From 13ea8b334572c2423abb8d156fd8428f8d074172 Mon Sep 17 00:00:00 2001 From: zhang <zc857179121@qq.com> Date: 星期四, 03 七月 2025 08:24:58 +0800 Subject: [PATCH] 1 --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java | 4 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java | 39 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenAlgorithmController.java | 40 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/OpenAlgorithmServiceImpl.java | 47 + zy-acs-manager/src/main/java/com/zy/acs/manager/common/security/SecurityConfig.java | 1 zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLxtService.java | 4 zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/AllocateTaskResponse.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/Navigation.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficZkdService.java | 42 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java | 5 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java | 4 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java | 4 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java | 1462 ++++++++++++++++++++++++------------------------ zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainZkdService.java | 119 ++- zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java | 5 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/OpenAgvInfo.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java | 2 20 files changed, 936 insertions(+), 854 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/common/security/SecurityConfig.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/common/security/SecurityConfig.java index 3fe3948..3f5a9d6 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/common/security/SecurityConfig.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/common/security/SecurityConfig.java @@ -34,6 +34,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { public static final String[] FILTER_PATH = new String[]{ + "/api/open/**", "/demo/**", "/test/**", "/fake/**", diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java index a7e2e61..341654f 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java @@ -47,8 +47,6 @@ @Autowired private LocService locService; @Autowired - private TrafficService trafficService; - @Autowired private ThreadPoolRegulator threadPoolRegulator; @Autowired private MapDataDispatcher mapDataDispatcher; diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java index ca24d60..1324f81 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java @@ -62,8 +62,8 @@ private LocService locService; @Autowired private StaService staService; - @Autowired - private TrafficService trafficService; +// @Autowired +// private TrafficService trafficService; @Autowired private ThreadPoolRegulator threadPoolRegulator; @Autowired diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java index 5491b80..318a076 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java @@ -11,7 +11,6 @@ import com.zy.acs.manager.core.constant.StaGroupConstant; import com.zy.acs.manager.core.service.MainLockWrapService; import com.zy.acs.manager.core.service.MainLxtService; -import com.zy.acs.manager.core.service.TrafficService; import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam; import com.zy.acs.manager.manager.entity.*; import com.zy.acs.manager.manager.enums.*; @@ -44,8 +43,7 @@ private ActionService actionService; @Autowired private SegmentService segmentService; - @Autowired - private TrafficService trafficService; + @Autowired private ConfigService configService; @Autowired diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java index cd4e72d..765fde1 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java @@ -2,9 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.manager.core.domain.AgvTaskDto; -import com.zy.acs.manager.core.service.MainLockWrapService; -import com.zy.acs.manager.core.service.MainLxtService; -import com.zy.acs.manager.core.service.TrafficService; +import com.zy.acs.manager.core.service.*; import com.zy.acs.manager.manager.entity.Bus; import com.zy.acs.manager.manager.entity.Segment; import com.zy.acs.manager.manager.entity.Task; @@ -16,6 +14,8 @@ import com.zy.acs.manager.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -53,13 +53,15 @@ @Autowired private MainLxtService mainService; @Autowired + private MainZkdService mainZkdService; + @Autowired private MainLockWrapService mainLockWrapService; @Autowired private ActionService actionService; @Autowired private SegmentService segmentService; @Autowired - private TrafficService trafficService; + private TrafficZkdService trafficZkdService; @Autowired private ConfigService configService; @Autowired @@ -67,20 +69,24 @@ @Autowired private AgvModelService agvModelService; - //@Scheduled(cron = "0/1 * * * * ? ") + @Scheduled(cron = "0/1 * * * * ? ") private void startupBus() throws InterruptedException { // if (!configService.getVal("TaskAssignMode", Boolean.class)) { return; } - if (!this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS)) { return; } + if (!this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS)) { + return; + } List<Bus> busList = busService.selectBySts(BusStsType.RECEIVE); for (Bus bus : busList) { - mainService.allocateTask(bus); + mainZkdService.allocateTask(bus); } this.lock.unlock(); } //@Scheduled(cron = "0/1 * * * * ? ") private void calculateSeg() throws InterruptedException { - if (!this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS)) { return; } + if (!this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS)) { + return; + } List<Task> taskList = taskService.selectBySts(TaskStsType.WAITING); List<AgvTaskDto> taskDtoList = new ArrayList<>(); @@ -101,9 +107,12 @@ this.lock.unlock(); } - //@EventListener(ApplicationReadyEvent.class) + @EventListener(ApplicationReadyEvent.class) public void init() { - try { Thread.sleep(1200); } catch (InterruptedException ignore) {} + try { + Thread.sleep(1200); + } catch (InterruptedException ignore) { + } // traffic calculate this.trafficCalcThread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { @@ -115,7 +124,7 @@ ); for (Segment segment : segments) { long startTime = System.currentTimeMillis(); - trafficService.trigger(segment); + trafficZkdService.trigger(segment); // log.info("traffic calculation spend {} ms", System.currentTimeMillis() - startTime); } @@ -148,7 +157,7 @@ // patch ---------------------------------------------------------------------------------------------- @Scheduled(cron = "0/3 * * * * ? ") - private void busFinishPatch(){ + private void busFinishPatch() { List<Bus> busList = busService.selectBySts(BusStsType.PROGRESS); for (Bus bus : busList) { boolean finish = true; @@ -180,12 +189,12 @@ @PreDestroy - public void shutDown(){ + public void shutDown() { if (this.trafficCalcThread != null) { - this.trafficCalcThread .interrupt(); + this.trafficCalcThread.interrupt(); } if (this.actionPublicThread != null) { - this.actionPublicThread .interrupt(); + this.actionPublicThread.interrupt(); } } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java index c63c585..c14ca71 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java @@ -44,8 +44,6 @@ @Autowired private WebsocketService websocketService; @Autowired - private TrafficService trafficService; - @Autowired private MapService mapService; @Autowired private ThreadPoolRegulator threadPoolRegulator; diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java index d9c55cb..8d02b7b 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java @@ -83,8 +83,8 @@ private TravelService travelService; @Autowired private SegmentService segmentService; - @Autowired - private TrafficService trafficService; +// @Autowired +// private TrafficService trafficService; @Autowired private AgvModelService agvModelService; @Autowired diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLxtService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLxtService.java index 945fa4c..0d6ca93 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLxtService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLxtService.java @@ -76,8 +76,8 @@ private TravelService travelService; @Autowired private SegmentService segmentService; - @Autowired - private TrafficService trafficService; +// @Autowired +// private TrafficService trafficService; @Autowired private AgvModelService agvModelService; @Autowired diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainZkdService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainZkdService.java index 04391b8..540b950 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainZkdService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainZkdService.java @@ -2,17 +2,22 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.SnowflakeIdWorker; import com.zy.acs.manager.common.domain.param.HandlerPublishParam; import com.zy.acs.manager.common.exception.BusinessException; +import com.zy.acs.manager.core.domain.TaskPosDto; import com.zy.acs.manager.core.service.astart.MapDataDispatcher; import com.zy.acs.manager.core.third.zkd.HttpUtils; import com.zy.acs.manager.core.third.zkd.dto.AllocateTask; import com.zy.acs.manager.core.third.zkd.dto.AllocateTaskResponse; import com.zy.acs.manager.core.third.zkd.dto.Navigation; import com.zy.acs.manager.manager.entity.*; -import com.zy.acs.manager.manager.enums.*; +import com.zy.acs.manager.manager.enums.BusStsType; +import com.zy.acs.manager.manager.enums.SegmentStateType; +import com.zy.acs.manager.manager.enums.TaskStsType; +import com.zy.acs.manager.manager.enums.TaskTypeType; import com.zy.acs.manager.manager.service.*; import com.zy.acs.manager.manager.utils.ActionSorter; import com.zy.acs.manager.system.service.ConfigService; @@ -74,8 +79,8 @@ private TravelService travelService; @Autowired private SegmentService segmentService; - @Autowired - private TrafficService trafficService; + // @Autowired +// private TrafficService trafficService; @Autowired private AgvModelService agvModelService; @Autowired @@ -149,20 +154,33 @@ allocateTask.setEnd(endCode); allocateTask.setType("1"); allocateTask.setPriority(task.getPriority()); + allocateTasks.add(allocateTask); } - allocateTasks.add(allocateTask); - String post = HttpUtils.post("http://localhost:8080/zy-acs-manager/api/v1/zkd/allocateTask", JSON.toJSONString(allocateTasks)); - List<AllocateTaskResponse> allocateTaskResponses = JSON.parseArray(post, AllocateTaskResponse.class); - for (AllocateTaskResponse allocateTaskResponse : allocateTaskResponses) { - Task task = taskService.getById(allocateTaskResponse.getTaskId()); - task.setAgvId(Long.parseLong(allocateTaskResponse.getAgvId())); - task.setTaskSts(TaskStsType.WAITING.val()); - task.setIoTime(now); - task.setUpdateTime(now); - if (!taskService.updateById(task)) { - throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); + log.info("allocateTask:{}", JSON.toJSONString(allocateTasks)); + String post = HttpUtils.post("http://10.10.10.239:8002/open/task/send/v1", JSON.toJSONString(allocateTasks)); + if (post == null) { + return; + } + Object data = JSON.parseObject(post).get("data"); + if (data != null) { + List<AllocateTaskResponse> allocateTaskResponses = JSON.parseArray(data.toString(), AllocateTaskResponse.class); + if (Cools.isEmpty(allocateTaskResponses)) { + log.error("allocateTaskResponses is null,{}", post); + throw new BusinessException("浠诲姟涓嬪彂澶辫触"); + } + for (AllocateTaskResponse allocateTaskResponse : allocateTaskResponses) { + Task task = taskService.getById(allocateTaskResponse.getTaskId()); + task.setAgvId(agvService.getAgvId(allocateTaskResponse.getAgvId())); + task.setBack(allocateTaskResponse.getLev_id()); + task.setTaskSts(TaskStsType.WAITING.val()); + task.setIoTime(now); + task.setUpdateTime(now); + if (!taskService.updateById(task)) { + throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); + } } } + } catch (Exception e) { log.error("mainService.allocateTaskByZkd", e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); @@ -175,37 +193,53 @@ * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)} */ @Transactional(propagation = Propagation.REQUIRES_NEW) - public void buildMajorTask(Long agvId, Navigation navigation) { + public boolean buildMajorTask(Long agvId, Navigation navigation) { try { // generate travel - Travel travel = new Travel(); - travel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); - travel.setTravelId(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); - travel.setAgvId(agvId); - travel.setTaskContent(JSON.toJSONString(navigation)); - //travel.setTaskIds(JSON.toJSONString(taskList.stream().map(Task::getId).collect(Collectors.toList()))); - travel.setState(TravelStateType.RUNNING.toString()); - if (!travelService.save(travel)) { - throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�"); - } +// Travel travel = new Travel(); +// travel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); +// travel.setTravelId(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); +// travel.setAgvId(agvId); +// travel.setTaskContent(JSON.toJSONString(navigation)); +// //travel.setTaskIds(JSON.toJSONString(taskList.stream().map(Task::getId).collect(Collectors.toList()))); +// travel.setState(TravelStateType.RUNNING.toString()); +// if (!travelService.save(travel)) { +// throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�"); +// } // generate segment - int segSerial = 0; - List<Segment> segmentList = new ArrayList<>(); + Segment segment = segmentService.getOne(new QueryWrapper<Segment>().eq("uuid", navigation.getSegId())); + if (segment == null) { + segment = new Segment(); + } + int segSerial = 1; + //segment.setTravelId(travel.getId()); + segment.setAgvId(agvId); + + segment.setSerial(segSerial); for (Navigation.CodeDTO codeDTO : navigation.getCodeList()) { - segSerial++; + //segSerial++; Task task = taskService.getById(Long.parseLong(codeDTO.getTaskId())); - Segment segment = new Segment(); - segment.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); - segment.setTravelId(travel.getId()); - segment.setAgvId(agvId); + segment.setUuid(navigation.getSegId()); segment.setTaskId(task.getId()); - segment.setSerial(segSerial); - Code cacheByData = codeService.getCacheByData(codeDTO.getCode()); + Code cacheByData = codeService.getCacheById(Long.parseLong(codeDTO.getCode())); + if (cacheByData == null) { + throw new BusinessException(codeDTO.getCode() + "鐐逛綅涓嶅瓨鍦�"); + } segment.setEndNode(cacheByData.getId()); - segment.setPosType(codeDTO.getPosType()); + if (codeDTO.getPosType() != null) { + if (task.getTaskType().equals(TaskTypeType.LOC_TO_STA.val())) { + segment.setPosType(codeDTO.getPosType().equals("1") ? TaskPosDto.PosType.ORI_LOC.toString() : TaskPosDto.PosType.DEST_STA.toString()); + } else if (task.getTaskType().equals(TaskTypeType.STA_TO_LOC.val())) { + segment.setPosType(codeDTO.getPosType().equals("1") ? TaskPosDto.PosType.ORI_STA.toString() : TaskPosDto.PosType.DEST_LOC.toString()); + } else if (task.getTaskType().equals(TaskTypeType.STA_TO_STA.val())) { + segment.setPosType(codeDTO.getPosType().equals("1") ? TaskPosDto.PosType.ORI_STA.toString() : TaskPosDto.PosType.DEST_STA.toString()); + } else if (task.getTaskType().equals(TaskTypeType.LOC_TO_LOC.val())) { + segment.setPosType(codeDTO.getPosType().equals("1") ? TaskPosDto.PosType.ORI_LOC.toString() : TaskPosDto.PosType.DEST_LOC.toString()); + } + } segment.setBackpack(codeDTO.getLev()); segment.setState(SegmentStateType.INIT.toString()); - segmentList.add(segment); + segment.setPath((Cools.isEmpty(segment.getPath()) ? "" : segment.getPath()) + cacheByData.getData() + ","); task.setTaskSts(TaskStsType.ASSIGN.val()); task.setStartTime(new Date()); @@ -214,20 +248,17 @@ throw new BusinessException(task.getUuid() + "浠诲姟鏇存柊澶辫触"); } } - for (int i = 0; i < segmentList.size(); i++) { - Segment segment = segmentList.get(i); - if (i == 0) { - segment.setState(SegmentStateType.WAITING.toString()); - } - if (!segmentService.save(segment)) { - throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�"); - } + + segment.setState(SegmentStateType.WAITING.toString()); + if (!segmentService.save(segment)) { + throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�"); } } catch (Exception e) { log.error("mainService.buildMajorTask[task]", e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } + return true; } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java index 5f4df21..e1c4631 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java @@ -35,7 +35,7 @@ @Component("mapService") public class MapService { - private final static int[][] DIRECTIONS = {{0,1},{0,-1},{-1,0},{1,0}}; + private final static int[][] DIRECTIONS = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}}; @Value("${floyd.enable}") private Boolean floydEnable; 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 30cd237..2b4dc48 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,742 +1,742 @@ -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.Utils; -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.constant.MapDataConstant; -import com.zy.acs.manager.core.domain.BlockVehicleDto; -import com.zy.acs.manager.core.domain.TaskPosDto; -import com.zy.acs.manager.core.domain.type.BlockSeverityType; -import com.zy.acs.manager.core.service.astart.MapDataDispatcher; -import com.zy.acs.manager.core.service.astart.NavigateNode; -import com.zy.acs.manager.core.service.astart.RetreatNavigateNode; -import com.zy.acs.manager.core.service.astart.WaveNodeType; -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 com.zy.acs.manager.system.service.ConfigService; -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.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -/** - * Wavefront - * Created by vincent on 6/25/2024 - */ -@Slf4j -@Component -public class TrafficService { - - @Autowired - private AgvService agvService; - @Autowired - private AgvDetailService agvDetailService; - @Autowired - private CodeService codeService; - @Autowired - private TravelService travelService; - @Autowired - private SegmentService segmentService; - @Autowired - private MainLxtService mainService; - @Autowired - private MainLockWrapService mainLockWrapService; - @Autowired - private MapService mapService; - @Autowired - private MapDataDispatcher mapDataDispatcher; - @Autowired - private SnowflakeIdWorker snowflakeIdWorker; - @Autowired - private AgvModelService agvModelService; - @Autowired - private RetreatNavigateService retreatNavigateService; - @Autowired - private ConfigService configService; - @Autowired - private JamService jamService; - @Autowired - private AvoidWaveCalculator avoidWaveCalculator; - @Autowired - private TaskService taskService; - @Autowired - private FuncStaService funcStaService; - - @Transactional - public synchronized void trigger(Segment segment) { - try { - Date now = new Date(); - - // deprecate jam - if (this.isExpiredJamByAvo(segment.getId())) { - mainService.settleSegmentList(Utils.singletonList(segment), null); - return; - } - - // temporary ----------------- - Integer algoExtensionTime = configService.getVal("algoExtensionTime", Integer.class); - if (null != algoExtensionTime && algoExtensionTime > 0) { - Thread.sleep(algoExtensionTime); - } - // --------------------------- - - 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; - } - - // resolve deadlock -// if (configService.getVal("unlockSwitch", Boolean.class)) { +//package com.zy.acs.manager.core.service; // -// boolean preSegIsStandbyDeadLock = false; -// Segment previousSeg = segmentService.getPreviousStepOfFinish(segment.getTravelId(), segment.getSerial(), MapDataConstant.RESOLVE_DEADLOCK); -// preSegIsStandbyDeadLock = previousSeg != null; -// if (preSegIsStandbyDeadLock && !jamService.isAvoidSeg(segment.getId())) { -// if (0 < segmentService.count(new LambdaQueryWrapper<Segment>() -// .in(Segment::getState, SegmentStateType.WAITING.toString(), SegmentStateType.RUNNING.toString()) -// .eq(Segment::getMemo, MapDataConstant.RESOLVE_DEADLOCK))) { -// return; -// } -// } +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.zy.acs.common.utils.GsonUtils; +//import com.zy.acs.common.utils.Utils; +//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.constant.MapDataConstant; +//import com.zy.acs.manager.core.domain.BlockVehicleDto; +//import com.zy.acs.manager.core.domain.TaskPosDto; +//import com.zy.acs.manager.core.domain.type.BlockSeverityType; +//import com.zy.acs.manager.core.service.astart.MapDataDispatcher; +//import com.zy.acs.manager.core.service.astart.NavigateNode; +//import com.zy.acs.manager.core.service.astart.RetreatNavigateNode; +//import com.zy.acs.manager.core.service.astart.WaveNodeType; +//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 com.zy.acs.manager.system.service.ConfigService; +//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; // -// Jam jam = jamService.getJam(agv.getId(), agvDetail.getRecentCode(), segment.getId()); -// if (!preSegIsStandbyDeadLock && (null != jam && null != jam.getDuration() && jam.getDuration() > (BlockSeverityType.SEVERE.duration - MapDataConstant.MAX_JAM_TIMEOUT) -// || DateUtils.diffToMilliseconds(segment.getUpdateTime(), now) > (BlockSeverityType.SEVERE.duration - MapDataConstant.MAX_JAM_TIMEOUT)) -// && (Cools.isEmpty(segment.getMemo()) || !segment.getMemo().equals(MapDataConstant.RESOLVE_DEADLOCK))) { +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.Date; +//import java.util.List; +//import java.util.stream.Collectors; // -// Task task = taskService.getById(segment.getTaskId()); -// if (task.getTaskSts().equals(TaskStsType.PROGRESS.val()) -// && DateUtils.diffToMilliseconds(task.getUpdateTime(), now) > MapDataConstant.DEADLOCK_TASK_TIMEOUT) { +///** +// * Wavefront +// * Created by vincent on 6/25/2024 +// */ +//@Slf4j +//@Component +//public class TrafficService { // -// Code endCode = null; -// List<FuncSta> idleFunStaList = funcStaService.findInIdleStatus(FuncStaType.STANDBY, segment.getAgvId()); -// if (!Cools.isEmpty(idleFunStaList)) { -// idleFunStaList = idleFunStaList.stream().filter(funcSta -> { -// return 0 == segmentService.count(new LambdaQueryWrapper<Segment>() -// .eq(Segment::getEndNode, funcSta.getCode()) -// .in(Segment::getState, SegmentStateType.WAITING.toString(), SegmentStateType.RUNNING.toString()) -// .eq(Segment::getMemo, MapDataConstant.RESOLVE_DEADLOCK) -// ); -// }).collect(Collectors.toList()); -// FuncSta funcSta = funcStaService.checkoutFurthestFunSta(agvDetailService.getCurrentCode(segment.getAgvId()).getId(), idleFunStaList); -// if (null != funcSta) { -// endCode = codeService.getCacheById(funcSta.getCode()); -// } -// } -// if (null == endCode) { -// log.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", segment.getAgvId(), FuncStaType.STANDBY); -// return; -// } +// @Autowired +// private AgvService agvService; +// @Autowired +// private AgvDetailService agvDetailService; +// @Autowired +// private CodeService codeService; +// @Autowired +// private TravelService travelService; +// @Autowired +// private SegmentService segmentService; +// @Autowired +// private MainLxtService mainService; +// @Autowired +// private MainLockWrapService mainLockWrapService; +// @Autowired +// private MapService mapService; +// @Autowired +// private MapDataDispatcher mapDataDispatcher; +// @Autowired +// private SnowflakeIdWorker snowflakeIdWorker; +// @Autowired +// private AgvModelService agvModelService; +// @Autowired +// private RetreatNavigateService retreatNavigateService; +// @Autowired +// private ConfigService configService; +// @Autowired +// private JamService jamService; +// @Autowired +// private AvoidWaveCalculator avoidWaveCalculator; +// @Autowired +// private TaskService taskService; +// @Autowired +// private FuncStaService funcStaService; // -// segment.setState(SegmentStateType.INIT.toString()); -// segment.setUpdateTime(now); -// if (!segmentService.updateById(segment)) { -// log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial()); -// return; -// } +// @Transactional +// public synchronized void trigger(Segment segment) { +// try { +// Date now = new Date(); // -// // new move seg -// Segment insertSeg = new Segment(); -// insertSeg.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); -// insertSeg.setTravelId(segment.getTravelId()); -// insertSeg.setAgvId(segment.getAgvId()); -// insertSeg.setTaskId(segment.getTaskId()); -// insertSeg.setSerial(segment.getSerial() - 1); -// insertSeg.setEndNode(endCode.getId()); -// insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString()); -// insertSeg.setState(SegmentStateType.WAITING.toString()); -// insertSeg.setMemo(MapDataConstant.RESOLVE_DEADLOCK); -// if (!segmentService.save(insertSeg)) { -// log.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial()); -// return; -// } +// // deprecate jam +// if (this.isExpiredJamByAvo(segment.getId())) { +// mainService.settleSegmentList(Utils.singletonList(segment), null); +// return; +// } +// +// // temporary ----------------- +// Integer algoExtensionTime = configService.getVal("algoExtensionTime", Integer.class); +// if (null != algoExtensionTime && algoExtensionTime > 0) { +// Thread.sleep(algoExtensionTime); +// } +// // --------------------------- +// +// 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; +// } +// +// // resolve deadlock +//// if (configService.getVal("unlockSwitch", Boolean.class)) { +//// +//// boolean preSegIsStandbyDeadLock = false; +//// Segment previousSeg = segmentService.getPreviousStepOfFinish(segment.getTravelId(), segment.getSerial(), MapDataConstant.RESOLVE_DEADLOCK); +//// preSegIsStandbyDeadLock = previousSeg != null; +//// if (preSegIsStandbyDeadLock && !jamService.isAvoidSeg(segment.getId())) { +//// if (0 < segmentService.count(new LambdaQueryWrapper<Segment>() +//// .in(Segment::getState, SegmentStateType.WAITING.toString(), SegmentStateType.RUNNING.toString()) +//// .eq(Segment::getMemo, MapDataConstant.RESOLVE_DEADLOCK))) { +//// return; +//// } +//// } +//// +//// Jam jam = jamService.getJam(agv.getId(), agvDetail.getRecentCode(), segment.getId()); +//// if (!preSegIsStandbyDeadLock && (null != jam && null != jam.getDuration() && jam.getDuration() > (BlockSeverityType.SEVERE.duration - MapDataConstant.MAX_JAM_TIMEOUT) +//// || DateUtils.diffToMilliseconds(segment.getUpdateTime(), now) > (BlockSeverityType.SEVERE.duration - MapDataConstant.MAX_JAM_TIMEOUT)) +//// && (Cools.isEmpty(segment.getMemo()) || !segment.getMemo().equals(MapDataConstant.RESOLVE_DEADLOCK))) { +//// +//// Task task = taskService.getById(segment.getTaskId()); +//// if (task.getTaskSts().equals(TaskStsType.PROGRESS.val()) +//// && DateUtils.diffToMilliseconds(task.getUpdateTime(), now) > MapDataConstant.DEADLOCK_TASK_TIMEOUT) { +//// +//// Code endCode = null; +//// List<FuncSta> idleFunStaList = funcStaService.findInIdleStatus(FuncStaType.STANDBY, segment.getAgvId()); +//// if (!Cools.isEmpty(idleFunStaList)) { +//// idleFunStaList = idleFunStaList.stream().filter(funcSta -> { +//// return 0 == segmentService.count(new LambdaQueryWrapper<Segment>() +//// .eq(Segment::getEndNode, funcSta.getCode()) +//// .in(Segment::getState, SegmentStateType.WAITING.toString(), SegmentStateType.RUNNING.toString()) +//// .eq(Segment::getMemo, MapDataConstant.RESOLVE_DEADLOCK) +//// ); +//// }).collect(Collectors.toList()); +//// FuncSta funcSta = funcStaService.checkoutFurthestFunSta(agvDetailService.getCurrentCode(segment.getAgvId()).getId(), idleFunStaList); +//// if (null != funcSta) { +//// endCode = codeService.getCacheById(funcSta.getCode()); +//// } +//// } +//// if (null == endCode) { +//// log.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", segment.getAgvId(), FuncStaType.STANDBY); +//// return; +//// } +//// +//// segment.setState(SegmentStateType.INIT.toString()); +//// segment.setUpdateTime(now); +//// if (!segmentService.updateById(segment)) { +//// log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial()); +//// return; +//// } +//// +//// // new move seg +//// Segment insertSeg = new Segment(); +//// insertSeg.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); +//// insertSeg.setTravelId(segment.getTravelId()); +//// insertSeg.setAgvId(segment.getAgvId()); +//// insertSeg.setTaskId(segment.getTaskId()); +//// insertSeg.setSerial(segment.getSerial() - 1); +//// insertSeg.setEndNode(endCode.getId()); +//// insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString()); +//// insertSeg.setState(SegmentStateType.WAITING.toString()); +//// insertSeg.setMemo(MapDataConstant.RESOLVE_DEADLOCK); +//// if (!segmentService.save(insertSeg)) { +//// log.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial()); +//// return; +//// } +//// 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())) { +//// log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid()); // 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())) { -// log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid()); - return; - } - } - } - - // dead lane - 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>>>() {}); - - // * sync wave scope - if (!avoidWaveCalculator.calcWaveScope()) { - log.error("failed to calculate avoid wave matrix ..."); - return; - } - - // checkout path - Code startCode = codeService.getCacheById(agvDetail.getRecentCode()); - Code endCode = codeService.getCacheById(endNode); - long startTime = System.currentTimeMillis(); - List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment); -// System.out.println("checkoutPath: " + (System.currentTimeMillis() - startTime)); - 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.getCacheByData(lastCodeData); - -// if (pathList.size() <= MIN_SLICE_PATH_LENGTH) { -// return; +// +// // dead lane +// 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>>>() {}); +// +// // * sync wave scope +// if (!avoidWaveCalculator.calcWaveScope()) { +// log.error("failed to calculate avoid wave matrix ..."); +// return; +// } +// +// // checkout path +// Code startCode = codeService.getCacheById(agvDetail.getRecentCode()); +// Code endCode = codeService.getCacheById(endNode); +// long startTime = System.currentTimeMillis(); +// List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment); +//// System.out.println("checkoutPath: " + (System.currentTimeMillis() - startTime)); +// 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.getCacheByData(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()); // } - - // 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 [{}] failed to save 锛侊紒锛�", 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()); - - startTime = System.currentTimeMillis(); - mainService.generateAction(segment.getAgvId(), segmentList, pathList, now); -// System.out.println("generateAction: " + (System.currentTimeMillis() - startTime)); - - } catch (Exception e) { - log.error("TrafficService.trigger", e); - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - - } - } - - 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()); - BlockSeverityType blockSeverity = BlockSeverityType.query(null == jam ? null : jam.getDuration()); - // 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, blackPath, segment); - // 閬胯瑙� - 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 - ) { - - pathList = lockPathList; - } else { - - // preview path - List<String> draftPath = new ArrayList<>(unlockPathList); - if (blockSeverity.equals(BlockSeverityType.SEVERE)) { - unlockPathList.remove(endCode.getData()); - blackPath.addAll(unlockPathList); - List<String> newUnlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment); - if (!Cools.isEmpty(newUnlockPathList)) { - draftPath = newUnlockPathList; - } - } - // 鍙蛋琛岃矾寰勯泦鍚堣绠� - List<BlockVehicleDto> blockVehicleList = this.slicePathAndReturnBlockVehicleList(lev, draftPath, agvNo, pathList); // jamAgvNo may was wave - - if (!Cools.isEmpty(pathList)) { - - if (!pathList.get(pathList.size() - 1).equals(endCode.getData())) { - assert !Cools.isEmpty(blockVehicleList); - - boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable()); - if (hasUnavoidableBlocks && pathList.size() <= MapDataConstant.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(); - } - } - - // 鏃犲彲璧拌璺緞 - } else { - - 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 { - - assert !Cools.isEmpty(blockVehicleList); - Integer maxJamTimeoutFactor = null; - - // persist jam data - jam = this.createOrUpdateJam(agv, startCode, segment, jam, draftPath); - - // ? has unAvoidable block vehicles - if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())) { - - // set factor of jam timeout - maxJamTimeoutFactor = 1; - } else { - - // ? already do notify to avoid - if (!Cools.isEmpty(jam.getAvoAgv()) - && BlockVehicleDto.customContain(blockVehicleList, agvService.getById(jam.getAvoAgv()).getUuid())) { - - maxJamTimeoutFactor = 4; - - } else { - - // select optimal block vehicle - String blockAgvNo = this.checkoutBestSolutionOfBlocks(blockVehicleList, segment); - if (Cools.isEmpty(blockAgvNo)) { - - maxJamTimeoutFactor = 2; - - } else { - - // block vehicle info - Long blockAgvId = agvService.getAgvId(blockAgvNo); - String blockAgvCode = codeService.getCacheById(agvDetailService.selectMajorByAgvId(blockAgvId).getRecentCode()).getData(); - - // create new jam if already notify the avoid vehicle - if (!Cools.isEmpty(jam.getAvoAgv(), jam.getAvoSeg()) && !blockAgvId.equals(jam.getAvoAgv())) { - jam = this.setupNewJam(jam, agv, startCode, segment, draftPath); - } - - do { - - // 闃诲杞﹁締姝e湪鍘熷湴浣滀笟锛岀瓑寰� ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺� - List<Segment> runningSegList = segmentService.getByAgvAndState(blockAgvId, SegmentStateType.RUNNING.toString()); - if (!Cools.isEmpty(runningSegList)) { - maxJamTimeoutFactor = 1; - break; - } - - // 鍒ゆ柇涓嬩釜浠诲姟鏄惁涓哄師鍦颁换鍔★紝濡傛灉鏄垯绛夊緟 ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺紱濡傛灉涓嶆槸锛岃闃诲杞﹁締閬胯 - List<Segment> waitingSegList = segmentService.getJustWaitingSeg(blockAgvId); - if (null != waitingSegList - && waitingSegList.stream().anyMatch( - waitingSeg -> waitingSeg.getEndNode().equals(codeService.getCacheByData(blockAgvCode).getId()) - )) { - maxJamTimeoutFactor = 1; - break; - } - - // notify block vehicle to avoid - if (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, draftPath, agvNo, jam)) { - if (jam.getCycleAvo() == 1) { - jam.setCycleCode(endCode.getId()); - } - jam.setAvoAgv(blockAgvId); - 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() > (long) MapDataConstant.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)) { - - if (null != jam) { - boolean beDeprecate = false; - if (blockSeverity.equals(BlockSeverityType.SEVERE) && !Cools.isEmpty(jam.getJamPath())) { - List<String> jamPath = GsonUtils.fromJsonToList(jam.getJamPath(), String.class); - if (!this.comparePathLists(jamPath, pathList)) { // jamPath >= pathList - beDeprecate = true; - } - } - jam.setEndTime(now); - jam.setUpdateTime(now); - jam.setState(beDeprecate ? JamStateType.DEPRECATED.toString() : JamStateType.FINISH.toString()); - if (jamService.updateById(jam)) { - if (beDeprecate) { - // search previous jam that jamSeg from this segment - List<Jam> previousJams = jamService.list(new LambdaQueryWrapper<Jam>() - .eq(Jam::getJamSeg, segment.getId()) - .eq(Jam::getState, JamStateType.FINISH.toString()) - ); - for (Jam previousJam : previousJams) { - previousJam.setState(JamStateType.DEPRECATED.toString()); - previousJam.setUpdateTime(now); - if (!jamService.updateById(previousJam)) { - log.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid()); - } - } - } - } else { - log.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid()); - } - } - // deal 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.DEPRECATED.toString()); - if (!jamService.updateById(expiredJam)) { - log.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid()); - } - } - - } - - return pathList; - } - - private List<BlockVehicleDto> slicePathAndReturnBlockVehicleList(Integer lev, List<String> fullPathList, String agvNo, List<String> pathList) { - List<BlockVehicleDto> blockVehicleList = new ArrayList<>(); - - String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev); - List<int[]> codeMatrixIdxList = mapDataDispatcher.getCodeMatrixIdxList(lev, fullPathList); - for (int i = 0; i < fullPathList.size(); i++) { - String codeData = fullPathList.get(i); - int[] codeMatrixIdx = codeMatrixIdxList.get(i); - - String waveNode = waveMatrix[codeMatrixIdx[0]][codeMatrixIdx[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)) { - for (String otherWave : otherWaveList) { - if (mapService.isWalkingByVehicle(lev, otherWave)) { - blockVehicleList.add(new BlockVehicleDto(otherWave, false)); - } else { - blockVehicleList.add(new BlockVehicleDto(otherWave, true)); - } - } - break; - } - } - - pathList.add(codeData); - } - - if (pathList.size() <= 1) { - pathList.clear(); - } - - return blockVehicleList.stream().distinct().collect(Collectors.toList()); - } - - /** - * avoidPathList include wave node and dynamic node - */ - private boolean notifyVehicleAvoid(String agvNo, String agvPosCode, List<String> avoidPathList, String sponsor, Jam jam) { - Long agvId = agvService.getAgvId(agvNo); - if (!Cools.isEmpty(segmentService.getByAgvAndState(agvId, 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.getCacheByData(endCodeData); - - List<Segment> waitingSegList = segmentService.getByAgvAndState(agvId, 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) { - 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(agvId); - 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 { - jam.setAvoSeg(insertSeg.getId()); - jam.setAvoCode(endCode.getId()); - } - - } else { - - return mainLockWrapService.buildMinorTask(agvId, TaskTypeType.MOVE, endCodeData, jam); - } - - return true; - } - - 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)) { - log.error("AGV[{}] failed to save jam", agv.getUuid()); - throw new CoolException("failed to save jam"); - } - } else { - jam.setDuration(System.currentTimeMillis() - jam.getStartTime().getTime()); - if (!jamService.updateById(jam)) { - log.error("AGV[{}] failed to update jam", agv.getUuid()); - } - } - return jam; - } - - private Jam setupNewJam(Jam originJam, Agv agv, Code startCode, Segment segment, List<String> draftPath) { - originJam.setUpdateTime(new Date()); - originJam.setState(JamStateType.FINISH.toString()); - if (!jamService.updateById(originJam)) { - log.error("Jam[{}] failed to update", originJam.getUuid()); - return originJam; - } else { - return this.createOrUpdateJam( - agv - , startCode - , segment - , null - , draftPath - ); - } - } - - private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) { - List<String> blackPathList = new ArrayList<>(); - Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV; - if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) { - for (Jam jam : unfinishedOriginJamByCurrAgv) { - if (!Cools.isEmpty(jam.getJamPath())) { - - List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class); - - Agv jamAgv = agvService.getById(jam.getJamAgv()); - List<String> jamDynamicNodes = mapService.queryCodeListFromDynamicNode(lev, jamAgv.getUuid()); - // jamDynamicNodes has sorted - String firstCodeNode = jamDynamicNodes.stream().findFirst().orElse(null); - - if (!Cools.isEmpty(firstCodeNode)) { - int idx = list.indexOf(firstCodeNode); - if (idx != -1) { - list = new ArrayList<>(list.subList(idx, list.size())); - - // the wave of first node - Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance( - agvModelService.getById(jamAgv.getAgvModel()).getDiameter(), - MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR - ); - List<String> waveCodeList = mapService.getWaveScopeByCode(lev, firstCodeNode, avoidDistance) - .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList()); - list.addAll(waveCodeList); - } else { - // 濡傛灉琚樆濉炶溅杈嗗凡缁忎笉鍦ㄥ師鏉ョ殑闃诲璺緞涓紝鑰冭檻閬胯杞﹁蛋琛屾椂涓嶉渶瑕佹妸涔嬪墠鐨勯樆濉炶矾寰勫姞鍏ラ粦鍚嶅崟 - list = new ArrayList<>(); - } - } - - blackPathList.addAll(list); - } - } - } - return blackPathList.stream().distinct().collect(Collectors.toList()); - } - - private String checkoutBestSolutionOfBlocks(List<BlockVehicleDto> blockVehicleList, Segment segment) { - assert !Cools.isEmpty(blockVehicleList); - for (BlockVehicleDto blockVehicleDto : blockVehicleList) { - if (!blockVehicleDto.isAvoidable()) { - continue; - } - // 褰撳墠vehicle姝e湪杩涜閬胯浣滀笟 - if (!Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(blockVehicleDto.getVehicle(), null))) { - continue; - } - return blockVehicleDto.getVehicle(); - } - return null; - } - - public boolean comparePathLists(List<String> list1, List<String> list2) { - if (list1.equals(list2)) { - return true; - } - if (list1.containsAll(list2)) { - return true; - } - return false; - } - - /** - * 1. the jam was deprecated - * 2. the jam segment is finished - * - * all these by avoid segment - */ - private boolean isExpiredJamByAvo(Long avoSeg) { - List<Jam> jamList = jamService.list(new LambdaQueryWrapper<Jam>() -// .eq(Jam::getAvoAgv, avoAgv) - .eq(Jam::getAvoSeg, avoSeg)); - if (Cools.isEmpty(jamList)) { - return false; - } - if (jamList.size() > 1) { - log.error("AvoSeg[id = {}] seg data has exception, result in two jams", avoSeg); - } - Jam jam = jamList.get(0); - if (jam.getState().equals(JamStateType.DEPRECATED.toString())) { - return true; - } - Segment jamSegment = segmentService.getById(jam.getJamSeg()); - if (jamSegment.getState().equals(SegmentStateType.FINISH.toString())) { - return true; - } - return false; - } - -} +// 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 [{}] failed to save 锛侊紒锛�", 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()); +// +// startTime = System.currentTimeMillis(); +// mainService.generateAction(segment.getAgvId(), segmentList, pathList, now); +//// System.out.println("generateAction: " + (System.currentTimeMillis() - startTime)); +// +// } catch (Exception e) { +// log.error("TrafficService.trigger", e); +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// +// } +// } +// +// 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()); +// BlockSeverityType blockSeverity = BlockSeverityType.query(null == jam ? null : jam.getDuration()); +// // 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, blackPath, segment); +// // 閬胯瑙� +// 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 +// ) { +// +// pathList = lockPathList; +// } else { +// +// // preview path +// List<String> draftPath = new ArrayList<>(unlockPathList); +// if (blockSeverity.equals(BlockSeverityType.SEVERE)) { +// unlockPathList.remove(endCode.getData()); +// blackPath.addAll(unlockPathList); +// List<String> newUnlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment); +// if (!Cools.isEmpty(newUnlockPathList)) { +// draftPath = newUnlockPathList; +// } +// } +// // 鍙蛋琛岃矾寰勯泦鍚堣绠� +// List<BlockVehicleDto> blockVehicleList = this.slicePathAndReturnBlockVehicleList(lev, draftPath, agvNo, pathList); // jamAgvNo may was wave +// +// if (!Cools.isEmpty(pathList)) { +// +// if (!pathList.get(pathList.size() - 1).equals(endCode.getData())) { +// assert !Cools.isEmpty(blockVehicleList); +// +// boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable()); +// if (hasUnavoidableBlocks && pathList.size() <= MapDataConstant.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(); +// } +// } +// +// // 鏃犲彲璧拌璺緞 +// } else { +// +// 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 { +// +// assert !Cools.isEmpty(blockVehicleList); +// Integer maxJamTimeoutFactor = null; +// +// // persist jam data +// jam = this.createOrUpdateJam(agv, startCode, segment, jam, draftPath); +// +// // ? has unAvoidable block vehicles +// if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())) { +// +// // set factor of jam timeout +// maxJamTimeoutFactor = 1; +// } else { +// +// // ? already do notify to avoid +// if (!Cools.isEmpty(jam.getAvoAgv()) +// && BlockVehicleDto.customContain(blockVehicleList, agvService.getById(jam.getAvoAgv()).getUuid())) { +// +// maxJamTimeoutFactor = 4; +// +// } else { +// +// // select optimal block vehicle +// String blockAgvNo = this.checkoutBestSolutionOfBlocks(blockVehicleList, segment); +// if (Cools.isEmpty(blockAgvNo)) { +// +// maxJamTimeoutFactor = 2; +// +// } else { +// +// // block vehicle info +// Long blockAgvId = agvService.getAgvId(blockAgvNo); +// String blockAgvCode = codeService.getCacheById(agvDetailService.selectMajorByAgvId(blockAgvId).getRecentCode()).getData(); +// +// // create new jam if already notify the avoid vehicle +// if (!Cools.isEmpty(jam.getAvoAgv(), jam.getAvoSeg()) && !blockAgvId.equals(jam.getAvoAgv())) { +// jam = this.setupNewJam(jam, agv, startCode, segment, draftPath); +// } +// +// do { +// +// // 闃诲杞﹁締姝e湪鍘熷湴浣滀笟锛岀瓑寰� ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺� +// List<Segment> runningSegList = segmentService.getByAgvAndState(blockAgvId, SegmentStateType.RUNNING.toString()); +// if (!Cools.isEmpty(runningSegList)) { +// maxJamTimeoutFactor = 1; +// break; +// } +// +// // 鍒ゆ柇涓嬩釜浠诲姟鏄惁涓哄師鍦颁换鍔★紝濡傛灉鏄垯绛夊緟 ===>> 瓒呰繃绛夊緟鏃堕棿锛岀粫璺紱濡傛灉涓嶆槸锛岃闃诲杞﹁締閬胯 +// List<Segment> waitingSegList = segmentService.getJustWaitingSeg(blockAgvId); +// if (null != waitingSegList +// && waitingSegList.stream().anyMatch( +// waitingSeg -> waitingSeg.getEndNode().equals(codeService.getCacheByData(blockAgvCode).getId()) +// )) { +// maxJamTimeoutFactor = 1; +// break; +// } +// +// // notify block vehicle to avoid +// if (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, draftPath, agvNo, jam)) { +// if (jam.getCycleAvo() == 1) { +// jam.setCycleCode(endCode.getId()); +// } +// jam.setAvoAgv(blockAgvId); +// 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() > (long) MapDataConstant.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)) { +// +// if (null != jam) { +// boolean beDeprecate = false; +// if (blockSeverity.equals(BlockSeverityType.SEVERE) && !Cools.isEmpty(jam.getJamPath())) { +// List<String> jamPath = GsonUtils.fromJsonToList(jam.getJamPath(), String.class); +// if (!this.comparePathLists(jamPath, pathList)) { // jamPath >= pathList +// beDeprecate = true; +// } +// } +// jam.setEndTime(now); +// jam.setUpdateTime(now); +// jam.setState(beDeprecate ? JamStateType.DEPRECATED.toString() : JamStateType.FINISH.toString()); +// if (jamService.updateById(jam)) { +// if (beDeprecate) { +// // search previous jam that jamSeg from this segment +// List<Jam> previousJams = jamService.list(new LambdaQueryWrapper<Jam>() +// .eq(Jam::getJamSeg, segment.getId()) +// .eq(Jam::getState, JamStateType.FINISH.toString()) +// ); +// for (Jam previousJam : previousJams) { +// previousJam.setState(JamStateType.DEPRECATED.toString()); +// previousJam.setUpdateTime(now); +// if (!jamService.updateById(previousJam)) { +// log.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid()); +// } +// } +// } +// } else { +// log.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid()); +// } +// } +// // deal 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.DEPRECATED.toString()); +// if (!jamService.updateById(expiredJam)) { +// log.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid()); +// } +// } +// +// } +// +// return pathList; +// } +// +// private List<BlockVehicleDto> slicePathAndReturnBlockVehicleList(Integer lev, List<String> fullPathList, String agvNo, List<String> pathList) { +// List<BlockVehicleDto> blockVehicleList = new ArrayList<>(); +// +// String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev); +// List<int[]> codeMatrixIdxList = mapDataDispatcher.getCodeMatrixIdxList(lev, fullPathList); +// for (int i = 0; i < fullPathList.size(); i++) { +// String codeData = fullPathList.get(i); +// int[] codeMatrixIdx = codeMatrixIdxList.get(i); +// +// String waveNode = waveMatrix[codeMatrixIdx[0]][codeMatrixIdx[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)) { +// for (String otherWave : otherWaveList) { +// if (mapService.isWalkingByVehicle(lev, otherWave)) { +// blockVehicleList.add(new BlockVehicleDto(otherWave, false)); +// } else { +// blockVehicleList.add(new BlockVehicleDto(otherWave, true)); +// } +// } +// break; +// } +// } +// +// pathList.add(codeData); +// } +// +// if (pathList.size() <= 1) { +// pathList.clear(); +// } +// +// return blockVehicleList.stream().distinct().collect(Collectors.toList()); +// } +// +// /** +// * avoidPathList include wave node and dynamic node +// */ +// private boolean notifyVehicleAvoid(String agvNo, String agvPosCode, List<String> avoidPathList, String sponsor, Jam jam) { +// Long agvId = agvService.getAgvId(agvNo); +// if (!Cools.isEmpty(segmentService.getByAgvAndState(agvId, 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.getCacheByData(endCodeData); +// +// List<Segment> waitingSegList = segmentService.getByAgvAndState(agvId, 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) { +// 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(agvId); +// 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 { +// jam.setAvoSeg(insertSeg.getId()); +// jam.setAvoCode(endCode.getId()); +// } +// +// } else { +// +// return mainLockWrapService.buildMinorTask(agvId, TaskTypeType.MOVE, endCodeData, jam); +// } +// +// return true; +// } +// +// 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)) { +// log.error("AGV[{}] failed to save jam", agv.getUuid()); +// throw new CoolException("failed to save jam"); +// } +// } else { +// jam.setDuration(System.currentTimeMillis() - jam.getStartTime().getTime()); +// if (!jamService.updateById(jam)) { +// log.error("AGV[{}] failed to update jam", agv.getUuid()); +// } +// } +// return jam; +// } +// +// private Jam setupNewJam(Jam originJam, Agv agv, Code startCode, Segment segment, List<String> draftPath) { +// originJam.setUpdateTime(new Date()); +// originJam.setState(JamStateType.FINISH.toString()); +// if (!jamService.updateById(originJam)) { +// log.error("Jam[{}] failed to update", originJam.getUuid()); +// return originJam; +// } else { +// return this.createOrUpdateJam( +// agv +// , startCode +// , segment +// , null +// , draftPath +// ); +// } +// } +// +// private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) { +// List<String> blackPathList = new ArrayList<>(); +// Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV; +// if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) { +// for (Jam jam : unfinishedOriginJamByCurrAgv) { +// if (!Cools.isEmpty(jam.getJamPath())) { +// +// List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class); +// +// Agv jamAgv = agvService.getById(jam.getJamAgv()); +// List<String> jamDynamicNodes = mapService.queryCodeListFromDynamicNode(lev, jamAgv.getUuid()); +// // jamDynamicNodes has sorted +// String firstCodeNode = jamDynamicNodes.stream().findFirst().orElse(null); +// +// if (!Cools.isEmpty(firstCodeNode)) { +// int idx = list.indexOf(firstCodeNode); +// if (idx != -1) { +// list = new ArrayList<>(list.subList(idx, list.size())); +// +// // the wave of first node +// Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance( +// agvModelService.getById(jamAgv.getAgvModel()).getDiameter(), +// MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR +// ); +// List<String> waveCodeList = mapService.getWaveScopeByCode(lev, firstCodeNode, avoidDistance) +// .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList()); +// list.addAll(waveCodeList); +// } else { +// // 濡傛灉琚樆濉炶溅杈嗗凡缁忎笉鍦ㄥ師鏉ョ殑闃诲璺緞涓紝鑰冭檻閬胯杞﹁蛋琛屾椂涓嶉渶瑕佹妸涔嬪墠鐨勯樆濉炶矾寰勫姞鍏ラ粦鍚嶅崟 +// list = new ArrayList<>(); +// } +// } +// +// blackPathList.addAll(list); +// } +// } +// } +// return blackPathList.stream().distinct().collect(Collectors.toList()); +// } +// +// private String checkoutBestSolutionOfBlocks(List<BlockVehicleDto> blockVehicleList, Segment segment) { +// assert !Cools.isEmpty(blockVehicleList); +// for (BlockVehicleDto blockVehicleDto : blockVehicleList) { +// if (!blockVehicleDto.isAvoidable()) { +// continue; +// } +// // 褰撳墠vehicle姝e湪杩涜閬胯浣滀笟 +// if (!Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(blockVehicleDto.getVehicle(), null))) { +// continue; +// } +// return blockVehicleDto.getVehicle(); +// } +// return null; +// } +// +// public boolean comparePathLists(List<String> list1, List<String> list2) { +// if (list1.equals(list2)) { +// return true; +// } +// if (list1.containsAll(list2)) { +// return true; +// } +// return false; +// } +// +// /** +// * 1. the jam was deprecated +// * 2. the jam segment is finished +// * +// * all these by avoid segment +// */ +// private boolean isExpiredJamByAvo(Long avoSeg) { +// List<Jam> jamList = jamService.list(new LambdaQueryWrapper<Jam>() +//// .eq(Jam::getAvoAgv, avoAgv) +// .eq(Jam::getAvoSeg, avoSeg)); +// if (Cools.isEmpty(jamList)) { +// return false; +// } +// if (jamList.size() > 1) { +// log.error("AvoSeg[id = {}] seg data has exception, result in two jams", avoSeg); +// } +// Jam jam = jamList.get(0); +// if (jam.getState().equals(JamStateType.DEPRECATED.toString())) { +// return true; +// } +// Segment jamSegment = segmentService.getById(jam.getJamSeg()); +// if (jamSegment.getState().equals(SegmentStateType.FINISH.toString())) { +// return true; +// } +// return false; +// } +// +//} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficZkdService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficZkdService.java index 861f248..b592454 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficZkdService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficZkdService.java @@ -76,30 +76,36 @@ } // --------------------------- - Travel travel = travelService.getById(segment.getTravelId()); - Agv agv = agvService.getById(travel.getAgvId()); - AgvDetail agvDetail = agvDetailService.selectByAgvId(travel.getAgvId()); - long endNode = segment.getEndNode(); +// Travel travel = travelService.getById(segment.getTravelId()); +// Agv agv = agvService.getById(travel.getAgvId()); +// AgvDetail agvDetail = agvDetailService.selectByAgvId(travel.getAgvId()); +// long endNode = segment.getEndNode(); - 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())) { -// log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid()); - 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())) { +//// log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid()); +// return; +// } +// } +// } List<Segment> segmentList = new ArrayList<>(); segmentList.add(segment); - - mainZkdService.generateAction(segment.getAgvId(), segmentList, null, now); + List<String> pathList = new ArrayList<>(); + String[] split = segment.getPath().split(","); + for (int i = 0; i < split.length; i++) { + if (!Cools.isEmpty(split[i])) { + pathList.add(split[i]); + } + } + mainZkdService.generateAction(segment.getAgvId(), segmentList, pathList, now); } catch (Exception e) { log.error("TrafficService.trigger", e); diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/AllocateTaskResponse.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/AllocateTaskResponse.java index 5374127..69d5d1f 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/AllocateTaskResponse.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/AllocateTaskResponse.java @@ -11,4 +11,6 @@ private String agvId; + + private Integer lev_id; } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/Navigation.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/Navigation.java index e2b6b21..2bc45a4 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/Navigation.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/third/zkd/dto/Navigation.java @@ -10,7 +10,7 @@ private String agvId; - private List<CodeDTO> CodeList; + private List<CodeDTO> codeList; private String segId; diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenAlgorithmController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenAlgorithmController.java index f6fb37d..f351041 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenAlgorithmController.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenAlgorithmController.java @@ -1,8 +1,7 @@ package com.zy.acs.manager.manager.controller; -import com.zy.acs.framework.common.Cools; +import com.alibaba.fastjson.JSONObject; import com.zy.acs.framework.common.R; -import com.zy.acs.manager.common.annotation.OperationLog; import com.zy.acs.manager.core.service.MainZkdService; import com.zy.acs.manager.core.third.zkd.dto.Navigation; import com.zy.acs.manager.manager.controller.param.OpenAgvParam; @@ -10,17 +9,15 @@ import com.zy.acs.manager.manager.service.CodeService; import com.zy.acs.manager.manager.service.OpenAlgorithmService; import com.zy.acs.manager.system.controller.BaseController; -import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * Created by vincent on 2023/6/12 */ -@Api(tags = "Open Api") +//@Api(tags = "Open Api") +@Slf4j @RestController @RequestMapping("/api/open/algorithm") public class OpenAlgorithmController extends BaseController { @@ -37,24 +34,31 @@ @Autowired private CodeService codeService; + @GetMapping("/demo") + public R demo() { + return R.ok("demo"); + } + @PostMapping("/getAgv") - @OperationLog("get agv msg") - public R save(@RequestBody OpenAgvParam param) { - if (Cools.isEmpty(param)) { - return R.error("涓嶈兘涓虹┖"); - } - if (Cools.isEmpty(param.getMapId())) { - return R.error("鍦板浘缂栧彿涓嶈兘涓虹┖"); - } +// @OperationLog("get agv msg") + public R save(@RequestBody(required = false) OpenAgvParam param) { +// if (Cools.isEmpty(param)) { +// return R.error("涓嶈兘涓虹┖"); +// } +// if (Cools.isEmpty(param.getMapId())) { +// return R.error("鍦板浘缂栧彿涓嶈兘涓虹┖"); +// } return R.ok(openAlgorithmService.listAgv(param)); } @RequestMapping("/zkd/navigation/v1") - public Object navigation(@RequestBody Navigation navigation) { + public Object navigation(@RequestBody String data) { + log.info("鏀跺埌鐨勫鑸俊鎭細{}", data); + Navigation navigation = JSONObject.parseObject(data, Navigation.class); Long agvId = agvService.getAgvId(navigation.getAgvId()); mainZkdService.buildMajorTask(agvId, navigation); - return null; + return R.ok(); } } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/OpenAgvInfo.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/OpenAgvInfo.java index 634355d..301890c 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/OpenAgvInfo.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/OpenAgvInfo.java @@ -11,7 +11,7 @@ /** * AGV缂栧彿 */ - private String agvNo; + private String agvId; /* * 鐘舵�� */ diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java index 9f7cb82..95f82e5 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java @@ -75,6 +75,11 @@ */ @ApiModelProperty(value= "鐩爣鑺傜偣") private Long endNode; + /** + * 鐩爣鑺傜偣 + */ + @ApiModelProperty(value= "璺緞鑺傜偣") + private String path; /** * 浣滀笟绫诲埆 diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java index af1c34c..86c3a04 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java @@ -96,6 +96,11 @@ */ @ApiModelProperty(value= "寮傚父鏃堕棿") private Date errTime; + /** + * 鑳岀瘬 + */ + @ApiModelProperty(value= "鑳岀瘬") + private Integer back; /** * 璧峰绔� diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/OpenAlgorithmServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/OpenAlgorithmServiceImpl.java index e3f930e..0801e8a 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/OpenAlgorithmServiceImpl.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/OpenAlgorithmServiceImpl.java @@ -1,12 +1,17 @@ package com.zy.acs.manager.manager.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.utils.GsonUtils; +import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.core.domain.BackpackDto; import com.zy.acs.manager.manager.controller.param.OpenAgvParam; import com.zy.acs.manager.manager.controller.result.BackpackVo; import com.zy.acs.manager.manager.controller.result.OpenAgvInfo; -import com.zy.acs.manager.manager.entity.*; -import com.zy.acs.manager.manager.enums.SegmentStateType; +import com.zy.acs.manager.manager.entity.Agv; +import com.zy.acs.manager.manager.entity.AgvDetail; +import com.zy.acs.manager.manager.entity.AgvModel; +import com.zy.acs.manager.manager.entity.Task; +import com.zy.acs.manager.manager.enums.TaskStsType; import com.zy.acs.manager.manager.service.*; import com.zy.acs.manager.system.service.ConfigService; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +38,14 @@ private ConfigService configService; + public static final ArrayList<String> FOURTH_AGV_GROUP = new ArrayList<String>() {{ + add("113"); + add("115"); + add("116"); + add("117"); + add("119"); + }}; + @Override public List<OpenAgvInfo> listAgv(OpenAgvParam param) { List<Agv> agvList = agvService.list(); @@ -40,12 +53,16 @@ AgvDetail agvDetail; AgvModel agvModel; for (Agv agv : agvList) { + if (!FOURTH_AGV_GROUP.contains(agv.getUuid())) { + continue; + } agvDetail = agvDetailService.getById(agv.getId()); List<Task> taskList = taskService.findTransportTasksByAgv(agvDetail.getId()); agvModel = agvModelService.getByAgvId(agv.getAgvModel()); OpenAgvInfo info = new OpenAgvInfo(); - info.setAgvNo(agvDetail.getUuid()); - info.setStatus(agvDetail.getStatus()); + info.setAgvId(agv.getUuid()); + info.setStatus(1); + //info.setStatus(agvDetail.getStatus()); info.setPosition(agvDetail.getCode$()); info.setDirection(agvDetail.getAgvAngle()); info.setVol(agvDetail.getVol()); @@ -57,16 +74,24 @@ BackpackVo backpackVo; List<Long> taskIds = taskList.stream().map(Task::getId).collect(Collectors.toList()); List<BackpackDto> backpackDtos = GsonUtils.fromJsonToList(agvDetail.getBackpack(), BackpackDto.class); - for (int i = 0; i < agvModel.getBackpack(); i++) { - BackpackDto backpackDto = backpackDtos.get(i); + for (int i = 1; i <= agvModel.getBackpack(); i++) { backpackVo = new BackpackVo(); - List<Segment> segments = segmentService.getByAgvAndTaskAndBackpack(agvDetail.getAgvId(), taskIds, backpackVo.getIndex()); - for (Segment segment : segments) { - backpackVo.setTaskId(segment.getTaskId() + ""); - } backpackVo.setIndex(i); + List<Task> taskList1 = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getAgvId, agv.getId()).eq(Task::getBack, i).in(Task::getTaskSts, TaskStsType.INIT.val(), TaskStsType.WAITING.val(), TaskStsType.ASSIGN.val(), TaskStsType.PROGRESS.val())); + //if (!Cools.isEmpty(taskIds)) { + // List<Segment> segments = segmentService.getByAgvAndTaskAndBackpack(agvDetail.getAgvId(), taskIds, backpackVo.getIndex()); + // if (segments != null) { + // for (Segment segment : segments) { + if (!Cools.isEmpty(taskList1)) { + backpackVo.setTaskId(taskList1.get(0).getId() + ""); + } + // } + // } + BackpackDto backpackDto = backpackDtos.get(i); backpackVo.setLoaded(backpackDto.getLoaded()); - backpackVo.setExecute(segments.stream().anyMatch(segment -> segment.getState().equals(SegmentStateType.RUNNING.toString()))); + //backpackVo.setExecute(one.getTaskSts()==); + //segments.stream().anyMatch(segment -> segment.getState().equals(SegmentStateType.RUNNING.toString())) + // } backpackVos.add(backpackVo); } info.setBackpack(backpackVos); diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java index d797b58..cceba96 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java @@ -110,7 +110,7 @@ .eq(Segment::getAgvId, agvId) .eq(Segment::getBackpack, backpack) .in(Segment::getTaskId, taskIds) - .orderByAsc(Segment::getSerial) + //.orderByAsc(Segment::getSerial) ); } -- Gitblit v1.9.1