From bc64b3b45cf00885696aea4cfa97230390717012 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期二, 17 六月 2025 15:38:59 +0800
Subject: [PATCH] 1

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java             |    6 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/BusController.java  |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java            |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java    |   12 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvCompleteSubscriber.java |    4 
 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       |  679 ++++++++++++++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java  |    3 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java      |  442 ------------
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java   |    4 
 /dev/null                                                                              |   51 -
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java       |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java  |    8 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainZkdService.java       |  890 ------------------------
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IBaseMainService.java     |   26 
 zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java                |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenController.java |    4 
 17 files changed, 738 insertions(+), 1,405 deletions(-)

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 b109ac2..a7e2e61 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
@@ -35,7 +35,7 @@
     @Autowired
     private TaskService taskService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @Autowired
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 8f6a78e..ca24d60 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
@@ -49,7 +49,7 @@
     @Autowired
     private TaskService taskService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @Autowired
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvCompleteSubscriber.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvCompleteSubscriber.java
index 9863260..50d7eb2 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvCompleteSubscriber.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/listen/AgvCompleteSubscriber.java
@@ -3,7 +3,7 @@
 import com.zy.acs.common.constant.RedisConstant;
 import com.zy.acs.common.domain.AgvProtocol;
 import com.zy.acs.common.utils.RedisSupport;
-import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
@@ -23,7 +23,7 @@
     private final RedisSupport redis = RedisSupport.defaultRedisSupport;
 
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
 
     @EventListener(ApplicationReadyEvent.class)
     private void start(){
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 15f7cbf..5491b80 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
@@ -10,7 +10,7 @@
 import com.zy.acs.manager.core.constant.LocGroupConstant;
 import com.zy.acs.manager.core.constant.StaGroupConstant;
 import com.zy.acs.manager.core.service.MainLockWrapService;
-import com.zy.acs.manager.core.service.MainService;
+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.*;
@@ -37,7 +37,7 @@
     @Autowired
     private TaskService taskService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @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 43d4ac0..cd4e72d 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
@@ -3,7 +3,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.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import com.zy.acs.manager.core.service.TrafficService;
 import com.zy.acs.manager.manager.entity.Bus;
 import com.zy.acs.manager.manager.entity.Segment;
@@ -16,8 +16,6 @@
 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,7 +51,7 @@
     @Autowired
     private TaskService taskService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @Autowired
@@ -69,7 +67,7 @@
     @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; }
@@ -80,7 +78,7 @@
         this.lock.unlock();
     }
 
-    @Scheduled(cron = "0/1 * * * * ? ")
+    //@Scheduled(cron = "0/1 * * * * ? ")
     private void calculateSeg() throws InterruptedException {
         if (!this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS)) { return; }
         List<Task> taskList = taskService.selectBySts(TaskStsType.WAITING);
@@ -103,7 +101,7 @@
         this.lock.unlock();
     }
 
