skyouc
2024-12-21 c635d78b479510ebe2556a420948effcd30a0731
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
@@ -1,155 +1,155 @@
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<Dict>().eq(Dict::getFlag, "autoCreateWaveSeed").eq(Dict::getStatus, 1));
            if (dict == null) {
                return;
            }
            String autoCreateWaveSeed = dict.getValue();
            if (!autoCreateWaveSeed.equals("true")) {
                return;
            }
            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
            for (Task task : taskList) {
                Long hostId = task.getHostId();
                List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId()).eq(TaskDetl::getHostId, hostId));
                if (taskDetls.isEmpty()) {
                    continue;
                }
                for (TaskDetl taskDetl : taskDetls) {
                    //分配订单
                    Long waveId = taskDetl.getWaveId();
                    List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId));
                    if (list.isEmpty()) {
                        continue;
                    }
                    ArrayList<Long> orderIds = new ArrayList<>();
                    for (Order order : list) {
                        orderIds.add(order.getId());
                    }
                    String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
                    List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>()
                            .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<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.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();
        }
    }
}
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<Dict>().eq(Dict::getFlag, "autoCreateWaveSeed").eq(Dict::getStatus, 1));
            if (dict == null) {
                return;
            }
            String autoCreateWaveSeed = dict.getValue();
            if (!autoCreateWaveSeed.equals("true")) {
                return;
            }
            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
            for (Task task : taskList) {
                Long hostId = task.getHostId();
                List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId()).eq(TaskDetl::getHostId, hostId));
                if (taskDetls.isEmpty()) {
                    continue;
                }
                for (TaskDetl taskDetl : taskDetls) {
                    //分配订单
                    Long waveId = taskDetl.getWaveId();
                    List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId));
                    if (list.isEmpty()) {
                        continue;
                    }
                    ArrayList<Long> orderIds = new ArrayList<>();
                    for (Order order : list) {
                        orderIds.add(order.getId());
                    }
                    String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
                    List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>()
                            .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<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.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();
        }
    }
}