From 70930071a49190f414c8d8bc9c9e9795a4096739 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期一, 23 三月 2026 16:08:27 +0800
Subject: [PATCH] Merge branch 'refs/heads/rcs_master' into jdxaj

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java |  357 ++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 192 insertions(+), 165 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index 091f636..cde9b3d 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -4,16 +4,11 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zy.acs.common.constant.RedisConstant;
-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.*;
 import com.zy.acs.common.domain.protocol.*;
 import com.zy.acs.common.domain.protocol.action.*;
 import com.zy.acs.common.enums.*;
-import com.zy.acs.common.utils.GsonUtils;
-import com.zy.acs.common.utils.RedisSupport;
-import com.zy.acs.common.utils.Utils;
+import com.zy.acs.common.utils.*;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.SnowflakeIdWorker;
 import com.zy.acs.framework.exception.CoolException;
@@ -22,10 +17,11 @@
 import com.zy.acs.manager.common.exception.BusinessException;
 import com.zy.acs.manager.core.domain.AgvBackpackDto;
 import com.zy.acs.manager.core.domain.LaneDto;
+import com.zy.acs.manager.core.domain.PathDto;
 import com.zy.acs.manager.core.domain.TaskPosDto;
 import com.zy.acs.manager.core.integrate.conveyor.ConveyorStationService;
+import com.zy.acs.manager.core.integrate.dto.OpenBusSubmitParam;
 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.*;
@@ -38,6 +34,7 @@
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import com.zy.acs.common.utils.News;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -106,11 +103,12 @@
     @Transactional
     public Bus generateBusAndTask(OpenBusSubmitParam busSubmitParam, String memo) {
         String errorMsg = busService.checkoutValid(busSubmitParam);
+        Boolean maintainLocSts = configService.getVal("maintainLocSts", Boolean.class);
         if (!Cools.isEmpty(errorMsg)) {
             throw new BusinessException(errorMsg);
         }
-        String batch = busSubmitParam.getBatch();
-        List<TaskDto> taskDtoList = busSubmitParam.getTaskList();
+        String batchNo = busSubmitParam.getBatchNo();
+        List<TaskDto> taskDtoList = busSubmitParam.getTasks();
         if (Cools.isEmpty(taskDtoList)) {
             throw new BusinessException("taskList can't be empty!");
         }
@@ -125,7 +123,7 @@
         Date now = new Date();
         Bus bus = new Bus();
         bus.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
-        bus.setBusNo(batch);
+        bus.setBusNo(batchNo);
         bus.setStartTime(now);
         bus.setBusSts(BusStsType.RECEIVE.val());
         bus.setMemo(memo);
@@ -149,35 +147,39 @@
             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");
-                    }
+                    if (maintainLocSts) {
+                        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");
+                        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");
+                    if (maintainLocSts) {
+                        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());
@@ -191,14 +193,16 @@
                         throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to reserve");
                     }
 
-                    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");
+                    if (maintainLocSts) {
+                        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:
@@ -238,7 +242,7 @@
                     bus.setBusSts(BusStsType.PROGRESS.val());
                     bus.setUpdateTime(now);
                     if (!busService.updateById(bus)) {
-                        log.error("Bus [{}] failed to Update 锛侊紒锛�", bus.getUuid());
+                        News.error("Bus [{}] failed to Update 锛侊紒锛�", bus.getUuid());
                     }
                 }
                 return;
