|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType; | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.entity.enums.TaskStsType; | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.service.*; | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.service.impl.WaveDetlLogServiceImpl; | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.service.impl.WaveDetlServiceImpl; | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.service.impl.WaveLogServiceImpl; | 
|---|
|  |  |  | import com.zy.asrs.wms.asrs.service.impl.WaveServiceImpl; | 
|---|
|  |  |  | import com.zy.asrs.wms.system.entity.Dict; | 
|---|
|  |  |  | import com.zy.asrs.wms.system.service.DictService; | 
|---|
|  |  |  | import com.zy.asrs.wms.utils.OrderUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Component | 
|---|
|  |  |  | public class TaskWaveTimer { | 
|---|
|  |  |  | 
|---|
|  |  |  | private WaveSeedService waveSeedService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private DictService dictService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WaveServiceImpl waveService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WaveLogServiceImpl waveLogService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WaveDetlServiceImpl waveDetlService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WaveDetlLogServiceImpl waveDetlLogService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @author Ryan | 
|---|
|  |  |  | * @date 2025/6/20 | 
|---|
|  |  |  | * @description: 更新波次明细,加入历史档 | 
|---|
|  |  |  | * @version 1.0 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Scheduled(cron = "0/30 * * * * ? ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void addWaveHistories() { | 
|---|
|  |  |  | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.UPDATED_OUT.id)); | 
|---|
|  |  |  | if (tasks.isEmpty()) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Task task : tasks) { | 
|---|
|  |  |  | List<TaskDetl> detls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId())); | 
|---|
|  |  |  | if (detls.isEmpty()) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Set<Long> waveIds = detls.stream().map(TaskDetl::getWaveId).collect(Collectors.toSet()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (waveIds.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("波次信息为空!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Wave> waves = waveService.list(new LambdaQueryWrapper<Wave>().in(Wave::getId, waveIds)); | 
|---|
|  |  |  | for (Wave wave : waves) { | 
|---|
|  |  |  | WaveLog waveLog = new WaveLog(); | 
|---|
|  |  |  | waveLog.sync(wave); | 
|---|
|  |  |  | waveLog.setId(null); | 
|---|
|  |  |  | if (!waveLogService.save(waveLog)) { | 
|---|
|  |  |  | throw new CoolException("波次转历史失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<WaveDetl> waveDetls = waveDetlService.list(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, wave.getId())); | 
|---|
|  |  |  | for (WaveDetl waveDetl : waveDetls) { | 
|---|
|  |  |  | WaveDetlLog waveDetlLog = new WaveDetlLog(); | 
|---|
|  |  |  | waveDetlLog.sync(waveDetl); | 
|---|
|  |  |  | waveDetlLog.setId(null); | 
|---|
|  |  |  | waveDetlLog.setWaveId(waveLog.getId()); | 
|---|
|  |  |  | if (!waveDetlLogService.save(waveDetlLog)) { | 
|---|
|  |  |  | throw new CoolException("波次明细转历史失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!waveDetlService.removeById(waveDetl.getId())) { | 
|---|
|  |  |  | throw new CoolException("波次明细删除失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!waveService.removeById(wave.getId())) { | 
|---|
|  |  |  | throw new CoolException("波次删除失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * modifty: | 
|---|
|  |  |  | * original : fetch datasource of task type on WAVE_SEED | 
|---|
|  |  |  | * now: Fetch datasource of task type  on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting  the task type equal to WAVE_SEED | 
|---|
|  |  |  | * original : fetch datasource of task type on WCS_EXECUTE_OUT_TASK_DONE | 
|---|
|  |  |  | * now: Fetch datasource of task type  on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting  the task type equal to GENERATE_WAVE_SEED | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Scheduled(cron = "0/15 * * * * ? ") | 
|---|
|  |  |  | @Scheduled(cron = "0/3 * * * * ? ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void taskWave() { | 
|---|
|  |  |  | InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (!autoCreateWaveSeed.equals("true")) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //查询状态为容器到达状态所有任务单据 | 
|---|
|  |  |  | //查询状态为RCS任务完成所有任务单据 | 
|---|
|  |  |  | //            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id)); | 
|---|
|  |  |  | List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.id)); | 
|---|
|  |  |  | List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id)); | 
|---|
|  |  |  | HashSet<String> sycMatnrs = new HashSet<>(); | 
|---|
|  |  |  | if (taskList.isEmpty()) { | 
|---|
|  |  |  | //                throw new CoolException("没有可播种任务!!"); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (taskDetls.isEmpty()) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 过滤已经生成波次播种数据的任务  该任务的任务明细号不能在播种数据表里面 | 
|---|
|  |  |  | long count = waveSeedService.count(new LambdaQueryWrapper<WaveSeed>().in(WaveSeed::getTaskDetlId, taskDetls.stream().map(TaskDetl::getId).collect(Collectors.toList())).eq(WaveSeed::getHostId, hostId)); | 
|---|
|  |  |  | if (count > 0) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (TaskDetl taskDetl : taskDetls) { | 
|---|
|  |  |  | //分配订单 | 
|---|
|  |  |  | Long waveId = taskDetl.getWaveId(); | 
|---|
|  |  |  | //同一个物料只添加一次播种任务 | 
|---|
|  |  |  | if(sycMatnrs.contains(taskDetl.getMatnr())) { | 
|---|
|  |  |  | if (sycMatnrs.contains(taskDetl.getMatnr())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | sycMatnrs.add(taskDetl.getMatnr()); | 
|---|
|  |  |  | 
|---|
|  |  |  | .in(OrderDetl::getOrderId, orderIds) | 
|---|
|  |  |  | .eq(OrderDetl::getStockIndex, matUniqueKey) | 
|---|
|  |  |  | .eq(OrderDetl::getHostId, hostId)); | 
|---|
|  |  |  | if(orderDetls.isEmpty()){ | 
|---|
|  |  |  | if (orderDetls.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("订单明细不存在"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | for (OrderDetl orderDetl : orderDetls) { | 
|---|
|  |  |  | //fixme 作业中数量调整放至,生成出库任务成功后 | 
|---|
|  |  |  | double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D); | 
|---|
|  |  |  | if (issued <= 0.0D) { continue; } | 
|---|
|  |  |  | if (anfme <= 0.0D) { break; } | 
|---|
|  |  |  | if (issued <= 0.0D) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (anfme <= 0.0D) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double workQty = issued; | 
|---|
|  |  |  | if(anfme - issued < 0){ | 
|---|
|  |  |  | if (anfme - issued < 0) { | 
|---|
|  |  |  | workQty = anfme; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | anfme -= workQty; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | orderUtils.updateWorkQty(orderDetl.getId(), workQty, true); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //fixme 生成波次播种数据时,不自动添加站点绑定,站点绑定调整至出库绑定播种库位时更新 | 
|---|
|  |  |  | //                            CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orderDetl.getOrderId()).eq(CacheSite::getHostId, hostId)); | 
|---|
|  |  |  | //                            if (cacheSite == null) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | task.setTaskSts(TaskStsType.GENERATE_WAVE_SEED.id); | 
|---|
|  |  |  | task.setUpdateTime(new Date()); | 
|---|
|  |  |  | if (!taskService.updateById(task)) { | 
|---|
|  |  |  | throw new CoolException("任务更新失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //                    task.setTaskSts(TaskStsType.GENERATE_WAVE_SEED.id); | 
|---|
|  |  |  | //                    task.setUpdateTime(new Date()); | 
|---|
|  |  |  | //                    if (!taskService.updateById(task)) { | 
|---|
|  |  |  | //                        throw new CoolException("任务更新失败"); | 
|---|
|  |  |  | //                    } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | }finally { | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | InterceptorIgnoreHelper.clearIgnoreStrategy(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|