From 9c5b9144ed8ed3190a21c4cb66b80e1ed9b7c954 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 03 四月 2026 15:19:06 +0800
Subject: [PATCH] #预调度优化

---
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java |  217 +++++++++++++++++++++++------------------------------
 1 files changed, 95 insertions(+), 122 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 21f433e..4be2698 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -77,14 +77,13 @@
     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);
+            crnIoExecute(basCrnp);
         }
     }
 
-    public void crnIoExecute(BasCrnp basCrnp, Set<Integer> crnMoveBlockedCrnNos) {
+    public void crnIoExecute(BasCrnp basCrnp) {
         if (basCrnp == null || basCrnp.getCrnNo() == null) {
             return;
         }
@@ -92,16 +91,16 @@
         if (systemConfigMapObj != null) {
             HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
             if (systemConfigMap.get("crnRunMethod").equals("solver")) {
-                plannerExecute(basCrnp, crnMoveBlockedCrnNos);
+                plannerExecute(basCrnp);
             }else {
-                crnIoExecuteNormal(basCrnp, crnMoveBlockedCrnNos);
+                crnIoExecuteNormal(basCrnp);
             }
         }
     }
 
     //鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
-    private void crnIoExecuteNormal(BasCrnp currentCrn, Set<Integer> crnMoveBlockedCrnNos) {
-        if (currentCrn == null || currentCrn.getCrnNo() == null || crnMoveBlockedCrnNos.contains(currentCrn.getCrnNo())) {
+    private void crnIoExecuteNormal(BasCrnp currentCrn) {
+        if (currentCrn == null || currentCrn.getCrnNo() == null) {
             return;
         }
 
@@ -118,7 +117,12 @@
 
         long runningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
                 .eq("crn_no", crnNo)
-                .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts, WrkStsType.CRN_MOVE_RUN.sts));
+                .in("wrk_sts",
+                        WrkStsType.INBOUND_RUN.sts
+                        , WrkStsType.OUTBOUND_RUN.sts
+                        , WrkStsType.LOC_MOVE_RUN.sts
+                        , WrkStsType.CRN_MOVE_RUN.sts
+                ));
         if (runningCount > 0) {
             return;
         }
@@ -135,6 +139,12 @@
 
         Object clearLock = redisUtil.get(RedisKeyType.CLEAR_CRN_TASK_LIMIT.key + crnNo);
         if (clearLock != null) {
+            return;
+        }
+
+        //鎵ц绉诲姩浠诲姟
+        boolean executed = executeCrnMoveTask(crnThread, crnProtocol);
+        if (executed) {
             return;
         }
 
@@ -385,7 +395,7 @@
             return false;
         }
 
-        if (!allowBatchOutboundExecute(wrkMast)) {
+        if (!allowBatchOutboundExecute(wrkMast, true)) {
             return false;
         }
 
@@ -458,13 +468,19 @@
         return false;
     }
 