@@ -251,33 +255,28 @@
                         , (task, agvNo, sta) -> {
                             Long agvId = agvService.getAgvId(agvNo);
 
-//                            List<Travel> travelList = travelService.list(new LambdaQueryWrapper<Travel>()
-//                                    .eq(Travel::getAgvId, agvId)
-//                                    .eq(Travel::getState, TravelStateType.RUNNING.toString())
-//                                    .orderByDesc(Travel::getCreateTime));
-//                            if (Cools.isEmpty(travelList)) {
-//                                throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
+                            Travel travel = travelService.findRunningTravel(agvId);
+                            if (null == travel) {
+                                throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting travel");
+                            }
+
+                            // curr segment
+                            Segment currSeg = segmentService.getCurrWaitingSeg(travel.getId(), agvId);
+//                            if (null == currSeg) {
+//                                currSeg = segmentService.getCurrRunningSeg(travel.getId(), agvId, null);
 //                            }
-//                            Travel travel = travelList.get(0);
-//
-//                            List<Segment> currSegments = segmentService.list(new LambdaQueryWrapper<Segment>()
-//                                    .eq(Segment::getAgvId, agvId)
-//                                    .eq(Segment::getTravelId, travel.getId())
-//                            );
-                            // load segment
-                            Segment currSeg = segmentService.getRollerWaiting(agvId, sta.getCode(), TaskPosDto.PosType.ORI_STA);
                             if (null == currSeg) {
-                                throw new BusinessException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting segment");
+                                throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no waiting segment");
                             }
 
                             // get backpack lev
                             int backpackLev = 0;
-                            int backpack = agvService.getBackpack(agvId);
+                            int backpackCap = agvService.getBackpack(agvId);
                             List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
-                            if (usedBackpacks.size() >= backpack) {
+                            if (usedBackpacks.size() >= backpackCap) {
                                 throw new CoolException("[Agv:" + agvNo + "] allocate inbound segment failed: no idle backpack to use");
                             }
-                            for (int lev = 1; lev <= backpack; lev++) {
+                            for (int lev = 1; lev <= backpackCap; lev++) {
                                 if (!usedBackpacks.contains(lev)) {
                                     backpackLev = lev;
                                     break;
@@ -291,7 +290,7 @@
                             currSeg.setState(SegmentStateType.INIT.toString());
                             currSeg.setUpdateTime(now);
                             if (!segmentService.updateById(currSeg)) {
-//                                log.error("Segment [{}] failed to update 锛侊紒锛�", currSeg.getGroupId() + " - " + currSeg.getSerial());
+//                                News.error("Segment [{}] failed to update 锛侊紒锛�", currSeg.getGroupId() + " - " + currSeg.getSerial());
                                 throw new CoolException("failed to update segment [" + currSeg.getGroupId() + "-" + currSeg.getSerial() + "] failed");
                             }
 
@@ -309,7 +308,7 @@
                             loadSeg.setCreateTime(now);
                             loadSeg.setUpdateTime(now);
                             if (!segmentService.save(loadSeg)) {
-//                                log.error("Segment [{}] failed to save 锛侊紒锛�", loadSeg.getTravelId() + " - " + loadSeg.getSerial());
+//                                News.error("Segment [{}] failed to save 锛侊紒锛�", loadSeg.getTravelId() + " - " + loadSeg.getSerial());
                                 throw new CoolException("failed to save segment [" + loadSeg.getGroupId() + "-" + loadSeg.getSerial() + "] failed");
                             }
 
@@ -363,7 +362,6 @@
 
                             // DEST-only sort
                             destPosList.sort((a, b) -> {
-
                                 // 涓昏酱
                                 double aFirst = a.getFirstWeight(sameGroupXy);
                                 double bFirst = b.getFirstWeight(sameGroupXy);
@@ -381,11 +379,10 @@
 
                             // get placeSeg serial
                             int placeSegSerial;
-                            // query placeSeg idx
                             int idx = -1;
                             for (int i = 0; i < destPosList.size(); i++) {
-                                if (Objects.equals(destPosList.get(i).getCodeId(), newDto.getCodeId())
-                                        && Objects.equals(destPosList.get(i).getTaskId(), newDto.getTaskId())) {
+                                if (Objects.equals(destPosList.get(i).getTaskId(), newDto.getTaskId())
+                                        && Objects.equals(destPosList.get(i).getCodeId(), newDto.getCodeId())) {
                                     idx = i;
                                     break;
                                 }
@@ -435,7 +432,7 @@
                             placeSeg.setCreateTime(now);
                             placeSeg.setUpdateTime(now);
                             if (!segmentService.save(placeSeg)) {
-//                                log.error("Segment [{}] failed to save 锛侊紒锛�", placeSeg.getTravelId() + " - " + placeSeg.getSerial());
+//                                News.error("Segment [{}] failed to save 锛侊紒锛�", placeSeg.getTravelId() + " - " + placeSeg.getSerial());
                                 throw new CoolException("failed to save segment [" + placeSeg.getGroupId() + "-" + placeSeg.getSerial() + "] failed");
                             }
 
@@ -465,7 +462,7 @@
                             staReserveService.allocateCallBack(task, agvId);
                         });
 //                if (Cools.isEmpty(agvNo)) {
-////                    log.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
+////                    News.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
 //                    continue;
 //                }
 //                task.setAgvId(agvService.getAgvId(agvNo));
@@ -477,7 +474,7 @@
 //                }
             }
         } catch (Exception e) {
-            log.error("mainService.infuseAgvForTask", e);
+            News.error("mainService.infuseAgvForTask", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
         }
     }
@@ -492,7 +489,7 @@
         try {
             // valid -----------------------------------------------
             Agv agv = agvService.getById(agvId);
-            if (!agvService.judgeEnable(agv.getId(), false)) {
+            if (!agvService.judgeEnable(agv.getId())) {
                 return;
             }
             if (!Cools.isEmpty(taskService.selectInSts(agvId, TaskStsType.ASSIGN, TaskStsType.PROGRESS))) {
@@ -512,9 +509,9 @@
                     return o2.getPriority() - o1.getPriority();
                 }
             });
-            Integer backpack = agvService.getBackpack(agvId);
-            if (taskList.size() > backpack) {
-                taskList = taskList.subList(0, backpack);
+            Integer backpackCap = agvService.getBackpack(agvId);
+            if (taskList.size() > backpackCap) {
+                taskList = taskList.subList(0, backpackCap);
             }
 
             AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId);
@@ -584,7 +581,7 @@
 
                 }
 
-                if (backpackLev > backpack) {
+                if (backpackLev > backpackCap) {
                     throw new BusinessException("瑙f瀽Task澶辫触,AGV鑳岀瘬宸叉弧......");
                 }
 
@@ -654,7 +651,7 @@
                     dropGroups.add(group);
                 } else {
                     // import tip: the list must only contain ORIGIN and DESTINATION
-                    log.error("the list must only contain ORIGIN and DESTINATION");
+                    News.error("the list must only contain ORIGIN and DESTINATION");
                 }
             }
 
@@ -730,7 +727,7 @@
 
         } catch (Exception e) {
 
-            log.error("mainService.buildMajorTask[task]", e);
+            News.error("mainService.buildMajorTask[task]", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
         }
     }
@@ -767,7 +764,7 @@
                         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());
+                        News.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", agvNo, taskType.toString());
                     }
                     break;
                 case MOVE:
@@ -788,7 +785,8 @@
             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.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+            task.setSeqNum(Base62.encode(snowflakeIdWorker.nextId()));
             task.setOriCode(agvDetail.getCode());
             task.setDestCode(endCode.getId());
             // lane
@@ -799,6 +797,7 @@
             task.setPriority(taskType.equals(TaskTypeType.TO_CHARGE)?2:1);
             task.setTaskSts(TaskStsType.ASSIGN.val());
             task.setTaskType(taskType.val());
+            task.setUplinkSts(TaskUplinkStateType.SKIPPED.toString());
             task.setIoTime(now);
             task.setStartTime(now);
             if (!taskService.save(task)) {
@@ -871,7 +870,7 @@
                     destFuncSta.setState(FuncStaStateType.OCCUPIED.toString());
                     destFuncSta.setUpdateTime(now);
                     if (!funcStaService.updateById(destFuncSta)) {
-                        log.error("FuncSta [{}] failed to update 锛侊紒锛�", destFuncSta.getName());
+                        News.error("FuncSta [{}] failed to update 锛侊紒锛�", destFuncSta.getName());
                     }
                     break;
                 case MOVE:
@@ -882,7 +881,7 @@
 
             return true;
         } catch (Exception e) {
-            log.error("mainService.buildMinorTask[task]", e);
+            News.error("mainService.buildMinorTask[task]", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 
             return false;
@@ -893,13 +892,16 @@
      * 鏍规嵁鍒嗙墖鐢熸垚鍔ㄤ綔 ( 杞﹁締鍙兘宸茬粡鍋氳繃涓�浜涗换鍔′簡,姝e湪绛夊緟涓嬩竴娈典换鍔� )
      */
     @Transactional
-    public synchronized void generateAction(Long agvId, List<Segment> segmentList, List<String> pathList, Date algoStartTime) {
+    public synchronized List<PathDto> generateAction(Long agvId, List<Segment> segmentList, List<String> pathList, Date algoStartTime) {
+        List<PathDto> pathTrace = new ArrayList<>();
         try {
-            if (Cools.isEmpty(agvId, segmentList)) { return; }
+            if (Cools.isEmpty(agvId, segmentList)) { return pathTrace; }
             Date now = new Date();
             long actionPrepareSts = ActionStsType.PREPARE.val();
 //            JSONObject storeDirection = configService.getVal("storeDirection", JSONObject.class);
             int angleOffsetVal = configService.getVal("mapAngleOffsetVal", Integer.class);
+//            Double defaultShelfDepth = configService.getVal("defaultShelfDepth", Double.class);
+//            defaultShelfDepth = Optional.ofNullable(defaultShelfDepth).orElse((double) 0);
             String agvNo = agvService.getAgvNo(agvId);
 //            if (!agvService.judgeEnable(agvId)) {
 //                throw new CoolException("AGV[" + agvNo + "]褰撳墠涓嶅彲鐢�...");
@@ -922,6 +924,7 @@
             if (!lastCode.getData().equals(pathList.get(0))) {
                 throw new CoolException("AGV[" + agvNo + "]瀹氫綅鍋忕Щ...");
             }
+            pathTrace.add(new PathDto(lastCode.getData(), lastDirection, false));
 
             boolean first = true;
             for (Segment segment : segmentList) {
@@ -936,7 +939,6 @@
                 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++) {
@@ -979,7 +981,7 @@
                                         null,    // 鍔ㄤ綔鍙�
                                         null,    // 浼樺厛绾�
                                         ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                        (double) mapService.spinDirection(lastCode).val,     // 灞炴�у��
+                                        (double) MapService.calcSpinDirection(lastCode, lastDirection, nextLaneDir).val,     // 灞炴�у��
                                         lastCode.getData(),    // 鍦伴潰鐮�
                                         String.valueOf(nextLaneDir),   // 鍔ㄤ綔鍙傛暟
                                         ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -988,30 +990,26 @@
                                         now    // 宸ヤ綔鏃堕棿
                                 ));
                                 lastDirection = nextLaneDir;
-
-                                if (nextDirection.equals(oppNextLaneDir)) {
-                                    reverse = true;
-                                }
-                            } else {
-                                if (nextDirection.equals(oppNextLaneDir)) {
-                                    nextDirection = nextLaneDir;
-                                    reverse = true;
-                                }
+                                PathDto.markTurn(pathTrace, lastDirection);
                             }
 
-                            nextDirection = nextLaneDir;
-                        } else if (null != lastLaneDir) {
-                            final double oppLastLaneDir = (lastLaneDir + 180) % 360;
-                            if (nextDirection.equals(oppLastLaneDir)) {
+                            if (nextDirection.equals(oppNextLaneDir)) {
                                 reverse = true;
                             }
-                            nextDirection = lastLaneDir;
+                            nextDirection = nextLaneDir; // 闃叉 绗竴涓姩浣滀竴瀹氭槸 turn 鍑洪棶棰�
+                        } else if (null != lastLaneDir) { // turn 鐜舰鐩磋涓嶅簲璇ュ瓨鍦ㄤ簬lane涓�
+                            final double oppLastLaneDir = (lastLaneDir + 180) % 360;
 
-                            if (!lastDirection.equals(nextDirection)) {
+                            if (!lastDirection.equals(lastLaneDir)) {
                                 if (!lastCode.getCornerBool()) {
                                     throw new CoolException(agvNo + "鍙峰皬杞︾寮�宸烽亾闇�璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
                                 }
                             }
+
+                            if (nextDirection.equals(oppLastLaneDir)) {
+                                reverse = true;
+                            }
+                            nextDirection = lastLaneDir; // 闃叉 绗竴涓姩浣滀竴瀹氭槸 turn 鍑洪棶棰�
                         } else {
 
                             // 濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
@@ -1051,7 +1049,7 @@
                                                 null,    // 鍔ㄤ綔鍙�
                                                 null,    // 浼樺厛绾�
                                                 ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                                (double) mapService.spinDirection(lastCode).val,     // 灞炴�у��
+                                                (double) MapService.calcSpinDirection(lastCode, lastDirection, nextDirection).val,     // 灞炴�у��
                                                 lastCode.getData(),    // 鍦伴潰鐮�
                                                 String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
                                                 ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1061,6 +1059,7 @@
                                         ));
 
                                         lastDirection = nextDirection;
+                                        PathDto.markTurn(pathTrace, lastDirection);
                                     }
                                 }
                             }
@@ -1076,7 +1075,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
+                                    (double) MapService.calcSpinDirection(lastCode, lastDirection, nextDirection).val,    // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1086,6 +1085,7 @@
                             ));
 
                             lastDirection = nextDirection;
