|  |  |  | 
|---|
|  |  |  | 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.annotation.Transactional; | 
|---|
|  |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Date; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Optional; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Scheduled(cron = "0/15 * * * * ? ") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @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 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/3 * * * * ? ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void taskWave() { | 
|---|
|  |  |  | InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (!autoCreateWaveSeed.equals("true")) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id)); | 
|---|
|  |  |  | //查询状态为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.id)); | 
|---|
|  |  |  | HashSet<String> sycMatnrs = new HashSet<>(); | 
|---|
|  |  |  | if (taskList.isEmpty()) { | 
|---|
|  |  |  | //                throw new CoolException("没有可播种任务!!"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | 
|---|
|  |  |  | 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())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | sycMatnrs.add(taskDetl.getMatnr()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId)); | 
|---|
|  |  |  | if (list.isEmpty()) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | 
|---|
|  |  |  | .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); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orderDetl.getOrderId()).eq(CacheSite::getHostId, hostId)); | 
|---|
|  |  |  | if (cacheSite == null) { | 
|---|
|  |  |  | throw new CoolException("缓存站空间不存在"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //fixme 生成波次播种数据时,不自动添加站点绑定,站点绑定调整至出库绑定播种库位时更新 | 
|---|
|  |  |  | //                            CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orderDetl.getOrderId()).eq(CacheSite::getHostId, hostId)); | 
|---|
|  |  |  | //                            if (cacheSite == null) { | 
|---|
|  |  |  | //                                throw new CoolException("缓存站空间不存在"); | 
|---|
|  |  |  | //                            } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | WaveSeed waveSeed = new WaveSeed(); | 
|---|
|  |  |  | waveSeed.setSiteId(cacheSite.getId()); | 
|---|
|  |  |  | waveSeed.setSiteNo(cacheSite.getSiteNo()); | 
|---|
|  |  |  | //                            waveSeed.setSiteId(cacheSite.getId()); | 
|---|
|  |  |  | //                            waveSeed.setSiteNo(cacheSite.getSiteNo()); | 
|---|
|  |  |  | waveSeed.setOrderNo(orderDetl.getOrderNo()); | 
|---|
|  |  |  | waveSeed.setOrderId(orderDetl.getOrderId()); | 
|---|
|  |  |  | waveSeed.setOrderDetlId(orderDetl.getId()); | 
|---|
|  |  |  | waveSeed.setWaveId(taskDetl.getWaveId()).setWaveNo(taskDetl.getWaveNo()); | 
|---|
|  |  |  | waveSeed.setTaskDetlId(taskDetl.getId()); | 
|---|
|  |  |  | //fixme 确认是否使用订单明细数量 | 
|---|
|  |  |  | //为满足当前需求,经确认,改成订单数量 | 
|---|
|  |  |  | waveSeed.setAnfme(orderDetl.getAnfme()); | 
|---|
|  |  |  | waveSeed.setWorkQty(0D); | 
|---|
|  |  |  | waveSeed.setMatnr(taskDetl.getMatnr()); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (!waveSeedService.save(waveSeed)) { | 
|---|
|  |  |  | throw new CoolException("波次播种创建失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | cacheSite.setOrderId(orderDetl.getOrderId()); | 
|---|
|  |  |  | cacheSite.setOrderNo(orderDetl.getOrderNo()); | 
|---|
|  |  |  | cacheSite.setSiteStatus(CacheSiteStatusType.R.id); | 
|---|
|  |  |  | cacheSite.setUpdateTime(new Date()); | 
|---|
|  |  |  | if (!cacheSiteService.updateById(cacheSite)) { | 
|---|
|  |  |  | throw new CoolException("缓存站更新失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //                            cacheSite.setOrderId(orderDetl.getOrderId()); | 
|---|
|  |  |  | //                            cacheSite.setOrderNo(orderDetl.getOrderNo()); | 
|---|
|  |  |  | //                            cacheSite.setSiteStatus(CacheSiteStatusType.R.id); | 
|---|
|  |  |  | //                            cacheSite.setUpdateTime(new Date()); | 
|---|
|  |  |  | //                            if (!cacheSiteService.updateById(cacheSite)) { | 
|---|
|  |  |  | //                                throw new CoolException("缓存站更新失败"); | 
|---|
|  |  |  | //                            } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | task.setTaskSts(TaskStsType.COMPLETE_OUT.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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|