| | |
| | | && stationMoveCoordinator.shouldSuppressDispatch(taskNo, stationId, plan.command())) { |
| | | return RerouteExecutionResult.skip("dispatch-suppressed"); |
| | | } |
| | | if (context.sceneType() == RerouteSceneType.RUN_BLOCK_REROUTE |
| | | && shouldSkipRunBlockRerouteForExistingSession(taskNo, stationId, plan.command())) { |
| | | News.info("输送站点堵塞重规划命中已生效同路径路线,已跳过重复下发。站点号={},工作号={},目标站={}", |
| | | stationId, |
| | | taskNo, |
| | | plan.command().getTargetStaNo()); |
| | | return RerouteExecutionResult.skip("run-block-same-path"); |
| | | } |
| | | if (context.requireOutOrderDispatchLock() |
| | | && !tryAcquireOutOrderDispatchLock(taskNo, stationId)) { |
| | | return RerouteExecutionResult.skip("out-order-lock"); |
| | |
| | | if (session == null) { |
| | | return false; |
| | | } |
| | | boolean protectedStatus = session.isActive() || StationMoveSession.STATUS_BLOCKED.equals(session.getStatus()); |
| | | if (!protectedStatus || !session.containsStation(stationId)) { |
| | | if (!session.isActive() || !session.containsStation(stationId)) { |
| | | return false; |
| | | } |
| | | if (StationMoveDispatchMode.CIRCLE == session.getDispatchMode()) { |
| | | return true; |
| | | } |
| | | return !Objects.equals(stationId, session.getCurrentRouteTargetStationId()); |
| | | } |
| | | |
| | | private boolean shouldSkipRunBlockRerouteForExistingSession(Integer wrkNo, |
| | | Integer stationId, |
| | | StationCommand candidateCommand) { |
| | | if (stationMoveCoordinator == null |
| | | || wrkNo == null || wrkNo <= 0 |
| | | || stationId == null |
| | | || candidateCommand == null) { |
| | | return false; |
| | | } |
| | | StationMoveSession session = stationMoveCoordinator.loadSession(wrkNo); |
| | | if (session == null) { |
| | | return false; |
| | | } |
| | | boolean protectedStatus = session.isActive() || StationMoveSession.STATUS_BLOCKED.equals(session.getStatus()); |
| | | if (!protectedStatus) { |
| | | return false; |
| | | } |
| | | boolean sameDispatchStation = Objects.equals(stationId, session.getCurrentStationId()) |
| | | || Objects.equals(stationId, session.getDispatchStationId()); |
| | | if (!sameDispatchStation) { |
| | | return false; |
| | | } |
| | | String candidateSignature = stationMoveCoordinator.buildPathSignature(candidateCommand); |
| | | return !isBlank(candidateSignature) && Objects.equals(candidateSignature, session.getPathSignature()); |
| | | } |
| | | |
| | | private boolean isWatchingCircleArrival(Integer wrkNo, Integer stationId) { |