-    private boolean allowBatchOutboundExecute(WrkMast wrkMast) {
+    public boolean canOutboundTaskExecuteInCurrentBatchWindow(WrkMast wrkMast) {
+        return allowBatchOutboundExecute(wrkMast, false);
+    }
+
+    private boolean allowBatchOutboundExecute(WrkMast wrkMast, boolean logBlockedReason) {
         if (wrkMast == null || Cools.isEmpty(wrkMast.getBatch())) {
             return true;
         }
 
         if (Cools.isEmpty(wrkMast.getBatchSeq())) {
-            News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 缂哄皯鎵规搴忓彿锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱", wrkMast.getBatch());
+            if (logBlockedReason) {
+                News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 缂哄皯鎵规搴忓彿锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱", wrkMast.getBatch());
+            }
             return false;
         }
 
@@ -479,7 +495,9 @@
         }
 
         if (Cools.isEmpty(firstBatchWrkMast.getBatchSeq())) {
-            News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 瀛樺湪鏈厤缃壒娆″簭鍙风殑浠诲姟锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱", wrkMast.getBatch());
+            if (logBlockedReason) {
+                News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 瀛樺湪鏈厤缃壒娆″簭鍙风殑浠诲姟锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱", wrkMast.getBatch());
+            }
             return false;
         }
 
@@ -487,7 +505,9 @@
         boolean firstBatchTaskExecuted = firstBatchWrkMast.getWrkSts() != null
                 && !firstBatchWrkMast.getWrkSts().equals(WrkStsType.NEW_OUTBOUND.sts);
         if (!currentIsFirstBatchTask && !firstBatchTaskExecuted) {
-            News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 棣栦釜搴忓彿浠诲姟:{} 灏氭湭鎵ц锛屽綋鍓嶄换鍔℃殏涓嶅厑璁稿嚭搴�", wrkMast.getBatch(), firstBatchWrkMast.getWrkNo());
+            if (logBlockedReason) {
+                News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 棣栦釜搴忓彿浠诲姟:{} 灏氭湭鎵ц锛屽綋鍓嶄换鍔℃殏涓嶅厑璁稿嚭搴�", wrkMast.getBatch(), firstBatchWrkMast.getWrkNo());
+            }
             return false;
         }
 
@@ -498,19 +518,24 @@
 
         List<WrkMast> unfinishedBatchWrkMasts = listUnfinishedBatchWrkMasts(wrkMast.getBatch());
         if (hasMissingBatchSeq(unfinishedBatchWrkMasts)) {
-            News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 瀛樺湪鏈厤缃壒娆″簭鍙风殑鏈畬鎴愪换鍔★紝鏆備笉鍏佽鍫嗗灈鏈哄嚭搴�", wrkMast.getBatch());
+            if (logBlockedReason) {
+                News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 瀛樺湪鏈厤缃壒娆″簭鍙风殑鏈畬鎴愪换鍔★紝鏆備笉鍏佽鍫嗗灈鏈哄嚭搴�", wrkMast.getBatch());
+            }
             return false;
         }
 
         if (!isWithinBatchExecuteWindow(wrkMast, unfinishedBatchWrkMasts, batchRunningLimit)) {
-            Integer windowStartSeq = unfinishedBatchWrkMasts.get(0).getBatchSeq();
-            Integer windowEndSeq = unfinishedBatchWrkMasts.get(Math.min(batchRunningLimit, unfinishedBatchWrkMasts.size()) - 1).getBatchSeq();
-            News.taskInfo(wrkMast.getWrkNo(),
-                    "鎵规:{} 褰撳墠涓ユ牸鎵ц绐楀彛搴忓彿涓篬{}-{}]锛屽綋鍓嶅簭鍙�={}锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱",
-                    wrkMast.getBatch(),
-                    windowStartSeq,
-                    windowEndSeq,
-                    wrkMast.getBatchSeq());
+            if (logBlockedReason) {
+                List<Integer> windowBatchSeqList = unfinishedBatchWrkMasts.stream()
+                        .limit(Math.min(batchRunningLimit, unfinishedBatchWrkMasts.size()))
+                        .map(WrkMast::getBatchSeq)
+                        .collect(java.util.stream.Collectors.toList());
+                News.taskInfo(wrkMast.getWrkNo(),
+                        "鎵规:{} 褰撳墠涓ユ牸鎵ц绐楀彛搴忓彿鍒楄〃涓簕}锛屽綋鍓嶅簭鍙�={}锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱",
+                        wrkMast.getBatch(),
+                        windowBatchSeqList,
+                        wrkMast.getBatchSeq());
+            }
             return false;
         }
 
@@ -522,7 +547,9 @@
                         WrkStsType.COMPLETE_OUTBOUND.sts,
                         WrkStsType.SETTLE_OUTBOUND.sts));
         if (batchRunningCount >= batchRunningLimit) {
-            News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 鎵ц涓换鍔℃暟杈惧埌涓婇檺锛屽綋鍓�={}锛屼笂闄�={}", wrkMast.getBatch(), batchRunningCount, batchRunningLimit);
+            if (logBlockedReason) {
+                News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 鎵ц涓换鍔℃暟杈惧埌涓婇檺锛屽綋鍓�={}锛屼笂闄�={}", wrkMast.getBatch(), batchRunningCount, batchRunningLimit);
+            }
             return false;
         }
 
@@ -728,16 +755,15 @@
     }
 
     public synchronized void plannerExecute() {
-        Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
         List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
         for (BasCrnp basCrnp : basCrnps) {
-            plannerExecute(basCrnp, crnMoveBlockedCrnNos);
+            plannerExecute(basCrnp);
         }
     }
 
