From c720e1ca147093cac0137e4bd9d053e5e04c8e7a Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期五, 01 十一月 2024 12:51:42 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 2 /dev/null | 31 -- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java | 534 ++++++++++++++++++++++++++++++++++++++++++++++++ zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java | 21 + zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java | 47 ++++ 6 files changed, 604 insertions(+), 33 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java new file mode 100644 index 0000000..f03fa9d --- /dev/null +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java @@ -0,0 +1,21 @@ +package com.zy.acs.manager.core.domain; + +import lombok.Data; + +/** + * Created by vincent on 11/1/2024 + */ +@Data +public class TimeWindow { + + private long startTime; // 寮�濮嬫椂闂� + + private long endTime; // 缁撴潫鏃堕棿 + + private String agvId; // 棰勫畾鐨凙GV + + public boolean isConflict(TimeWindow other) { + return this.endTime > other.startTime && this.startTime < other.endTime; + } + +} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java index 351573d..ba7f2b2 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java @@ -110,7 +110,7 @@ taskDtoList.sort((o1, o2) -> o2.getPriority() - o1.getPriority()); // 鏍¢獙 - List<Task> taskList = validService.validBusDto(taskDtoList); + List<Task> taskList = validService.validTaskDtoList(taskDtoList); // 淇濆瓨鎬荤嚎 Date now = new Date(); diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapTurnNode.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapTurnNode.java deleted file mode 100644 index 27a80d0..0000000 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapTurnNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zy.acs.manager.core.service; - -import com.zy.acs.manager.core.service.astart.DirectionType; -import com.zy.acs.manager.core.service.astart.TurnNodeType; -import lombok.Data; - -/** - * Created by vincent on 8/6/2024 - */ -@Data -public class MapTurnNode { - - private TurnNodeType turnNodeType; - - private Double top; - - private Double right; - - private Double bottom; - - private Double left; - - static class TurnDirection { - - private DirectionType directionType; - - private Double distance; - - } - -} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java new file mode 100644 index 0000000..4d114e6 --- /dev/null +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java @@ -0,0 +1,47 @@ +package com.zy.acs.manager.core.service; + +import com.zy.acs.manager.core.domain.TimeWindow; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * dynamic time window + * Created by vincent on 11/1/2024 + */ +@Service +public class TimeWindowService { + + public static final Map<String, List<TimeWindow>> TIME_WINDOW_MAP = new ConcurrentHashMap<>(); + + // 棰勫畾鏃堕棿绐楀彛 + public synchronized boolean reserve(String key, TimeWindow window, String vehicle) { + + List<TimeWindow> windows = TIME_WINDOW_MAP.getOrDefault(key, new ArrayList<>()); + + for (TimeWindow reservedWindow : windows) { + if (reservedWindow.isConflict(window)) { + return false; + } + } + + windows.add(window); + TIME_WINDOW_MAP.put(key, windows); + return true; + } + + // 閲婃斁鏃堕棿绐楀彛 + public synchronized void release(String key, TimeWindow window, String vehicle) { + List<TimeWindow> windows = TIME_WINDOW_MAP.get(key); + if (windows != null) { + windows.remove(window); + if (windows.isEmpty()) { + TIME_WINDOW_MAP.remove(key); + } + } + } + +} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java new file mode 100644 index 0000000..9e5701e --- /dev/null +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java @@ -0,0 +1,534 @@ +package com.zy.acs.manager.core.service; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zy.acs.common.constant.RedisConstant; +import com.zy.acs.common.utils.RedisSupport; +import com.zy.acs.framework.common.Cools; +import com.zy.acs.framework.common.SnowflakeIdWorker; +import com.zy.acs.framework.exception.CoolException; +import com.zy.acs.manager.common.utils.MapDataUtils; +import com.zy.acs.manager.core.domain.TaskPosDto; +import com.zy.acs.manager.core.domain.TrafficJamDto; +import com.zy.acs.manager.core.service.astart.DynamicNodeType; +import com.zy.acs.manager.core.service.astart.MapDataDispatcher; +import com.zy.acs.manager.core.service.astart.RetreatNavigateNode; +import com.zy.acs.manager.core.service.astart.WaveNodeType; +import com.zy.acs.manager.core.service.astart.domain.DynamicNode; +import com.zy.acs.manager.manager.entity.*; +import com.zy.acs.manager.manager.enums.JamStateType; +import com.zy.acs.manager.manager.enums.SegmentStateType; +import com.zy.acs.manager.manager.enums.TaskTypeType; +import com.zy.acs.manager.manager.service.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +import java.util.*; + +/** + * Wavefront + * Created by vincent on 6/25/2024 + */ +@Slf4j +@Component +public class TwTrafficService { + + public static final Integer MIN_SLICE_PATH_LENGTH = 3; + + public static final Integer timeoutDuration = 5 * 1000; + + private final RedisSupport redis = RedisSupport.defaultRedisSupport; + + @Autowired + private AgvService agvService; + @Autowired + private AgvDetailService agvDetailService; + @Autowired + private CodeService codeService; + @Autowired + private TravelService travelService; + @Autowired + private SegmentService segmentService; + @Autowired + private MainService mainService; + @Autowired + private MapService mapService; + @Autowired + private MapDataDispatcher mapDataDispatcher; + @Autowired + private SnowflakeIdWorker snowflakeIdWorker; + @Autowired + private ActionService actionService; + @Autowired + private RetreatNavigateService retreatNavigateService; + @Autowired + private TaskService taskService; + @Autowired + private JamService jamService; + @Autowired + private AvoidWaveCalculator avoidWaveCalculator; + + @Transactional + public synchronized void trigger(Segment segment) { + try { + Date now = new Date(); + Travel travel = travelService.getById(segment.getTravelId()); + Agv agv = agvService.getById(travel.getAgvId()); + AgvDetail agvDetail = agvDetailService.selectByAgvId(travel.getAgvId()); + long endNode = segment.getEndNode(); + + // valid ---------------------------------------------------- + if (!agvService.judgeEnable(agv.getId())) { + return; + } + if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) { + return; + } + List<Segment> waitingSegList = segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString()); + if (!Cools.isEmpty(waitingSegList)) { + for (Segment waitingSeg : waitingSegList) { + if (!waitingSeg.getId().equals(segment.getId())) { + return; + } + } + } + if (jamService.count(new LambdaQueryWrapper<Jam>() + .eq(Jam::getJamAgv, agv.getId()) + .eq(Jam::getJamSeg, segment.getId()) + .eq(Jam::getCycleAvo, 1) + .eq(Jam::getCycleCode, endNode) + .eq(Jam::getState, JamStateType.RUNNING.toString()) + ) > 0) { + return; + } + + // execute ----------------------------------------------- + // ArrayList<List<TaskPosDto>> list = JSON.parseObject(travel.getTaskContent(), new TypeReference<ArrayList<List<TaskPosDto>>>() {}); + + // get path list + avoidWaveCalculator.calcWaveScope(); // * sync wave scope + + // checkout path + Code startCode = codeService.getById(agvDetail.getRecentCode()); + Code endCode = codeService.getById(endNode); + List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment); + if (Cools.isEmpty(pathList)) { + return; + } + + List<Segment> segmentList = new ArrayList<>(); + segmentList.add(segment); + + String lastCodeData = pathList.get(pathList.size() - 1); + if (!endCode.getData().equals(lastCodeData)) { + // slice + Code lastCode = codeService.selectByData(lastCodeData); + +// if (pathList.size() <= MIN_SLICE_PATH_LENGTH) { +// return; +// } + + // revert + segment.setState(SegmentStateType.INIT.toString()); + segment.setUpdateTime(now); + if (!segmentService.updateById(segment)) { + log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial()); + } + segmentList.clear(); + + // new move seg + Segment insertSeg = new Segment(); + insertSeg.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); + insertSeg.setTravelId(travel.getId()); + insertSeg.setAgvId(agv.getId()); + insertSeg.setTaskId(segment.getTaskId()); + insertSeg.setSerial(segment.getSerial() - 1); + insertSeg.setEndNode(lastCode.getId()); + insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString()); + insertSeg.setState(SegmentStateType.WAITING.toString()); + if (!segmentService.save(insertSeg)) { + log.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial()); + } + segmentList.add(insertSeg); + + } else { + + // complete first segment then merge behind segment + int serial = segment.getSerial(); + boolean interrupt = false; + while (!interrupt) { + + Segment nextStep = segmentService.getNextStepOfInit(travel.getId(), serial); + serial ++; + if (null == nextStep) { + interrupt = true; + } else { + if (nextStep.getEndNode() == endNode) { + + segmentList.add(nextStep); + } else { + interrupt = true; + } + } + + } + } + + mapService.lockPath(null, pathList, agv.getUuid()); + + mainService.generateAction(segment.getAgvId(), segmentList, pathList); + + } catch (Exception e) { + log.error("TrafficService.trigger", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + + } + } + + public void callback(List<Segment> segmentList) { + Date now = new Date(); + + segmentList.stream().max(Comparator.comparingInt(Segment::getSerial)).ifPresent(segment -> { + Segment nextSegment = segmentService.getNextStepOfInit(segment.getTravelId(), segment.getSerial()); + + if (null != nextSegment) { + + nextSegment.setState(SegmentStateType.WAITING.toString()); + nextSegment.setUpdateTime(now); + if (!segmentService.updateById(nextSegment)) { + log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", nextSegment.getGroupId() + " - " + nextSegment.getSerial()); + } + + } else { + + travelService.checkFinish(segment.getTravelId()); + } + }); + + } + + private List<String> checkoutPath(Agv agv, Code startCode, Code endCode, Segment segment) { + Integer lev = null; + String agvNo = agv.getUuid(); + Date now = new Date(); + Jam jam = jamService.getJam(agv.getId(), startCode.getId(), segment.getId()); + + // 缁撴灉闆� + List<String> pathList = new ArrayList<>(); + + // 鏃犻殰纰嶈В + List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false); + // 閬胯瑙� + List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true); + + if (!Cools.isEmpty(lockPathList) && // 瀛樺湪閬胯瑙� + Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10 + ) { + + pathList = lockPathList; + } else { + + // 鍙蛋琛岃矾寰勯泦鍚堣绠� + List<String> jamVehicleList = this.getSliceAndReturnJamVehicleList(lev, unlockPathList, agvNo, pathList); // jamAgvNo may was wave + + if (!Cools.isEmpty(pathList)) { + + if (!Cools.isEmpty(jamVehicleList) && !pathList.get(pathList.size() - 1).equals(endCode.getData())) { + String jamAgvNo = jamVehicleList.get(0); + if (mapDataDispatcher.queryCodeListFromDynamicNode(null, jamAgvNo).size() > 1 && pathList.size() <= MIN_SLICE_PATH_LENGTH) { + pathList.clear(); + } + } + + // 鏃犲彲璧拌璺緞 + } else { + + // 闃诲杞﹁締鍒楄〃 + assert !Cools.isEmpty(jamVehicleList); + + String jamAgvNo = jamVehicleList.get(0); + + boolean initJamCache = false; + if (null == jam) { + jam = new Jam(); + jam.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); + jam.setJamAgv(agv.getId()); + jam.setJamCode(startCode.getId()); + jam.setJamSeg(segment.getId()); + jam.setStartTime(now); + jam.setState(JamStateType.RUNNING.toString()); + if (!jamService.save(jam)) { + log.error("{}鍙疯溅杈嗗湪{}瀹氫綅琚樆濉烇紝璁板綍闃诲鐘舵�佸け璐ワ紒锛侊紒", agvNo, startCode.getData()); + return pathList; + } + initJamCache = true; + } + long previousTimestamp = jam.getStartTime().getTime(); + + // jam vehicle info + Agv jamAgv = agvService.selectByUuid(jamAgvNo); + String jamAgvCode = codeService.getById(agvDetailService.selectByAgvId(jamAgv.getId()).getRecentCode()).getData(); + + // jam vehicle dynamic on map matrix + List<String> jamCodeList = mapDataDispatcher.queryCodeListFromDynamicNode(lev, jamAgvNo); + + // 璺緞闃诲 + if (jamCodeList.size() > 1) { + if (System.currentTimeMillis() - previousTimestamp > timeoutDuration) { + + if (!Cools.isEmpty(lockPathList)) { + + pathList = lockPathList; + } else { + log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}" + , agvNo, startCode.getData(), endCode.getData(), "璺緞闃诲瓒呮椂"); + } + } else { + log.info("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�", agvNo, jamAgvNo); + } + + // 杞﹁締闃诲 + } else { + + // 宸茬粡閫氱煡杞﹁締閬胯 + if (!Cools.isEmpty(jam.getAvoAgv())) { + assert !Cools.isEmpty(jam.getNotifyTime()); + + if (System.currentTimeMillis() - jam.getNotifyTime().getTime() > timeoutDuration) { + log.warn("{}鍙疯溅杈嗛樆濉炴椂闂磋繃闀匡紒锛侊紒宸查�氱煡閬胯杞﹁締銆恵}銆�...", agvNo, jam.getAvoAgv$()); + } + return pathList; + } + + do { + + // 闃诲杞﹁締姝e湪浣滀笟锛岀瓑寰� ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺� + List<Segment> runningSegList = segmentService.getByAgvAndState(jamAgv.getId(), SegmentStateType.RUNNING.toString()); + if (!Cools.isEmpty(runningSegList)) { + + if (System.currentTimeMillis() - previousTimestamp > timeoutDuration) { + + if (!Cools.isEmpty(lockPathList)) { + pathList = lockPathList; + } else { + log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}" + , agvNo, startCode.getData(), endCode.getData(), "杞﹁締闃诲瓒呮椂"); + } + } else { + log.info("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�", agvNo, jamAgvNo); + } + + break; + } + + // 鍒ゆ柇涓嬩釜浠诲姟鏄惁涓哄師鍦颁换鍔★紝濡傛灉鏄垯绛夊緟 ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺紱濡傛灉涓嶆槸锛岃闃诲杞﹁締閬胯 + Segment waitingSeg = segmentService.getJustWaitingSeg(jamAgv.getId()); + if (null != waitingSeg) { + + // 濡傛灉闃诲杞﹁締寰呮墽琛屼换鍔″浜庡師鍦帮紝鍒欎笉鑳介�氱煡瀹冮伩璁� + if (waitingSeg.getEndNode().equals(codeService.selectByData(jamAgvCode).getId())) { + + if (System.currentTimeMillis() - previousTimestamp > Math.max((timeoutDuration / 30), (5 * 1000))) { + + if (!Cools.isEmpty(lockPathList)) { + pathList = lockPathList; + } else { + log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}" + , agvNo, startCode.getData(), endCode.getData(), "杞﹁締闃诲瓒呮椂"); + } + } else { + log.info("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�", agvNo, jamAgvNo); + } + + break; + } + } + + // 閫氱煡闃诲杞﹁締閬胯 + if (this.notifyVehicleAvoid(jamAgvNo, jamAgvCode, unlockPathList, agvNo, jam)) { + + if (jam.getCycleAvo() == 1) { + jam.setCycleCode(endCode.getId()); + } + jam.setAvoAgv(jamAgv.getId()); + jam.setNotifyTime(new Date()); + if (!jamService.updateById(jam)) { +// log.error("{}缂栧彿闃诲璁板綍鏇存柊澶辫触锛侊紒锛�", jam.getUuid()); + throw new CoolException(jam.getUuid() + "缂栧彿闃诲璁板綍鏇存柊澶辫触锛侊紒锛�"); + } + } else { + + if (System.currentTimeMillis() - previousTimestamp > timeoutDuration) { + + if (!Cools.isEmpty(lockPathList)) { + pathList = lockPathList; + } else { + log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}" + , agvNo, startCode.getData(), endCode.getData(), "杞﹁締闃诲瓒呮椂"); + } + } else { + log.info("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�", agvNo, jamAgvNo); + } + } + + } while (false); + + } + + if (!initJamCache) { + jam.setDuration(System.currentTimeMillis() - jam.getStartTime().getTime()); + if (!jamService.updateById(jam)) { + log.error("{}缂栧彿闃诲璁板綍鏇存柊澶辫触锛侊紒锛�", jam.getUuid()); + } + } + + } + + } + + if (!Cools.isEmpty(pathList)) { + + if (null != jam) { + jam.setEndTime(now); + jam.setUpdateTime(now); + jam.setState(JamStateType.FINISH.toString()); + if (!jamService.updateById(jam)) { + log.error("{}缂栧彿闃诲璁板綍瀹屾垚淇敼澶辫触锛侊紒锛�", jam.getUuid()); + } + } + // expired jam + for (Jam expiredJam : jamService.list(new LambdaQueryWrapper<Jam>() + .eq(Jam::getJamAgv, agv.getId()) + .eq(Jam::getState, JamStateType.RUNNING.toString()))) { + expiredJam.setEndTime(now); + expiredJam.setUpdateTime(now); + expiredJam.setState(JamStateType.FINISH.toString()); + if (!jamService.updateById(expiredJam)) { + log.error("{}缂栧彿闃诲璁板綍瀹屾垚淇敼澶辫触锛侊紒锛�", expiredJam.getUuid()); + } + } + + } + + return pathList; + } + + private List<String> getSliceAndReturnJamVehicleList(Integer lev, List<String> fullPathList, String agvNo, List<String> input) { + List<String> jamVehicleList = new ArrayList<>(); + + DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev); + String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev); + for (String code : fullPathList) { + int[] node = mapDataDispatcher.getCodeMatrixIdx(lev, code); + + String waveNode = waveMatrix[node[0]][node[1]]; + assert !waveNode.equals(WaveNodeType.DISABLE.val); + if (!waveNode.equals(WaveNodeType.ENABLE.val)) { + List<String> waveNodeList = MapDataUtils.parseWaveNode(waveNode); + List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo); + if (!Cools.isEmpty(otherWaveList)) { + jamVehicleList.addAll(otherWaveList); + break; + } + } + + DynamicNode dynamicNode = dynamicMatrix[node[0]][node[1]]; + String vehicle = dynamicNode.getVehicle(); + assert !vehicle.equals(DynamicNodeType.BLOCK.val); + if (!vehicle.equals(DynamicNodeType.ACCESS.val) && !vehicle.equals(agvNo)) { + jamVehicleList.add(vehicle); + break; + } + + input.add(code); + } + + if (input.size() <= 1) { + input.clear(); + } + + return jamVehicleList; + } + + private String hasEvent(String agvNo) { + List<Agv> agvList = agvService.list(new LambdaQueryWrapper<>()); + for (Agv agv : agvList) { + if (agvNo.equals(agv.getUuid())) { + continue; + } + String jamStr = redis.getValue(RedisConstant.AGV_TRAFFIC_JAM_FLAG, agv.getUuid()); + if (!Cools.isEmpty(jamStr)) { + + TrafficJamDto jamDto = JSON.parseObject(jamStr, TrafficJamDto.class); + + + + } + } + return null; + } + + /** + * avoidPathList include wave node and dynamic node + */ + private boolean notifyVehicleAvoid(String agvNo, String agvPosCode, List<String> avoidPathList, String sponsor, Jam jam) { + Agv agv = agvService.selectByUuid(agvNo); + if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) { + log.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝瀛樺湪杩涜涓换鍔★紒锛侊紒", agvNo); + return false; + } + + int[] startMapIdx = mapDataDispatcher.getCodeMatrixIdx(null, agvPosCode); + RetreatNavigateNode startNode = new RetreatNavigateNode(startMapIdx[0], startMapIdx[1], agvPosCode); + + assert avoidPathList.size() >= 2; + RetreatNavigateNode finalNode = retreatNavigateService.execute(agvNo, startNode, avoidPathList, sponsor, jam); + if (null == finalNode) { + log.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝妫�绱㈤伩璁╃偣澶辫触锛侊紒锛�", agvNo); + return false; + } + + String endCodeData = finalNode.getCodeData(); + Code endCode = codeService.selectByData(endCodeData); + jam.setAvoCode(endCode.getId()); + + List<Segment> waitingSegList = segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString()); + if (!Cools.isEmpty(waitingSegList)) { + + // revert + Date now = new Date(); + for (Segment seg : waitingSegList) { + seg.setState(SegmentStateType.INIT.toString()); + seg.setUpdateTime(now); + if (!segmentService.updateById(seg)) { + log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", seg.getTravelId() + " - " + seg.getSerial()); + } + } + Segment segment = waitingSegList.get(0); + + Segment insertSeg = new Segment(); + insertSeg.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); + insertSeg.setTravelId(segment.getTravelId()); + insertSeg.setAgvId(agv.getId()); + insertSeg.setTaskId(segment.getTaskId()); + insertSeg.setSerial(segment.getSerial() - 1); + insertSeg.setEndNode(endCode.getId()); + insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString()); + insertSeg.setState(SegmentStateType.WAITING.toString()); + if (!segmentService.save(insertSeg)) { + log.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial()); + return false; + } + + } else { + + return mainService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData); + } + + return true; + } + +} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java index 4b44ddf..bf7d1d3 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java @@ -37,7 +37,7 @@ @Autowired private SnowflakeIdWorker snowflakeIdWorker; - public List<Task> validBusDto(List<TaskDto> taskDtoList) { + public List<Task> validTaskDtoList(List<TaskDto> taskDtoList) { List<Task> taskList = new ArrayList<>(); for (TaskDto taskDto : taskDtoList) { if (Cools.isEmpty(taskDto.getSeqNum())) { -- Gitblit v1.9.1