From dc3f9cc91759823ce59486f19b138be4b296a0f1 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 28 四月 2026 09:43:28 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/task/WrkMastScheduler.java |  347 +++++++++------------------------------------------------
 1 files changed, 57 insertions(+), 290 deletions(-)

diff --git a/src/main/java/com/zy/asrs/task/WrkMastScheduler.java b/src/main/java/com/zy/asrs/task/WrkMastScheduler.java
index c7258ce..94e81dd 100644
--- a/src/main/java/com/zy/asrs/task/WrkMastScheduler.java
+++ b/src/main/java/com/zy/asrs/task/WrkMastScheduler.java
@@ -1,21 +1,12 @@
 package com.zy.asrs.task;
 
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.zy.asrs.domain.enums.NotifyMsgType;
-import com.zy.asrs.entity.BasStation;
 import com.zy.asrs.entity.LocMast;
-import com.zy.asrs.entity.WrkMastLog;
 import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.service.*;
-import com.zy.asrs.utils.NotifyUtils;
-import com.zy.core.cache.SlaveConnection;
-import com.zy.core.enums.LocStsType;
-import com.zy.core.enums.SlaveType;
-import com.zy.core.enums.WrkIoType;
+import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.service.WrkMastService;
 import com.zy.core.enums.WrkStsType;
-import com.zy.core.thread.StationThread;
-import com.zy.core.utils.StationOperateProcessUtils;
+import com.zy.core.task.MainProcessTaskSubmitter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -24,300 +15,61 @@
 import java.util.Date;
 import java.util.List;
 