-    private void plannerExecute(BasCrnp basCrnp, Set<Integer> crnMoveBlockedCrnNos) {
+    private void plannerExecute(BasCrnp basCrnp) {
         int nowSec = (int) (System.currentTimeMillis() / 1000);
-        if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
+        if (basCrnp == null || basCrnp.getCrnNo() == null) {
             return;
         }
             String key = RedisKeyType.PLANNER_SCHEDULE.key + "CRN-" + basCrnp.getCrnNo();
@@ -886,76 +912,20 @@
         return false;
     }
 
-    private Set<Integer> executeCrnMoveTask() {
-        List<WrkMast> pendingTaskQueue = wrkMastService.list(new QueryWrapper<WrkMast>()
-                .eq("io_type", WrkIoType.CRN_MOVE.id)
-                .eq("wrk_sts", WrkStsType.NEW_CRN_MOVE.sts)
-                .orderByAsc("appe_time")
-                .orderByAsc("wrk_no"));
-        Set<Integer> blockedCrnNoSet = new HashSet<>();
-        for (WrkMast wrkMast : pendingTaskQueue) {
-            if (wrkMast != null && wrkMast.getCrnNo() != null) {
-                blockedCrnNoSet.add(wrkMast.getCrnNo());
-            }
-        }
-        if (blockedCrnNoSet.isEmpty()) {
-            return blockedCrnNoSet;
-        }
-
-        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
-        Map<Integer, CrnThread> dispatchThreadMap = new HashMap<>();
-        Map<Integer, CrnProtocol> dispatchProtocolMap = new HashMap<>();
-        for (BasCrnp basCrnp : basCrnps) {
-            if (basCrnp == null || basCrnp.getCrnNo() == null) {
-                continue;
-            }
-
-            Integer crnNo = basCrnp.getCrnNo();
-            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo);
-            if (crnThread == null) {
-                continue;
-            }
-
-            CrnProtocol crnProtocol = crnThread.getStatus();
-            if (crnProtocol == null) {
-                continue;
-            }
-
-            long runningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
-                    .eq("crn_no", crnNo)
-                    .in("wrk_sts",
-                            WrkStsType.INBOUND_RUN.sts,
-                            WrkStsType.OUTBOUND_RUN.sts,
-                            WrkStsType.LOC_MOVE_RUN.sts,
-                            WrkStsType.CRN_MOVE_RUN.sts));
-            if (runningCount > 0) {
-                continue;
-            }
-
-            if (!Objects.equals(crnProtocol.getMode(), CrnModeType.AUTO.id)
-                    || !Objects.equals(crnProtocol.getTaskNo(), 0)
-                    || !Objects.equals(crnProtocol.getStatus(), CrnStatusType.IDLE.id)
-                    || !Objects.equals(crnProtocol.getLoaded(), 0)
-                    || !Objects.equals(crnProtocol.getForkPos(), 0)
-                    || !Objects.equals(crnProtocol.getAlarm(), 0)) {
-                continue;
-            }
-
-            Object clearLock = redisUtil.get(RedisKeyType.CLEAR_CRN_TASK_LIMIT.key + crnNo);
-            if (clearLock != null) {
-                continue;
-            }
-
-            dispatchThreadMap.put(crnNo, crnThread);
-            dispatchProtocolMap.put(crnNo, crnProtocol);
-        }
-
-        if (dispatchThreadMap.isEmpty()) {
-            return blockedCrnNoSet;
+    private boolean executeCrnMoveTask(CrnThread crnThread, CrnProtocol crnProtocol) {
+        long runningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
+                .eq("crn_no", crnProtocol.getCrnNo())
+                .in("wrk_sts",
+                        WrkStsType.INBOUND_RUN.sts,
+                        WrkStsType.OUTBOUND_RUN.sts,
+                        WrkStsType.LOC_MOVE_RUN.sts,
+                        WrkStsType.CRN_MOVE_RUN.sts));
+        if (runningCount > 0) {
+            return false;
         }
 
         List<WrkMast> taskQueue = wrkMastService.list(new QueryWrapper<WrkMast>()
-                .in("crn_no", new ArrayList<>(dispatchThreadMap.keySet()))
+                .eq("crn_no", crnProtocol.getCrnNo())
                 .eq("io_type", WrkIoType.CRN_MOVE.id)
                 .eq("wrk_sts", WrkStsType.NEW_CRN_MOVE.sts)
                 .orderByAsc("appe_time")
@@ -966,36 +936,38 @@
                 continue;
             }
 
-            Integer crnNo = wrkMast.getCrnNo();
-            CrnThread crnThread = dispatchThreadMap.get(crnNo);
-            if (crnThread == null || dispatchProtocolMap.get(crnNo) == null) {
+            if (crnProtocol.getBay() == Utils.getBay(wrkMast.getLocNo())) {
+                Date now = new Date();
+                wrkMast.setWrkSts(WrkStsType.COMPLETE_CRN_MOVE.sts);
+                wrkMast.setSystemMsg("鍫嗗灈鏈哄凡鍦ㄧ洰鏍囩偣锛屼换鍔$洿鎺ュ畬鎴�");
+                wrkMast.setIoTime(now);
+                wrkMast.setModiTime(now);
+                if (wrkMastService.updateById(wrkMast)) {
+                    wrkAnalysisService.markCraneStart(wrkMast, now);
+                }
                 continue;
             }
 
-            CrnCommand moveCommand = crnThread.getMoveCommand(wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
+            CrnCommand moveCommand = crnThread.getMoveCommand(wrkMast.getLocNo(), wrkMast.getWrkNo(), crnProtocol.getCrnNo());
             if (moveCommand == null) {
                 continue;
             }
 
             Date now = new Date();
             wrkMast.setWrkSts(WrkStsType.CRN_MOVE_RUN.sts);
-            wrkMast.setCrnNo(crnNo);
             wrkMast.setSystemMsg("");
             wrkMast.setIoTime(now);
             wrkMast.setModiTime(now);
             if (wrkMastService.updateById(wrkMast)) {
                 wrkAnalysisService.markCraneStart(wrkMast, now);
-                MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, moveCommand));
+                MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, moveCommand));
                 News.info("鍫嗗灈鏈虹Щ鍔ㄥ懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}锛岀洰鏍囦綅={}锛屼换鍔℃暟鎹�={}",
-                        crnNo, wrkMast.getWrkNo(), wrkMast.getLocNo(), JSON.toJSON(moveCommand));
-                return blockedCrnNoSet;
+                        crnProtocol.getCrnNo(), wrkMast.getWrkNo(), wrkMast.getLocNo(), JSON.toJSON(moveCommand));
+                return true;
             }
         }
