From a96d6e291e5f4b3f455e9f2230a28d1834550ad1 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期四, 14 十一月 2024 14:58:42 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java | 168 ++++++++++++++++++++++++++++++------------------------- 1 files changed, 92 insertions(+), 76 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java index d9e99d5..45c6fb4 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java @@ -55,6 +55,8 @@ @Autowired private MainService mainService; @Autowired + private MainLockWrapService mainLockWrapService; + @Autowired private MapService mapService; @Autowired private MapDataDispatcher mapDataDispatcher; @@ -91,6 +93,7 @@ if (!Cools.isEmpty(waitingSegList)) { for (Segment waitingSeg : waitingSegList) { if (!waitingSeg.getId().equals(segment.getId())) { +// log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid()); return; } } @@ -217,9 +220,17 @@ if (!pathList.get(pathList.size() - 1).equals(endCode.getData())) { assert !Cools.isEmpty(blockVehicleList); - boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable()); + boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable()); if (hasUnavoidableBlocks && pathList.size() <= MIN_SLICE_PATH_LENGTH) { log.info("AGV[{}] waiting in place, because the path list is too short...", agvNo); + pathList.clear(); + } + + boolean hasCycleJam = blockVehicleList.stream().anyMatch( + blockVehicleDto -> null != jamService.getCycleJam(agv.getId(), segment.getId(), blockVehicleDto.getVehicle()) + ); + if (hasCycleJam) { + log.info("AGV[{}] waiting in place, because has cycle jam...", agvNo); pathList.clear(); } } @@ -227,94 +238,99 @@ // 鏃犲彲璧拌璺緞 } else { - assert !Cools.isEmpty(blockVehicleList); - Integer maxJamTimeoutFactor = null; - - // persist jam data - jam = this.createOrUpdateJam(agv, startCode, segment, jam); - - // ? has unAvoidable block vehicles - if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())) { - - // set factor of jam timeout - maxJamTimeoutFactor = 1; + if (Cools.isEmpty(blockVehicleList)) { + log.warn("AGV[{}] can't reach to code: {}, because there is too many vehicle in the lane...", agvNo, endCode.getData()); } else { - // ? already do notify to avoid - if (!Cools.isEmpty(jam.getAvoAgv()) - && BlockVehicleDto.customContain(blockVehicleList, agvService.getById(jam.getAvoAgv()).getUuid())) { + assert !Cools.isEmpty(blockVehicleList); + Integer maxJamTimeoutFactor = null; - maxJamTimeoutFactor = 10; + // persist jam data + jam = this.createOrUpdateJam(agv, startCode, segment, jam); + // ? has unAvoidable block vehicles + if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())) { + + // set factor of jam timeout + maxJamTimeoutFactor = 1; } else { - // select optimal block vehicle - String blockAgvNo = blockVehicleList.stream() - .filter(BlockVehicleDto::isAvoidable) - .map(BlockVehicleDto::getVehicle) - .findFirst().orElse(null); + // ? already do notify to avoid + if (!Cools.isEmpty(jam.getAvoAgv()) + && BlockVehicleDto.customContain(blockVehicleList, agvService.getById(jam.getAvoAgv()).getUuid())) { - // block vehicle info - Agv blockAgv = agvService.selectByUuid(blockAgvNo); - String blockAgvCode = codeService.getById(agvDetailService.selectByAgvId(blockAgv.getId()).getRecentCode()).getData(); + maxJamTimeoutFactor = 10; - do { - - // 闃诲杞﹁締姝e湪鍘熷湴浣滀笟锛岀瓑寰� ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺� - List<Segment> runningSegList = segmentService.getByAgvAndState(blockAgv.getId(), SegmentStateType.RUNNING.toString()); - if (!Cools.isEmpty(runningSegList)) { - maxJamTimeoutFactor = 1; - break; - } - - // 鍒ゆ柇涓嬩釜浠诲姟鏄惁涓哄師鍦颁换鍔★紝濡傛灉鏄垯绛夊緟 ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺紱濡傛灉涓嶆槸锛岃闃诲杞﹁締閬胯 - Segment waitingSeg = segmentService.getJustWaitingSeg(blockAgv.getId()); - if (null != waitingSeg && waitingSeg.getEndNode().equals(codeService.selectByData(blockAgvCode).getId())) { - maxJamTimeoutFactor = 1; - break; - } - - // notify block vehicle to avoid - if (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, unlockPathList, agvNo, jam)) { - if (jam.getCycleAvo() == 1) { - jam.setCycleCode(endCode.getId()); - } - jam.setAvoAgv(blockAgv.getId()); - jam.setNotifyTime(new Date()); - if (!jamService.updateById(jam)) { - throw new CoolException(jam.getUuid() + "-jam failed to update锛侊紒锛�"); - } - } else { - - maxJamTimeoutFactor = 1; - } - - } while (false); - } - - } - - // handle jam timeout - if (null != maxJamTimeoutFactor) { - if (System.currentTimeMillis() - jam.getStartTime().getTime() > MAX_JAM_TIMEOUT * maxJamTimeoutFactor) { - - if (!Cools.isEmpty(lockPathList)) { - - pathList = lockPathList; } else { - log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}" - , agvNo, startCode.getData(), endCode.getData(), "璺緞闃诲瓒呮椂"); + + // select optimal block vehicle + String blockAgvNo = blockVehicleList.stream() + .filter(BlockVehicleDto::isAvoidable) + .map(BlockVehicleDto::getVehicle) + .findFirst().orElse(null); + + // block vehicle info + Agv blockAgv = agvService.selectByUuid(blockAgvNo); + String blockAgvCode = codeService.getById(agvDetailService.selectByAgvId(blockAgv.getId()).getRecentCode()).getData(); + + do { + + // 闃诲杞﹁締姝e湪鍘熷湴浣滀笟锛岀瓑寰� ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺� + List<Segment> runningSegList = segmentService.getByAgvAndState(blockAgv.getId(), SegmentStateType.RUNNING.toString()); + if (!Cools.isEmpty(runningSegList)) { + maxJamTimeoutFactor = 1; + break; + } + + // 鍒ゆ柇涓嬩釜浠诲姟鏄惁涓哄師鍦颁换鍔★紝濡傛灉鏄垯绛夊緟 ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺紱濡傛灉涓嶆槸锛岃闃诲杞﹁締閬胯 + Segment waitingSeg = segmentService.getJustWaitingSeg(blockAgv.getId()); + if (null != waitingSeg && waitingSeg.getEndNode().equals(codeService.selectByData(blockAgvCode).getId())) { + maxJamTimeoutFactor = 1; + break; + } + + // notify block vehicle to avoid + if (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, unlockPathList, agvNo, jam)) { + if (jam.getCycleAvo() == 1) { + jam.setCycleCode(endCode.getId()); + } + jam.setAvoAgv(blockAgv.getId()); + jam.setNotifyTime(new Date()); + if (!jamService.updateById(jam)) { + throw new CoolException(jam.getUuid() + "-jam failed to update锛侊紒锛�"); + } + } else { + + maxJamTimeoutFactor = 1; + } + + } while (false); } - } else { - log.warn("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�" - , agvNo - , blockVehicleList.stream().map(BlockVehicleDto::getVehicle).collect(Collectors.toList()).toString() - ); + } + + // handle jam timeout + if (null != maxJamTimeoutFactor) { + if (System.currentTimeMillis() - jam.getStartTime().getTime() > MAX_JAM_TIMEOUT * maxJamTimeoutFactor) { + + if (!Cools.isEmpty(lockPathList)) { + + pathList = lockPathList; + } else { + log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}" + , agvNo, startCode.getData(), endCode.getData(), "璺緞闃诲瓒呮椂"); + } + } else { + log.warn("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�" + , agvNo + , blockVehicleList.stream().map(BlockVehicleDto::getVehicle).collect(Collectors.toList()).toString() + ); + } + } + } } - } if (!Cools.isEmpty(pathList)) { @@ -441,7 +457,7 @@ } else { - return mainService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData); + return mainLockWrapService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData); } return true; -- Gitblit v1.9.1