-    @EventListener(ApplicationReadyEvent.class)
+    //@EventListener(ApplicationReadyEvent.class)
     public void init() {
         try { Thread.sleep(1200); } catch (InterruptedException ignore) {}
         // traffic calculate
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
index d5b5c73..cd4cd7f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -5,7 +5,7 @@
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.framework.common.DateUtils;
 import com.zy.acs.manager.core.service.MainLockWrapService;
-import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.*;
 import com.zy.acs.manager.manager.service.*;
@@ -36,7 +36,7 @@
     @Autowired
     private FuncStaService funcStaService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @Autowired
@@ -48,7 +48,7 @@
     @Autowired
     private SegmentService segmentService;
 
-    @Scheduled(cron = "0/5 * * * * ? ")
+//    @Scheduled(cron = "0/5 * * * * ? ")
     private synchronized void autoCharge(){
         List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
         for (Agv agv : agvList) {
@@ -87,7 +87,7 @@
     }
 
 
-    @Scheduled(cron = "0/1 * * * * ? ")
+//    @Scheduled(cron = "0/1 * * * * ? ")
 //    @Scheduled(cron = "0 */2 * * * ? ")
     private synchronized void autoStandby(){
         if (!configService.getVal("automaticStandbyPosition", Boolean.class)) { return; }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java
similarity index 72%
rename from zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
rename to zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java
index c18e9f1..d9c55cb 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/BaseMainService.java
@@ -19,14 +19,10 @@
 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.domain.TaskDto;
-import com.zy.acs.manager.common.domain.param.HandlerPublishParam;
 import com.zy.acs.manager.common.exception.BusinessException;
-import com.zy.acs.manager.core.domain.AgvBackpackDto;
 import com.zy.acs.manager.core.domain.Lane;
 import com.zy.acs.manager.core.domain.TaskPosDto;
 import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
-import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.*;
 import com.zy.acs.manager.manager.service.*;
@@ -41,14 +37,13 @@
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * Created by vincent on 2023/6/14
  */
 @Slf4j
-@Service("mainService")
-public class MainService implements IMainService {
+@Service("baseMainService")
+public class BaseMainService implements IBaseMainService {
 
     @Autowired
     private BusService busService;
@@ -96,439 +91,6 @@
     private LaneService laneService;
     @Autowired
     private ActionSorter actionSorter;
-
-    @SuppressWarnings("all")
-    @Transactional
-    public Bus generateBusAndTask(OpenBusSubmitParam busSubmitParam, String memo) {
-        String errorMsg = busService.checkoutValid(busSubmitParam);
-        if (!Cools.isEmpty(errorMsg)) {
-            throw new BusinessException(errorMsg);
-        }
-        String batch = busSubmitParam.getBatch();
-        List<TaskDto> taskDtoList = busSubmitParam.getTaskList();
-        if (Cools.isEmpty(taskDtoList)) {
-            throw new BusinessException("taskList can't be empty!");
-        }
-
-        // 浼樺厛绾ф帓搴�
-        taskDtoList.sort((o1, o2) -> o2.getPriority() - o1.getPriority());
-
-        // 鏍¢獙
-        List<Task> taskList = validService.validTaskDtoList(taskDtoList);
-
-        // 淇濆瓨鎬荤嚎
-        Date now = new Date();
-        Bus bus = new Bus();
-        bus.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
-        bus.setBusNo(batch);
-        bus.setStartTime(now);
-        bus.setBusSts(BusStsType.RECEIVE.val());
-        bus.setMemo(memo);
-
-        if (!busService.save(bus)) {
-            throw new BusinessException("Internal Server Error!");
-        }
-
-        // 淇濆瓨浠诲姟
-        for (Task task : taskList) {
-            task.setBusId(bus.getId());
-            task.setTaskSts(TaskStsType.INIT.val());
-            if (!taskService.save(task)) {
-                throw new BusinessException("seqNum:" + task.getSeqNum() + " failed to save!");
-            }
-
-            // 淇敼搴撲綅鐘舵��
-            Loc oriLoc = null;
-            Loc destLoc = null;
-            Sta oriSta = null;
-            Sta destSta = null;
-            switch (TaskTypeType.get(task.getTaskTypeEl())) {
-                case LOC_TO_LOC:
-                    oriLoc = locService.getById(task.getOriLoc());
-                    if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
-                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " is not in STOCK status");
-                    }
-                    oriLoc.setLocSts(LocStsType.PAKOUT.val());
-                    oriLoc.setUpdateTime(now);
-                    if (!locService.updateById(oriLoc)) {
-                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " failed to update");
-                    }
-
-                    destLoc = locService.getById(task.getDestLoc());
-                    if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
-                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " is not in IDLE status");
-                    }
-                    destLoc.setLocSts(LocStsType.PAKIN.val());
-                    destLoc.setUpdateTime(now);
-                    if (!locService.updateById(destLoc)) {
-                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " failed to update");
-                    }
-                    break;
-                case LOC_TO_STA:
-                    oriLoc = locService.getById(task.getOriLoc());
-                    if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
-                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " is not in STOCK status");
-                    }
-                    oriLoc.setLocSts(LocStsType.PAKOUT.val());
-                    oriLoc.setUpdateTime(now);
-                    if (!locService.updateById(oriLoc)) {
-                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " failed to update");
-                    }
-
-                    destSta = staService.getById(task.getDestSta());
-                    if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
-                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
-                    }
-                    destSta.setStaSts(StaStsType.READY_RELEASE.val());
-                    destSta.setUpdateTime(now);
-                    if (!staService.updateById(destSta)) {
-                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
-                    }
-                    break;
-                case STA_TO_LOC:
-                    oriSta = staService.getById(task.getOriSta());
-                    if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
-                    }
-                    oriSta.setStaSts(StaStsType.READY_TAKE.val());
-                    oriSta.setUpdateTime(now);
-                    if (!staService.updateById(oriSta)) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
-                    }
-
-                    destLoc = locService.getById(task.getDestLoc());
-                    if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
-                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " is not in IDLE status");
-                    }
-                    destLoc.setLocSts(LocStsType.PAKIN.val());
-                    destLoc.setUpdateTime(now);
-                    if (!locService.updateById(destLoc)) {
-                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " failed to update");
-                    }
-                    break;
-                case STA_TO_STA:
-                    oriSta = staService.getById(task.getOriSta());
-                    if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
-                    }
-                    oriSta.setStaSts(StaStsType.READY_TAKE.val());
-                    oriSta.setUpdateTime(now);
-                    if (!staService.updateById(oriSta)) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
-                    }
-
-                    destSta = staService.getById(task.getDestSta());
-                    if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
-                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
-                    }
-                    destSta.setStaSts(StaStsType.READY_RELEASE.val());
-                    destSta.setUpdateTime(now);
-                    if (!staService.updateById(destSta)) {
-                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
-                    }
-                    break;
-                default:
-                    break;
-            }
-
-        }
-        return bus;
-    }
-
-    /**
-     * 浠诲姟鍒嗛厤缁欒溅杈� ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
-     */
-    @Transactional
-    public synchronized void allocateTask(Bus bus) {
-        try {
-            Date now = new Date();
-            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>()
-                    .eq(Task::getBusId, bus.getId())
-                    .eq(Task::getTaskSts, TaskStsType.INIT.val())
-                    .orderByDesc(Task::getPriority)
-            );
-
-            if (Cools.isEmpty(taskList)) {
-                bus.setBusSts(BusStsType.PROGRESS.val());
-                bus.setUpdateTime(now);
-                if (!busService.updateById(bus)) {
-                    log.error("Bus [{}] failed to Update 锛侊紒锛�", bus.getUuid());
-                }
-                return;
-            }
-
-            List<Long> taskIds = taskList.stream().map(Task::getId).distinct().collect(Collectors.toList());
-            for (Task task : taskList) {
-                Agv agv = allocateService.execute(task);
-                if (null == agv) {
-//                    log.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
-                    continue;
-                }
-                task.setAgvId(agv.getId());
-                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.infuseAgvForTask", e);
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }
-    }
-
-    /**
-     * 瑙f瀽鍙栨斁璐ч泦鍚堜换鍔�,杩涜鏈�浼樼殑鎺掑垪缁勫悎椤哄簭 ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
-     * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)}
-     */
-    @Transactional(propagation = Propagation.REQUIRES_NEW)
-    public void buildMajorTask(Long agvId, List<Task> taskList) {
-        if (Cools.isEmpty(agvId, taskList)) {
-            return;
-        }
-        try {
-            // valid -----------------------------------------------
-            Agv agv = agvService.getById(agvId);
-            if (!agvService.judgeEnable(agv.getId(), false)) {
-                return;
-            }
-            if (!Cools.isEmpty(taskService.selectInSts(agvId, TaskStsType.ASSIGN, TaskStsType.PROGRESS))) {
-                throw new CoolException("AGV[" + agv.getUuid() + "]鍒嗛厤浠诲姟澶辫触锛屽凡瀛樺湪鎵ц浠诲姟...");
-            }
-            if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString()))
-                    || !Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) {
-                throw new CoolException("AGV[" + agv.getUuid() + "] failed to assign锛宐ecause already has the segment in running...");
-            }
-
-            // execute ----------------------------------------------------
-            Date now = new Date();
-            // sort and sub
-            taskList.sort(new Comparator<Task>() {
-                @Override
-                public int compare(Task o1, Task o2) {
-                    return o2.getPriority() - o1.getPriority();
-                }
-            });
-            Integer backpack = agvService.getBackpack(agv);
-            if (taskList.size() > backpack) {
-                taskList = taskList.subList(0, backpack);
-            }
-
-            AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId);
-            List<AgvBackpackDto> backpackDtoList = new ArrayList<>();
-
-            /**
-             * 鍚屽贩閬撳綊绫�
-             * same lane for every single agvId
-             *
-             * key: y(val) + TaskPosDto.PosType.ORI_LOC / ORI_STA / DEST_LOC / DEST_STA
-             * val: new TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType)
-             */
-            Map<String, List<TaskPosDto>> groups = new HashMap<>();
-            final String sameGroupXy = configService.getVal("sameGroupXy", String.class);
-
-            int backpackLev = 0;
-            for (Task task : taskList) {
-
-                backpackLev++;
-                Code startCode = null;
-                Code endCode = null;
-                Loc oriLoc = null;
-                Loc destLoc = null;
-                Sta oriSta = null;
-                Sta destSta = null;
-                switch (Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl()))) {
-                    case LOC_TO_LOC:
-                        oriLoc = locService.getById(task.getOriLoc());
-                        destLoc = locService.getById(task.getDestLoc());
-
-                        startCode = codeService.getCacheById(oriLoc.getCode());
-                        endCode = codeService.getCacheById(destLoc.getCode());
-
-                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_LOC, sameGroupXy);
-                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_LOC, sameGroupXy);
-                        break;
-                    case LOC_TO_STA:
-                        oriLoc = locService.getById(task.getOriLoc());
-                        destSta = staService.getById(task.getDestSta());
-
-                        startCode = codeService.getCacheById(oriLoc.getCode());
-                        endCode = codeService.getCacheById(destSta.getCode());
-
-                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_LOC, sameGroupXy);
-                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_STA, sameGroupXy);
-                        break;
-                    case STA_TO_LOC:
-                        oriSta = staService.getById(task.getOriSta());
-                        destLoc = locService.getById(task.getDestLoc());
-
-                        startCode = codeService.getCacheById(oriSta.getCode());
-                        endCode = codeService.getCacheById(destLoc.getCode());
-
-                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_STA, sameGroupXy);
-                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_LOC, sameGroupXy);
-                        break;
-                    case STA_TO_STA:
-                        oriSta = staService.getById(task.getOriSta());
-                        destSta = staService.getById(task.getDestSta());
-
-                        startCode = codeService.getCacheById(oriSta.getCode());
-                        endCode = codeService.getCacheById(destSta.getCode());
-
-                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_STA, sameGroupXy);
-                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_STA, sameGroupXy);
-                        break;
-                    default:
-                        throw new BusinessException(task.getSeqNum() + "浠诲姟绫诲瀷閿欒");
-
-                }
-
-                if (backpackLev > backpack) {
-                    throw new BusinessException("瑙f瀽Task澶辫触,AGV鑳岀瘬宸叉弧......");
-                }
-
-                backpackDtoList.add(new AgvBackpackDto(backpackLev, task.getId()));
-            }
-
-            /**
-             * 1.Map<String, List<TaskPosDto>> groups
-             *
-             * key: 1000 + ORIGIN
-             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
-             *
-             * key: 3000 + ORIGIN
-             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
-             *
-             * key: 2000 + ORIGIN
-             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
-             *
-             * key: 1000 + DESTINATION
-             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
-             *
-             * key: 2000 + DESTINATION
-             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
-             *
-             * ......
-             *
-             * 2.ArrayList<List<TaskPosDto>> list
-             * [
-             *  [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...],
-             *  [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...],
-             *  [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...],
-             *  ......
-             * ]
-             */
-
-            /**
-             * 瀵规墍鏈夊贩閬撹繘琛屾湁搴忔帓搴忥紝鍏堟槸閽堝List涓轰竴涓崟浣嶏紝瀵逛粬浠繘琛孎irstWeight鎺掑簭锛岀浉褰撲簬琛�1鐨刱ey鐨勬暟鍊艰繘琛屾湁搴忔帓搴�
-             *  List<TaskPosDto>: task list on the same lane
-             *  ArrayList<List<TaskPosDto>>: all the task list by one agv
-             *
-             *  tip: ORI 鍜� DEST 姘歌繙涓嶄細瀛樺湪鍚屼竴涓� List
-             */
-            ArrayList<List<TaskPosDto>> list = new ArrayList<>(groups.values());
-            list.sort((o1, o2) -> {
-                double o1CompVal = (o1.get(0).getFirstWeight(sameGroupXy) * 100) + o1.get(0).getPosType().compOffset;
-                double o2CompVal = (o2.get(0).getFirstWeight(sameGroupXy) * 100) + o2.get(0).getPosType().compOffset;
-                return (int) (o1CompVal - o2CompVal);
-            });
-            // 閽堝Dto锛屾寜鐓econdWeight杩涜鎺掑簭
-            for (List<TaskPosDto> taskPosDtoList : list) {
-                taskPosDtoList.sort((o1, o2) -> (int) (o1.getSecondWeight(sameGroupXy) * 100 - o2.getSecondWeight(sameGroupXy) * 100));
-            }
-
-            // re-order by agv current position
-            Code currCode = codeService.getCacheById(agvDetail.getRecentCode());
-            Double[] currPosition = new Double[]{currCode.getX(), currCode.getY()};
-
-            List<List<TaskPosDto>> pickGroups = new ArrayList<>();
-            List<List<TaskPosDto>> dropGroups = new ArrayList<>();
-
-            for (List<TaskPosDto> group : list) {
-                // Assume 涓�涓换鍔$粍涓墍鏈塗askPosDto鐨凱osType.brief鐩稿悓
-                TaskPosDto.PosType posType = group.get(0).getPosType();
-                if (posType == TaskPosDto.PosType.ORI_LOC || posType == TaskPosDto.PosType.ORI_STA) {
-                    pickGroups.add(group);
-                } else if (posType == TaskPosDto.PosType.DEST_LOC || posType == TaskPosDto.PosType.DEST_STA) {
-                    dropGroups.add(group);
-                } else {
-                    // import tip: the list must only contain ORIGIN and DESTINATION
-                    log.error("the list must only contain ORIGIN and DESTINATION");
-                }
-            }
-
-            currPosition = allocateService.pac(currPosition, pickGroups);
-            currPosition = allocateService.pac(currPosition, dropGroups);
-
-            List<List<TaskPosDto>> reorderedList = new ArrayList<>();
-            reorderedList.addAll(pickGroups);
-            reorderedList.addAll(dropGroups);
-
-            list.clear();
-            list.addAll(reorderedList);
-
-
-            // 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(list));
-            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<>();
-            for (List<TaskPosDto> dtoList : list) {
-                for (TaskPosDto taskPosDto : dtoList) {
-                    segSerial++;
-                    AgvBackpackType backpackType = AgvBackpackDto.find(backpackDtoList, taskPosDto.getTaskId());
-                    assert null != backpackType;
-
-                    Segment segment = new Segment();
-                    segment.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
-                    segment.setTravelId(travel.getId());
-                    segment.setAgvId(agvId);
-                    segment.setTaskId(taskPosDto.getTaskId());
-                    segment.setSerial(segSerial);
-                    segment.setEndNode(taskPosDto.getCodeId());
-                    segment.setPosType(taskPosDto.getPosType().toString());
-                    segment.setBackpack(backpackType.lev);
-                    segment.setState(SegmentStateType.INIT.toString());
-                    segmentList.add(segment);
-                }
-            }
-            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("浠诲姟缁勪繚瀛樺け璐�");
-                }
-            }
-
-            // task
-            for (Task task : taskList) {
-                task.setTaskSts(TaskStsType.ASSIGN.val());
-                task.setStartTime(now);
-                task.setUpdateTime(now);
-                if (!taskService.updateById(task)) {
-                    throw new BusinessException(task.getUuid() + "浠诲姟鏇存柊澶辫触");
-                }
-            }
-
-        } catch (Exception e) {
-
-            log.error("mainService.buildMajorTask[task]", e);
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }
-    }
 
 
     /**
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IBaseMainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IBaseMainService.java
new file mode 100644
index 0000000..67f3776
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IBaseMainService.java
@@ -0,0 +1,26 @@
+package com.zy.acs.manager.core.service;
+
+import com.zy.acs.common.domain.AgvProtocol;
+import com.zy.acs.manager.manager.entity.Segment;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by vincent on 2023/6/14
+ */
+public interface IBaseMainService {
+
+
+    /**
+     * 鏍规嵁鍒嗙墖鐢熸垚鍔ㄤ綔 ( 杞﹁締鍙兘宸茬粡鍋氳繃涓�浜涗换鍔′簡,姝e湪绛夊緟涓嬩竴娈典换鍔� )
+     */
+    void generateAction(Long agvId, List<Segment> segmentList, List<String> pathList, Date algoStartTime);
+
+    void publishAction(String actionGroupId);
+
+    void upDataSubscribe(AgvProtocol protocol);
+
+    void settleSegmentList(List<Segment> segmentList, String serialNo);
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IMainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IMainService.java
deleted file mode 100644
index 66db355..0000000
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/IMainService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.zy.acs.manager.core.service;
-
-import com.zy.acs.common.domain.AgvProtocol;
-import com.zy.acs.manager.common.domain.param.HandlerPublishParam;
-import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
-import com.zy.acs.manager.manager.entity.Bus;
-import com.zy.acs.manager.manager.entity.Jam;
-import com.zy.acs.manager.manager.entity.Segment;
-import com.zy.acs.manager.manager.entity.Task;
-import com.zy.acs.manager.manager.enums.TaskTypeType;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * Created by vincent on 2023/6/14
- */
-public interface IMainService {
-
-
-    //Bus generateBusAndTask(OpenBusSubmitParam busSubmitParam, String memo);
-
-    /**
-     * 浠诲姟鍒嗛厤缁欒溅杈� ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
-     */
-    void allocateTask(Bus bus);
-
-    /**
-     * 瑙f瀽鍙栨斁璐ч泦鍚堜换鍔�,杩涜鏈�浼樼殑鎺掑垪缁勫悎椤哄簭 ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
-     * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)}
-     */
-    void buildMajorTask(Long agvId, List<Task> taskList);
-
-
-    /**
-     * 鍏呯數 鍥炲緟鏈轰綅浠诲姟
-     */
-    //boolean buildMinorTask(Long agvId, TaskTypeType taskType, String destination, Jam jam);
-
-    /**
-     * 鏍规嵁鍒嗙墖鐢熸垚鍔ㄤ綔 ( 杞﹁締鍙兘宸茬粡鍋氳繃涓�浜涗换鍔′簡,姝e湪绛夊緟涓嬩竴娈典换鍔� )
-     */
-    void generateAction(Long agvId, List<Segment> segmentList, List<String> pathList, Date algoStartTime);
-
-    void publishAction(String actionGroupId);
-
-    void upDataSubscribe(AgvProtocol protocol);
-
-    void settleSegmentList(List<Segment> segmentList, String serialNo);
-
-}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java
index 0021542..e686e2e 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java
@@ -1,7 +1,6 @@
 package com.zy.acs.manager.core.service;
 
 import com.zy.acs.framework.exception.CoolException;
-import com.zy.acs.manager.manager.entity.Agv;
 import com.zy.acs.manager.manager.entity.Jam;
 import com.zy.acs.manager.manager.entity.Task;
 import com.zy.acs.manager.manager.enums.TaskTypeType;
@@ -25,7 +24,7 @@
     private final ReentrantLock lock = new ReentrantLock(Boolean.TRUE);
 
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
 
     public void buildMajorTask(Long agvId, List<Task> taskList) {
         boolean lockAcquired = false;
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
new file mode 100644
index 0000000..945fa4c
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLxtService.java
@@ -0,0 +1,679 @@
+package com.zy.acs.manager.core.service;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.enums.AgvBackpackType;
+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.domain.TaskDto;
+import com.zy.acs.manager.common.domain.param.HandlerPublishParam;
+import com.zy.acs.manager.common.exception.BusinessException;
+import com.zy.acs.manager.core.domain.AgvBackpackDto;
+import com.zy.acs.manager.core.domain.Lane;
+import com.zy.acs.manager.core.domain.TaskPosDto;
+import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
+import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
+import com.zy.acs.manager.manager.entity.*;
+import com.zy.acs.manager.manager.enums.*;
+import com.zy.acs.manager.manager.service.*;
+import com.zy.acs.manager.manager.utils.ActionSorter;
+import com.zy.acs.manager.system.service.ConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Created by vincent on 2023/6/14
+ */
+@Slf4j
+@Service("mainService")
+public class MainLxtService extends BaseMainService {
+
+    @Autowired
+    private BusService busService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private ActionService actionService;
+    @Autowired
+    private StaService staService;
+    @Autowired
+    private LocService locService;
+    @Autowired
+    private AgvService agvService;
+    @Autowired
+    private AgvDetailService agvDetailService;
+    @Autowired
+    private ConfigService configService;
+    @Autowired
+    private ValidService validService;
+    @Autowired
+    private AllocateService allocateService;
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private MapService mapService;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+    @Autowired
+    private CodeGapService codeGapService;
+    @Autowired
+    private AgvCmdService agvCmdService;
+    @Autowired
+    private FuncStaService funcStaService;
+    @Autowired
+    private MapDataDispatcher mapDataDispatcher;
+    @Autowired
+    private TravelService travelService;
+    @Autowired
+    private SegmentService segmentService;
+    @Autowired
+    private TrafficService trafficService;
+    @Autowired
+    private AgvModelService agvModelService;
+    @Autowired
+    private LaneService laneService;
+    @Autowired
+    private ActionSorter actionSorter;
+
+    @SuppressWarnings("all")
+    @Transactional
+    public Bus generateBusAndTask(OpenBusSubmitParam busSubmitParam, String memo) {
+        String errorMsg = busService.checkoutValid(busSubmitParam);
+        if (!Cools.isEmpty(errorMsg)) {
+            throw new BusinessException(errorMsg);
+        }
+        String batch = busSubmitParam.getBatch();
+        List<TaskDto> taskDtoList = busSubmitParam.getTaskList();
+        if (Cools.isEmpty(taskDtoList)) {
+            throw new BusinessException("taskList can't be empty!");
+        }
+
+        // 浼樺厛绾ф帓搴�
+        taskDtoList.sort((o1, o2) -> o2.getPriority() - o1.getPriority());
+
+        // 鏍¢獙
+        List<Task> taskList = validService.validTaskDtoList(taskDtoList);
+
+        // 淇濆瓨鎬荤嚎
+        Date now = new Date();
+        Bus bus = new Bus();
+        bus.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+        bus.setBusNo(batch);
+        bus.setStartTime(now);
+        bus.setBusSts(BusStsType.RECEIVE.val());
+        bus.setMemo(memo);
+
+        if (!busService.save(bus)) {
+            throw new BusinessException("Internal Server Error!");
+        }
+
+        // 淇濆瓨浠诲姟
+        for (Task task : taskList) {
+            task.setBusId(bus.getId());
+            task.setTaskSts(TaskStsType.INIT.val());
+            if (!taskService.save(task)) {
+                throw new BusinessException("seqNum:" + task.getSeqNum() + " failed to save!");
+            }
+
+            // 淇敼搴撲綅鐘舵��
+            Loc oriLoc = null;
+            Loc destLoc = null;
+            Sta oriSta = null;
+            Sta destSta = null;
+            switch (TaskTypeType.get(task.getTaskTypeEl())) {
+                case LOC_TO_LOC:
+                    oriLoc = locService.getById(task.getOriLoc());
+                    if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
+                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " is not in STOCK status");
+                    }
+                    oriLoc.setLocSts(LocStsType.PAKOUT.val());
+                    oriLoc.setUpdateTime(now);
+                    if (!locService.updateById(oriLoc)) {
+                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " failed to update");
+                    }
+
+                    destLoc = locService.getById(task.getDestLoc());
+                    if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
+                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " is not in IDLE status");
+                    }
+                    destLoc.setLocSts(LocStsType.PAKIN.val());
+                    destLoc.setUpdateTime(now);
+                    if (!locService.updateById(destLoc)) {
+                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " failed to update");
+                    }
+                    break;
+                case LOC_TO_STA:
+                    oriLoc = locService.getById(task.getOriLoc());
+                    if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
+                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " is not in STOCK status");
+                    }
+                    oriLoc.setLocSts(LocStsType.PAKOUT.val());
+                    oriLoc.setUpdateTime(now);
+                    if (!locService.updateById(oriLoc)) {
+                        throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " failed to update");
+                    }
+
+                    destSta = staService.getById(task.getDestSta());
+                    if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
+                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
+                    }
+                    destSta.setStaSts(StaStsType.READY_RELEASE.val());
+                    destSta.setUpdateTime(now);
+                    if (!staService.updateById(destSta)) {
+                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
+                    }
+                    break;
+                case STA_TO_LOC:
+                    oriSta = staService.getById(task.getOriSta());
+                    if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
+                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
+                    }
+                    oriSta.setStaSts(StaStsType.READY_TAKE.val());
+                    oriSta.setUpdateTime(now);
+                    if (!staService.updateById(oriSta)) {
+                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
+                    }
+
+                    destLoc = locService.getById(task.getDestLoc());
+                    if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
+                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " is not in IDLE status");
+                    }
+                    destLoc.setLocSts(LocStsType.PAKIN.val());
+                    destLoc.setUpdateTime(now);
+                    if (!locService.updateById(destLoc)) {
+                        throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " failed to update");
+                    }
+                    break;
+                case STA_TO_STA:
+                    oriSta = staService.getById(task.getOriSta());
+                    if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
+                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
+                    }
+                    oriSta.setStaSts(StaStsType.READY_TAKE.val());
+                    oriSta.setUpdateTime(now);
+                    if (!staService.updateById(oriSta)) {
+                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
+                    }
+
+                    destSta = staService.getById(task.getDestSta());
+                    if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
+                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
+                    }
+                    destSta.setStaSts(StaStsType.READY_RELEASE.val());
+                    destSta.setUpdateTime(now);
+                    if (!staService.updateById(destSta)) {
+                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
+                    }
+                    break;
+                default:
+                    break;
+            }
+
+        }
+        return bus;
+    }
+
+    /**
+     * 浠诲姟鍒嗛厤缁欒溅杈� ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
+     */
+    @Transactional
+    public synchronized void allocateTask(Bus bus) {
+        try {
+            Date now = new Date();
+            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>()
+                    .eq(Task::getBusId, bus.getId())
+                    .eq(Task::getTaskSts, TaskStsType.INIT.val())
+                    .orderByDesc(Task::getPriority)
+            );
+
+            if (Cools.isEmpty(taskList)) {
+                bus.setBusSts(BusStsType.PROGRESS.val());
+                bus.setUpdateTime(now);
+                if (!busService.updateById(bus)) {
+                    log.error("Bus [{}] failed to Update 锛侊紒锛�", bus.getUuid());
+                }
+                return;
+            }
+
+            List<Long> taskIds = taskList.stream().map(Task::getId).distinct().collect(Collectors.toList());
+            for (Task task : taskList) {
+                Agv agv = allocateService.execute(task);
+                if (null == agv) {
+//                    log.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
+                    continue;
+                }
+                task.setAgvId(agv.getId());
+                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.infuseAgvForTask", e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+    }
+
+    /**
+     * 瑙f瀽鍙栨斁璐ч泦鍚堜换鍔�,杩涜鏈�浼樼殑鎺掑垪缁勫悎椤哄簭 ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
+     * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)}
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void buildMajorTask(Long agvId, List<Task> taskList) {
+        if (Cools.isEmpty(agvId, taskList)) {
+            return;
+        }
+        try {
+            // valid -----------------------------------------------
+            Agv agv = agvService.getById(agvId);
+            if (!agvService.judgeEnable(agv.getId(), false)) {
+                return;
+            }
+            if (!Cools.isEmpty(taskService.selectInSts(agvId, TaskStsType.ASSIGN, TaskStsType.PROGRESS))) {
+                throw new CoolException("AGV[" + agv.getUuid() + "]鍒嗛厤浠诲姟澶辫触锛屽凡瀛樺湪鎵ц浠诲姟...");
+            }
+            if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString()))
+                    || !Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) {
+                throw new CoolException("AGV[" + agv.getUuid() + "] failed to assign锛宐ecause already has the segment in running...");
+            }
+
+            // execute ----------------------------------------------------
+            Date now = new Date();
+            // sort and sub
+            taskList.sort(new Comparator<Task>() {
+                @Override
+                public int compare(Task o1, Task o2) {
+                    return o2.getPriority() - o1.getPriority();
+                }
+            });
+            Integer backpack = agvService.getBackpack(agv);
+            if (taskList.size() > backpack) {
+                taskList = taskList.subList(0, backpack);
+            }
+
+            AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId);
+            List<AgvBackpackDto> backpackDtoList = new ArrayList<>();
+
+            /**
+             * 鍚屽贩閬撳綊绫�
+             * same lane for every single agvId
+             *
+             * key: y(val) + TaskPosDto.PosType.ORI_LOC / ORI_STA / DEST_LOC / DEST_STA
+             * val: new TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType)
+             */
+            Map<String, List<TaskPosDto>> groups = new HashMap<>();
+            final String sameGroupXy = configService.getVal("sameGroupXy", String.class);
+
+            int backpackLev = 0;
+            for (Task task : taskList) {
+
+                backpackLev++;
+                Code startCode = null;
+                Code endCode = null;
+                Loc oriLoc = null;
+                Loc destLoc = null;
+                Sta oriSta = null;
+                Sta destSta = null;
+                switch (Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl()))) {
+                    case LOC_TO_LOC:
+                        oriLoc = locService.getById(task.getOriLoc());
+                        destLoc = locService.getById(task.getDestLoc());
+
+                        startCode = codeService.getCacheById(oriLoc.getCode());
+                        endCode = codeService.getCacheById(destLoc.getCode());
+
+                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_LOC, sameGroupXy);
+                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_LOC, sameGroupXy);
+                        break;
+                    case LOC_TO_STA:
+                        oriLoc = locService.getById(task.getOriLoc());
+                        destSta = staService.getById(task.getDestSta());
+
+                        startCode = codeService.getCacheById(oriLoc.getCode());
+                        endCode = codeService.getCacheById(destSta.getCode());
+
+                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_LOC, sameGroupXy);
+                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_STA, sameGroupXy);
+                        break;
+                    case STA_TO_LOC:
+                        oriSta = staService.getById(task.getOriSta());
+                        destLoc = locService.getById(task.getDestLoc());
+
+                        startCode = codeService.getCacheById(oriSta.getCode());
+                        endCode = codeService.getCacheById(destLoc.getCode());
+
+                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_STA, sameGroupXy);
+                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_LOC, sameGroupXy);
+                        break;
+                    case STA_TO_STA:
+                        oriSta = staService.getById(task.getOriSta());
+                        destSta = staService.getById(task.getDestSta());
+
+                        startCode = codeService.getCacheById(oriSta.getCode());
+                        endCode = codeService.getCacheById(destSta.getCode());
+
+                        TaskPosDto.packagePosGroup(groups, task, startCode, TaskPosDto.PosType.ORI_STA, sameGroupXy);
+                        TaskPosDto.packagePosGroup(groups, task, endCode, TaskPosDto.PosType.DEST_STA, sameGroupXy);
+                        break;
+                    default:
+                        throw new BusinessException(task.getSeqNum() + "浠诲姟绫诲瀷閿欒");
+
+                }
+
+                if (backpackLev > backpack) {
+                    throw new BusinessException("瑙f瀽Task澶辫触,AGV鑳岀瘬宸叉弧......");
+                }
+
+                backpackDtoList.add(new AgvBackpackDto(backpackLev, task.getId()));
+            }
+
+            /**
+             * 1.Map<String, List<TaskPosDto>> groups
+             *
+             * key: 1000 + ORIGIN
+             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
+             *
+             * key: 3000 + ORIGIN
+             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
+             *
+             * key: 2000 + ORIGIN
+             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
+             *
+             * key: 1000 + DESTINATION
+             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
+             *
+             * key: 2000 + DESTINATION
+             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
+             *
+             * ......
+             *
+             * 2.ArrayList<List<TaskPosDto>> list
+             * [
+             *  [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...],
+             *  [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...],
+             *  [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...],
+             *  ......
+             * ]
+             */
+
+            /**
+             * 瀵规墍鏈夊贩閬撹繘琛屾湁搴忔帓搴忥紝鍏堟槸閽堝List涓轰竴涓崟浣嶏紝瀵逛粬浠繘琛孎irstWeight鎺掑簭锛岀浉褰撲簬琛�1鐨刱ey鐨勬暟鍊艰繘琛屾湁搴忔帓搴�
+             *  List<TaskPosDto>: task list on the same lane
+             *  ArrayList<List<TaskPosDto>>: all the task list by one agv
+             *
+             *  tip: ORI 鍜� DEST 姘歌繙涓嶄細瀛樺湪鍚屼竴涓� List
+             */
+            ArrayList<List<TaskPosDto>> list = new ArrayList<>(groups.values());
+            list.sort((o1, o2) -> {
+                double o1CompVal = (o1.get(0).getFirstWeight(sameGroupXy) * 100) + o1.get(0).getPosType().compOffset;
+                double o2CompVal = (o2.get(0).getFirstWeight(sameGroupXy) * 100) + o2.get(0).getPosType().compOffset;
+                return (int) (o1CompVal - o2CompVal);
+            });
+            // 閽堝Dto锛屾寜鐓econdWeight杩涜鎺掑簭
+            for (List<TaskPosDto> taskPosDtoList : list) {
+                taskPosDtoList.sort((o1, o2) -> (int) (o1.getSecondWeight(sameGroupXy) * 100 - o2.getSecondWeight(sameGroupXy) * 100));
+            }
+
+            // re-order by agv current position
+            Code currCode = codeService.getCacheById(agvDetail.getRecentCode());
+            Double[] currPosition = new Double[]{currCode.getX(), currCode.getY()};
+
+            List<List<TaskPosDto>> pickGroups = new ArrayList<>();
+            List<List<TaskPosDto>> dropGroups = new ArrayList<>();
+
+            for (List<TaskPosDto> group : list) {
+                // Assume 涓�涓换鍔$粍涓墍鏈塗askPosDto鐨凱osType.brief鐩稿悓
+                TaskPosDto.PosType posType = group.get(0).getPosType();
+                if (posType == TaskPosDto.PosType.ORI_LOC || posType == TaskPosDto.PosType.ORI_STA) {
+                    pickGroups.add(group);
+                } else if (posType == TaskPosDto.PosType.DEST_LOC || posType == TaskPosDto.PosType.DEST_STA) {
+                    dropGroups.add(group);
+                } else {
+                    // import tip: the list must only contain ORIGIN and DESTINATION
+                    log.error("the list must only contain ORIGIN and DESTINATION");
+                }
+            }
+
+            currPosition = allocateService.pac(currPosition, pickGroups);
+            currPosition = allocateService.pac(currPosition, dropGroups);
+
+            List<List<TaskPosDto>> reorderedList = new ArrayList<>();
+            reorderedList.addAll(pickGroups);
+            reorderedList.addAll(dropGroups);
+
+            list.clear();
+            list.addAll(reorderedList);
+
+
+            // 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(list));
+            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<>();
+            for (List<TaskPosDto> dtoList : list) {
+                for (TaskPosDto taskPosDto : dtoList) {
+                    segSerial++;
+                    AgvBackpackType backpackType = AgvBackpackDto.find(backpackDtoList, taskPosDto.getTaskId());
+                    assert null != backpackType;
+
+                    Segment segment = new Segment();
+                    segment.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+                    segment.setTravelId(travel.getId());
+                    segment.setAgvId(agvId);
+                    segment.setTaskId(taskPosDto.getTaskId());
+                    segment.setSerial(segSerial);
+                    segment.setEndNode(taskPosDto.getCodeId());
+                    segment.setPosType(taskPosDto.getPosType().toString());
+                    segment.setBackpack(backpackType.lev);
+                    segment.setState(SegmentStateType.INIT.toString());
+                    segmentList.add(segment);
+                }
+            }
+            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("浠诲姟缁勪繚瀛樺け璐�");
+                }
+            }
+
+            // task
+            for (Task task : taskList) {
+                task.setTaskSts(TaskStsType.ASSIGN.val());
+                task.setStartTime(now);
+                task.setUpdateTime(now);
+                if (!taskService.updateById(task)) {
+                    throw new BusinessException(task.getUuid() + "浠诲姟鏇存柊澶辫触");
+                }
+            }
+
+        } catch (Exception e) {
+
+            log.error("mainService.buildMajorTask[task]", e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+    }
+
+
+    /**
+     * 鍏呯數 鍥炲緟鏈轰綅浠诲姟
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    // although there is a Transactional here that the lock is isolated, but we can't join the caller's Transactional
+    public boolean buildMinorTask(Long agvId, TaskTypeType taskType, String destination, Jam jam) {
+        if (Cools.isEmpty(agvId, taskType)) {
+            return false;
+        }
+        try {
+            String agvNo = agvService.getAgvNo(agvId);
+            if (!agvService.judgeEnable(agvId)) {
+                return false;
+            }
+            if (!Cools.isEmpty(taskService.selectInSts(agvId, TaskStsType.ASSIGN, TaskStsType.PROGRESS))) {
+                throw new CoolException("AGV[" + agvNo + "] failed to assign锛宐ecause already has the task in running...");
+            }
+            if (!Cools.isEmpty(segmentService.getByAgvAndState(agvId, SegmentStateType.WAITING.toString()))
+                    || !Cools.isEmpty(segmentService.getByAgvAndState(agvId, SegmentStateType.RUNNING.toString()))) {
+                throw new CoolException("AGV[" + agvNo + "] failed to assign锛宐ecause already has the segment in running...");
+            }
+
+            Date now = new Date();
+            AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agvId);
+            Code endCode = null;
+            switch (taskType) {
+                case TO_CHARGE:
+                case TO_STANDBY:
+                    List<FuncSta> idleFunStaList = funcStaService.findInIdleStatus(FuncStaType.query(taskType), agvId);
+                    if (!Cools.isEmpty(idleFunStaList)) {
+                        FuncSta funcSta = funcStaService.checkoutClosestFunSta(agvDetail.getRecentCode(), idleFunStaList);
+                        endCode = codeService.getCacheById(funcSta.getCode());
+                    }
+                    if (null == endCode) {
+                        log.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", agvNo, taskType.toString());
+                    }
+                    break;
+                case MOVE:
+                    endCode = codeService.getCacheByData(destination);
+                    break;
+                default:
+                    return false;
+            }
+
+            if (null == endCode) {
+                return false;
+            }
+            if (!allocateService.validCapacityOfLane(agvNo, endCode)) {
+                throw new BusinessException("the lane with code:" + endCode.getData() + " is full of AGV[" + agvNo + "]!!!");
+            }
+
+            Task task = new Task();
+            task.setAgvId(agvId);
+            task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+            List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
+            task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks) ? null : lastTasks.get(0).getSeqNum()));
+            task.setOriCode(agvDetail.getCode());
+            task.setDestCode(endCode.getId());
+            // lane
+            Lane destLane = laneService.search(endCode.getData());
+            if (null != destLane) {
+                task.setDestLaneHash(destLane.getHashCode());
+            }
+            task.setPriority(taskType.equals(TaskTypeType.TO_CHARGE) ? 2 : 1);
+            task.setTaskSts(TaskStsType.ASSIGN.val());
+            task.setTaskType(taskType.val());
+            task.setIoTime(now);
+            task.setStartTime(now);
+            if (!taskService.save(task)) {
+                throw new BusinessException(task.getSeqNum() + " failed to save");
+            }
+
+            // 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(list));
+            travel.setTaskIds(GsonUtils.toJson(Utils.singletonList(task.getId())));
+            travel.setState(TravelStateType.RUNNING.toString());
+            if (!travelService.save(travel)) {
+                throw new BusinessException("travel failed to save");
+            }
+
+            // generate segment
+            int segSerial = 0;
+            segSerial++;
+            List<Segment> segmentList = new ArrayList<>();
+
+            String posType = "";
+            switch (taskType) {
+                case TO_CHARGE:
+                    posType = TaskPosDto.PosType.TO_CHARGE.toString();
+                    break;
+                case TO_STANDBY:
+                    posType = TaskPosDto.PosType.TO_STANDBY.toString();
+                    break;
+                case MOVE:
+                    posType = TaskPosDto.PosType.MOVE.toString();
+                    break;
+                default:
+                    break;
+            }
+
+            Segment segment = new Segment();
+            segment.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+            segment.setTravelId(travel.getId());
+            segment.setAgvId(agvId);
+            segment.setTaskId(task.getId());
+            segment.setSerial(segSerial);
+            segment.setEndNode(endCode.getId());
+            segment.setPosType(posType);
+            segment.setState(SegmentStateType.INIT.toString());
+            segmentList.add(segment);
+
+            for (int i = 0; i < segmentList.size(); i++) {
+                Segment next = segmentList.get(i);
+                if (i == 0) {
+                    next.setState(SegmentStateType.WAITING.toString());
+                }
+                if (!segmentService.save(next)) {
+                    throw new BusinessException("segment failed to save");
+                } else {
+                    if (null != jam && i == 0) {
+                        jam.setAvoSeg(next.getId());
+                        jam.setAvoCode(endCode.getId());
+                    }
+                }
+            }
+
+            switch (taskType) {
+                case TO_CHARGE:
+                case TO_STANDBY:
+                    // funcSta
+                    FuncSta destFuncSta = funcStaService.getByCodeAndType(task.getDestCode(), FuncStaType.query(taskType).toString());
+                    destFuncSta.setState(FuncStaStateType.OCCUPIED.toString());
+                    destFuncSta.setUpdateTime(now);
+                    if (!funcStaService.updateById(destFuncSta)) {
+                        log.error("FuncSta [{}] failed to update 锛侊紒锛�", destFuncSta.getName());
+                    }
+                    break;
+                case MOVE:
+                    break;
+                default:
+                    break;
+            }
+
+            return true;
+        } catch (Exception e) {
+            log.error("mainService.buildMinorTask[task]", e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+
+            return false;
+        }
+    }
+
+
+}
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 284c70c..04391b8 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,24 +2,10 @@
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.zy.acs.common.domain.AgvAction;
-import com.zy.acs.common.domain.AgvActionItem;
-import com.zy.acs.common.domain.AgvProtocol;
-import com.zy.acs.common.domain.BaseResult;
-import com.zy.acs.common.domain.protocol.AGV_11_UP;
-import com.zy.acs.common.domain.protocol.AGV_70_UP;
-import com.zy.acs.common.domain.protocol.IMessageBody;
-import com.zy.acs.common.domain.protocol.action.*;
-import com.zy.acs.common.enums.AgvBackpackType;
-import com.zy.acs.common.enums.AgvCompleteType;
-import com.zy.acs.common.enums.AgvDirectionType;
-import com.zy.acs.common.enums.AgvSpeedType;
 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.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;
@@ -28,7 +14,6 @@
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.*;
 import com.zy.acs.manager.manager.service.*;
-import com.zy.acs.manager.manager.service.impl.WebsocketServiceImpl;
 import com.zy.acs.manager.manager.utils.ActionSorter;
 import com.zy.acs.manager.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
@@ -38,7 +23,10 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -46,7 +34,7 @@
  */
 @Slf4j
 @Service("zkdMainService")
-public class MainZkdService implements IMainService {
+public class MainZkdService extends BaseMainService {
 
     @Autowired
     private BusService busService;
@@ -182,7 +170,6 @@
     }
 
 
-
     /**
      * 瑙f瀽鍙栨斁璐ч泦鍚堜换鍔�,杩涜鏈�浼樼殑鎺掑垪缁勫悎椤哄簭 ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
      * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)}
@@ -243,872 +230,5 @@
         }
     }
 
-
-    /**
-     * 鏍规嵁鍒嗙墖鐢熸垚鍔ㄤ綔 ( 杞﹁締鍙兘宸茬粡鍋氳繃涓�浜涗换鍔′簡,姝e湪绛夊緟涓嬩竴娈典换鍔� )
-     */
-    @Transactional
-    public synchronized void generateAction(Long agvId, List<Segment> segmentList, List<String> pathList, Date algoStartTime) {
-        try {
-            if (Cools.isEmpty(agvId, segmentList)) {
-                return;
-            }
-            Date now = new Date();
-            long actionPrepareSts = ActionStsType.PREPARE.val();
-//            JSONObject storeDirection = configService.getVal("storeDirection", JSONObject.class);
-            int angleOffsetVal = configService.getVal("mapAngleOffsetVal", Integer.class);
-            String agvNo = agvService.getAgvNo(agvId);
-//            if (!agvService.judgeEnable(agvId)) {
-//                throw new CoolException("AGV[" + agvNo + "]褰撳墠涓嶅彲鐢�...");
-//            }
-
-            AgvModel agvModel = agvModelService.getByAgvId(agvId);
-            Double workDirection = agvModel.getWorkDirection();
-            AgvSpeedType agvSpeedType = AgvSpeedType.query(agvModel.getTravelSpeed());
-            assert agvSpeedType != null;
-
-            AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agvId);
-
-            List<Action> actionList = new ArrayList<>();
-            // start node
-            Code lastCode = codeService.getCacheById(agvDetail.getRecentCode());
-            Double lastDirection = MapService.mapToNearest(agvDetail.getAgvAngle());
-            if (!lastCode.getData().equals(pathList.get(0))) {
-                throw new CoolException("AGV[" + agvNo + "]瀹氫綅鍋忕Щ...");
-            }
-
-            boolean first = true;
-            for (Segment segment : segmentList) {
-
-                // 鍒嗘鎵�灞炵殑Task
-                Task task = taskService.getById(segment.getTaskId());
-
-                // 鑺傜偣鏉$爜
-                Code code = codeService.getCacheById(segment.getEndNode());
-
-                // 闇�瑕佽蛋琛�
-                if (!lastCode.getData().equals(code.getData())) {
-
-                    // 璧拌璺緞鑺傜偣
-//                    List<String> pathList = mapService.checkoutPath(agv.getUuid(), lastCode, code);
-                    List<String> pathListPart = pathList.subList(pathList.indexOf(lastCode.getData()), pathList.indexOf(code.getData()) + 1);
-
-                    for (int i = 0; i < pathListPart.size(); i++) {
-                        if (i == 0) {
-                            continue;
-                        }
-
-                        String next = pathListPart.get(i);
-
-                        Code nextCode = codeService.getCacheByData(next);
-                        Double nextDirection = mapService.calculateDirection(lastCode, nextCode, angleOffsetVal);
-
-                        // 绗竴姝ワ細濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
-                        boolean reverse = false;
-                        if (nextDirection.equals((workDirection + 180) % 360)) {
-                            nextDirection = workDirection;
-                            reverse = true;
-                        }
-
-                        // 绗簩姝ワ細鍒ゆ柇褰撳墠鑺傜偣鏄惁鍙互鏃嬭浆
-                        if (!lastCode.getCornerBool()) {
-                            // 濡傛灉鏄綔涓氭柟鍚戯紝浣嗘槸灏忚溅鍦ㄥ贩閬撳唴鏂瑰悜閿欒锛屽垯鍋滄
-                            if (reverse && !lastDirection.equals(nextDirection)) {
-//                                throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
-                            }
-                            // 濡傛灉涓嶆槸浣滀笟鏂瑰悜锛屽垽鏂槸鍚︾浉鍙嶆柟鍚戯紝濡傛灉鍙嶆柟鍚戝垯鍊掗��琛岃蛋
-                            if (nextDirection.equals((lastDirection + 180) % 360)) {
-                                nextDirection = lastDirection;
-                                reverse = true;
-                            }
-                        } else {
-                            if (!lastDirection.equals(nextDirection)) {
-                                // 濡傛灉涓嬩釜鑺傜偣鏂瑰悜涓庡綋鍓峚gv鏂瑰悜鐩稿弽锛屽垯鍊掗��琛岃蛋锛屼絾鏄鏋滃綋鍓峚gv鏂瑰悜姝eソ涓庡伐浣滄柟鍚戠浉鍙嶏紝鍒欐棆杞嚦宸ヤ綔鏂瑰悜
-                                if (nextDirection.equals((lastDirection + 180) % 360) && !workDirection.equals((lastDirection + 180) % 360)) {
-                                    nextDirection = lastDirection;
-                                    reverse = true;
-                                } else {
-                                    // turn
-                                    actionList.add(new Action(
-                                            null,    // 缂栧彿s
-                                            task.getBusId(),    // 鎬荤嚎
-                                            task.getId(),    // 浠诲姟
-                                            null,    // 鍔ㄤ綔鍙�
-                                            null,    // 浼樺厛绾�
-                                            ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                            mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
-                                            lastCode.getData(),    // 鍦伴潰鐮�
-                                            String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
-                                            ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-                                            actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                            agvId,    // AGV
-                                            now    // 宸ヤ綔鏃堕棿
-                                    ));
-
-                                    lastDirection = nextDirection;
-                                }
-                            }
-                        }
-
-                        // 绗竴涓姩浣滀竴瀹氭槸 turn
-                        if (actionList.isEmpty()) {
-                            // turn
-                            actionList.add(new Action(
-                                    null,    // 缂栧彿
-                                    task.getBusId(),    // 鎬荤嚎
-                                    task.getId(),    // 浠诲姟
-                                    null,    // 鍔ㄤ綔鍙�
-                                    null,    // 浼樺厛绾�
-                                    ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
-                                    lastCode.getData(),    // 鍦伴潰鐮�
-                                    String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
-                                    ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-                                    actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                    agvId,    // AGV
-                                    now    // 宸ヤ綔鏃堕棿
-                            ));
-
-                            lastDirection = nextDirection;
-                        }
-
-                        // run
-                        ActionTypeType actionType = ActionTypeType.StraightAheadTurnable;
-                        if (reverse) {
-                            actionType = ActionTypeType.StraightBackTurnable;
-                        }
-                        CodeGap gap = codeGapService.findByCodeOfBoth(lastCode.getId(), nextCode.getId());
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                actionType.desc,    // 鍚嶇О
-                                (double) agvSpeedType.val,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(gap.getDistance()),   // 鍔ㄤ綔鍙傛暟
-                                actionType.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-
-                        lastCode = nextCode;
-
-                    }
-
-                }
-
-                // 鍒濆鏂瑰悜鍊艰ˉ涓�
-                if (first) {
-                    if (Cools.isEmpty(actionList) || !actionList.get(0).getActionType().equals(ActionTypeType.TurnCorner.val())) {
-                        // turn
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(workDirection),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-
-                        lastDirection = workDirection;
-
-                    }
-                    first = false;
-                }
-
-                // 浣滀笟鐐瑰姩浣�
-                AgvDirectionType agvDirectionType;
-                Double staWorkDirection;
-                AgvBackpackType backpackType = AgvBackpackType.query(segment.getBackpack());
-                switch (Objects.requireNonNull(TaskPosDto.queryPosType(segment.getPosType()))) {
-                    case ORI_LOC:
-                        assert backpackType != null;
-                        // 妫�楠屾柟鍚�
-                        if (!lastDirection.equals(workDirection)) {
-                            throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
-                        }
-                        // 璐ф灦鍙栬揣
-                        Loc oriLoc = locService.getById(task.getOriLoc());
-                        // 璁$畻宸﹀彸鏂瑰悜
-                        agvDirectionType = mapService.calculateAgvWorkDirectionByShelf(oriLoc, lastCode);
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyTakeFromShelvesLoc.desc,    // 鍚嶇О
-                                (double) agvDirectionType.val,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(oriLoc.getOffset()),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyTakeFromShelvesLoc.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        // 鏆傚瓨鐐规斁璐�
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyReleaseToAgvSite.desc,    // 鍚嶇О
-                                (double) backpackType.lev,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(backpackType.height),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyReleaseToAgvSite.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        break;
-                    case DEST_LOC:
-                        assert backpackType != null;
-                        // 妫�楠屾柟鍚�
-                        if (!lastDirection.equals(workDirection)) {
-                            throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
-                        }
-                        // 鏆傚瓨鐐瑰彇璐ц揣
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyTakeFromAgvSite.desc,    // 鍚嶇О
-                                (double) backpackType.lev,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(backpackType.height),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyTakeFromAgvSite.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-
-                        // 璐ф灦鏀捐揣
-                        Loc destLoc = locService.getById(task.getDestLoc());
-                        // 璁$畻宸﹀彸鏂瑰悜
-                        agvDirectionType = mapService.calculateAgvWorkDirectionByShelf(destLoc, lastCode);
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyReleaseToShelvesLoc.desc,    // 鍚嶇О
-                                (double) agvDirectionType.val,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(destLoc.getOffset()),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyReleaseToShelvesLoc.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        break;
-                    case ORI_STA:
-                        // 绔欑偣鍙栬揣
-                        Sta oriSta = staService.getById(task.getOriSta());
-                        Double oriStaWorkDirection = mapService.getStaAngle(oriSta, workDirection);
-                        // 妫�楠屾柟鍚�
-                        if (!lastDirection.equals(oriStaWorkDirection)) {
-                            if (!lastCode.getCornerBool()) {
-                                throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
-                            }
-                            // turn
-                            actionList.add(new Action(
-                                    null,    // 缂栧彿
-                                    task.getBusId(),    // 鎬荤嚎
-                                    task.getId(),    // 浠诲姟
-                                    null,    // 鍔ㄤ綔鍙�
-                                    null,    // 浼樺厛绾�
-                                    ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
-                                    lastCode.getData(),    // 鍦伴潰鐮�
-                                    String.valueOf(oriStaWorkDirection),   // 鍔ㄤ綔鍙傛暟
-                                    ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-                                    actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                    agvId,    // AGV
-                                    now    // 宸ヤ綔鏃堕棿
-                            ));
-                            lastDirection = oriStaWorkDirection;
-                        }
-                        // 璁$畻璐у弶宸ヤ綔鏂瑰悜
-                        staWorkDirection = mapService.calculateAgvWorkDirectionByStation(oriStaWorkDirection, lastDirection);
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyTakeFromConveyorSta.desc,    // 鍚嶇О
-                                staWorkDirection,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(oriSta.getOffset()),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyTakeFromConveyorSta.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        // 鏆傚瓨鐐规斁璐�
-                        assert backpackType != null;
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyReleaseToAgvSite.desc,    // 鍚嶇О
-                                (double) backpackType.lev,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(backpackType.height),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyReleaseToAgvSite.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        break;
-                    case DEST_STA:
-                        // 绔欑偣鏀捐揣
-                        Sta destSta = staService.getById(task.getDestSta());
-                        Double destStaWorkDirection = mapService.getStaAngle(destSta, workDirection);
-                        // 妫�楠屾柟鍚�
-                        if (!lastDirection.equals(destStaWorkDirection)) {
-                            if (!lastCode.getCornerBool()) {
-                                throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
-                            }
-                            // turn
-                            actionList.add(new Action(
-                                    null,    // 缂栧彿
-                                    task.getBusId(),    // 鎬荤嚎
-                                    task.getId(),    // 浠诲姟
-                                    null,    // 鍔ㄤ綔鍙�
-                                    null,    // 浼樺厛绾�
-                                    ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
-                                    lastCode.getData(),    // 鍦伴潰鐮�
-                                    String.valueOf(destStaWorkDirection),   // 鍔ㄤ綔鍙傛暟
-                                    ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-                                    actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                    agvId,    // AGV
-                                    now    // 宸ヤ綔鏃堕棿
-                            ));
-                            lastDirection = destStaWorkDirection;
-                        }
-                        // 鏆傚瓨鐐瑰彇璐�
-                        assert backpackType != null;
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyTakeFromAgvSite.desc,    // 鍚嶇О
-                                (double) backpackType.lev,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(backpackType.height),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyTakeFromAgvSite.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        // 璁$畻璐у弶宸ヤ綔鏂瑰悜
-                        staWorkDirection = mapService.calculateAgvWorkDirectionByStation(destStaWorkDirection, lastDirection);
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                task.getBusId(),    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.ReadyReleaseToConveyorSta.desc,    // 鍚嶇О
-                                staWorkDirection,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(destSta.getOffset()),   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.ReadyReleaseToConveyorSta.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        break;
-                    case TO_CHARGE:
-                        // 妫�楠屾柟鍚�
-                        FuncSta chargeFuncSta = funcStaService.query(lastCode.getId(), FuncStaType.CHARGE.toString());
-                        Double chargeDirection = Double.parseDouble(chargeFuncSta.getAngle());
-                        if (!lastDirection.equals(chargeDirection)) {
-                            actionList.add(new Action(
-                                    null,    // 缂栧彿
-                                    null,    // 鎬荤嚎
-                                    task.getId(),    // 浠诲姟
-                                    null,    // 鍔ㄤ綔鍙�
-                                    null,    // 浼樺厛绾�
-                                    ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
-                                    lastCode.getData(),    // 鍦伴潰鐮�
-                                    String.valueOf(chargeDirection),   // 鍔ㄤ綔鍙傛暟
-                                    ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-                                    actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                    agvId,    // AGV
-                                    now    // 宸ヤ綔鏃堕棿
-                            ));
-                            lastDirection = chargeDirection;
-                        }
-
-                        // charge
-                        actionList.add(new Action(
-                                null,    // 缂栧彿
-                                null,    // 鎬荤嚎
-                                task.getId(),    // 浠诲姟
-                                null,    // 鍔ㄤ綔鍙�
-                                null,    // 浼樺厛绾�
-                                ActionTypeType.DockingCharge.desc,    // 鍚嶇О
-                                null,    // 灞炴�у��
-                                lastCode.getData(),    // 鍦伴潰鐮�
-                                null,   // 鍔ㄤ綔鍙傛暟
-                                ActionTypeType.DockingCharge.val(),    // 鍔ㄤ綔绫诲瀷
-                                actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                                agvId,    // AGV
-                                now    // 宸ヤ綔鏃堕棿
-                        ));
-                        break;
-                    case TO_STANDBY:
-//                        FuncSta standByFuncSta = funcStaService.query(agvId, lastCode.getId(), 2);
-//                        Double standByDirection = Double.parseDouble(standByFuncSta.getAngle());
-//                        if (!lastDirection.equals(standByDirection)) {
-//                            actionList.add(new Action(
-//                                    null,    // 缂栧彿
-//                                    null,    // 鎬荤嚎
-//                                    task.getId(),    // 浠诲姟
-//                                    null,    // 鍔ㄤ綔鍙�
-//                                    null,    // 浼樺厛绾�
-//                                    ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-//                                    null,    // 灞炴�у��
-//                                    lastCode.getData(),    // 鍦伴潰鐮�
-//                                    String.valueOf(standByDirection),   // 鍔ㄤ綔鍙傛暟
-//                                    ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
-//                                    actionPrepareSts,    // 鍔ㄤ綔杩涘害
-//                                    agvId,    // AGV
-//                                    now    // 宸ヤ綔鏃堕棿
-//                            ));
-//                            lastDirection = standByDirection;
-//                        }
-                        break;
-                    case MOVE:
-                        break;
-                    default:
-                        break;
-                }
-
-            }
-
-            // finish
-            actionList.add(new Action(
-                    null,    // 缂栧彿
-                    null,    // 鎬荤嚎
-                    null,    // 浠诲姟
-                    null,    // 鍔ㄤ綔鍙�
-                    null,    // 浼樺厛绾�
-                    ActionTypeType.FinishPath.desc,    // 鍚嶇О
-                    null,    // 灞炴�у��
-                    lastCode.getData(),    // 鍦伴潰鐮�
-                    null,   // 鍔ㄤ綔鍙傛暟
-                    ActionTypeType.FinishPath.val(),    // 鍔ㄤ綔绫诲瀷
-                    actionPrepareSts,    // 鍔ㄤ綔杩涘害
-                    agvId,    // AGV
-                    now    // 宸ヤ綔鏃堕棿
-            ));
-
-            List<Action> newActionList = actionSorter.optimizeSort(actionList);
-            String groupId = String.valueOf(snowflakeIdWorker.nextId()).substring(3);
-
-            // save action
-            int i = newActionList.size();
-            for (Action action : newActionList) {
-//                action.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
-                action.setGroupId(groupId);
-                action.setPriority(i);
-                i -= 1;
-            }
-            if (!actionService.saveBatch(newActionList)) {
-                throw new BusinessException("group[" + groupId + "] 鍔ㄤ綔淇濆瓨澶辫触");
-            }
-
-            // update segment
-            for (Segment item : segmentList) {
-                item.setGroupId(groupId);
-                item.setState(SegmentStateType.RUNNING.toString());
-                item.setUpdateTime(now);
-                if (null != algoStartTime) {
-                    item.setAlgoTime((int) (now.getTime() - algoStartTime.getTime()));
-                }
-                if (!segmentService.updateById(item)) {
-                    throw new CoolException("鏇存柊Segment澶辫触");
-                }
-            }
-
-            log.info("{}鍙稟gv鍔ㄤ綔缁勮瀹屾垚锛屾寚浠ゆ暟閲忥細{}", agvNo, newActionList.size());
-        } catch (Exception e) {
-            log.error("mainService.generateAction", e);
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-
-            if (!Cools.isEmpty(pathList)) {
-                pathList.remove(0);
-                List<int[]> codeMatrixIdxList = mapDataDispatcher.getCodeMatrixIdxList(null, pathList);
-                mapDataDispatcher.clearDynamicMatrixByCodeList(null, codeMatrixIdxList);
-            }
-
-            throw new RuntimeException("generateAction method caught an exception, rolling back transaction.", e);
-        }
-    }
-
-    @Transactional
-    public void publishAction(String actionGroupId) {
-        try {
-            Date now = new Date();
-
-            // action
-            List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>()
-                    .eq(Action::getGroupId, actionGroupId).eq(Action::getActionSts, ActionStsType.PREPARE.val())
-                    .orderByDesc(Action::getPriority));
-            if (Cools.isEmpty(actionList)) {
-                return;
-            }
-
-            Long agvId = actionList.get(0).getAgvId();
-            String agvNo = agvService.getAgvNo(agvId);
-            if (!agvService.judgeOnline(agvId)) {
-                return;
-            }
-
-            long actionIssuedSts = ActionStsType.ISSUED.val();
-            for (Action action : actionList) {
-                action.setActionSts(actionIssuedSts);
-                action.setStartTime(now);
-                action.setIoTime(now);
-                action.setUpdateTime(now);
-            }
-            if (!actionService.updateBatchById(actionList)) {
-                throw new BusinessException("failed to update action batch !!!");
-            }
-
-            // task
-            List<Long> taskIds = actionService.selectTaskIdsByGroupId(actionGroupId);
-            long taskAssignSts = TaskStsType.ASSIGN.val();
-            long taskProgressSts = TaskStsType.PROGRESS.val();
-            for (Long taskId : taskIds) {
-                Task task = taskService.getById(taskId);
-                if (task.getTaskSts().equals(taskAssignSts)) {
-                    task.setTaskSts(taskProgressSts);
-                    task.setUpdateTime(now);
-                    if (!taskService.updateById(task)) {
-                        throw new BusinessException(task.getSeqNum() + "浠诲姟鏇存柊澶辫触");
-                    }
-                }
-            }
-
-            AgvAction agvAction = new AgvAction(agvNo, actionGroupId);
-            for (Action action : actionList) {
-                switch (Objects.requireNonNull(ActionTypeType.get(action.getActionTypeEl()))) {
-                    case TurnCorner:
-                        agvAction.add(new AgvActionItem<>(TurnCornerAction.class)
-                                .setQrCode(action.getCode())
-                                .setVal(Optional.ofNullable(action.getVal()).orElse(0D).intValue())
-                                .bodySync(body -> body.setAngle((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case StraightBackUnturnable:
-                        break;
-                    case StraightBackTurnable:
-                        agvAction.add(new AgvActionItem<>(StraightBackTurnableAction.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setDistance((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case StraightAheadUnturnable:
-                        break;
-                    case StraightAheadTurnable:
-                        agvAction.add(new AgvActionItem<>(StraightAheadTurnableAction.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setDistance((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case ReadyTakeFromShelvesLoc:
-                        agvAction.add(new AgvActionItem<>(ReadyTakeFromShelvesLoc.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case ReadyTakeFromConveyorSta:
-                        agvAction.add(new AgvActionItem<>(ReadyTakeFromConveyorSta.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case ReadyTakeFromAgvSite:
-                        agvAction.add(new AgvActionItem<>(ReadyTakeFromAgvSite.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setDepth((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case ReadyReleaseToShelvesLoc:
-                        agvAction.add(new AgvActionItem<>(ReadyReleaseToShelvesLoc.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case ReadyReleaseToConveyorSta:
-                        agvAction.add(new AgvActionItem<>(ReadyReleaseToConveyorSta.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case ReadyReleaseToAgvSite:
-                        agvAction.add(new AgvActionItem<>(ReadyReleaseToAgvSite.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setDepth((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case FinishPath:
-                        agvAction.add(new AgvActionItem<>(FinishPathAction.class)
-                                .setQrCode(action.getCode())
-                        );
-                        break;
-                    case DockingCharge:
-                        agvAction.add(new AgvActionItem<>(DockingChargeAction.class)
-                                .setQrCode(action.getCode())
-                        );
-                        break;
-                    default:
-                        break;
-                }
-
-            }
-
-            BaseResult<?> result = agvCmdService.executeAgvActionCmd(agvAction);
-            if (result.success()) {
-                log.info("浠诲姟缁� [{}] 鍔ㄤ綔鎸囦护宸蹭笅鍙� ===>> 鎸囦护鏁伴噺锛歿}", actionGroupId, actionList.size());
-            } else {
-                log.error("浠诲姟缁� [{}] 鍔ㄤ綔鎸囦护涓嬪彂澶辫触 锛侊紒锛�", actionGroupId);
-                throw new CoolException("浠诲姟缁� [{" + actionGroupId + "}] 鍔ㄤ綔鎸囦护涓嬪彂澶辫触 锛侊紒锛�");
-            }
-        } catch (Exception e) {
-            log.error("mainService.publishAction", e);
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }
-
-    }
-
-    @Transactional
-    public void upDataSubscribe(AgvProtocol protocol) {
-        Date now = new Date();
-
-        Agv agv = agvService.selectByUuid(protocol.getAgvNo());
-        if (null == agv) {
-            log.warn("Agv [{}] 灏氭湭閴存潈 锛侊紒锛�", protocol.getAgvNo());
-            return;
-        }
-
-        IMessageBody msgBody = protocol.getMessageBody();
-        assert msgBody != null;
-
-        // 鍔ㄤ綔瀹屾垚鍖�
-        if (msgBody instanceof AGV_11_UP) {
-            AGV_11_UP agv_11_up = (AGV_11_UP) msgBody;
-            String serialNo = agv_11_up.getSerialNo();
-
-            log.info("Agv [{}] 鍔ㄤ綔瀹屾垚鍖� ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_11_up));
-
-            // 鍏ュ簱鏀捐揣
-            if (agv_11_up.getCompleteType().equals(AgvCompleteType.RELEASE_FROM_SHELVES_COMPLETE)) {
-                WebsocketServiceImpl.taskShelfBarcode = agv_11_up.getLocCode();
-
-                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, String.valueOf(Integer.parseInt(agv_11_up.getLocCode()))));
-                if (null == loc) {
-                    log.warn("Agv [{}] 涓婃姤寰�璐ф灦鏀捐揣瀹屾垚鏃讹紝搴撲綅鐮乕{}]鏃犳晥銆�", protocol.getAgvNo(), agv_11_up.getLocCode());
-                } else {
-                    List<Long> taskIds = actionService.selectTaskIdsByGroupId(serialNo);
-                    for (Long taskId : taskIds) {
-                        Task task = taskService.getById(taskId);
-                        if (task.getDestLoc().equals(loc.getId())) {
-
-                            Action action = actionService.getOne(new LambdaQueryWrapper<Action>()
-                                    .eq(Action::getTaskId, task.getId())
-                                    .eq(Action::getActionType, ActionTypeType.ReadyReleaseToShelvesLoc.val())
-                                    .eq(Action::getActionSts, ActionStsType.ISSUED.val())
-                            );
-
-                            if (null != action) {
-                                action.setActionSts(ActionStsType.FINISH.val());
-                                action.setEndTime(now);
-                                action.setUpdateTime(now);
-                                if (!actionService.updateById(action)) {
-                                    log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
-                                }
-                            }
-
-                        }
-                    }
-                }
-            }
-
-            // 鍑哄簱鍙栬揣
-            if (agv_11_up.getCompleteType().equals(AgvCompleteType.TAKE_FROM_SHELVES_COMPLETE)) {
-                WebsocketServiceImpl.taskShelfBarcode = agv_11_up.getLocCode();
-
-                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, String.valueOf(Integer.parseInt(agv_11_up.getLocCode()))));
-                if (null == loc) {
-                    log.warn("Agv [{}] 涓婃姤浠庤揣鏋跺彇璐у畬鎴愶紝搴撲綅鐮乕{}]鏃犳晥銆�", protocol.getAgvNo(), agv_11_up.getLocCode());
-                } else {
-
-                    List<Long> taskIds = actionService.selectTaskIdsByGroupId(serialNo);
-                    for (Long taskId : taskIds) {
-                        Task task = taskService.getById(taskId);
-                        if (task.getOriLoc().equals(loc.getId())) {
-
-                            Action action = actionService.getOne(new LambdaQueryWrapper<Action>()
-                                    .eq(Action::getTaskId, task.getId())
-                                    .eq(Action::getActionType, ActionTypeType.ReadyTakeFromShelvesLoc.val())
-                                    .eq(Action::getActionSts, ActionStsType.ISSUED.val())
-                            );
-                            if (null != action) {
-                                action.setActionSts(ActionStsType.FINISH.val());
-                                action.setEndTime(now);
-                                action.setUpdateTime(now);
-                                if (!actionService.updateById(action)) {
-                                    log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            // 璺緞瀹屾垚 || 鍏呯數瀹屾垚
-            if (agv_11_up.getCompleteType().equals(AgvCompleteType.ENTIRE_PATH_COMPLETE)
-                    || agv_11_up.getCompleteType().equals(AgvCompleteType.DOCKING_CHARGE_COMPLETE)) {
-
-                // segment list
-                List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
-                                .eq(Segment::getGroupId, serialNo)
-//                        .eq(Segment::getState, SegmentStateType.RUNNING.toString())
-                                .orderByAsc(Segment::getSerial)
-                );
-
-                // settlement
-                this.settleSegmentList(segmentList, serialNo);
-
-                log.info("Agv [{}] {}浣滀笟瀹屾瘯 ==========>> ", protocol.getAgvNo(), serialNo);
-
-            }
-        }
-
-        // 鏂欎粨淇℃伅鍖�
-        if (msgBody instanceof AGV_70_UP) {
-            AGV_70_UP agv_70_up = (AGV_70_UP) msgBody;
-
-            log.info("Agv [{}] 鏂欎粨淇℃伅鍖� ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_70_up));
-        }
-    }
-
-    @Transactional
-    public void settleSegmentList(List<Segment> segmentList, String serialNo) {
-        if (Cools.isEmpty(segmentList)) {
-            return;
-        }
-        Date now = new Date();
-
-        // task
-        for (Segment segment : segmentList) {
-            boolean taskComplete = false;
-
-            Task task = taskService.getById(segment.getTaskId());
-            assert null != task;
-            TaskTypeType typeType = TaskTypeType.get(task.getTaskTypeEl());
-            assert null != typeType;
-
-            TaskPosDto.PosType posType = TaskPosDto.queryPosType(segment.getPosType());
-            switch (Objects.requireNonNull(posType)) {
-                case ORI_STA:
-                case ORI_LOC:
-                    break;
-                case DEST_STA:
-                case DEST_LOC:
-                case TO_CHARGE:
-                case TO_STANDBY:
-                    if (segment.getEndNode().equals(task.getDestCode())) {
-                        taskComplete = true;
-                    }
-                    break;
-                case MOVE:
-                    if (segment.getEndNode().equals(task.getDestCode())) {
-                        if (typeType.equals(TaskTypeType.MOVE)) {
-                            taskComplete = true;
-                        }
-                    }
-                    break;
-                default:
-                    break;
-            }
-
-            if (taskComplete) {
-                locService.taskCallBack(task);
-
-                task.setTaskSts(TaskStsType.COMPLETE.val());
-                task.setEndTime(now);
-                task.setUpdateTime(now);
-                if (!taskService.updateById(task)) {
-                    log.error("Task [{}] 鏇存柊澶辫触 锛侊紒锛�", task.getSeqNum());
-                } else {
-                    log.info("Task [{}] 浣滀笟瀹屾瘯 ==========>> ", task.getSeqNum());
-                }
-
-            }
-        }
-
-        // action, follow by groupId
-        if (!Cools.isEmpty(serialNo)) {
-            List<Action> actionList = actionService.list(new LambdaQueryWrapper<Action>()
-                    .eq(Action::getGroupId, serialNo)
-                    .eq(Action::getActionSts, ActionStsType.ISSUED.val())
-            );
-            for (Action action : actionList) {
-                action.setActionSts(ActionStsType.FINISH.val());
-                action.setEndTime(now);
-                action.setUpdateTime(now);
-                if (!actionService.updateById(action)) {
-                    log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
-                }
-            }
-        }
-
-        // segment
-        for (Segment segment : segmentList) {
-            segment.setState(SegmentStateType.FINISH.toString());
-            segment.setUpdateTime(now);
-            if (!segmentService.updateById(segment)) {
-                log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
-            }
-        }
-
-        // segment call back
-        segmentService.processNext(segmentList);
-    }
 
 }
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 775f301..30cd237 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
@@ -52,7 +52,7 @@
     @Autowired
     private SegmentService segmentService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @Autowired
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
index 9a7a5b7..a433b4d 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
@@ -8,7 +8,7 @@
 import com.zy.acs.manager.core.domain.CodeStepDto;
 import com.zy.acs.manager.core.domain.type.JobType;
 import com.zy.acs.manager.core.scheduler.MapDataWsScheduler;
-import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import com.zy.acs.manager.core.service.MapService;
 import com.zy.acs.manager.manager.entity.Action;
 import com.zy.acs.manager.manager.entity.Agv;
@@ -34,7 +34,7 @@
     private final CodeService codeService;
     private final MapService mapService;
     private final JamService jamService;
-    private final MainService mainService;
+    private final MainLxtService mainService;
     private final List<Action> actionList;
 
     private final RedisSupport redis;
@@ -50,7 +50,7 @@
             , CodeService codeService
             , MapService mapService
             , JamService jamService
-            , MainService mainService
+            , MainLxtService mainService
             , List<Action> actionList
     ) {
         this.agv = agv;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java
index 0457ea7..49dce9b 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java
@@ -7,7 +7,7 @@
 import com.zy.acs.common.domain.protocol.AGV_01_UP;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.framework.common.Cools;
-import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import com.zy.acs.manager.core.service.MapService;
 import com.zy.acs.manager.manager.entity.Action;
 import com.zy.acs.manager.manager.entity.Agv;
@@ -67,7 +67,7 @@
     @Autowired
     private JamService jamService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
 
     @PostConstruct
     public void init() {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/BusController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/BusController.java
index d959c93..57c5649 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/BusController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/BusController.java
@@ -9,7 +9,7 @@
 import com.zy.acs.manager.common.domain.*;
 import com.zy.acs.manager.common.utils.BusinessSortService;
 import com.zy.acs.manager.common.utils.ExcelUtil;
-import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import com.zy.acs.manager.manager.controller.param.BusCreateParam;
 import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
 import com.zy.acs.manager.manager.entity.Bus;
@@ -37,7 +37,7 @@
     @Autowired
     private BusService busService;
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
     @Autowired
     private StaService staService;
     @Autowired
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenController.java
index 1711b4d..2fc2715 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/OpenController.java
@@ -3,7 +3,7 @@
 import com.zy.acs.manager.common.annotation.OperationLog;
 import com.zy.acs.framework.common.R;
 import com.zy.acs.manager.system.controller.BaseController;
-import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.core.service.MainLxtService;
 import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,7 +22,7 @@
 public class OpenController extends BaseController {
 
     @Autowired
-    private MainService mainService;
+    private MainLxtService mainService;
 
     @PreAuthorize("hasAuthority('open:bus:submit')")
     @PostMapping("/bus/submit")

--
Gitblit v1.9.1