From f81c0ff58a4f5df9a62703c4361d1a5adc63570f Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期四, 22 一月 2026 10:44:49 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java |  120 ++++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 72 insertions(+), 48 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 41386e6..81af921 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
@@ -11,6 +11,7 @@
 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.Base62;
 import com.zy.acs.common.utils.GsonUtils;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.common.utils.Utils;
@@ -251,33 +252,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;
@@ -363,7 +359,6 @@
 
                             // DEST-only sort
                             destPosList.sort((a, b) -> {
-
                                 // 涓昏酱
                                 double aFirst = a.getFirstWeight(sameGroupXy);
                                 double bFirst = b.getFirstWeight(sameGroupXy);
@@ -381,11 +376,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;
                                 }
@@ -512,9 +506,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 +578,7 @@
 
                 }
 
-                if (backpackLev > backpack) {
+                if (backpackLev > backpackCap) {
                     throw new BusinessException("瑙f瀽Task澶辫触,AGV鑳岀瘬宸叉弧......");
                 }
 
@@ -788,7 +782,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
@@ -936,7 +931,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++) {
@@ -965,11 +959,11 @@
 
                         // 宸烽亾寮哄埗杞集锛屼紭鍏堢骇 > workDirection
                         if (null != nextLaneDir) {
-                            nextDirection = nextLaneDir;
+                            final double oppNextLaneDir = (nextLaneDir + 180) % 360;
 
-                            if (!lastDirection.equals(nextDirection)) {
+                            if (!lastDirection.equals(nextLaneDir)) {
                                 if (!lastCode.getCornerBool()) {
-                                    throw new CoolException(agvNo + "鍙峰皬杞﹁繘鍏ュ贩閬撻渶璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
+                                    throw new CoolException(agvNo + "鍙峰皬杞﹁繘鍏ュ贩閬撻渶璋冩暣鏂瑰悜涓� " + nextLaneDir + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
                                 }
                                 // turn
                                 actionList.add(new Action(
@@ -979,24 +973,34 @@
                                         null,    // 鍔ㄤ綔鍙�
                                         null,    // 浼樺厛绾�
                                         ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                        (double) mapService.spinDirection(lastCode).val,     // 灞炴�у��
+                                        (double) MapService.calcSpinDirection(lastCode, lastDirection, nextLaneDir).val,     // 灞炴�у��
                                         lastCode.getData(),    // 鍦伴潰鐮�
-                                        String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
+                                        String.valueOf(nextLaneDir),   // 鍔ㄤ綔鍙傛暟
                                         ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
                                         actionPrepareSts,    // 鍔ㄤ綔杩涘害
                                         agvId,    // AGV
                                         now    // 宸ヤ綔鏃堕棿
                                 ));
-                                lastDirection = nextDirection;
+                                lastDirection = nextLaneDir;
                             }
-                        } else if (null != lastLaneDir) {
-                            nextDirection = lastLaneDir;
 
-                            if (!lastDirection.equals(nextDirection)) {
+                            if (nextDirection.equals(oppNextLaneDir)) {
+                                reverse = true;
+                            }
+                            nextDirection = nextLaneDir; // 闃叉 绗竴涓姩浣滀竴瀹氭槸 turn 鍑洪棶棰�
+                        } else if (null != lastLaneDir) { // turn 鐜舰鐩磋涓嶅簲璇ュ瓨鍦ㄤ簬lane涓�
+                            final double oppLastLaneDir = (lastLaneDir + 180) % 360;
+
+                            if (!lastDirection.equals(lastLaneDir)) {
                                 if (!lastCode.getCornerBool()) {
                                     throw new CoolException(agvNo + "鍙峰皬杞︾寮�宸烽亾闇�璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
                                 }
                             }
+
+                            if (nextDirection.equals(oppLastLaneDir)) {
+                                reverse = true;
+                            }
+                            nextDirection = lastLaneDir; // 闃叉 绗竴涓姩浣滀竴瀹氭槸 turn 鍑洪棶棰�
                         } else {
 
                             // 濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
@@ -1036,7 +1040,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,7 +1065,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1101,6 +1105,25 @@
                 // 鍒濆鏂瑰悜鍊艰ˉ涓�
                 if (first) {
                     if (Cools.isEmpty(actionList) || !actionList.get(0).getActionType().equals(ActionTypeType.TurnCorner.val())) {
+                        Double firstTurnDir = workDirection;
+
+                        // 宸烽亾閫昏緫
+                        if (!laneBuilder.isInitialized()) {
+                            throw new CoolException("lanes are not initialized");
+                        }
+                        LaneDto lastLaneDto = laneBuilder.search(lastCode.getData());
+                        // 杩涘叆宸烽亾瑙掑害
+                        Double lastLaneDir = laneService.getLaneDirection(lastLaneDto);
+                        if (lastLaneDir != null) {
+                            firstTurnDir = lastLaneDir;
+                        }
+
+                        if (!lastDirection.equals(firstTurnDir)) {
+                            if (!lastCode.getCornerBool()) {
+                                throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
+                            }
+                        }
+
                         // turn
                         actionList.add(new Action(
                                 null,    // 缂栧彿
@@ -1109,16 +1132,16 @@
                                 null,    // 鍔ㄤ綔鍙�
                                 null,    // 浼樺厛绾�
                                 ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
+                                (double) MapService.calcSpinDirection(lastCode, lastDirection, firstTurnDir).val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
-                                String.valueOf(workDirection),   // 鍔ㄤ綔鍙傛暟
+                                String.valueOf(firstTurnDir),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
                                 actionPrepareSts,    // 鍔ㄤ綔杩涘害
                                 agvId,    // AGV
                                 now    // 宸ヤ綔鏃堕棿
                         ));
 
-                        lastDirection = workDirection;
+                        lastDirection = firstTurnDir;
 
                     }
                     first = false;
@@ -1235,7 +1258,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1299,7 +1322,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1358,7 +1381,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1807,7 +1830,7 @@
                 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());
                 } else {
@@ -1840,6 +1863,7 @@
                                     staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT);
                                     break;
                                 }
+                                log.info("AGV[{}] load permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
                                 success = true;
                                 break;
                             case DEST_STA:
@@ -1855,6 +1879,7 @@
                                     staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN);
                                     break;
                                 }
+                                log.info("AGV[{}] unload permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
                                 success = true;
                                 break;
                             default:
@@ -1871,8 +1896,7 @@
             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));
         }
 

--
Gitblit v1.9.1