+                            PathDto.markTurn(pathTrace, lastDirection);
                         }
 
                         // run
@@ -1108,6 +1108,7 @@
                         ));
 
                         lastCode = nextCode;
+                        pathTrace.add(new PathDto(lastCode.getData(), lastDirection, false));
 
                     }
 
@@ -1143,7 +1144,7 @@
                                 null,    // 鍔ㄤ綔鍙�
                                 null,    // 浼樺厛绾�
                                 ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
+                                (double) MapService.calcSpinDirection(lastCode, lastDirection, firstTurnDir).val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
                                 String.valueOf(firstTurnDir),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1153,13 +1154,14 @@
                         ));
 
                         lastDirection = firstTurnDir;
+                        PathDto.markTurn(pathTrace, lastDirection);
 
                     }
                     first = false;
                 }
 
                 // 浣滀笟鐐瑰姩浣�
-                AgvDirectionType agvDirectionType;
+                ActuatorDirectionType actuatorDirectionType;
                 Double staWorkDirection;
                 AgvBackpackType backpackType = AgvBackpackType.query(segment.getBackpack());
                 switch (Objects.requireNonNull(TaskPosDto.queryPosType(segment.getPosType()))) {
@@ -1172,7 +1174,8 @@
                         // 璐ф灦鍙栬揣
                         Loc oriLoc = locService.getById(task.getOriLoc());
                         // 璁$畻宸﹀彸鏂瑰悜
-                        agvDirectionType = mapService.calculateAgvWorkDirectionByShelf(oriLoc, lastCode);
+                        actuatorDirectionType = ActuatorDirectionType.fromVal(oriLoc.getCompDirect());
+//                        actuatorDirectionType = mapService.calculateAgvWorkDirectionByShelf(oriLoc, lastCode);
                         actionList.add(new Action(
                                 null,    // 缂栧彿
                                 task.getBusId(),    // 鎬荤嚎
@@ -1180,9 +1183,9 @@
                                 null,    // 鍔ㄤ綔鍙�
                                 null,    // 浼樺厛绾�
                                 ActionTypeType.ReadyTakeFromShelvesLoc.desc,    // 鍚嶇О
-                                (double) agvDirectionType.val,    // 灞炴�у��
+                                (double) actuatorDirectionType.val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(oriLoc.getOffset()),   // 鍔ㄤ綔鍙傛暟
+                                JSON.toJSONString(new HeightDepthDto(oriLoc.getOffset())),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.ReadyTakeFromShelvesLoc.val(),    // 鍔ㄤ綔绫诲瀷
                                 actionPrepareSts,    // 鍔ㄤ綔杩涘害
                                 agvId,    // AGV
@@ -1235,17 +1238,18 @@
                         // 璐ф灦鏀捐揣
                         Loc destLoc = locService.getById(task.getDestLoc());
                         // 璁$畻宸﹀彸鏂瑰悜
-                        agvDirectionType = mapService.calculateAgvWorkDirectionByShelf(destLoc, lastCode);
+                        actuatorDirectionType = ActuatorDirectionType.fromVal(destLoc.getCompDirect());
+//                        actuatorDirectionType = mapService.calculateAgvWorkDirectionByShelf(destLoc, lastCode);
                         actionList.add(new Action(
                                 null,    // 缂栧彿
                                 task.getBusId(),    // 鎬荤嚎
                                 task.getId(),    // 浠诲姟
                                 null,    // 鍔ㄤ綔鍙�
-                                 null,    // 浼樺厛绾�
+                                null,    // 浼樺厛绾�
                                 ActionTypeType.ReadyReleaseToShelvesLoc.desc,    // 鍚嶇О
-                                (double) agvDirectionType.val,    // 灞炴�у��
+                                (double) actuatorDirectionType.val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(destLoc.getOffset()),   // 鍔ㄤ綔鍙傛暟
+                                JSON.toJSONString(new HeightDepthDto(destLoc.getOffset())),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.ReadyReleaseToShelvesLoc.val(),    // 鍔ㄤ綔绫诲瀷
                                 actionPrepareSts,    // 鍔ㄤ綔杩涘害
                                 agvId,    // AGV
@@ -1255,7 +1259,7 @@
                     case ORI_STA:
                         // 绔欑偣鍙栬揣
                         Sta oriSta = staService.getById(task.getOriSta());
-                        Double oriStaWorkDirection = mapService.getStaAngle(oriSta, workDirection);
+                        Double oriStaWorkDirection = mapService.getStaAngle(oriSta);
                         // 妫�楠屾柟鍚�
                         if (!lastDirection.equals(oriStaWorkDirection)) {
                             if (!lastCode.getCornerBool()) {
@@ -1269,7 +1273,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    (double) mapService.spinDirection(lastCode).val,   // 灞炴�у��
+                                    (double) MapService.calcSpinDirection(lastCode, lastDirection, oriStaWorkDirection).val,   // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(oriStaWorkDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1278,9 +1282,11 @@
                                     now    // 宸ヤ綔鏃堕棿
                             ));
                             lastDirection = oriStaWorkDirection;
+                            PathDto.markTurn(pathTrace, lastDirection);
                         }
                         // 璁$畻璐у弶宸ヤ綔鏂瑰悜
-                        staWorkDirection = mapService.calculateAgvWorkDirectionByStation(oriStaWorkDirection, lastDirection);
+                        actuatorDirectionType = ActuatorDirectionType.fromVal(oriSta.getActDir());
+//                        staWorkDirection = mapService.calculateAgvWorkDirectionByStation(oriStaWorkDirection, lastDirection);
                         actionList.add(new Action(
                                 null,    // 缂栧彿
                                 task.getBusId(),    // 鎬荤嚎
@@ -1288,9 +1294,9 @@
                                 null,    // 鍔ㄤ綔鍙�
                                 null,    // 浼樺厛绾�
                                 ActionTypeType.ReadyTakeFromConveyorSta.desc,    // 鍚嶇О
-                                staWorkDirection,    // 灞炴�у��
+                                (double) actuatorDirectionType.val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(oriSta.getOffset()),   // 鍔ㄤ綔鍙傛暟
+                                JSON.toJSONString(new HeightDepthDto(oriSta.getHeight(), Optional.ofNullable(oriSta.getDepth()).orElse((double) 0))),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.ReadyTakeFromConveyorSta.val(),    // 鍔ㄤ綔绫诲瀷
                                 actionPrepareSts,    // 鍔ㄤ綔杩涘害
                                 agvId,    // AGV
@@ -1319,7 +1325,7 @@
                     case DEST_STA:
                         // 绔欑偣鏀捐揣
                         Sta destSta = staService.getById(task.getDestSta());
-                        Double destStaWorkDirection = mapService.getStaAngle(destSta, workDirection);
+                        Double destStaWorkDirection = mapService.getStaAngle(destSta);
                         // 妫�楠屾柟鍚�
                         if (!lastDirection.equals(destStaWorkDirection)) {
                             if (!lastCode.getCornerBool()) {
@@ -1333,7 +1339,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
+                                    (double) MapService.calcSpinDirection(lastCode, lastDirection, destStaWorkDirection).val,    // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(destStaWorkDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1342,6 +1348,7 @@
                                     now    // 宸ヤ綔鏃堕棿
                             ));
                             lastDirection = destStaWorkDirection;
+                            PathDto.markTurn(pathTrace, lastDirection);
                         }
                         // 鑳岀瘬鍙栬揣
                         if (backupAction) {
@@ -1363,7 +1370,8 @@
                             ));
                         }
                         // 璁$畻璐у弶宸ヤ綔鏂瑰悜
-                        staWorkDirection = mapService.calculateAgvWorkDirectionByStation(destStaWorkDirection, lastDirection);
+//                        staWorkDirection = mapService.calculateAgvWorkDirectionByStation(destStaWorkDirection, lastDirection);
+                        actuatorDirectionType = ActuatorDirectionType.fromVal(destSta.getActDir());
                         actionList.add(new Action(
                                 null,    // 缂栧彿
                                 task.getBusId(),    // 鎬荤嚎
@@ -1371,9 +1379,9 @@
                                 null,    // 鍔ㄤ綔鍙�
                                 null,    // 浼樺厛绾�
                                 ActionTypeType.ReadyReleaseToConveyorSta.desc,    // 鍚嶇О
-                                staWorkDirection,    // 灞炴�у��
+                                (double) actuatorDirectionType.val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(destSta.getOffset()),   // 鍔ㄤ綔鍙傛暟
+                                JSON.toJSONString(new HeightDepthDto(destSta.getHeight(), Optional.ofNullable(destSta.getDepth()).orElse((double) 0))),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.ReadyReleaseToConveyorSta.val(),    // 鍔ㄤ綔绫诲瀷
                                 actionPrepareSts,    // 鍔ㄤ綔杩涘害
                                 agvId,    // AGV
@@ -1392,7 +1400,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
+                                    (double) MapService.calcSpinDirection(lastCode, lastDirection, chargeDirection).val,    // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(chargeDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1401,6 +1409,7 @@
                                     now    // 宸ヤ綔鏃堕棿
                             ));
                             lastDirection = chargeDirection;
+                            PathDto.markTurn(pathTrace, lastDirection);
                         }
 
                         // charge
@@ -1554,9 +1563,10 @@
                 throw new BusinessException("group[" + groupId + "] 鍔ㄤ綔淇濆瓨澶辫触");
             }
 
-            log.info("{}鍙稟gv鍔ㄤ綔缁勮瀹屾垚锛屾寚浠ゆ暟閲忥細{}", agvNo, newActionList.size());
+            News.info("{}鍙稟gv鍔ㄤ綔缁勮瀹屾垚锛屾寚浠ゆ暟閲忥細{}", agvNo, newActionList.size());
+            return pathTrace;
         } catch (Exception e) {
-            log.error("mainService.generateAction", e);
+            News.error("mainService.generateAction", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 
             if (!Cools.isEmpty(pathList)) {
@@ -1646,14 +1656,22 @@
                         agvAction.add(new AgvActionItem<>(ReadyTakeFromShelvesLoc.class)
                                 .setVal(action.getVal().intValue())
                                 .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
+                                .bodySync((body) -> {
+                                    HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+                                    body.setHeight(heightDepthDto.getHeight());
+                                    body.setDepth(heightDepthDto.getDepth());
+                                })
                         );
                         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())))
