From 26784989e73fc36c6315e54939d1b13a50eb5020 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 26 三月 2026 21:03:00 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java |   56 +++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index 9ab571c..e3ece21 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -382,10 +382,11 @@
 
                 boolean complete = false;
                 Integer targetDeviceNo = null;
+                StationThread stationThread = null;
                 BasStation basStation = basStationService.getOne(new QueryWrapper<BasStation>().eq("station_id", targetStaNo));
                 if (basStation != null) {
                     targetDeviceNo = basStation.getDeviceNo();
-                    StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basStation.getDeviceNo());
+                    stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basStation.getDeviceNo());
                     if (stationThread != null) {
                         Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
                         StationProtocol stationProtocol = statusMap.get(basStation.getStationId());
@@ -396,11 +397,26 @@
                 }
 
                 if (complete) {
+                    attemptClearTaskPath(stationThread, wrkNo);
                     completeStationRunTask(wrkMast, targetDeviceNo);
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
+        }
+    }
+
+    private void attemptClearTaskPath(StationThread stationThread, Integer taskNo) {
+        if (stationThread == null || taskNo == null || taskNo <= 0) {
+            return;
+        }
+        try {
+            boolean cleared = stationThread.clearPath(taskNo);
+            if (cleared) {
+                News.info("杈撻�佺珯鐐逛换鍔¤繍琛屽畬鎴愬悗娓呯悊娈嬬暀璺緞锛屽伐浣滃彿={}", taskNo);
+            }
+        } catch (Exception e) {
+            News.error("杈撻�佺珯鐐逛换鍔¤繍琛屽畬鎴愬悗娓呯悊娈嬬暀璺緞寮傚父锛屽伐浣滃彿={}", taskNo, e);
         }
     }
 
@@ -804,17 +820,19 @@
         if (taskNo == null || taskNo <= 0 || stationId == null) {
             return RerouteExecutionResult.skip("invalid-station-task");
         }
-        boolean runBlockReroute = context.sceneType() == RerouteSceneType.RUN_BLOCK_REROUTE;
-        if (runBlockReroute) {
-            // 绔欑偣杩涘叆鍫靛鍚庯紝璁惧渚у彲鑳藉凡缁忔妸涔嬪墠棰勪笅鍙戠殑鍒嗘鍛戒护娓呮帀浜嗐��
-            // 鍏堜綔搴熸湰鍦� session/segment 鐘舵�侊紝鍐嶆寜鏂拌矾绾块噸鍙戯紝閬垮厤琚棫鐘舵�佸弽鍚戝崱浣忋��
-            if (context.cancelSessionBeforeDispatch() && stationMoveCoordinator != null) {
-                stationMoveCoordinator.cancelSession(taskNo);
-            }
-            if (context.resetSegmentCommandsBeforeDispatch()) {
-                resetSegmentMoveCommandsBeforeReroute(taskNo);
-            }
+        if (stationMoveCoordinator != null) {
+            return stationMoveCoordinator.withTaskDispatchLock(taskNo,
+                    () -> executeReroutePlanWithTaskLock(context, plan, stationProtocol, taskNo, stationId));
         }
+        return executeReroutePlanWithTaskLock(context, plan, stationProtocol, taskNo, stationId);
+    }
+
+    private RerouteExecutionResult executeReroutePlanWithTaskLock(RerouteContext context,
+                                                                  RerouteCommandPlan plan,
+                                                                  StationProtocol stationProtocol,
+                                                                  Integer taskNo,
+                                                                  Integer stationId) {
+        boolean runBlockReroute = context.sceneType() == RerouteSceneType.RUN_BLOCK_REROUTE;
         if (context.checkRecentDispatch()
                 && shouldSkipIdleRecoverForRecentDispatch(taskNo, stationId)) {
             return RerouteExecutionResult.skip("recent-dispatch");
@@ -848,6 +866,22 @@
             return RerouteExecutionResult.skip("out-order-lock");
         }
 
+        if (context.cancelSessionBeforeDispatch() && stationMoveCoordinator != null) {
+            // 鍒囪矾鍓嶅厛鎶婃棫 session 缃负 CANCEL_PENDING锛岃宸茬粡鎺掗槦涓殑鏃у垎娈电嚎绋嬪湪鏈�缁堝彂閫佸墠鍋滀笅銆�
+            stationMoveCoordinator.markCancelPending(taskNo, "reroute_pending");
+        }
+
+        if (runBlockReroute) {
+            // 绔欑偣杩涘叆鍫靛鍚庯紝璁惧渚у彲鑳藉凡缁忔妸涔嬪墠棰勪笅鍙戠殑鍒嗘鍛戒护娓呮帀浜嗐��
+            // 鍏堜綔搴熸湰鍦� session/segment 鐘舵�侊紝鍐嶆寜鏂拌矾绾块噸鍙戯紝閬垮厤琚棫鐘舵�佸弽鍚戝崱浣忋��
+            if (context.cancelSessionBeforeDispatch() && stationMoveCoordinator != null) {
+                stationMoveCoordinator.cancelSession(taskNo);
+            }
+            if (context.resetSegmentCommandsBeforeDispatch()) {
+                resetSegmentMoveCommandsBeforeReroute(taskNo);
+            }
+        }
+
         if (!runBlockReroute
                 && context.cancelSessionBeforeDispatch() && stationMoveCoordinator != null) {
             stationMoveCoordinator.cancelSession(taskNo);

--
Gitblit v1.9.1