-        return blockedCrnNoSet;
-    }
 
-    public Set<Integer> executeCrnMoveTaskAndGetBlockedCrnNos() {
-        return executeCrnMoveTask();
+        return false;
     }
 
     public void submitCrnIoTasks(long minIntervalMs) {
@@ -1003,7 +975,6 @@
     }
 
     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();
@@ -1015,7 +986,7 @@
                     crnNo,
                     "crnIoExecute",
                     minIntervalMs,
-                    () -> crnIoExecute(basCrnp, blockedCrnNos)
+                    () -> crnIoExecute(basCrnp)
             );
         }
     }
@@ -1105,6 +1076,10 @@
 
     //璋冨害鍫嗗灈鏈虹Щ鍔�
     public synchronized boolean dispatchCrnMove(Integer crnNo, String targetLocNo) {
+        return dispatchCrnMove(crnNo, targetLocNo, false);
+    }
+
+    public synchronized boolean dispatchCrnMove(Integer crnNo, String targetLocNo, boolean allowQueueWhenBusy) {
         if (crnNo == null || Cools.isEmpty(targetLocNo)) {
             return false;
         }
@@ -1135,20 +1110,18 @@
             return false;
         }
 
-        if (crnProtocol.getLevel() == targetLev) {
-            return false;
-        }
-
-        long runningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
-                .eq("crn_no", crnNo)
-                .in("wrk_sts",
-                        WrkStsType.INBOUND_RUN.sts,
-                        WrkStsType.OUTBOUND_RUN.sts,
-                        WrkStsType.LOC_MOVE_RUN.sts,
-                        WrkStsType.CRN_MOVE_RUN.sts));
-        if (runningCount > 0) {
-            News.info("鍫嗗灈鏈�:{} 瀛樺湪鎵ц涓殑浠诲姟锛屾殏涓嶇敓鎴愮Щ鍔ㄤ换鍔�", crnNo);
-            return false;
+        if (!allowQueueWhenBusy) {
+            long runningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
+                    .eq("crn_no", crnNo)
+                    .in("wrk_sts",
+                            WrkStsType.INBOUND_RUN.sts,
+                            WrkStsType.OUTBOUND_RUN.sts,
+                            WrkStsType.LOC_MOVE_RUN.sts,
+                            WrkStsType.CRN_MOVE_RUN.sts));
+            if (runningCount > 0) {
+                News.info("鍫嗗灈鏈�:{} 瀛樺湪鎵ц涓殑浠诲姟锛屾殏涓嶇敓鎴愮Щ鍔ㄤ换鍔�", crnNo);
+                return false;
+            }
         }
 
         WrkMast activeTask = wrkMastService.getOne(new QueryWrapper<WrkMast>()

--
Gitblit v1.9.1