-
 @Component
 @Slf4j
 public class WrkMastScheduler {
 
+    private static final long MIN_SUBMIT_INTERVAL_MS = 0L;
+    private static final String WRK_MAST_FINALIZE_LANE_PREFIX = "wrk-mast-finalize-";
+
     private final WrkMastService wrkMastService;
-    private final WrkMastLogService wrkMastLogService;
-    private final WrkAnalysisService wrkAnalysisService;
     private final LocMastService locMastService;
-    private final NotifyUtils notifyUtils;
-    private final StationOperateProcessUtils stationOperateProcessUtils;
-    private final BasStationService basStationService;
+    private final MainProcessTaskSubmitter mainProcessTaskSubmitter;
+    private final WrkMastFinalizeProcessor wrkMastFinalizeProcessor;
 
     public WrkMastScheduler(WrkMastService wrkMastService,
-                            WrkMastLogService wrkMastLogService,
-                            WrkAnalysisService wrkAnalysisService,
                             LocMastService locMastService,
-                            NotifyUtils notifyUtils,
-                            StationOperateProcessUtils stationOperateProcessUtils,
-                            BasStationService basStationService
-    ) {
+                            MainProcessTaskSubmitter mainProcessTaskSubmitter,
+                            WrkMastFinalizeProcessor wrkMastFinalizeProcessor) {
         this.wrkMastService = wrkMastService;
-        this.wrkMastLogService = wrkMastLogService;
-        this.wrkAnalysisService = wrkAnalysisService;
         this.locMastService = locMastService;
-        this.notifyUtils = notifyUtils;
-        this.stationOperateProcessUtils = stationOperateProcessUtils;
-        this.basStationService = basStationService;
+        this.mainProcessTaskSubmitter = mainProcessTaskSubmitter;
+        this.wrkMastFinalizeProcessor = wrkMastFinalizeProcessor;
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
-    @Transactional
-    public void executeIn(){
-        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_INBOUND.sts));
-        if (wrkMasts.isEmpty()) {
-            return;
-        }
-
-        for (WrkMast wrkMast : wrkMasts) {
-            Integer taskNo = wrkMast.getWrkNo();
-            Integer sourceStaNo = wrkMast.getSourceStaNo();
-            Integer staNo = wrkMast.getStaNo();
-
-            String locNo = wrkMast.getLocNo();
-            LocMast locMast = locMastService.queryByLoc(locNo);
-            if (locMast == null) {
-                log.info("[workNo={}]搴撲綅涓嶅瓨鍦�", wrkMast.getWrkNo());
-                continue;
-            }
-
-            if (!locMast.getLocSts().equals("S")) {
-                log.info("[workNo={}]搴撲綅鐘舵�佷笉澶勪簬S", wrkMast.getWrkNo());
-                continue;
-            }
-
-            locMast.setLocSts("F");
-            locMast.setBarcode(wrkMast.getBarcode());
-            locMast.setModiTime(new Date());
-            boolean result = locMastService.updateById(locMast);
-            if (!result) {
-                log.info("[workNo={}]搴撲綅鐘舵�丗鏇存柊澶辫触", wrkMast.getWrkNo());
-                continue;
-            }
-
-            // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-            WrkMastLog wrkMastLog = wrkMastLogService.saveRecord(wrkMast.getWrkNo());
-            if (wrkMastLog == null) {
-                log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={}]澶辫触", wrkMast.getWrkNo());
-            } else {
-                wrkAnalysisService.finishTask(wrkMast, resolveFinishTime(wrkMast), wrkMastLog.getId());
-            }
-            // 鍒犻櫎宸ヤ綔涓绘。
-            if (!wrkMastService.removeById(wrkMast.getWrkNo())) {
-                log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={}]澶辫触", wrkMast.getWrkNo());
-            }
-
-            //涓婃姤
-            notifyUtils.notify("task", 1, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.TASK_COMPLETE, JSON.toJSONString(wrkMast));
-
-            //娓呯悊璺緞
-            List<BasStation> basStations = basStationService.list(new QueryWrapper<BasStation>().in("station_id", sourceStaNo, staNo));
-            if (!basStations.isEmpty()) {
-                for (BasStation basStation : basStations) {
-                    StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basStation.getDeviceNo());
-                    if (stationThread != null) {
-                        stationOperateProcessUtils.attemptClearTaskPath(stationThread, taskNo);
-                    }
-                }
-            }
-        }
+    public void executeIn() {
+        submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_INBOUND.sts),
+                "executeIn",
+                wrkMastFinalizeProcessor::processCompleteInbound);
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
-    @Transactional
-    public void executeOut(){
-        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_OUTBOUND.sts));
-        if (wrkMasts.isEmpty()) {
-            return;
-        }
-
-        for (WrkMast wrkMast : wrkMasts) {
-            Integer taskNo = wrkMast.getWrkNo();
-            Integer sourceStaNo = wrkMast.getSourceStaNo();
-            Integer staNo = wrkMast.getStaNo();
-
-            String locNo = wrkMast.getSourceLocNo();
-            LocMast locMast = locMastService.queryByLoc(locNo);
-            if (locMast == null) {
-                log.info("[workNo={}]搴撲綅涓嶅瓨鍦�", wrkMast.getWrkNo());
-                continue;
-            }
-
-            if (!(locMast.getLocSts().equals("R") || locMast.getLocSts().equals("O"))) {
-                log.info("[workNo={}]搴撲綅鐘舵�佷笉澶勪簬R or O", wrkMast.getWrkNo());
-                continue;
-            }
-
-            locMast.setLocSts("O");
-            locMast.setBarcode("");
-            locMast.setModiTime(new Date());
-            boolean result = locMastService.updateById(locMast);
-            if (!result) {
-                log.info("[workNo={}]搴撲綅鐘舵�丱鏇存柊澶辫触", wrkMast.getWrkNo());
-                continue;
-            }
-
-            // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-            WrkMastLog wrkMastLog = wrkMastLogService.saveRecord(wrkMast.getWrkNo());
-            if (wrkMastLog == null) {
-                log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={}]澶辫触", wrkMast.getWrkNo());
-            } else {
-                wrkAnalysisService.finishTask(wrkMast, resolveFinishTime(wrkMast), wrkMastLog.getId());
-            }
-            // 鍒犻櫎宸ヤ綔涓绘。
-            if (!wrkMastService.removeById(wrkMast.getWrkNo())) {
-                log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={}]澶辫触", wrkMast.getWrkNo());
-            }
-
-            //涓婃姤
-            notifyUtils.notify("task", 1, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.TASK_COMPLETE, JSON.toJSONString(wrkMast));
-
-            //娓呯悊璺緞
-            List<BasStation> basStations = basStationService.list(new QueryWrapper<BasStation>().in("station_id", sourceStaNo, staNo));
-            if (!basStations.isEmpty()) {
-                for (BasStation basStation : basStations) {
-                    StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basStation.getDeviceNo());
-                    if (stationThread != null) {
-                        stationOperateProcessUtils.attemptClearTaskPath(stationThread, taskNo);
-                    }
-                }
-            }
-        }
+    public void executeOut() {
+        submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_OUTBOUND.sts),
+                "executeOut",
+                wrkMastFinalizeProcessor::processCompleteOutbound);
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
-    @Transactional
-    public void executeLocMove(){
-        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_LOC_MOVE.sts));
-        if (wrkMasts.isEmpty()) {
-            return;
-        }
-
-        for (WrkMast wrkMast : wrkMasts) {
-            String sourceLocNo = wrkMast.getSourceLocNo();
-            String locNo = wrkMast.getLocNo();
-            LocMast locMast = locMastService.queryByLoc(locNo);
-            if (locMast == null) {
-                log.info("[workNo={}]搴撲綅涓嶅瓨鍦�", wrkMast.getWrkNo());
-                continue;
-            }
-
-            if (!locMast.getLocSts().equals("S")) {
-                log.info("[workNo={}]搴撲綅鐘舵�佷笉澶勪簬S", wrkMast.getWrkNo());
-                continue;
-            }
-
-            LocMast sourceLocMast = locMastService.queryByLoc(sourceLocNo);
-            if (sourceLocMast == null) {
-                log.info("[workNo={}]搴撲綅涓嶅瓨鍦�", wrkMast.getWrkNo());
-                continue;
-            }
-
-            if (!sourceLocMast.getLocSts().equals("R")) {
-                log.info("[workNo={}]搴撲綅鐘舵�佷笉澶勪簬R", wrkMast.getWrkNo());
-                continue;
-            }
-
-            locMast.setLocSts("F");
-            locMast.setBarcode(wrkMast.getBarcode());
-            locMast.setModiTime(new Date());
-            boolean result = locMastService.updateById(locMast);
-            if (!result) {
-                log.info("[workNo={}]搴撲綅鐘舵�丗鏇存柊澶辫触", wrkMast.getWrkNo());
-                continue;
-            }
-
-            sourceLocMast.setLocSts("O");
-            sourceLocMast.setBarcode("");
-            sourceLocMast.setModiTime(new Date());
-            boolean result2 = locMastService.updateById(sourceLocMast);
-            if (!result2) {
-                log.info("[workNo={}]搴撲綅鐘舵�丱鏇存柊澶辫触", wrkMast.getWrkNo());
-                continue;
-            }
-
-            // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-            WrkMastLog wrkMastLog = wrkMastLogService.saveRecord(wrkMast.getWrkNo());
-            if (wrkMastLog == null) {
-                log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={}]澶辫触", wrkMast.getWrkNo());
-            } else {
-                wrkAnalysisService.finishTask(wrkMast, resolveFinishTime(wrkMast), wrkMastLog.getId());
-            }
-            // 鍒犻櫎宸ヤ綔涓绘。
-            if (!wrkMastService.removeById(wrkMast.getWrkNo())) {
-                log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={}]澶辫触", wrkMast.getWrkNo());
-            }
-
-            //涓婃姤
-            notifyUtils.notify("task", 1, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.TASK_COMPLETE, JSON.toJSONString(wrkMast));
-        }
+    public void executeLocMove() {
+        submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_LOC_MOVE.sts),
+                "executeLocMove",
+                wrkMastFinalizeProcessor::processCompleteLocMove);
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
-    @Transactional
-    public void executeCrnMove(){
-        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_CRN_MOVE.sts));
-        if (wrkMasts.isEmpty()) {
-            return;
-        }
-
-        for (WrkMast wrkMast : wrkMasts) {
-            WrkMastLog wrkMastLog = wrkMastLogService.saveRecord(wrkMast.getWrkNo());
-            if (wrkMastLog == null) {
-                log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={}]澶辫触", wrkMast.getWrkNo());
-            } else {
-                wrkAnalysisService.finishTask(wrkMast, resolveFinishTime(wrkMast), wrkMastLog.getId());
-            }
-
-            if (!wrkMastService.removeById(wrkMast.getWrkNo())) {
-                log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={}]澶辫触", wrkMast.getWrkNo());
-            }
-        }
+    public void executeCrnMove() {
+        submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_CRN_MOVE.sts),
+                "executeCrnMove",
+                wrkMastFinalizeProcessor::processCompleteCrnMove);
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
-    @Transactional
-    public void executeCancelTask(){
-        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("mk", "taskCancel"));
-        if (wrkMasts.isEmpty()) {
-            return;
-        }
-
-        for (WrkMast wrkMast : wrkMasts) {
-            // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-            WrkMastLog wrkMastLog = wrkMastLogService.saveRecord(wrkMast.getWrkNo());
-            if (wrkMastLog == null) {
-                log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={}]澶辫触", wrkMast.getWrkNo());
-            } else {
-                wrkAnalysisService.finishTask(wrkMast, resolveFinishTime(wrkMast), wrkMastLog.getId());
-            }
-            // 鍒犻櫎宸ヤ綔涓绘。
-            if (!wrkMastService.removeById(wrkMast.getWrkNo())) {
-                log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={}]澶辫触", wrkMast.getWrkNo());
-            }
-
-            if (wrkMast.getIoType() == WrkIoType.IN.id) {
-                LocMast locMast = locMastService.queryByLoc(wrkMast.getLocNo());
-                locMast.setLocSts(String.valueOf(LocStsType.O));
-                locMast.setModiTime(new Date());
-                locMastService.updateById(locMast);
-            } else if (wrkMast.getIoType() == WrkIoType.OUT.id) {
-                LocMast locMast = locMastService.queryByLoc(wrkMast.getSourceLocNo());
-                locMast.setLocSts(String.valueOf(LocStsType.F));
-                locMast.setModiTime(new Date());
-                locMastService.updateById(locMast);
-            } else if (wrkMast.getIoType() == WrkIoType.LOC_MOVE.id) {
-                LocMast sourceLocMast = locMastService.queryByLoc(wrkMast.getSourceLocNo());
-                LocMast locMast = locMastService.queryByLoc(wrkMast.getLocNo());
-                if (sourceLocMast.getLocSts().equals(String.valueOf(LocStsType.R))) {
-                    sourceLocMast.setLocSts(String.valueOf(LocStsType.F));
-                    sourceLocMast.setModiTime(new Date());
-                    locMastService.updateById(sourceLocMast);
-                }
-
-                if (locMast.getLocSts().equals(String.valueOf(LocStsType.S))) {
-                    locMast.setLocSts(String.valueOf(LocStsType.O));
-                    locMast.setModiTime(new Date());
-                    locMastService.updateById(locMast);
-                }
-            }
-
-            //涓婃姤
-            notifyUtils.notify("task", 1, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.TASK_CANCEL, JSON.toJSONString(wrkMast));
-        }
+    public void executeCancelTask() {
+        submitByWrkNo(new QueryWrapper<WrkMast>().in("mk", "taskCancel", "taskForceCancel"),
+                "executeCancelTask",
+                wrkMastFinalizeProcessor::processCancelTask);
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
@@ -351,22 +103,37 @@
             boolean result = locMastService.updateById(locMast);
             if (!result) {
                 log.info("[workNo={}]搴撲綅鐘舵�丱鏇存柊澶辫触", wrkMast.getWrkNo());
-                continue;
             }
         }
     }
 
