From d16c9af7bb89a7e3abb4071003c63b3a6f6b9e4b Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 07 四月 2026 14:45:27 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/utils/station/StationRerouteProcessor.java |  345 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 188 insertions(+), 157 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/station/StationRerouteProcessor.java b/src/main/java/com/zy/core/utils/station/StationRerouteProcessor.java
index 42034af..985ab4c 100644
--- a/src/main/java/com/zy/core/utils/station/StationRerouteProcessor.java
+++ b/src/main/java/com/zy/core/utils/station/StationRerouteProcessor.java
@@ -75,178 +75,188 @@
     @Autowired
     private StationDispatchRuntimeStateSupport stationDispatchRuntimeStateSupport;
 
-    public void checkStationRunBlock() {
+    public void checkStationRunBlock(BasDevp basDevp, Integer stationId) {
         try {
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                List<Integer> runBlockReassignLocStationList = new ArrayList<>();
-                for (StationObjModel stationObjModel : basDevp.getRunBlockReassignLocStationList$()) {
-                    runBlockReassignLocStationList.add(stationObjModel.getStationId());
-                }
-                List<Integer> outOrderStationIds = basDevp.getOutOrderIntList();
-
-                for (StationProtocol stationProtocol : stationThread.getStatus()) {
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.getTaskNo() > 0
-                            && stationProtocol.isRunBlock()) {
-                        WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
-                        if (wrkMast == null) {
-                            News.info("杈撻�佺珯鐐瑰彿={} 杩愯闃诲锛屼絾鏃犳硶鎵惧埌瀵瑰簲浠诲姟锛屽伐浣滃彿={}", stationProtocol.getStationId(), stationProtocol.getTaskNo());
-                            continue;
-                        }
-
-                        Object lock = redisUtil.get(RedisKeyType.CHECK_STATION_RUN_BLOCK_LIMIT_.key + stationProtocol.getTaskNo());
-                        if (lock != null) {
-                            continue;
-                        }
-                        redisUtil.set(RedisKeyType.CHECK_STATION_RUN_BLOCK_LIMIT_.key + stationProtocol.getTaskNo(), "lock", 15);
-
-                        if (shouldUseRunBlockDirectReassign(wrkMast, stationProtocol.getStationId(), runBlockReassignLocStationList)) {
-                            executeRunBlockDirectReassign(basDevp, stationThread, stationProtocol, wrkMast);
-                            continue;
-                        }
-
-                        Double pathLenFactor = stationOutboundDecisionSupport.resolveOutboundPathLenFactor(wrkMast);
-                        RerouteContext context = RerouteContext.create(
-                                RerouteSceneType.RUN_BLOCK_REROUTE,
-                                basDevp,
-                                stationThread,
-                                stationProtocol,
-                                wrkMast,
-                                outOrderStationIds,
-                                pathLenFactor,
-                                "checkStationRunBlock_reroute"
-                        ).withRunBlockCommand()
-                                .withSuppressDispatchGuard()
-                                .withCancelSessionBeforeDispatch()
-                                .withResetSegmentCommandsBeforeDispatch();
-                        executeSharedReroute(context);
-                    }
-                }
+            if (basDevp == null || basDevp.getDevpNo() == null || stationId == null) {
+                return;
             }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void checkStationIdleRecover() {
-        try {
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                for (StationProtocol stationProtocol : stationThread.getStatus()) {
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.getTaskNo() > 0
-                            && !stationProtocol.isRunBlock()) {
-                        checkStationIdleRecover(basDevp, stationThread, stationProtocol, basDevp.getOutOrderIntList());
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void checkStationOutOrder() {
-        List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<BasDevp>());
-        for (BasDevp basDevp : basDevps) {
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
             if (stationThread == null) {
-                continue;
+                return;
+            }
+
+            Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
+            StationProtocol stationProtocol = statusMap == null ? null : statusMap.get(stationId);
+            if (stationProtocol == null
+                    || !stationProtocol.isAutoing()
+                    || !stationProtocol.isLoading()
+                    || stationProtocol.getTaskNo() <= 0
+                    || !stationProtocol.isRunBlock()) {
+                return;
+            }
+
+            List<Integer> runBlockReassignLocStationList = new ArrayList<>();
+            for (StationObjModel stationObjModel : basDevp.getRunBlockReassignLocStationList$()) {
+                runBlockReassignLocStationList.add(stationObjModel.getStationId());
+            }
+            List<Integer> outOrderStationIds = basDevp.getOutOrderIntList();
+
+            WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
+            if (wrkMast == null) {
+                News.info("杈撻�佺珯鐐瑰彿={} 杩愯闃诲锛屼絾鏃犳硶鎵惧埌瀵瑰簲浠诲姟锛屽伐浣滃彿={}", stationProtocol.getStationId(), stationProtocol.getTaskNo());
+                return;
+            }
+
+            Object lock = redisUtil.get(RedisKeyType.CHECK_STATION_RUN_BLOCK_LIMIT_.key + stationProtocol.getTaskNo());
+            if (lock != null) {
+                return;
+            }
+            redisUtil.set(RedisKeyType.CHECK_STATION_RUN_BLOCK_LIMIT_.key + stationProtocol.getTaskNo(), "lock", 30);
+
+            if (shouldUseRunBlockDirectReassign(wrkMast, stationProtocol.getStationId(), runBlockReassignLocStationList)) {
+                executeRunBlockDirectReassign(basDevp, stationThread, stationProtocol, wrkMast);
+                return;
+            }
+
+            Double pathLenFactor = stationOutboundDecisionSupport.resolveOutboundPathLenFactor(wrkMast);
+            RerouteContext context = RerouteContext.create(
+                    RerouteSceneType.RUN_BLOCK_REROUTE,
+                    basDevp,
+                    stationThread,
+                    stationProtocol,
+                    wrkMast,
+                    outOrderStationIds,
+                    pathLenFactor,
+                    "checkStationRunBlock_reroute"
+            ).withRunBlockCommand()
+                    .withSuppressDispatchGuard()
+                    .withCancelSessionBeforeDispatch()
+                    .withResetSegmentCommandsBeforeDispatch();
+            executeSharedReroute(context);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void checkStationIdleRecover(BasDevp basDevp, Integer stationId) {
+        try {
+            if (basDevp == null || basDevp.getDevpNo() == null || stationId == null) {
+                return;
+            }
+            if (!isIdleRecoverCandidateStation(basDevp, stationId)) {
+                return;
+            }
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+            if (stationThread == null) {
+                return;
             }
             Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
-            List<StationObjModel> orderList = basDevp.getOutOrderList$();
-            List<Integer> outOrderStationIds = basDevp.getOutOrderIntList();
-            for (StationObjModel stationObjModel : orderList) {
-                StationProtocol stationProtocol = statusMap.get(stationObjModel.getStationId());
-                if (stationProtocol == null
-                        || !stationProtocol.isAutoing()
-                        || !stationProtocol.isLoading()
-                        || stationProtocol.getTaskNo() <= 0
-                        || stationProtocol.isRunBlock()
-                        || !stationProtocol.getStationId().equals(stationProtocol.getTargetStaNo())) {
-                    continue;
-                }
-
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
-                if (wrkMast == null
-                        || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.STATION_RUN.sts)
-                        || Objects.equals(stationProtocol.getStationId(), wrkMast.getStaNo())) {
-                    continue;
-                }
-                if (stationOutboundDecisionSupport.shouldSkipOutOrderDispatchForExistingRoute(wrkMast.getWrkNo(), stationProtocol.getStationId())) {
-                    continue;
-                }
-
-                Double pathLenFactor = stationOutboundDecisionSupport.resolveOutboundPathLenFactor(wrkMast);
-                RerouteContext context = RerouteContext.create(
-                        RerouteSceneType.OUT_ORDER,
-                        basDevp,
-                        stationThread,
-                        stationProtocol,
-                        wrkMast,
-                        outOrderStationIds,
-                        pathLenFactor,
-                        "checkStationOutOrder"
-                ).withDispatchDeviceNo(stationObjModel.getDeviceNo())
-                        .withSuppressDispatchGuard()
-                        .withOutOrderDispatchLock()
-                        .withResetSegmentCommandsBeforeDispatch();
-                executeSharedReroute(context);
+            StationProtocol stationProtocol = statusMap == null ? null : statusMap.get(stationId);
+            if (stationProtocol == null
+                    || !stationProtocol.isAutoing()
+                    || !stationProtocol.isLoading()
+                    || stationProtocol.getTaskNo() <= 0
+                    || stationProtocol.isRunBlock()) {
+                return;
             }
+            checkStationIdleRecover(basDevp, stationThread, stationProtocol, basDevp.getOutOrderIntList());
+        } catch (Exception e) {
+            e.printStackTrace();
         }
     }
 
-    public void watchCircleStation() {
-        List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<BasDevp>());
-        for (BasDevp basDevp : basDevps) {
+    public void checkStationOutOrder(BasDevp basDevp, StationObjModel stationObjModel) {
+        try {
+            if (basDevp == null || basDevp.getDevpNo() == null || stationObjModel == null || stationObjModel.getStationId() == null) {
+                return;
+            }
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
             if (stationThread == null) {
-                continue;
+                return;
+            }
+            Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
+            StationProtocol stationProtocol = statusMap == null ? null : statusMap.get(stationObjModel.getStationId());
+            if (stationProtocol == null
+                    || !stationProtocol.isAutoing()
+                    || !stationProtocol.isLoading()
+                    || stationProtocol.getTaskNo() <= 0
+                    || stationProtocol.isRunBlock()
+                    || !stationProtocol.getStationId().equals(stationProtocol.getTargetStaNo())) {
+                return;
             }
 
-            List<Integer> outOrderList = basDevp.getOutOrderIntList();
-            for (StationProtocol stationProtocol : stationThread.getStatus()) {
-                if (!stationProtocol.isAutoing()
-                        || !stationProtocol.isLoading()
-                        || stationProtocol.getTaskNo() <= 0
-                        || !stationOutboundDecisionSupport.isWatchingCircleArrival(stationProtocol.getTaskNo(), stationProtocol.getStationId())) {
-                    continue;
-                }
-
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
-                if (wrkMast == null
-                        || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.STATION_RUN.sts)
-                        || Objects.equals(stationProtocol.getStationId(), wrkMast.getStaNo())) {
-                    continue;
-                }
-
-                Double pathLenFactor = stationOutboundDecisionSupport.resolveOutboundPathLenFactor(wrkMast);
-                RerouteContext context = RerouteContext.create(
-                        RerouteSceneType.WATCH_CIRCLE,
-                        basDevp,
-                        stationThread,
-                        stationProtocol,
-                        wrkMast,
-                        outOrderList,
-                        pathLenFactor,
-                        "watchCircleStation"
-                ).withSuppressDispatchGuard()
-                        .withOutOrderDispatchLock()
-                        .withResetSegmentCommandsBeforeDispatch();
-                executeSharedReroute(context);
+            WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
+            if (wrkMast == null
+                    || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.STATION_RUN.sts)
+                    || Objects.equals(stationProtocol.getStationId(), wrkMast.getStaNo())) {
+                return;
             }
+            if (stationOutboundDecisionSupport.shouldSkipOutOrderDispatchForExistingRoute(wrkMast.getWrkNo(), stationProtocol.getStationId())) {
+                return;
+            }
+
+            Double pathLenFactor = stationOutboundDecisionSupport.resolveOutboundPathLenFactor(wrkMast);
+            RerouteContext context = RerouteContext.create(
+                    RerouteSceneType.OUT_ORDER,
+                    basDevp,
+                    stationThread,
+                    stationProtocol,
+                    wrkMast,
+                    basDevp.getOutOrderIntList(),
+                    pathLenFactor,
+                    "checkStationOutOrder"
+            ).withDispatchDeviceNo(stationObjModel.getDeviceNo())
+                    .withSuppressDispatchGuard()
+                    .withOutOrderDispatchLock()
+                    .withResetSegmentCommandsBeforeDispatch();
+            executeSharedReroute(context);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void watchCircleStation(BasDevp basDevp, Integer stationId) {
+        try {
+            if (basDevp == null || basDevp.getDevpNo() == null || stationId == null) {
+                return;
+            }
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+            if (stationThread == null) {
+                return;
+            }
+            Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
+            StationProtocol stationProtocol = statusMap == null ? null : statusMap.get(stationId);
+            if (stationProtocol == null
+                    || !stationProtocol.isAutoing()
+                    || !stationProtocol.isLoading()
+                    || stationProtocol.getTaskNo() <= 0
+                    || !stationOutboundDecisionSupport.isWatchingCircleArrival(stationProtocol.getTaskNo(), stationProtocol.getStationId())) {
+                return;
+            }
+
+            WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
+            if (wrkMast == null
+                    || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.STATION_RUN.sts)
+                    || Objects.equals(stationProtocol.getStationId(), wrkMast.getStaNo())) {
+                return;
+            }
+
+            Double pathLenFactor = stationOutboundDecisionSupport.resolveOutboundPathLenFactor(wrkMast);
+            RerouteContext context = RerouteContext.create(
+                    RerouteSceneType.WATCH_CIRCLE,
+                    basDevp,
+                    stationThread,
+                    stationProtocol,
+                    wrkMast,
+                    basDevp.getOutOrderIntList(),
+                    pathLenFactor,
+                    "watchCircleStation"
+            ).withSuppressDispatchGuard()
+                    .withOutOrderDispatchLock()
+                    .withResetSegmentCommandsBeforeDispatch();
+            executeSharedReroute(context);
+        } catch (Exception e) {
+            e.printStackTrace();
         }
     }
 
@@ -403,6 +413,27 @@
         return true;
     }
 
+    private boolean isIdleRecoverCandidateStation(BasDevp basDevp, Integer stationId) {
+        if (basDevp == null || stationId == null) {
+            return false;
+        }
+        return !containsStation(basDevp.getBarcodeStationList$(), stationId)
+                && !containsStation(basDevp.getInStationList$(), stationId)
+                && !containsStation(basDevp.getOutStationList$(), stationId);
+    }
+
+    private boolean containsStation(List<StationObjModel> stationList, Integer stationId) {
+        if (stationList == null || stationList.isEmpty() || stationId == null) {
+            return false;
+        }
+        for (StationObjModel stationObjModel : stationList) {
+            if (stationObjModel != null && Objects.equals(stationObjModel.getStationId(), stationId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private RerouteExecutionResult executeReroutePlanWithTaskLock(RerouteContext context,
                                                                   RerouteCommandPlan plan,
                                                                   StationProtocol stationProtocol,

--
Gitblit v1.9.1