+                                .bodySync((body) -> {
+                                    HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+                                    body.setHeight(heightDepthDto.getHeight());
+                                    body.setDepth(heightDepthDto.getDepth());
+                                })
                         );
                         break;
                     case ReadyTakeFromAgvSite:
@@ -1667,21 +1685,22 @@
                         agvAction.add(new AgvActionItem<>(ReadyReleaseToShelvesLoc.class)
                                 .setVal(action.getVal().intValue())
                                 .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
-                        );
-                        break;
-                    case LoadPlatformLift:
-                        agvAction.add(new AgvActionItem<>(LoadPlatformLift.class)
-                                .setVal(action.getVal().intValue())
-                                .setQrCode(action.getCode())
-                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
+                                .bodySync((body) -> {
+                                    HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+                                    body.setHeight(heightDepthDto.getHeight());
+                                    body.setDepth(heightDepthDto.getDepth());
+                                })
                         );
                         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())))
+                                .bodySync((body) -> {
+                                    HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+                                    body.setHeight(heightDepthDto.getHeight());
+                                    body.setDepth(heightDepthDto.getDepth());
+                                })
                         );
                         break;
                     case ReadyReleaseToAgvSite:
@@ -1689,6 +1708,13 @@
                                 .setVal(action.getVal().intValue())
                                 .setQrCode(action.getCode())
                                 .bodySync(body -> body.setDepth((short) Double.parseDouble(action.getParams())))