-    private Date resolveFinishTime(WrkMast wrkMast) {
-        if (wrkMast == null) {
-            return new Date();
+    private void submitByWrkNo(QueryWrapper<WrkMast> queryWrapper, String taskNamePrefix, WrkNoHandler handler) {
+        List<WrkMast> wrkMasts = wrkMastService.list(queryWrapper);
+        if (wrkMasts.isEmpty()) {
+            return;
         }
-        if (wrkMast.getModiTime() != null) {
-            return wrkMast.getModiTime();
+        for (WrkMast wrkMast : wrkMasts) {
+            if (wrkMast == null || wrkMast.getWrkNo() == null || wrkMast.getWrkNo() <= 0) {
+                log.error("WrkMastScheduler鎻愪氦浠诲姟璺宠繃锛屽伐浣滄。涓虹┖鎴栧伐浣滃彿闈炴硶銆倀askNamePrefix={}, wrkMast={}", taskNamePrefix, wrkMast);
+                continue;
+            }
+            Integer wrkNo = wrkMast.getWrkNo();
+            boolean submitted = mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    WRK_MAST_FINALIZE_LANE_PREFIX,
+                    wrkNo,
+                    taskNamePrefix + "-" + wrkNo,
+                    MIN_SUBMIT_INTERVAL_MS,
+                    () -> handler.handle(wrkNo)
+            );
+            if (!submitted) {
+                log.error("WrkMastScheduler鎻愪氦鍗曚换鍔″鐞嗗け璐ャ�倀askNamePrefix={}, wrkNo={}, lanePrefix={}",
+                        taskNamePrefix, wrkNo, WRK_MAST_FINALIZE_LANE_PREFIX);
+            }
         }
-        if (wrkMast.getIoTime() != null) {
-            return wrkMast.getIoTime();
-        }
-        return new Date();
     }
 
+    @FunctionalInterface
+    private interface WrkNoHandler {
+        void handle(Integer wrkNo);
+    }
 }

--
Gitblit v1.9.1