From 9b8ff50b66361c4b56074b7586b2d5951ecf2091 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 02 四月 2026 15:02:14 +0800
Subject: [PATCH] #优化运行速度

---
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java |  230 +++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 149 insertions(+), 81 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 614f005..787f8c0 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -31,6 +31,8 @@
 import com.zy.core.model.command.CrnCommand;
 import com.zy.core.model.protocol.CrnProtocol;
 import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.task.MainProcessLane;
+import com.zy.core.task.MainProcessTaskSubmitter;
 import com.zy.core.thread.CrnThread;
 import com.zy.core.thread.StationThread;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,30 +71,40 @@
     private StationOperateProcessUtils stationOperateProcessUtils;
     @Autowired
     private WrkAnalysisService wrkAnalysisService;
+    @Autowired
+    private MainProcessTaskSubmitter mainProcessTaskSubmitter;
 
     private static final String CRN_OUT_REQUIRE_STATION_OUT_ENABLE_CONFIG = "crnOutRequireStationOutEnable";
 
     public synchronized void crnIoExecute() {
+        Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
+        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+        for (BasCrnp basCrnp : basCrnps) {
+            crnIoExecute(basCrnp, crnMoveBlockedCrnNos);
+        }
+    }
+
+    public void crnIoExecute(BasCrnp basCrnp, Set<Integer> crnMoveBlockedCrnNos) {
+        if (basCrnp == null || basCrnp.getCrnNo() == null) {
+            return;
+        }
         Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
         if (systemConfigMapObj != null) {
             HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
             if (systemConfigMap.get("crnRunMethod").equals("solver")) {
-                plannerExecute();
+                plannerExecute(basCrnp, crnMoveBlockedCrnNos);
             }else {
-                crnIoExecuteNormal();
+                crnIoExecuteNormal(basCrnp, crnMoveBlockedCrnNos);
             }
         }
     }
 
     //鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
