From 46e61e6b3b26861799cd9c25191c4ce26d6c5258 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期六, 21 三月 2026 17:48:29 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/trace/StationTaskTraceRegistry.java |   72 ++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/core/trace/StationTaskTraceRegistry.java b/src/main/java/com/zy/core/trace/StationTaskTraceRegistry.java
index f983082..8cfca63 100644
--- a/src/main/java/com/zy/core/trace/StationTaskTraceRegistry.java
+++ b/src/main/java/com/zy/core/trace/StationTaskTraceRegistry.java
@@ -4,7 +4,10 @@
 import com.zy.asrs.domain.vo.StationTaskTraceEventVo;
 import com.zy.asrs.domain.vo.StationTaskTraceSegmentVo;
 import com.zy.asrs.domain.vo.StationTaskTraceVo;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.WrkMastService;
 import com.zy.common.utils.RedisUtil;
+import com.zy.core.enums.WrkStsType;
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.enums.RedisKeyType;
 import lombok.Data;
@@ -36,6 +39,9 @@
 
     @Autowired
     private RedisUtil redisUtil;
+
+    @Autowired
+    private WrkMastService wrkMastService;
 
     private final Map<Integer, TraceTaskState> taskStateMap = new ConcurrentHashMap<>();
     private volatile boolean loadedFromRedis = false;
@@ -149,6 +155,7 @@
     public List<StationTaskTraceVo> listLatestTraces() {
         ensureCacheLoaded();
         cleanupExpired();
+        reconcileInactiveBusinessTasks();
         List<StationTaskTraceVo> result = new ArrayList<>();
         for (TraceTaskState state : taskStateMap.values()) {
             if (state != null) {
@@ -166,6 +173,23 @@
         return result;
     }
 
+    public List<StationTaskTraceVo> listActiveTraces() {
+        List<StationTaskTraceVo> latestTraces = listLatestTraces();
+        List<StationTaskTraceVo> result = new ArrayList<>();
+        for (StationTaskTraceVo traceVo : latestTraces) {
+            if (traceVo == null) {
+                continue;
+            }
+            String status = traceVo.getStatus();
+            if (STATUS_WAITING.equals(status)
+                    || STATUS_RUNNING.equals(status)
+                    || STATUS_REROUTED.equals(status)) {
+                result.add(traceVo);
+            }
+        }
+        return result;
+    }
+
     private void cleanupExpired() {
         long now = System.currentTimeMillis();
         for (Map.Entry<Integer, TraceTaskState> entry : taskStateMap.entrySet()) {
@@ -175,6 +199,50 @@
                 removePersistedState(entry.getKey());
             }
         }
+    }
+
+    private void reconcileInactiveBusinessTasks() {
+        if (wrkMastService == null) {
+            return;
+        }
+        for (TraceTaskState state : taskStateMap.values()) {
+            if (state == null || state.isTerminal()) {
+                continue;
+            }
+            WrkMast wrkMast;
+            try {
+                wrkMast = wrkMastService.selectByWorkNo(state.taskNo);
+            } catch (Exception ignore) {
+                continue;
+            }
+            if (wrkMast == null || isStationTraceActiveWrkStatus(wrkMast.getWrkSts())) {
+                continue;
+            }
+            Integer currentStationId = state.currentStationId != null ? state.currentStationId : state.finalTargetStationId;
+            Map<String, Object> details = new LinkedHashMap<>();
+            details.put("reason", "wrk_status_transition");
+            details.put("wrkSts", wrkMast.getWrkSts());
+            details.put("wrkStsDesc", wrkMast.getWrkSts$());
+            if (isManualWrkStatus(wrkMast.getWrkSts())) {
+                state.markTerminal(state.traceVersion, STATUS_CANCELLED, currentStationId, null,
+                        "AUTO_CANCELLED", "杈撻�佷换鍔″凡閫�鍑鸿繍琛岋紝杞ㄨ抗鑷姩缁撴潫", details);
+            } else {
+                state.markTerminal(state.traceVersion, STATUS_FINISHED, currentStationId, null,
+                        "AUTO_FINISHED", "杈撻�佷换鍔″凡缁撴潫锛岃建杩硅嚜鍔ㄧ粨鏉�", details);
+            }
+            persistState(state);
+        }
+    }
+
+    private boolean isStationTraceActiveWrkStatus(Long wrkSts) {
+        return Objects.equals(wrkSts, WrkStsType.INBOUND_DEVICE_RUN.sts)
+                || Objects.equals(wrkSts, WrkStsType.STATION_RUN.sts);
+    }
+
+    private boolean isManualWrkStatus(Long wrkSts) {
+        return Objects.equals(wrkSts, WrkStsType.INBOUND_MANUAL.sts)
+                || Objects.equals(wrkSts, WrkStsType.OUTBOUND_MANUAL.sts)
+                || Objects.equals(wrkSts, WrkStsType.LOC_MOVE_MANUAL.sts);
     }
 
     private void ensureCacheLoaded() {
@@ -548,6 +616,10 @@
             return terminalExpireAt != null && terminalExpireAt <= now;
         }
 
+        private synchronized boolean isTerminal() {
+            return isTerminalStatus(this.status);
+        }
+
         private synchronized StationTaskTraceVo toVo() {
             StationTaskTraceVo vo = new StationTaskTraceVo();
             vo.setTaskNo(taskNo);

--
Gitblit v1.9.1