+                        );
+                        break;
+                    case LoadPlatformLift:
+                        agvAction.add(new AgvActionItem<>(LoadPlatformLift.class)
+                                .setVal(action.getVal().intValue())
+                                .setQrCode(action.getCode())
+                                .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
                         );
                         break;
                     case FinishPath:
@@ -1714,13 +1740,13 @@
 
             BaseResult<?> result = agvCmdService.executeAgvActionCmd(agvAction);
             if (result.success()) {
-                log.info("浠诲姟缁� [{}] 鍔ㄤ綔鎸囦护宸蹭笅鍙� ===>> 鎸囦护鏁伴噺锛歿}", actionGroupId, actionList.size());
+                News.info("浠诲姟缁� [{}] 鍔ㄤ綔鎸囦护宸蹭笅鍙� ===>> 鎸囦护鏁伴噺锛歿}", actionGroupId, actionList.size());
             } else {
-                log.error("浠诲姟缁� [{}] 鍔ㄤ綔鎸囦护涓嬪彂澶辫触 锛侊紒锛�", actionGroupId);
+                News.error("浠诲姟缁� [{}] 鍔ㄤ綔鎸囦护涓嬪彂澶辫触 锛侊紒锛�", actionGroupId);
                 throw new CoolException("浠诲姟缁� [{" + actionGroupId + "}] 鍔ㄤ綔鎸囦护涓嬪彂澶辫触 锛侊紒锛�");
             }
         } catch (Exception e) {
-            log.error("mainService.publishAction", e);
+            News.error("mainService.publishAction", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
         }
 
@@ -1732,7 +1758,7 @@
 
         Agv agv = agvService.selectByUuid(protocol.getAgvNo());
         if (null == agv) {
-            log.warn("Agv [{}] 灏氭湭閴存潈 锛侊紒锛�", protocol.getAgvNo());
+            News.warn("Agv [{}] 灏氭湭閴存潈 锛侊紒锛�", protocol.getAgvNo());
             return;
         }
 
@@ -1744,7 +1770,7 @@
             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));
