From 69e6f36a3fb8f2763ea353b96e1f40aa3e785b5b Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期一, 05 一月 2026 18:06:04 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java |  196 +++++++++++++++++++++++++++++-------------------
 1 files changed, 118 insertions(+), 78 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 9b3886e..d787707 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
@@ -10,10 +10,7 @@
 import com.zy.acs.common.domain.BaseResult;
 import com.zy.acs.common.domain.protocol.*;
 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.common.enums.*;
 import com.zy.acs.common.utils.GsonUtils;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.common.utils.Utils;
@@ -449,10 +446,13 @@
                             if (!taskService.updateById(task)) {
                                 throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
                             }
+                            // update reserve
+                            staReserveService.allocateCallBack(task, agvId);
                         }
                         // normal
                         , (task, agvNo, sta) -> {
                             Long agvId = agvService.getAgvId(agvNo);
+                            // update task
                             task.setAgvId(agvId);
                             task.setTaskSts(TaskStsType.WAITING.val());
                             task.setIoTime(now);
@@ -460,6 +460,8 @@
                             if (!taskService.updateById(task)) {
                                 throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
                             }
+                            // update reserve
+                            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());
@@ -902,6 +904,8 @@
 
             AgvModel agvModel = agvModelService.getByAgvId(agvId);
             Double workDirection = agvModel.getWorkDirection();
+            boolean backupAction = null != agvModel.getBackupAction() && agvModel.getBackupActionBool();
+            boolean needUndocking = null != agvModel.getNeedUndocking() && agvModel.getNeedUndockingBool();
             AgvSpeedType agvSpeedType = AgvSpeedType.query(agvModel.getTravelSpeed());
             assert agvSpeedType != null;
 
@@ -950,7 +954,7 @@
                         if (!lastCode.getCornerBool()) {
                             // 濡傛灉鏄綔涓氭柟鍚戯紝浣嗘槸灏忚溅鍦ㄥ贩閬撳唴鏂瑰悜閿欒锛屽垯鍋滄
                             if (reverse && !lastDirection.equals(nextDirection)) {
-//                                throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
+                                throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
                             }
                             // 濡傛灉涓嶆槸浣滀笟鏂瑰悜锛屽垽鏂槸鍚︾浉鍙嶆柟鍚戯紝濡傛灉鍙嶆柟鍚戝垯鍊掗��琛岃蛋
                             if (nextDirection.equals((lastDirection + 180) % 360)) {
@@ -972,7 +976,7 @@
                                             null,    // 鍔ㄤ綔鍙�
                                             null,    // 浼樺厛绾�
                                             ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                            mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
+                                            (double) mapService.spinDirection(lastCode).val,     // 灞炴�у��
                                             lastCode.getData(),    // 鍦伴潰鐮�
                                             String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
                                             ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -996,7 +1000,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
+                                    (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(nextDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1047,7 +1051,7 @@
                                 null,    // 鍔ㄤ綔鍙�
                                 null,    // 浼樺厛绾�
                                 ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
+                                (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
                                 lastCode.getData(),    // 鍦伴潰鐮�
                                 String.valueOf(workDirection),   // 鍔ㄤ綔鍙傛暟
                                 ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1092,22 +1096,24 @@
                                 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    // 宸ヤ綔鏃堕棿
-                        ));
+                        // 鑳岀瘬鏀捐揣
+                        if (backupAction) {
+                            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;
@@ -1115,22 +1121,24 @@
                         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    // 宸ヤ綔鏃堕棿
-                        ));
+                        // 鑳岀瘬鍙栬揣
+                        if (backupAction) {
+                            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());
@@ -1169,7 +1177,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
+                                    (double) mapService.spinDirection(lastCode).val,   // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(oriStaWorkDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1196,23 +1204,25 @@
                                 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    // 宸ヤ綔鏃堕棿
-                        ));
+                        // 鑳岀瘬鏀捐揣
+                        if (backupAction) {
+                            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:
                         // 绔欑偣鏀捐揣
@@ -1231,7 +1241,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
+                                    (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(destStaWorkDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1241,23 +1251,25 @@
                             ));
                             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    // 宸ヤ綔鏃堕棿
-                        ));
+                        // 鑳岀瘬鍙栬揣
+                        if (backupAction) {
+                            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(
@@ -1288,7 +1300,7 @@
                                     null,    // 鍔ㄤ綔鍙�
                                     null,    // 浼樺厛绾�
                                     ActionTypeType.TurnCorner.desc,    // 鍚嶇О
-                                    mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D,    // 灞炴�у��
+                                    (double) mapService.spinDirection(lastCode).val,    // 灞炴�у��
                                     lastCode.getData(),    // 鍦伴潰鐮�
                                     String.valueOf(chargeDirection),   // 鍔ㄤ綔鍙傛暟
                                     ActionTypeType.TurnCorner.val(),    // 鍔ㄤ綔绫诲瀷
@@ -1363,6 +1375,27 @@
 
             }
 
+            // 濡傛灉鍏呯數涓紝鍒欏厛鏂紑鍏呯數
+            if (needUndocking && agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
+                String undockingCode = Cools.isEmpty(actionList) ? lastCode.getData() : actionList.get(0).getCode();
+                // undocking charge
+                actionList.add(0, new Action(
+                        null,    // 缂栧彿
+                        null,    // 鎬荤嚎
+                        null,    // 浠诲姟
+                        null,    // 鍔ㄤ綔鍙�
+                        null,    // 浼樺厛绾�
+                        ActionTypeType.UndockingCharge.desc,    // 鍚嶇О
+                        null,    // 灞炴�у��
+                        undockingCode,    // 鍦伴潰鐮�
+                        null,   // 鍔ㄤ綔鍙傛暟
+                        ActionTypeType.UndockingCharge.val(),    // 鍔ㄤ綔绫诲瀷
+                        actionPrepareSts,    // 鍔ㄤ綔杩涘害
+                        agvId,    // AGV
+                        now    // 宸ヤ綔鏃堕棿
+                ));
+            }
+
             // finish
             actionList.add(new Action(
                     null,    // 缂栧彿
@@ -1380,7 +1413,6 @@
                     now    // 宸ヤ綔鏃堕棿
             ));
 
-            List<Action> newActionList = actionSorter.optimizeSort(actionList);
             String groupId = String.valueOf(snowflakeIdWorker.nextId()).substring(3);
 
             // update segment
@@ -1414,6 +1446,9 @@
 //                    throw new CoolException("鏇存柊Segment澶辫触");
 //                }
 //            }
+
+            // optimize action list, must have backpack
+            List<Action> newActionList = backupAction ? actionSorter.optimizeSort(actionList) : actionList;
 
             // save action
             int i = newActionList.size();
@@ -1574,6 +1609,11 @@
                                 .setQrCode(action.getCode())
                         );
                         break;
+                    case UndockingCharge:
+                        agvAction.add(new AgvActionItem<>(UndockingChargeAction.class)
+                                .setQrCode(action.getCode())
+                        );
+                        break;
                     default:
                         break;
                 }

--
Gitblit v1.9.1