From 9a8018c3fbc94f99d5d184c8cb1ef23d7366cea0 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 29 四月 2026 17:02:38 +0800
Subject: [PATCH] #堆垛机任务执行优先级修改
---
src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java | 194 ++++++++++++++++++++++++++++++++----------------
1 files changed, 129 insertions(+), 65 deletions(-)
diff --git a/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java b/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java
index f8ef8b9..7ae1627 100644
--- a/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java
+++ b/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java
@@ -4,13 +4,11 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zy.asrs.domain.enums.NotifyMsgType;
+import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasStation;
import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.service.BasDevpService;
-import com.zy.asrs.service.BasStationService;
-import com.zy.asrs.service.WrkAnalysisService;
-import com.zy.asrs.service.WrkMastService;
+import com.zy.asrs.service.*;
import com.zy.asrs.utils.NotifyUtils;
import com.zy.common.entity.FindCrnNoResult;
import com.zy.common.service.CommonService;
@@ -27,7 +25,6 @@
import com.zy.core.model.StationObjModel;
import com.zy.core.model.command.StationCommand;
import com.zy.core.model.protocol.StationProtocol;
-import com.zy.core.model.protocol.StationTaskBufferItem;
import com.zy.core.move.StationMoveCoordinator;
import com.zy.core.thread.StationThread;
import com.zy.core.utils.station.model.DispatchLimitConfig;
@@ -43,6 +40,8 @@
@Component
public class StationRegularDispatchProcessor {
+
+ private static final long STATION_IN_SLOW_LOG_THRESHOLD_MS = 500L;
@Autowired
private BasDevpService basDevpService;
@@ -64,6 +63,8 @@
private StationCommandDispatcher stationCommandDispatcher;
@Autowired
private StationDispatchLoadSupport stationDispatchLoadSupport;
+ @Autowired
+ private BasCrnpService basCrnpService;
public void stationOutExecuteFinish(StationObjModel stationObjModel) {
try {
@@ -265,67 +266,130 @@
) {
return;
}
-
- WrkMast wrkMast = wrkMastService.getOne(new QueryWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
- if (wrkMast == null || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.NEW_INBOUND.sts)) {
- return;
- }
-
- String locNo = wrkMast.getLocNo();
- FindCrnNoResult findCrnNoResult = commonService.findCrnNoByLocNo(locNo);
- if (findCrnNoResult == null) {
- News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鏈尮閰嶅埌鍫嗗灈鏈�", wrkMast.getWrkNo());
- return;
- }
-
- Integer targetStationId = commonService.findInStationId(findCrnNoResult, stationId);
- if (targetStationId == null) {
- News.taskInfo(wrkMast.getWrkNo(), "{}绔欑偣,鎼滅储鍏ュ簱绔欑偣澶辫触", stationId);
- return;
- }
-
- DispatchLimitConfig limitConfig = stationDispatchLoadSupport.getDispatchLimitConfig(stationProtocol.getStationId(), targetStationId);
- int currentStationTaskCount = stationDispatchLoadSupport.countCurrentStationTask();
- LoadGuardState loadGuardState = stationDispatchLoadSupport.buildLoadGuardState(limitConfig);
- LoopHitResult loopHitResult = stationDispatchLoadSupport.findPathLoopHit(
- limitConfig,
- stationProtocol.getStationId(),
- targetStationId,
- loadGuardState
- );
- if (stationDispatchLoadSupport.isDispatchBlocked(limitConfig, currentStationTaskCount, loadGuardState, loopHitResult.isThroughLoop())) {
- return;
- }
-
- StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationId, targetStationId, 0);
- if (command == null) {
- News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", wrkMast.getWrkNo());
- return;
- }
-
- Date now = new Date();
- wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
- wrkMast.setSourceStaNo(stationProtocol.getStationId());
- wrkMast.setStaNo(targetStationId);
- wrkMast.setSystemMsg("");
- wrkMast.setIoTime(now);
- wrkMast.setModiTime(now);
- if (wrkMastService.updateById(wrkMast)) {
- wrkAnalysisService.markInboundStationStart(wrkMast, now);
- boolean offered = offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "stationInExecute");
- if (offered && stationMoveCoordinator != null) {
- stationMoveCoordinator.recordDispatch(
- wrkMast.getWrkNo(),
- stationProtocol.getStationId(),
- "stationInExecute",
- command,
- false
- );
+ long totalStartNs = System.nanoTime();
+ Map<String, Long> stepCostMap = new java.util.LinkedHashMap<>();
+ WrkMast wrkMast = null;
+ Integer targetStationId = null;
+ String targetSource = "unknown";
+ String locNo = null;
+ try {
+ long stepStartNs = System.nanoTime();
+ wrkMast = wrkMastService.getOne(new QueryWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
+ stepCostMap.put("loadWrkByBarcode", elapsedMillis(stepStartNs));
+ if (wrkMast == null || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.NEW_INBOUND.sts)) {
+ return;
}
- News.info("杈撻�佺珯鐐瑰叆搴撳懡浠や笅鍙戞垚鍔燂紝绔欑偣鍙�={}锛屽伐浣滃彿={}锛屽懡浠ゆ暟鎹�={}", stationId, wrkMast.getWrkNo(), JSON.toJSONString(command));
- redisUtil.set(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId, "lock", 5);
- loadGuardState.reserveLoopTask(loopHitResult.getLoopNo());
- stationDispatchLoadSupport.saveLoopLoadReserve(wrkMast.getWrkNo(), loopHitResult);
+
+ Integer crnNo = wrkMast.getCrnNo();
+ BasCrnp basCrnp = basCrnpService.getOne(new QueryWrapper<BasCrnp>().eq("crn_no", crnNo));
+ if (basCrnp == null) {
+ News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鏈壘鍒板爢鍨涙満鏁版嵁", wrkMast.getWrkNo());
+ return;
+ }
+
+ int maxInTask = 3;
+ if (basCrnp.getMaxInTask() != null) {
+ maxInTask = basCrnp.getMaxInTask();
+ }
+
+ stepStartNs = System.nanoTime();
+ long count = wrkMastService.count(new QueryWrapper<WrkMast>().eq("crn_no", crnNo).eq("wrk_sts", WrkStsType.INBOUND_STATION_RUN.sts));
+ stepCostMap.put("countCrnInboundRunTask", elapsedMillis(stepStartNs));
+ if(count >= maxInTask) {
+ News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鍫嗗灈鏈哄埌杈句换鍔′笂闄愶紝绋嶅悗鎵ц", wrkMast.getWrkNo());
+ stationProtocol.setSystemWarning(wrkMast.getWrkNo() + "宸ヤ綔," + crnNo + "鍙峰爢鍨涙満鍒拌揪浠诲姟涓婇檺锛岀◢鍚庢墽琛�");
+ return;
+ }
+
+ locNo = wrkMast.getLocNo();
+ stepStartNs = System.nanoTime();
+ FindCrnNoResult findCrnNoResult = commonService.findCrnNoByLocNo(locNo);
+ stepCostMap.put("resolveCrnByLocNo", elapsedMillis(stepStartNs));
+ if (findCrnNoResult == null) {
+ News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鏈尮閰嶅埌鍫嗗灈鏈�", wrkMast.getWrkNo());
+ return;
+ }
+
+ stepStartNs = System.nanoTime();
+ CommonService.InStationResolveResult resolveResult = commonService.resolveInStationId(findCrnNoResult, stationId);
+ stepCostMap.put("resolveInboundTargetStation", elapsedMillis(stepStartNs));
+ targetStationId = resolveResult == null ? null : resolveResult.getTargetStationId();
+ targetSource = resolveResult == null ? "unknown" : (resolveResult.isCacheHit() ? "cache" : "search");
+ if (targetStationId == null) {
+ News.taskInfo(wrkMast.getWrkNo(), "{}绔欑偣,鎼滅储鍏ュ簱绔欑偣澶辫触", stationId);
+ return;
+ }
+
+ stepStartNs = System.nanoTime();
+ DispatchLimitConfig limitConfig = stationDispatchLoadSupport.getDispatchLimitConfig(stationProtocol.getStationId(), targetStationId);
+ int currentStationTaskCount = stationDispatchLoadSupport.countCurrentStationTask();
+ LoadGuardState loadGuardState = stationDispatchLoadSupport.buildLoadGuardState(limitConfig);
+ stepCostMap.put("buildLoopGuardState", elapsedMillis(stepStartNs));
+
+ stepStartNs = System.nanoTime();
+ StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationId, targetStationId, 0);
+ stepCostMap.put("buildMoveCommand", elapsedMillis(stepStartNs));
+ if (command == null) {
+ News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", wrkMast.getWrkNo());
+ return;
+ }
+
+ stepStartNs = System.nanoTime();
+ LoopHitResult loopHitResult = stationDispatchLoadSupport.findPathLoopHitByNavigatePath(command.getNavigatePath(), loadGuardState);
+ stepCostMap.put("evaluateLoopPath", elapsedMillis(stepStartNs));
+ if (stationDispatchLoadSupport.isDispatchBlocked(limitConfig, currentStationTaskCount, loadGuardState, loopHitResult.isThroughLoop())) {
+ return;
+ }
+
+ stepStartNs = System.nanoTime();
+ Date now = new Date();
+ wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
+ wrkMast.setSourceStaNo(stationProtocol.getStationId());
+ wrkMast.setStaNo(targetStationId);
+ wrkMast.setSystemMsg("");
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
+ if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markInboundStationStart(wrkMast, now);
+ // 鍏堣褰� session 鍐嶅叆闃熷懡浠わ紝閬垮厤娑堣垂绾跨▼鍦� session 鍐欏叆 Redis 鍓嶅彇鍒板懡浠ゅ鑷磋矾鐢辨牎楠屽け璐ャ��
+ if (stationMoveCoordinator != null) {
+ stationMoveCoordinator.recordDispatch(
+ wrkMast.getWrkNo(),
+ stationProtocol.getStationId(),
+ "stationInExecute",
+ command,
+ false
+ );
+ }
+ boolean offered = offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "stationInExecute");
+ if (offered) {
+ News.info("杈撻�佺珯鐐瑰叆搴撳懡浠や笅鍙戞垚鍔燂紝绔欑偣鍙�={}锛屽伐浣滃彿={}锛屽懡浠ゆ暟鎹�={}", stationId, wrkMast.getWrkNo(), JSON.toJSONString(command));
+ } else {
+ News.warn("杈撻�佺珯鐐瑰叆搴撳懡浠ゅ叆闃熻鎷掔粷(鍙兘閲嶅)锛岀珯鐐瑰彿={}锛屽伐浣滃彿={}", stationId, wrkMast.getWrkNo());
+ }
+ redisUtil.set(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId, "lock", 5);
+ loadGuardState.reserveLoopTask(loopHitResult.getLoopNo());
+ stationDispatchLoadSupport.saveLoopLoadReserve(wrkMast.getWrkNo(), loopHitResult);
+ }
+ stepCostMap.put("updateWrkAndDispatch", elapsedMillis(stepStartNs));
+ } finally {
+ long totalCostMs = elapsedMillis(totalStartNs);
+ if (totalCostMs >= STATION_IN_SLOW_LOG_THRESHOLD_MS) {
+ News.warn("stationInExecute鑰楁椂杈冮暱锛宻tationId={}锛宐arcode={}锛寃rkNo={}锛宭ocNo={}锛宼argetStaNo={}锛宼argetSource={}锛宻tepCosts={}锛宼otalCost={}ms",
+ stationId,
+ stationProtocol.getBarcode(),
+ wrkMast == null ? null : wrkMast.getWrkNo(),
+ locNo,
+ targetStationId,
+ targetSource,
+ JSON.toJSONString(stepCostMap),
+ totalCostMs);
+ }
}
}
+
+ private long elapsedMillis(long startNs) {
+ long elapsedNs = System.nanoTime() - startNs;
+ return elapsedNs <= 0L ? 0L : elapsedNs / 1_000_000L;
+ }
}
--
Gitblit v1.9.1