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

---
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java |   95 +++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 79 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index 5fcdbb4..8c5fed5 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -834,7 +834,7 @@
             Integer circleTarget = resolveNextCircleOrderTarget(
                     currentStationId,
                     outOrderStationIds,
-                    loopEvaluation.isLargeLoopTriggered()
+                    loopEvaluation.getExpectedLoopIssueCount()
             );
             if (circleTarget == null) {
                 News.taskInfo(wrkMast.getWrkNo(), "鐩爣绔欏綋鍓嶄笉鍙繘锛屼笖鏈壘鍒板彲鎵ц鐨勪笅涓�鎺掑簭妫�娴嬬偣锛屽綋鍓嶇珯鐐�={}", currentStationId);
@@ -851,7 +851,7 @@
         Integer circleTarget = resolveNextCircleOrderTarget(
                 currentStationId,
                 outOrderStationIds,
-                loopEvaluation.isLargeLoopTriggered()
+                loopEvaluation.getExpectedLoopIssueCount()
         );
         if (circleTarget == null) {
             News.taskInfo(wrkMast.getWrkNo(), "鏈壘鍒板彲鎵ц鐨勪笅涓�鎺掑簭妫�娴嬬偣锛屽綋鍓嶇珯鐐�={}", currentStationId);
@@ -1018,16 +1018,14 @@
 
     private Integer resolveNextCircleOrderTarget(Integer currentStationId,
                                                  List<Integer> orderedOutStationList,
-                                                 boolean preferLargeCircle) {
+                                                 Integer expectedLoopIssueCount) {
         if (currentStationId == null || orderedOutStationList == null || orderedOutStationList.size() <= 1) {
             return null;
         }
 
         int startIndex = orderedOutStationList.indexOf(currentStationId);
         int total = orderedOutStationList.size();
-        Integer bestStationId = null;
-        int bestPathLength = -1;
-        int bestOffset = -1;
+        List<CircleTargetCandidate> candidateList = new ArrayList<>();
         for (int offset = 1; offset < total; offset++) {
             int candidateIndex = (startIndex + offset + total) % total;
             Integer candidateStationId = orderedOutStationList.get(candidateIndex);
@@ -1037,19 +1035,60 @@
             try {
                 List<NavigateNode> path = navigateUtils.calcByStationId(currentStationId, candidateStationId);
                 if (path != null && !path.isEmpty()) {
-                    if (!preferLargeCircle) {
-                        return candidateStationId;
-                    }
-                    int pathLength = path.size();
-                    if (pathLength > bestPathLength || (pathLength == bestPathLength && offset > bestOffset)) {
-                        bestStationId = candidateStationId;
-                        bestPathLength = pathLength;
-                        bestOffset = offset;
-                    }
+                    candidateList.add(new CircleTargetCandidate(candidateStationId, path.size(), offset));
                 }
             } catch (Exception ignore) {}
         }
-        return bestStationId;
+        if (candidateList.isEmpty()) {
+            return null;
+        }
+        candidateList.sort(new Comparator<CircleTargetCandidate>() {
+            @Override
+            public int compare(CircleTargetCandidate left, CircleTargetCandidate right) {
+                if (left == right) {
+                    return 0;
+                }
+                if (left == null) {
+                    return 1;
+                }
+                if (right == null) {
+                    return -1;
+                }
+                int pathCompare = Integer.compare(left.getPathLength(), right.getPathLength());
+                if (pathCompare != 0) {
+                    return pathCompare;
+                }
+                return Integer.compare(left.getOffset(), right.getOffset());
+            }
+        });
+        return resolveGradualCircleTargetByPathLength(expectedLoopIssueCount, candidateList);
+    }
+
+    private Integer resolveGradualCircleTargetByPathLength(Integer expectedLoopIssueCount,
+                                                           List<CircleTargetCandidate> candidateList) {
+        if (candidateList == null || candidateList.isEmpty()) {
+            return null;
+        }
+        if (expectedLoopIssueCount == null || expectedLoopIssueCount <= 2) {
+            return candidateList.get(0).getStationId();
+        }
+
+        List<CircleTargetCandidate> tierList = new ArrayList<>();
+        Integer lastPathLength = null;
+        for (CircleTargetCandidate candidate : candidateList) {
+            if (candidate == null) {
+                continue;
+            }
+            if (lastPathLength == null || !Objects.equals(lastPathLength, candidate.getPathLength())) {
+                tierList.add(candidate);
+                lastPathLength = candidate.getPathLength();
+            }
+        }
+        if (tierList.isEmpty()) {
+            return candidateList.get(0).getStationId();
+        }
+        int tierIndex = Math.min(expectedLoopIssueCount - 2, tierList.size() - 1);
+        return tierList.get(tierIndex).getStationId();
     }
 
     private boolean tryAcquireOutOrderDispatchLock(Integer wrkNo, Integer stationId) {
@@ -1518,6 +1557,30 @@
         }
     }
 
+    private static class CircleTargetCandidate {
+        private final Integer stationId;
+        private final Integer pathLength;
+        private final Integer offset;
+
+        private CircleTargetCandidate(Integer stationId, Integer pathLength, Integer offset) {
+            this.stationId = stationId;
+            this.pathLength = pathLength == null ? 0 : pathLength;
+            this.offset = offset == null ? 0 : offset;
+        }
+
+        private Integer getStationId() {
+            return stationId;
+        }
+
+        private Integer getPathLength() {
+            return pathLength;
+        }
+
+        private Integer getOffset() {
+            return offset;
+        }
+    }
+
     private void saveLoopLoadReserve(Integer wrkNo, LoopHitResult loopHitResult) {
         if (wrkNo == null || wrkNo <= 0 || loopHitResult == null || !loopHitResult.isThroughLoop()) {
             return;

--
Gitblit v1.9.1