-    public synchronized void crnIoExecuteNormal() {
-        Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
-
-        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+    private void crnIoExecuteNormal(BasCrnp currentCrn, Set<Integer> crnMoveBlockedCrnNos) {
         Map<Integer, BasCrnp> dispatchCrnMap = new HashMap<>();
         Map<Integer, CrnThread> dispatchThreadMap = new HashMap<>();
         Map<Integer, CrnProtocol> dispatchProtocolMap = new HashMap<>();
-        for (BasCrnp basCrnp : basCrnps) {
+        for (BasCrnp basCrnp : java.util.Collections.singletonList(currentCrn)) {
             if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
                 continue;
             }
@@ -611,110 +623,120 @@
     public synchronized void crnIoExecuteFinish() {
         List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
         for (BasCrnp basCrnp : basCrnps) {
-            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
-            if(crnThread == null){
-                continue;
+            crnIoExecuteFinish(basCrnp);
+        }
+    }
+
+    public void crnIoExecuteFinish(BasCrnp basCrnp) {
+        if (basCrnp == null || basCrnp.getCrnNo() == null) {
+            return;
+        }
+        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+        if(crnThread == null){
+            return;
+        }
+
+        CrnProtocol crnProtocol = crnThread.getStatus();
+        if(crnProtocol == null){
+            return;
+        }
+
+        if (crnProtocol.getMode() == CrnModeType.AUTO.id
+                && crnProtocol.getTaskNo() > 0
+                && crnProtocol.getStatus() == CrnStatusType.WAITING.id
+        ) {
+            Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
+            if(lock != null){
+                return;
             }
 
-            CrnProtocol crnProtocol = crnThread.getStatus();
-            if(crnProtocol == null){
-                continue;
+            WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
+            if (wrkMast == null) {
+                News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                return;
             }
 
-            if (crnProtocol.getMode() == CrnModeType.AUTO.id
-                    && crnProtocol.getTaskNo() > 0
-                    && crnProtocol.getStatus() == CrnStatusType.WAITING.id
-            ) {
-                Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
-                if(lock != null){
-                    continue;
+            Long updateWrkSts = null;
+            Date now = new Date();
+            if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){
+                updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
+                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
+            }else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){
+                updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
+                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
+
+                List<StationObjModel> outStationList = basCrnp.getOutStationList$();
+                if(outStationList.isEmpty()){
+                    News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
+                    return;
                 }
 
-                // 鑾峰彇寰呯‘璁ゅ伐浣滄。
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
-                if (wrkMast == null) {
-                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                    continue;
-                }
-
-                Long updateWrkSts = null;
-                Date now = new Date();
-                if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){
-                    updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
-                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
-                }else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){
-                    updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
-                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
-
-                    List<StationObjModel> outStationList = basCrnp.getOutStationList$();
-                    if(outStationList.isEmpty()){
-                        News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
-                        return;
+                StationObjModel outStationObjModel = null;
+                for (StationObjModel stationObjModel : outStationList) {
+                    if (stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
+                        outStationObjModel = stationObjModel;
+                        break;
                     }
-
-                    StationObjModel outStationObjModel = null;
-                    for (StationObjModel stationObjModel : outStationList) {
-                        if (stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
-                            outStationObjModel = stationObjModel;
-                            break;
-                        }
-                    }
-                    redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(outStationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
-                }else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){
-                    updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
-                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
-                }else if(wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts){
-                    updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
-                }else{
-                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                    continue;
                 }
-
-                wrkMast.setWrkSts(updateWrkSts);
-                wrkMast.setSystemMsg("");
-                wrkMast.setIoTime(now);
-                wrkMast.setModiTime(now);
-                if (wrkMastService.updateById(wrkMast)) {
-                    wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
-                    CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
-                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
-                    News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                }
-
-                redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
+                redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(outStationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+            }else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){
+                updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
+                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
+            }else if(wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts){
+                updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
+            }else{
+                News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                return;
             }
+
+            wrkMast.setWrkSts(updateWrkSts);
+            wrkMast.setSystemMsg("");
+            wrkMast.setIoTime(now);
+            wrkMast.setModiTime(now);
+            if (wrkMastService.updateById(wrkMast)) {
+                wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
+                CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
+                MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
+                News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+            }
+
+            redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
         }
     }
 
     public synchronized void plannerExecute() {
         Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
-
-        int nowSec = (int) (System.currentTimeMillis() / 1000);
         List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
         for (BasCrnp basCrnp : basCrnps) {
-            if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
-                continue;
-            }
+            plannerExecute(basCrnp, crnMoveBlockedCrnNos);
+        }
+    }
+
+    private void plannerExecute(BasCrnp basCrnp, Set<Integer> crnMoveBlockedCrnNos) {
+        int nowSec = (int) (System.currentTimeMillis() / 1000);
+        if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
+            return;
+        }
             String key = RedisKeyType.PLANNER_SCHEDULE.key + "CRN-" + basCrnp.getCrnNo();
             List<Object> items = redisUtil.lGet(key, 0, -1);
             if (items == null || items.isEmpty()) {
-                continue;
+                return;
             }
 
             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
             if (crnThread == null) {
-                continue;
+                return;
             }
             CrnProtocol crnProtocol = crnThread.getStatus();
             if (crnProtocol == null) {
-                continue;
+                return;
             }
             List<WrkMast> running = wrkMastService.list(new QueryWrapper<WrkMast>()
                     .eq("crn_no", basCrnp.getCrnNo())
                     .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts, WrkStsType.CRN_MOVE_RUN.sts)
             );
             if (!running.isEmpty()) {
-                continue;
+                return;
             }
             if (!(crnProtocol.getMode() == CrnModeType.AUTO.id
                     && crnProtocol.getTaskNo() == 0
@@ -722,7 +744,7 @@
                     && crnProtocol.getLoaded() == 0
                     && crnProtocol.getForkPos() == 0
                     && crnProtocol.getAlarm() == 0)) {
-                continue;
+                return;
             }
 
             for (Object v : items) {
@@ -785,7 +807,6 @@
                     }
                 }
             }
-        }
     }
 
     private synchronized boolean crnExecuteMovePlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) {
@@ -950,6 +971,53 @@
         return blockedCrnNoSet;
     }
 
+    public Set<Integer> executeCrnMoveTaskAndGetBlockedCrnNos() {
+        return executeCrnMoveTask();
+    }
+
+    public void submitCrnIoTasks(long minIntervalMs) {
+        submitCrnIoTasks(MainProcessLane.CRN_IO, minIntervalMs);
+    }
+
+    public void submitCrnIoTasks(MainProcessLane lane, long minIntervalMs) {
+        Set<Integer> blockedCrnNos = executeCrnMoveTaskAndGetBlockedCrnNos();
+        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+        for (BasCrnp basCrnp : basCrnps) {
+            Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+            if (crnNo == null) {
+                continue;
+            }
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    lane,
+                    crnNo,
+                    "crnIoExecute",
+                    minIntervalMs,
+                    () -> crnIoExecute(basCrnp, blockedCrnNos)
+            );
+        }
+    }
+
+    public void submitCrnIoExecuteFinishTasks(long minIntervalMs) {
+        submitCrnIoExecuteFinishTasks(MainProcessLane.CRN_IO_FINISH, minIntervalMs);
+    }
+
+    public void submitCrnIoExecuteFinishTasks(MainProcessLane lane, long minIntervalMs) {
+        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+        for (BasCrnp basCrnp : basCrnps) {
+            Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+            if (crnNo == null) {
+                continue;
+            }
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    lane,
+                    crnNo,
+                    "crnIoExecuteFinish",
+                    minIntervalMs,
+                    () -> crnIoExecuteFinish(basCrnp)
+            );
+        }
+    }
+
     //妫�娴嬫祬搴撲綅鐘舵��
     public synchronized boolean checkShallowLocStatus(String locNo, Integer taskNo) {
         String checkDeepLocOutTaskBlockReport = "Y";

--
Gitblit v1.9.1