+            News.info("Agv [{}] 鍔ㄤ綔瀹屾垚鍖� ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_11_up));
 
             // 鍏ュ簱鏀捐揣
             if (agv_11_up.getCompleteType().equals(AgvCompleteType.RELEASE_FROM_SHELVES_COMPLETE)) {
@@ -1752,7 +1778,7 @@
 
                 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());
+                    News.warn("Agv [{}] 涓婃姤寰�璐ф灦鏀捐揣瀹屾垚鏃讹紝搴撲綅鐮乕{}]鏃犳晥銆�", protocol.getAgvNo(), agv_11_up.getLocCode());
                 } else {
                     List<Long> taskIds = actionService.selectTaskIdsByGroupId(serialNo);
                     for (Long taskId : taskIds) {
@@ -1770,7 +1796,7 @@
                                 action.setEndTime(now);
                                 action.setUpdateTime(now);
                                 if (!actionService.updateById(action)) {
-                                    log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
+                                    News.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
                                 }
                             }
 
@@ -1785,7 +1811,7 @@
 
                 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());
+                    News.warn("Agv [{}] 涓婃姤浠庤揣鏋跺彇璐у畬鎴愶紝搴撲綅鐮乕{}]鏃犳晥銆�", protocol.getAgvNo(), agv_11_up.getLocCode());
                 } else {
 
                     List<Long> taskIds = actionService.selectTaskIdsByGroupId(serialNo);
@@ -1803,7 +1829,7 @@
                                 action.setEndTime(now);
                                 action.setUpdateTime(now);
                                 if (!actionService.updateById(action)) {
-                                    log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
+                                    News.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
                                 }
                             }
                         }
@@ -1817,15 +1843,15 @@
 
                 // segment list
                 List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
-                        .eq(Segment::getGroupId, serialNo)
+                                .eq(Segment::getGroupId, serialNo)
 //                        .eq(Segment::getState, SegmentStateType.RUNNING.toString())
-                        .orderByAsc(Segment::getSerial)
+                                .orderByAsc(Segment::getSerial)
                 );
 
                 // settlement
                 this.settleSegmentList(segmentList, serialNo);
 
-                log.info("Agv [{}] {}浣滀笟瀹屾瘯 ==========>> ", protocol.getAgvNo(), serialNo);
+                News.info("Agv [{}] {} 璺緞浣滀笟宸插畬鎴�", protocol.getAgvNo(), serialNo);
 
             }
         }
