package com.zy.asrs.wms.asrs.timer; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.*; import com.zy.asrs.wms.asrs.entity.enums.CacheSiteStatusType; 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 com.zy.asrs.wms.utils.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.*; import java.util.stream.Collectors; @Component public class TaskWaveTimer { @Autowired private TaskService taskService; @Autowired private TaskDetlService taskDetlService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private OrderUtils orderUtils; @Autowired private CacheSiteService cacheSiteService; @Autowired 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 tasks = taskService.list(new LambdaQueryWrapper().eq(Task::getTaskSts, TaskStsType.UPDATED_OUT.id)); if (tasks.isEmpty()) { return; } for (Task task : tasks) { List detls = taskDetlService.list(new LambdaQueryWrapper().eq(TaskDetl::getTaskId, task.getId())); if (detls.isEmpty()) { continue; } Set waveIds = detls.stream().map(TaskDetl::getWaveId).collect(Collectors.toSet()); if (waveIds.isEmpty()) { throw new CoolException("波次信息为空!!"); } List waves = waveService.list(new LambdaQueryWrapper().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 waveDetls = waveDetlService.list(new LambdaQueryWrapper().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() { Dict dict = dictService.getOne(new LambdaQueryWrapper().eq(Dict::getFlag, "autoCreateWaveSeed").eq(Dict::getStatus, 1)); if (dict == null) { return; } String autoCreateWaveSeed = dict.getValue(); if (!autoCreateWaveSeed.equals("true")) { return; } //查询状态为RCS任务完成所有任务单据 // List taskList = taskService.list(new LambdaQueryWrapper().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id)); List taskList = taskService.list(new LambdaQueryWrapper().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id)); // HashSet sycMatnrs = new HashSet<>(); if (taskList.isEmpty()) { // throw new CoolException("没有可播种任务!!"); } else { for (Task task : taskList) { Long hostId = task.getHostId(); List taskDetls = taskDetlService.list(new LambdaQueryWrapper().eq(TaskDetl::getTaskId, task.getId()).eq(TaskDetl::getHostId, hostId)); if (taskDetls.isEmpty()) { continue; } // 过滤已经生成波次播种数据的任务 该任务的任务明细号不能在播种数据表里面 long count = waveSeedService.count(new LambdaQueryWrapper() .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 list = orderService.list(new LambdaQueryWrapper().eq(Order::getWaveId, waveId)); if (list.isEmpty()) { continue; } ArrayList orderIds = new ArrayList<>(); for (Order order : list) { orderIds.add(order.getId()); } String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField()); List orderDetls = orderDetlService.list(new LambdaQueryWrapper() .in(OrderDetl::getOrderId, orderIds) .eq(OrderDetl::getStockIndex, matUniqueKey) .eq(OrderDetl::getHostId, hostId)); if (orderDetls.isEmpty()) { throw new CoolException("订单明细不存在"); } Double anfme = taskDetl.getAnfme(); 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; } double workQty = issued; if (anfme - issued < 0) { workQty = anfme; } anfme -= workQty; orderUtils.updateWorkQty(orderDetl.getId(), workQty, true); WaveSeed waveSeed = new WaveSeed(); waveSeed.setOrderNo(orderDetl.getOrderNo()); waveSeed.setOrderId(orderDetl.getOrderId()); waveSeed.setOrderDetlId(orderDetl.getId()); waveSeed.setTaskId(taskDetl.getTaskId()); waveSeed.setTaskNo(taskDetl.getTaskNo()); waveSeed.setWaveId(taskDetl.getWaveId()).setWaveNo(taskDetl.getWaveNo()); waveSeed.setTaskDetlId(taskDetl.getId()); //为满足当前需求,经确认,改成订单数量 waveSeed.setAnfme(orderDetl.getAnfme()); waveSeed.setWorkQty(0D); waveSeed.setMatnr(taskDetl.getMatnr()); waveSeed.setBatch(taskDetl.getBatch()); waveSeed.setFieldParams(JSON.toJSONString(taskDetl.getUniqueField())); waveSeed.setHostId(hostId); if (!waveSeedService.save(waveSeed)) { throw new CoolException("波次播种创建失败"); } } } } } } }