skyouc
2025-06-22 ebe2da6e4eefd59b366ebab3a651b32763b580ed
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
@@ -10,6 +10,10 @@
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;
@@ -21,6 +25,7 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.*;
import java.util.stream.Collectors;
@Component
public class TaskWaveTimer {
@@ -41,13 +46,76 @@
    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<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.COMPLETE_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 WAVE_SEED
     * now: Fetch datasource of task type  on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting  the task type equal to WAVE_SEED
     * 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 * * * * ? ")
    @Scheduled(cron = "0/3 * * * * ? ")
    @Transactional(rollbackFor = Exception.class)
    public void taskWave() {
        InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
@@ -60,9 +128,9 @@
            if (!autoCreateWaveSeed.equals("true")) {
                return;
            }
            //查询状态为容器到达状态所有任务单据
            //查询状态为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_TASK_DONE.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("没有可播种任务!!");
@@ -74,12 +142,17 @@
                    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())) {
                        if (sycMatnrs.contains(taskDetl.getMatnr())) {
                            continue;
                        }
                        sycMatnrs.add(taskDetl.getMatnr());
@@ -99,7 +172,7 @@
                                .in(OrderDetl::getOrderId, orderIds)
                                .eq(OrderDetl::getStockIndex, matUniqueKey)
                                .eq(OrderDetl::getHostId, hostId));
                        if(orderDetls.isEmpty()){
                        if (orderDetls.isEmpty()) {
                            throw new CoolException("订单明细不存在");
                        }
@@ -107,17 +180,21 @@
                        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);
//
                            //fixme 生成波次播种数据时,不自动添加站点绑定,站点绑定调整至出库绑定播种库位时更新
//                            CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orderDetl.getOrderId()).eq(CacheSite::getHostId, hostId));
//                            if (cacheSite == null) {
@@ -153,17 +230,17 @@
                        }
                    }
                    task.setTaskSts(TaskStsType.GENERATE_WAVE_SEED.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();
        }
    }