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

---
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java |   38 ++++++++++++++++++++++++++++----------
 1 files changed, 28 insertions(+), 10 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..71153a4 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -804,17 +804,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 +850,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