From d62f97dabd206364220b74dfa0bb065d4e64dc7b Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 20 三月 2026 18:16:56 +0800
Subject: [PATCH] #

---
 src/main/webapp/components/MapCanvas.js                                     |    6 ++
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java             |    3 +
 src/main/java/com/zy/asrs/domain/vo/StationCycleCapacityVo.java             |    8 +++
 src/main/java/com/zy/asrs/service/impl/StationCycleCapacityServiceImpl.java |   45 ++++++++++++++++++----
 src/main/java/com/zy/asrs/domain/vo/StationCycleLoopVo.java                 |    8 +++
 src/main/webapp/static/js/common.js                                         |    5 ++
 6 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/zy/asrs/domain/vo/StationCycleCapacityVo.java b/src/main/java/com/zy/asrs/domain/vo/StationCycleCapacityVo.java
index fbcfda4..6e0403c 100644
--- a/src/main/java/com/zy/asrs/domain/vo/StationCycleCapacityVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/StationCycleCapacityVo.java
@@ -21,7 +21,13 @@
     // 寰幆鍦堜腑鏈変换鍔$珯鐐规�绘暟
     private Integer taskStationCount = 0;
 
-    // 褰撳墠鎵胯浇閲忥紙0-1锛夛細褰撳墠浠诲姟鏁� / 寰幆鍦堟�荤珯鐐规暟
+    // 寰幆鍦堜腑鎵嬪姩绔欑偣鎬绘暟锛堜笉涓庝换鍔$珯鐐归噸澶嶈鏁帮級
+    private Integer manualStationCount = 0;
+
+    // 寰幆鍦堜腑鍗犵敤绔欑偣鎬绘暟 = 浠诲姟绔欑偣 + 鎵嬪姩绔欑偣
+    private Integer occupiedStationCount = 0;
+
+    // 褰撳墠鎵胯浇閲忥紙0-1锛夛細褰撳墠鍗犵敤绔欑偣鏁� / 寰幆鍦堟�荤珯鐐规暟
     private Double currentLoad = 0.0;
 
     // 鏈�鏂板埛鏂版椂闂�
diff --git a/src/main/java/com/zy/asrs/domain/vo/StationCycleLoopVo.java b/src/main/java/com/zy/asrs/domain/vo/StationCycleLoopVo.java
index 0c84768..ce08200 100644
--- a/src/main/java/com/zy/asrs/domain/vo/StationCycleLoopVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/StationCycleLoopVo.java
@@ -23,6 +23,12 @@
     // 寰幆鍦堝唴鏈変换鍔$珯鐐规暟
     private Integer taskCount = 0;
 