@@ -1833,7 +1859,7 @@
         // 鍙栨斁璐ц姹傚寘
         if (msgBody instanceof AGV_06_UP) {
             AGV_06_UP agv_06_up = (AGV_06_UP) msgBody;
-            log.info("Agv [{}] 鍙栨斁璐ц姹傚寘 ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_06_up));
+            News.info("Agv [{}] 鍙栨斁璐ц姹傚寘 ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_06_up));
 
             boolean success = false;
 
@@ -1841,16 +1867,16 @@
                 Code code = codeService.getCacheByData(agv_06_up.getQrCode());
 
                 // query current segment
-                Segment currSeg = segmentService.getCurrRunningSeg(agv.getId(), code.getId());
+                Segment currSeg = segmentService.getCurrRunningSeg(null, agv.getId(), code.getId());
                 if (null == currSeg) {
-                    log.error("failed to find curr segment [{}]", agv.getUuid());
+                    News.error("failed to find curr segment [{}]", agv.getUuid());
                 } else {
 
                     // query current task
                     Task currTask = taskService.getById(currSeg.getTaskId());
                     if (currTask == null || !currTask.getTaskSts().equals(TaskStsType.PROGRESS.val())) {
 
-                        log.error("agv[{}] task invalid, task={}", protocol.getAgvNo(), currSeg.getTaskId());
+                        News.error("agv[{}] task invalid, task={}", protocol.getAgvNo(), currSeg.getTaskId());
                     } else {
 
                         Sta sta;
@@ -1865,7 +1891,7 @@
                                 // load from sta
                                 sta = staService.getById(currTask.getOriSta());
                                 // reserve to be waiting
-                                if (!staReserveService.waitingStaReserve(sta, currTask, 1, StaReserveType.OUT)) {
+                                if (!staReserveService.waitingStaReserve(sta, currTask, currSeg, 1, StaReserveType.OUT)) {
                                     break;
                                 }
                                 // convey plc valid
@@ -1874,13 +1900,14 @@
                                     staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT);
                                     break;
                                 }
+                                News.info("AGV [{}] load permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
                                 success = true;
                                 break;
                             case DEST_STA:
                                 // place to sta
                                 sta = staService.getById(currTask.getDestSta());
                                 // reserve to be waiting
-                                if (!staReserveService.waitingStaReserve(sta, currTask, 1, StaReserveType.IN)) {
+                                if (!staReserveService.waitingStaReserve(sta, currTask, currSeg, 1, StaReserveType.IN)) {
                                     break;
                                 }
                                 // convey plc valid
@@ -1889,24 +1916,24 @@
                                     staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN);
                                     break;
                                 }
+                                News.info("AGV [{}] unload permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
                                 success = true;
                                 break;
                             default:
-                                log.error("agv[{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId());
+                                News.error("AGV [{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId());
                                 break;
                         }
                     }
                 }
 
             } catch (Exception e) {
-                log.error("agv[{}] failed to deal with action request, qrCode={}", agv.getUuid(), agv_06_up.getVal(), e);
+                News.error("agv[{}] failed to deal with action request, qrCode={}", agv.getUuid(), agv_06_up.getVal(), e);
             }
 
             AGV_06_DOWN agv_06_down = new AGV_06_DOWN();
             agv_06_down.setSerialNo(agv_06_up.getSerialNo());
             agv_06_down.setActionCode(agv_06_up.getActionCode());
-            //agv_06_down.setResult(success ? 1 : 0);
-            agv_06_down.setResult(1);
+            agv_06_down.setResult(success ? 1 : 0);
             redis.push(RedisConstant.AGV_PATH_DOWN_FLAG, AgvProtocol.build(protocol.getAgvNo()).setMessageBody(agv_06_down));
         }
 
@@ -1914,7 +1941,7 @@
         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));
+            News.info("Agv [{}] 鏂欎粨淇℃伅鍖� ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_70_up));
         }
     }
 
@@ -1961,10 +1988,10 @@
                 task.setEndTime(now);
                 task.setUpdateTime(now);
                 if (!taskService.updateById(task)) {
-                    log.error("Task [{}] 鏇存柊澶辫触 锛侊紒锛�", task.getSeqNum());
+                    News.error("Task [{}] 鏇存柊澶辫触 锛侊紒锛�", task.getSeqNum());
                 } else {
                     taskService.maintainLocAndSta(task);
-                    log.info("Task [{}] 浣滀笟瀹屾瘯 ==========>> ", task.getSeqNum());
+                    News.info("Task [{}] 浠诲姟杩愯瀹屾垚.", task.getSeqNum());
                 }
 
             }
@@ -1981,7 +2008,7 @@
                 action.setEndTime(now);
                 action.setUpdateTime(now);
                 if (!actionService.updateById(action)) {
-                    log.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
+                    News.error("Action [{}] 鏇存柊澶辫触 锛侊紒锛�", action.getPriority() + " - " + action.getName());
                 }
             }
         }
@@ -1992,7 +2019,7 @@
             segment.setEndTime(now);
             segment.setUpdateTime(now);
             if (!segmentService.updateById(segment)) {
-                log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
+                News.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
             }
         }
 
@@ -2000,4 +2027,4 @@
         segmentService.processNext(segmentList);
     }
 
-}
+}
\ No newline at end of file

--
Gitblit v1.9.1