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