-    // 褰撳墠鎵胯浇閲忥紙0-1锛夛細褰撳墠浠诲姟鏁� / 褰撳墠寰幆鍦堟�荤珯鐐规暟
+    // 寰幆鍦堝唴鎵嬪姩绔欑偣鏁帮紙涓嶄笌浠诲姟绔欑偣閲嶅璁℃暟锛�
+    private Integer manualStationCount = 0;
+
+    // 寰幆鍦堝唴鍗犵敤绔欑偣鏁� = 浠诲姟绔欑偣 + 鎵嬪姩绔欑偣
+    private Integer occupiedStationCount = 0;
+
+    // 褰撳墠鎵胯浇閲忥紙0-1锛夛細褰撳墠鍗犵敤绔欑偣鏁� / 褰撳墠寰幆鍦堟�荤珯鐐规暟
     private Double currentLoad = 0.0;
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/StationCycleCapacityServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/StationCycleCapacityServiceImpl.java
index f06ff9a..08525e5 100644
--- a/src/main/java/com/zy/asrs/service/impl/StationCycleCapacityServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/StationCycleCapacityServiceImpl.java
@@ -74,7 +74,9 @@
 
     private StationCycleCapacityVo buildSnapshot() {
         GraphContext context = buildStationGraph();
-        Map<Integer, Integer> workNoMap = buildStationWorkNoMap();
+        StationOccupancyContext occupancyContext = buildStationOccupancyContext();
+        Map<Integer, Integer> workNoMap = occupancyContext.workNoMap;
+        Set<Integer> manualStationSet = occupancyContext.manualStationSet;
 
         Set<Integer> availableStationSet = new HashSet<>(context.graph.keySet());
         availableStationSet.removeAll(context.excludeStationSet);
@@ -97,6 +99,8 @@
         int loopNo = 1;
         int totalStationCount = 0;
         int taskStationCount = 0;
+        int manualStationCount = 0;
+        int occupiedStationCount = 0;
         Set<Integer> actualWorkNoSet = new HashSet<>();
 
         for (Set<Integer> scc : sccList) {
@@ -112,12 +116,17 @@
 
                 List<Integer> workNoList = new ArrayList<>();
                 int currentLoopTaskCount = 0;
+                int currentLoopManualStationCount = 0;
                 for (Integer stationId : stationIdList) {
                     Integer workNo = workNoMap.get(stationId);
                     if (workNo != null && workNo > 0) {
                         workNoList.add(workNo);
                         currentLoopTaskCount++;
                         actualWorkNoSet.add(workNo);
+                        continue;
+                    }
+                    if (manualStationSet.contains(stationId)) {
+                        currentLoopManualStationCount++;
                     }
                 }
 
@@ -127,23 +136,30 @@
                 loopVo.setWorkNoList(workNoList);
                 loopVo.setStationCount(stationIdList.size());
                 loopVo.setTaskCount(currentLoopTaskCount);
-                loopVo.setCurrentLoad(calcCurrentLoad(currentLoopTaskCount, stationIdList.size()));
+                loopVo.setManualStationCount(currentLoopManualStationCount);
+                loopVo.setOccupiedStationCount(currentLoopTaskCount + currentLoopManualStationCount);
+                loopVo.setCurrentLoad(calcCurrentLoad(toNonNegative(loopVo.getOccupiedStationCount()), stationIdList.size()));
                 loopList.add(loopVo);
 
                 totalStationCount += stationIdList.size();
                 taskStationCount += currentLoopTaskCount;
+                manualStationCount += currentLoopManualStationCount;
+                occupiedStationCount += toNonNegative(loopVo.getOccupiedStationCount());
             }
         }
 
         int reserveTaskCount = mergeReserveTaskCount(loopList, actualWorkNoSet);
         taskStationCount += reserveTaskCount;
+        occupiedStationCount += reserveTaskCount;
 
         StationCycleCapacityVo vo = new StationCycleCapacityVo();
         vo.setLoopList(loopList);
         vo.setLoopCount(loopList.size());
         vo.setTotalStationCount(totalStationCount);
         vo.setTaskStationCount(taskStationCount);
-        vo.setCurrentLoad(calcCurrentLoad(taskStationCount, totalStationCount));
+        vo.setManualStationCount(manualStationCount);
+        vo.setOccupiedStationCount(occupiedStationCount);
+        vo.setCurrentLoad(calcCurrentLoad(occupiedStationCount, totalStationCount));
         vo.setRefreshTime(new Date());
         return vo;
     }
@@ -217,8 +233,10 @@
             Collections.sort(workNoList);
 
             int mergedTaskCount = toNonNegative(loopVo.getTaskCount()) + 1;
+            int mergedOccupiedCount = toNonNegative(loopVo.getOccupiedStationCount()) + 1;
             loopVo.setTaskCount(mergedTaskCount);
-            loopVo.setCurrentLoad(calcCurrentLoad(mergedTaskCount, toNonNegative(loopVo.getStationCount())));
+            loopVo.setOccupiedStationCount(mergedOccupiedCount);
+            loopVo.setCurrentLoad(calcCurrentLoad(mergedOccupiedCount, toNonNegative(loopVo.getStationCount())));
             mergedCount++;
         }
 
@@ -416,12 +434,12 @@
                 || (isBarcodeStation != null && isBarcodeStation == 1);
     }
 
-    private Map<Integer, Integer> buildStationWorkNoMap() {
-        Map<Integer, Integer> workNoMap = new HashMap<>();
+    private StationOccupancyContext buildStationOccupancyContext() {
+        StationOccupancyContext context = new StationOccupancyContext();
         List<DeviceConfig> devpList = deviceConfigService.list(new QueryWrapper<DeviceConfig>()
                 .eq("device_type", String.valueOf(SlaveType.Devp)));
         if (devpList == null || devpList.isEmpty()) {
-            return workNoMap;
+            return context;
         }
 
         for (DeviceConfig deviceConfig : devpList) {
@@ -440,11 +458,15 @@
                 }
                 Integer taskNo = protocol.getTaskNo();
                 if (taskNo != null && taskNo > 0) {
-                    workNoMap.put(protocol.getStationId(), taskNo);
+                    context.workNoMap.put(protocol.getStationId(), taskNo);
+                    continue;
+                }
+                if (!protocol.isAutoing()) {
+                    context.manualStationSet.add(protocol.getStationId());
                 }
             }
         }
