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.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; @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; // @Scheduled(cron = "0/3 * * * * ? ") @Transactional 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; } List taskList = taskService.list(new LambdaQueryWrapper().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id)); 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(); 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) { 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); 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.setTaskDetlId(taskDetl.getId()); waveSeed.setAnfme(taskDetl.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.COMPLETE_OUT.id); task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { throw new CoolException("任务更新失败"); } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }finally { InterceptorIgnoreHelper.clearIgnoreStrategy(); } } }