| | |
| | | private static final int EXECUTOR_QUEUE_WARN_THRESHOLD = 20; |
| | | private static final int EXECUTOR_ACTIVE_WARN_THRESHOLD = 48; |
| | | private static final long SEGMENT_EXECUTE_WARN_MS = 10_000L; |
| | | private static final long COMMAND_BUILD_WARN_MS = 500L; |
| | | private static final int QUEUE_DRAIN_BATCH_SIZE = 32; |
| | | private static final long QUEUE_IDLE_SLEEP_MS = 20L; |
| | | |
| | |
| | | stationCommand.setCommandType(commandType); |
| | | |
| | | if (commandType == StationCommandType.MOVE && !stationId.equals(targetStationId)) { |
| | | long startNs = System.nanoTime(); |
| | | long calcPathStartNs = startNs; |
| | | List<NavigateNode> nodes = calcPathNavigateNodes(taskNo, stationId, targetStationId, pathLenFactor); |
| | | return fillMoveCommandPath(stationCommand, nodes, taskNo, stationId, targetStationId); |
| | | long calcPathCostMs = nanosToMillis(System.nanoTime() - calcPathStartNs); |
| | | long fillCommandStartNs = System.nanoTime(); |
| | | StationCommand builtCommand = fillMoveCommandPath(stationCommand, nodes, taskNo, stationId, targetStationId); |
| | | long fillCommandCostMs = nanosToMillis(System.nanoTime() - fillCommandStartNs); |
| | | long totalCostMs = nanosToMillis(System.nanoTime() - startNs); |
| | | if (totalCostMs >= COMMAND_BUILD_WARN_MS) { |
| | | log.warn("V5输送命令生成耗时较长,deviceNo={}, taskNo={}, stationId={}, targetStaNo={}, calcPath={}ms, fillCommand={}ms, total={}ms", |
| | | deviceConfig == null ? null : deviceConfig.getDeviceNo(), |
| | | taskNo, |
| | | stationId, |
| | | targetStationId, |
| | | calcPathCostMs, |
| | | fillCommandCostMs, |
| | | totalCostMs); |
| | | } |
| | | return builtCommand; |
| | | } |
| | | return stationCommand; |
| | | } |
| | |
| | | loopEvaluation.getLoopIdentity().getScopeType(), |
| | | loopEvaluation.getLoopIdentity().getLocalStationCount(), |
| | | loopEvaluation.getLoopIdentity().getSourceLoopStationCount()); |
| | | log.info("输送线堵塞重规划候选路径计算开始,taskNo={}, stationId={}, targetStationId={}, pathLenFactor={}", |
| | | taskNo, stationId, targetStationId, pathLenFactor); |
| | | List<List<NavigateNode>> candidatePathList = calcCandidatePathNavigateNodes(taskNo, stationId, targetStationId, pathLenFactor); |
| | | long candidatePathNs = System.nanoTime(); |
| | | log.info("输送线堵塞重规划候选路径计算完成,taskNo={}, stationId={}, targetStationId={}, candidatePathCount={}, costMs={}", |
| | | taskNo, |
| | | stationId, |
| | | targetStationId, |
| | | candidatePathList == null ? null : candidatePathList.size(), |
| | | nanosToMillis(candidatePathNs - loopEvalNs)); |
| | | List<StationCommand> candidateCommandList = new ArrayList<>(); |
| | | for (List<NavigateNode> candidatePath : candidatePathList) { |
| | | StationCommand rerouteCommand = buildMoveCommand(taskNo, stationId, targetStationId, palletSize, candidatePath); |
| | |
| | | candidateCommandList.add(rerouteCommand); |
| | | } |
| | | long buildCommandNs = System.nanoTime(); |
| | | log.info("输送线堵塞重规划候选命令构建完成,taskNo={}, stationId={}, targetStationId={}, candidatePathCount={}, candidateCommandCount={}, costMs={}, firstCommandPath={}", |
| | | taskNo, |
| | | stationId, |
| | | targetStationId, |
| | | candidatePathList == null ? null : candidatePathList.size(), |
| | | candidateCommandList.size(), |
| | | nanosToMillis(buildCommandNs - candidatePathNs), |
| | | JSON.toJSONString(firstCommandPath(candidateCommandList))); |
| | | |
| | | StationV5RunBlockReroutePlanner.PlanResult planResult = runBlockReroutePlanner.plan( |
| | | taskNo, |
| | |
| | | candidateCommandList |
| | | ); |
| | | long planNs = System.nanoTime(); |
| | | log.info("输送线堵塞重规划planner完成,taskNo={}, stationId={}, targetStationId={}, planCount={}, selected={}, issuedRouteCount={}, costMs={}", |
| | | taskNo, |
| | | stationId, |
| | | targetStationId, |
| | | planResult == null ? null : planResult.getPlanCount(), |
| | | planResult != null && planResult.getCommand() != null, |
| | | planResult == null || planResult.getIssuedRoutePathList() == null ? null : planResult.getIssuedRoutePathList().size(), |
| | | nanosToMillis(planNs - buildCommandNs)); |
| | | logRunBlockRerouteCost(taskNo, |
| | | stationId, |
| | | targetStationId, |
| | |
| | | StationCommand rerouteCommand = planResult.getCommand(); |
| | | if (rerouteCommand != null) { |
| | | if (taskLoopService != null) { |
| | | log.info("输送线堵塞重规划记录环线开始,taskNo={}, stationId={}, targetStationId={}", |
| | | taskNo, stationId, targetStationId); |
| | | taskLoopService.recordLoopIssue(loopEvaluation, "RUN_BLOCK_REROUTE"); |
| | | log.info("输送线堵塞重规划记录环线完成,taskNo={}, stationId={}, targetStationId={}", |
| | | taskNo, stationId, targetStationId); |
| | | } |
| | | log.info("输送线堵塞重规划选中候选路线,taskNo={}, planCount={}, stationId={}, targetStationId={}, route={}", |
| | | taskNo, planResult.getPlanCount(), stationId, targetStationId, JSON.toJSONString(rerouteCommand.getNavigatePath())); |
| | |
| | | return null; |
| | | } |
| | | |
| | | private List<Integer> firstCommandPath(List<StationCommand> candidateCommandList) { |
| | | if (candidateCommandList == null || candidateCommandList.isEmpty()) { |
| | | return new ArrayList<>(); |
| | | } |
| | | StationCommand firstCommand = candidateCommandList.get(0); |
| | | if (firstCommand == null || firstCommand.getNavigatePath() == null) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return firstCommand.getNavigatePath(); |
| | | } |
| | | |
| | | @Override |
| | | public boolean clearPath(Integer taskNo) { |
| | | if (taskNo == null || taskNo <= 0) { |