From 4116d1a906514bf1920e4450fc6868191fe93bac Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期一, 18 十一月 2024 11:06:51 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java | 69 ++++++++++++++++++++++++++++------ 1 files changed, 57 insertions(+), 12 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 45c6fb4..7729fe5 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 @@ -1,6 +1,7 @@ package com.zy.acs.manager.core.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.SnowflakeIdWorker; @@ -98,6 +99,8 @@ } } } + + // dead lane if (jamService.count(new LambdaQueryWrapper<Jam>() .eq(Jam::getJamAgv, agv.getId()) .eq(Jam::getJamSeg, segment.getId()) @@ -196,14 +199,17 @@ String agvNo = agv.getUuid(); Date now = new Date(); Jam jam = jamService.getJam(agv.getId(), startCode.getId(), segment.getId()); + // judge avoid of jam + List<Jam> unfinishedOriginJamByCurrAgv = jamService.getUnfinishedOriginJamByAvo(agv.getId(), startCode.getId(), segment.getId()); + List<String> blackPath = this.getBlackPathList(unfinishedOriginJamByCurrAgv); // 缁撴灉闆� List<String> pathList = new ArrayList<>(); // 鏃犻殰纰嶈В - List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false); + List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment); // 閬胯瑙� - List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true); + List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true, blackPath, segment); if (!Cools.isEmpty(lockPathList) && // 瀛樺湪閬胯瑙� Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10 @@ -246,7 +252,8 @@ Integer maxJamTimeoutFactor = null; // persist jam data - jam = this.createOrUpdateJam(agv, startCode, segment, jam); + ArrayList<String> jamPath = new ArrayList<>(unlockPathList); + jam = this.createOrUpdateJam(agv, startCode, segment, jam, jamPath); // ? has unAvoidable block vehicles if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())) { @@ -264,10 +271,11 @@ } else { // select optimal block vehicle - String blockAgvNo = blockVehicleList.stream() - .filter(BlockVehicleDto::isAvoidable) - .map(BlockVehicleDto::getVehicle) - .findFirst().orElse(null); +// String blockAgvNo = blockVehicleList.stream() +// .filter(BlockVehicleDto::isAvoidable) +// .map(BlockVehicleDto::getVehicle) +// .findFirst().orElse(null); + String blockAgvNo = this.checkoutBestSolutionOfBlocks(blockVehicleList); // block vehicle info Agv blockAgv = agvService.selectByUuid(blockAgvNo); @@ -283,14 +291,17 @@ } // 鍒ゆ柇涓嬩釜浠诲姟鏄惁涓哄師鍦颁换鍔★紝濡傛灉鏄垯绛夊緟 ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺紱濡傛灉涓嶆槸锛岃闃诲杞﹁締閬胯 - Segment waitingSeg = segmentService.getJustWaitingSeg(blockAgv.getId()); - if (null != waitingSeg && waitingSeg.getEndNode().equals(codeService.selectByData(blockAgvCode).getId())) { + List<Segment> waitingSegList = segmentService.getJustWaitingSeg(blockAgv.getId()); + if (null != waitingSegList + && waitingSegList.stream().anyMatch( + 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 (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, jamPath, agvNo, jam)) { if (jam.getCycleAvo() == 1) { jam.setCycleCode(endCode.getId()); } @@ -430,6 +441,10 @@ List<Segment> waitingSegList = segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString()); if (!Cools.isEmpty(waitingSegList)) { + if (waitingSegList.size() > 1) { + log.error("閬胯閫氱煡澶辫触锛寋}鍙疯溅杈嗗瓨鍦ㄥ涓瓑寰呬腑鐨凷egment锛侊紒锛�", agvNo); + return false; + } // revert Date now = new Date(); for (Segment seg : waitingSegList) { @@ -453,23 +468,26 @@ if (!segmentService.save(insertSeg)) { log.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial()); return false; + } else { + jam.setAvoSeg(insertSeg.getId()); } } else { - return mainLockWrapService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData); + return mainLockWrapService.buildMinorTask(agv, TaskTypeType.MOVE, endCodeData, jam); } return true; } - private Jam createOrUpdateJam(Agv agv, Code startCode, Segment segment, Jam jam) { + private Jam createOrUpdateJam(Agv agv, Code startCode, Segment segment, Jam jam, List<String> jamPath) { if (jam == null) { jam = new Jam(); jam.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); jam.setJamAgv(agv.getId()); jam.setJamCode(startCode.getId()); jam.setJamSeg(segment.getId()); + jam.setJamPath(GsonUtils.toJson(jamPath)); jam.setStartTime(new Date()); jam.setState(JamStateType.RUNNING.toString()); if (!jamService.save(jam)) { @@ -485,4 +503,31 @@ return jam; } + private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) { + List<String> blackPathList = new ArrayList<>(); + if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) { + for (Jam jam : unfinishedOriginJamByCurrAgv) { + if (!Cools.isEmpty(jam.getJamPath())) { + List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class); + blackPathList.addAll(list); + } + } + } + return blackPathList.stream().distinct().collect(Collectors.toList()); + } + + private String checkoutBestSolutionOfBlocks(List<BlockVehicleDto> blockVehicleList) { + assert !Cools.isEmpty(blockVehicleList); + for (BlockVehicleDto blockVehicleDto : blockVehicleList) { + if (!blockVehicleDto.isAvoidable()) { + continue; + } + // 娌℃湁閬胯涓殑浠诲姟 + if (Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(blockVehicleDto.getVehicle(), null))) { + return blockVehicleDto.getVehicle(); + } + } + return null; + } + } -- Gitblit v1.9.1