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.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.*; @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; /** * 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/15 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void taskWave() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { 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_TASK_DONE.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; } 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); // //fixme 生成波次播种数据时,不自动添加站点绑定,站点绑定调整至出库绑定播种库位时更新 // CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper().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.setOrderNo(orderDetl.getOrderNo()); waveSeed.setOrderId(orderDetl.getOrderId()); waveSeed.setOrderDetlId(orderDetl.getId()); 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("波次播种创建失败"); } // 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.GENERATE_WAVE_SEED.id); task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { throw new CoolException("任务更新失败"); } } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }finally { InterceptorIgnoreHelper.clearIgnoreStrategy(); } } }