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