-        return workNoMap;
+        return context;
     }
 
     private List<Set<Integer>> findStrongConnectedComponents(Map<Integer, Set<Integer>> graph) {
@@ -620,4 +642,9 @@
         private final Map<Integer, Set<Integer>> graph = new HashMap<>();
         private final Set<Integer> excludeStationSet = new HashSet<>();
     }
+
+    private static class StationOccupancyContext {
+        private final Map<Integer, Integer> workNoMap = new HashMap<>();
+        private final Set<Integer> manualStationSet = new HashSet<>();
+    }
 }
diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index 7851a04..1224d5d 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -906,7 +906,8 @@
         }
 
         state.totalStationCount = toNonNegative(capacityVo.getTotalStationCount());
-        state.projectedTaskStationCount = toNonNegative(capacityVo.getTaskStationCount());
+        Integer occupiedStationCount = capacityVo.getOccupiedStationCount();
+        state.projectedTaskStationCount = toNonNegative(occupiedStationCount != null ? occupiedStationCount : capacityVo.getTaskStationCount());
 
         List<StationCycleLoopVo> loopList = capacityVo.getLoopList();
         if (loopList != null) {
diff --git a/src/main/webapp/components/MapCanvas.js b/src/main/webapp/components/MapCanvas.js
index 3dfb358..4c2292e 100644
--- a/src/main/webapp/components/MapCanvas.js
+++ b/src/main/webapp/components/MapCanvas.js
@@ -12,6 +12,7 @@
             鍦坽{ item.loopNo }} |
             绔欑偣: {{ item.stationCount || 0 }} |
             浠诲姟: {{ item.taskCount || 0 }} |
+            鎵嬪姩: {{ item.manualStationCount || 0 }} |
             鎵胯浇: {{ formatLoadPercent(item.currentLoad) }}
           </div>
         </div>
@@ -129,6 +130,8 @@
         loopList: [],
         totalStationCount: 0,
         taskStationCount: 0,
+        manualStationCount: 0,
+        occupiedStationCount: 0,
         currentLoad: 0
       },
       showMapToolPanel: false,
@@ -984,6 +987,8 @@
         loopList: loopList,
         totalStationCount: payload.totalStationCount || 0,
         taskStationCount: payload.taskStationCount || 0,
+        manualStationCount: payload.manualStationCount || 0,
+        occupiedStationCount: payload.occupiedStationCount || 0,
         currentLoad: typeof payload.currentLoad === 'number' ? payload.currentLoad : parseFloat(payload.currentLoad || 0)
       };
       if (this.hoverLoopNo != null) {
@@ -2794,7 +2799,6 @@
     }
   }
 });
-
 
 
 
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 277ebc8..21b1408 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -361,6 +361,11 @@
     function buildBuiltinRegexEntries() {
         return [
             {
+                regex: /^鍦�(\d+)\s*\|\s*绔欑偣:\s*(\d+)\s*\|\s*(?:浠诲姟|Task):\s*(\d+)\s*\|\s*(?:鎵嬪姩|Manual):\s*(\d+)\s*\|\s*鎵胯浇:\s*([\d.]+%)$/,
+                key: "legacy.regex.loopStatusWithManual",
+                fallback: "Zone {0} | Stations: {1} | Tasks: {2} | Manual: {3} | Load: {4}"
+            },
+            {
                 regex: /^鍦�(\d+)\s*\|\s*绔欑偣:\s*(\d+)\s*\|\s*(?:浠诲姟|Task):\s*(\d+)\s*\|\s*鎵胯浇:\s*([\d.]+%)$/,
                 key: "legacy.regex.loopStatus",
                 fallback: "Zone {0} | Stations: {1} | Tasks: {2} | Load: {3}"

--
Gitblit v1.9.1