| src/main/java/com/zy/asrs/task/InboundCrnMoveDispatchScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/task/InboundCrnMoveDispatchScheduler.java
@@ -20,17 +20,12 @@ import com.zy.core.model.protocol.StationProtocol; import com.zy.core.thread.StationThread; import com.zy.core.utils.CrnOperateProcessUtils; import com.zy.common.utils.RedisUtil; import com.zy.core.enums.RedisKeyType; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Component public class InboundCrnMoveDispatchScheduler { @@ -40,20 +35,17 @@ private final CommonService commonService; private final BasCrnpService basCrnpService; private final CrnOperateProcessUtils crnOperateProcessUtils; private final RedisUtil redisUtil; public InboundCrnMoveDispatchScheduler(WrkMastService wrkMastService, BasStationService basStationService, CommonService commonService, BasCrnpService basCrnpService, CrnOperateProcessUtils crnOperateProcessUtils, RedisUtil redisUtil) { CrnOperateProcessUtils crnOperateProcessUtils) { this.wrkMastService = wrkMastService; this.basStationService = basStationService; this.commonService = commonService; this.basCrnpService = basCrnpService; this.crnOperateProcessUtils = crnOperateProcessUtils; this.redisUtil = redisUtil; } @Scheduled(fixedDelay = 1000L) @@ -165,9 +157,9 @@ } return pendingOutboundTasks.stream() .filter(this::isBatchTaskWithSeq) .filter(task -> isWithinCurrentBatchExecuteWindow(task, pendingOutboundTasks)) .filter(this::isCrnMoveBlockingOutboundTask) .filter(this::isBatchTaskWithSeq) .filter(crnOperateProcessUtils::canOutboundTaskExecuteInCurrentBatchWindow) .findAny() .isPresent(); } @@ -186,44 +178,5 @@ return Objects.equals(wrkMast.getWrkSts(), WrkStsType.NEW_OUTBOUND.sts) || Objects.equals(wrkMast.getWrkSts(), WrkStsType.OUTBOUND_RUN.sts) || Objects.equals(wrkMast.getWrkSts(), WrkStsType.OUTBOUND_MANUAL.sts); } private boolean isWithinCurrentBatchExecuteWindow(WrkMast wrkMast, List<WrkMast> pendingOutboundTasks) { if (!isBatchTaskWithSeq(wrkMast) || pendingOutboundTasks == null || pendingOutboundTasks.isEmpty()) { return false; } int batchRunningLimit = getSystemConfigInt("crnOutBatchRunningLimit", 5); if (batchRunningLimit <= 0) { return true; } List<WrkMast> sameBatchTasks = pendingOutboundTasks.stream() .filter(this::isBatchTaskWithSeq) .filter(task -> Objects.equals(task.getBatch(), wrkMast.getBatch())) .sorted(Comparator.comparing(WrkMast::getBatchSeq).thenComparing(WrkMast::getWrkNo)) .collect(Collectors.toList()); if (sameBatchTasks.isEmpty()) { return false; } int windowSize = Math.min(batchRunningLimit, sameBatchTasks.size()); for (int i = 0; i < windowSize; i++) { WrkMast current = sameBatchTasks.get(i); if (current != null && Objects.equals(current.getWrkNo(), wrkMast.getWrkNo())) { return true; } } return false; } private int getSystemConfigInt(String code, int defaultValue) { Object systemConfigMapObj = redisUtil == null ? null : redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key); if (!(systemConfigMapObj instanceof HashMap)) { return defaultValue; } try { HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj; return Integer.parseInt(systemConfigMap.getOrDefault(code, String.valueOf(defaultValue))); } catch (Exception ignore) { return defaultValue; } } } src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -385,7 +385,7 @@ return false; } if (!allowBatchOutboundExecute(wrkMast)) { if (!allowBatchOutboundExecute(wrkMast, true)) { return false; } @@ -458,13 +458,19 @@ return false; } private boolean allowBatchOutboundExecute(WrkMast wrkMast) { public boolean canOutboundTaskExecuteInCurrentBatchWindow(WrkMast wrkMast) { return allowBatchOutboundExecute(wrkMast, false); } private boolean allowBatchOutboundExecute(WrkMast wrkMast, boolean logBlockedReason) { if (wrkMast == null || Cools.isEmpty(wrkMast.getBatch())) { return true; } if (Cools.isEmpty(wrkMast.getBatchSeq())) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 缺少批次序号,暂不允许堆垛机出库", wrkMast.getBatch()); if (logBlockedReason) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 缺少批次序号,暂不允许堆垛机出库", wrkMast.getBatch()); } return false; } @@ -479,7 +485,9 @@ } if (Cools.isEmpty(firstBatchWrkMast.getBatchSeq())) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 存在未配置批次序号的任务,暂不允许堆垛机出库", wrkMast.getBatch()); if (logBlockedReason) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 存在未配置批次序号的任务,暂不允许堆垛机出库", wrkMast.getBatch()); } return false; } @@ -487,7 +495,9 @@ boolean firstBatchTaskExecuted = firstBatchWrkMast.getWrkSts() != null && !firstBatchWrkMast.getWrkSts().equals(WrkStsType.NEW_OUTBOUND.sts); if (!currentIsFirstBatchTask && !firstBatchTaskExecuted) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 首个序号任务:{} 尚未执行,当前任务暂不允许出库", wrkMast.getBatch(), firstBatchWrkMast.getWrkNo()); if (logBlockedReason) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 首个序号任务:{} 尚未执行,当前任务暂不允许出库", wrkMast.getBatch(), firstBatchWrkMast.getWrkNo()); } return false; } @@ -498,20 +508,24 @@ List<WrkMast> unfinishedBatchWrkMasts = listUnfinishedBatchWrkMasts(wrkMast.getBatch()); if (hasMissingBatchSeq(unfinishedBatchWrkMasts)) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 存在未配置批次序号的未完成任务,暂不允许堆垛机出库", wrkMast.getBatch()); if (logBlockedReason) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 存在未配置批次序号的未完成任务,暂不允许堆垛机出库", wrkMast.getBatch()); } return false; } if (!isWithinBatchExecuteWindow(wrkMast, unfinishedBatchWrkMasts, batchRunningLimit)) { List<Integer> windowBatchSeqList = unfinishedBatchWrkMasts.stream() .limit(Math.min(batchRunningLimit, unfinishedBatchWrkMasts.size())) .map(WrkMast::getBatchSeq) .collect(java.util.stream.Collectors.toList()); News.taskInfo(wrkMast.getWrkNo(), "批次:{} 当前严格执行窗口序号列表为{},当前序号={},暂不允许堆垛机出库", wrkMast.getBatch(), windowBatchSeqList, wrkMast.getBatchSeq()); if (logBlockedReason) { List<Integer> windowBatchSeqList = unfinishedBatchWrkMasts.stream() .limit(Math.min(batchRunningLimit, unfinishedBatchWrkMasts.size())) .map(WrkMast::getBatchSeq) .collect(java.util.stream.Collectors.toList()); News.taskInfo(wrkMast.getWrkNo(), "批次:{} 当前严格执行窗口序号列表为{},当前序号={},暂不允许堆垛机出库", wrkMast.getBatch(), windowBatchSeqList, wrkMast.getBatchSeq()); } return false; } @@ -523,7 +537,9 @@ WrkStsType.COMPLETE_OUTBOUND.sts, WrkStsType.SETTLE_OUTBOUND.sts)); if (batchRunningCount >= batchRunningLimit) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 执行中任务数达到上限,当前={},上限={}", wrkMast.getBatch(), batchRunningCount, batchRunningLimit); if (logBlockedReason) { News.taskInfo(wrkMast.getWrkNo(), "批次:{} 执行中任务数达到上限,当前={},上限={}", wrkMast.getBatch(), batchRunningCount, batchRunningLimit); } return false; }