From 583b31d46bb8abbee7410d29ca229120ee589cba Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期一, 05 一月 2026 10:10:08 +0800
Subject: [PATCH] # version merge

---
 version/db/new.sql                                                                              |   93 +++++
 zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolPojoType.java                  |    2 
 zy-acs-gateway/src/main/java/com/zy/acs/gateway/handler/AgvPackageServerHandler.java            |    7 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/ActionTypeType.java               |    1 
 zy-acs-flow/public/map/asr/ASRLoadedHalfBattery.svg                                             |   48 ++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java                        |    1 
 zy-acs-common/src/main/java/com/zy/acs/common/enums/error/AgvErrorType.java                     |   38 ++
 zy-acs-flow/src/page/code/CodeList.jsx                                                          |   33 +
 zy-acs-flow/public/map/asr/ASREmptyNoBattery.svg                                                |   47 ++
 zy-acs-flow/public/model/asr/fork.fbx                                                           |    0 
 zy-acs-flow/public/model/asr/loader.fbx                                                         |    0 
 zy-acs-flow/public/map/asr/ASREmptyHalfBattery.svg                                              |   43 ++
 zy-acs-flow/public/model/asr/body.fbx                                                           |    0 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/AgvModel.java                    |   88 +---
 zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvActionCmdType.java                       |    2 
 zy-acs-flow/src/page/code/CodeEdit.jsx                                                          |   10 
 zy-acs-flow/public/map/asr/ASRLoadedFullBattery.svg                                             |   47 ++
 zy-acs-flow/src/page/agvModel/AgvModelList.jsx                                                  |    2 
 zy-acs-manager/src/main/resources/mapper/manager/AgvDetailMapper.xml                            |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java        |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java                    |    8 
 zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/UndockingChargeAction.java |   33 +
 zy-acs-flow/src/page/agvModel/AgvModelPanel.jsx                                                 |   51 +-
 zy-acs-flow/src/map/insight/agv/AgvMain.jsx                                                     |   15 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java                        |   40 --
 zy-acs-flow/src/i18n/zh.js                                                                      |   12 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/CodeSpinType.java                 |   25 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvDetailServiceImpl.java  |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvModelController.java      |   10 
 zy-acs-flow/src/page/agvModel/AgvModelEdit.jsx                                                  |   50 ++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java                |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java                   |   48 ++
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java    |    2 
 zy-acs-flow/src/i18n/en.js                                                                      |   12 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java           |    6 
 zy-acs-flow/src/page/agvModel/AgvModelCreate.jsx                                                |   34 +
 zy-acs-gateway/src/main/java/com/zy/acs/gateway/listen/MessageListener.java                     |    2 
 zy-acs-flow/src/map/tool.js                                                                     |   33 +
 zy-acs-flow/src/page/code/CodeCreate.jsx                                                        |   19 
 zy-acs-flow/src/map/insight/agv/AgvThree.js                                                     |   22 +
 zy-acs-flow/public/map/asr/ASREmptyFullBattery.svg                                              |   42 ++
 zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolType.java                      |    4 
 zy-acs-flow/public/map/asr/ASRLoadedNoBattery.svg                                               |   52 +++
 43 files changed, 829 insertions(+), 167 deletions(-)

diff --git a/version/db/new.sql b/version/db/new.sql
new file mode 100644
index 0000000..73411a2
--- /dev/null
+++ b/version/db/new.sql
@@ -0,0 +1,93 @@
+code - spin
+
+alter table man_agv_model
+    add need_undocking int(1) default 0 null comment '鏂紑鍏呯數{1:鏄�,0:鍚' after mqtt_topic;
+
+alter table man_agv_model
+    add backup_action int(1) default 0 null comment '鑳岀瘬鍔ㄤ綔{1:鏄�,0:鍚' after need_undocking;
+
+man_segment: start_time, end_time,
+
+alter table man_segment
+    add roller_waiting int(1) default 0 null comment '婊氱瓛绾跨瓑寰�' after end_time;
+man_segment_log
+
+alter table man_sta
+    add capacity int null comment '妲戒綅鏁�' after angle;
+alter table man_sta
+    add occ_cnt int null comment '鍗犵敤鏁�' after capacity;
+alter table man_sta
+    add rsv_in_cnt int null comment '棰勭害鏀捐揣閲�' after occ_cnt;
+alter table man_sta
+    add rsv_out_cnt int null comment '棰勭害鍙栬揣閲�' after rsv_in_cnt;
+
+
+
+-- auto-generated definition
+create table man_sta_reserve_log
+(
+    id             bigint                              not null comment 'ID',
+    uuid         varchar(255)                        null comment '鏍囪瘑',
+    sta_id       bigint                              not null comment '绔欑偣[man_sta]',
+    task_id      bigint                              not null comment '浠诲姟[man_task]',
+    segment_id   bigint                              null comment '浣滀笟[man_segment]',
+    agv_id       bigint                              not null comment 'AGV[man_agv]',
+    name         varchar(255)                        null comment '鍚嶇О(*)',
+    type         varchar(255)                        not null comment '棰勭害绫诲瀷',
+    qty          int                                 not null comment '棰勭害鏁伴噺',
+    state        varchar(255)                        not null comment '棰勭害鐘舵��',
+    reason       varchar(255)                        null comment '鍘熷洜',
+    expire_time  timestamp                           null comment '杩囨湡鏃堕棿',
+    waiting_at   timestamp                           null comment '寮�濮嬬瓑寰呮椂闂�',
+    confirmed_at timestamp                           null comment '纭瀹屾垚鏃堕棿',
+    cancelled_at timestamp                           null comment '鍙栨秷鏃堕棿',
+    uniq_key     varchar(255)                        null comment '骞傜瓑閿�',
+    status       int(1)    default 1                 not null comment '鐘舵�亄1:姝e父,0:鍐荤粨}',
+    deleted      int(1)    default 0                 not null comment '鏄惁鍒犻櫎{1:鏄�,0:鍚',
+    tenant_id    int                                 null comment '绉熸埛[sys_tenant]',
+    create_by    bigint                              null comment '娣诲姞浜哄憳[sys_user]',
+    create_time  timestamp default CURRENT_TIMESTAMP not null comment '娣诲姞鏃堕棿',
+    update_by    bigint                              null comment '淇敼浜哄憳[sys_user]',
+    update_time  timestamp default CURRENT_TIMESTAMP null comment '淇敼鏃堕棿',
+    memo         varchar(255)                        null comment '澶囨敞'
+)
+    charset = utf8;
+
+
+
+-- auto-generated definition
+create table man_sta_reserve_log
+(
+    id           bigint                              not null comment 'ID',
+    uuid         varchar(255)                        null comment '鏍囪瘑',
+    sta_id       bigint                              not null comment '绔欑偣[man_sta]',
+    task_id      bigint                              not null comment '浠诲姟[man_task]',
+    segment_id   bigint                              null comment '浣滀笟[man_segment]',
+    agv_id       bigint                              not null comment 'AGV[man_agv]',
+    name         varchar(255)                        null comment '鍚嶇О(*)',
+    type         varchar(255)                        not null comment '棰勭害绫诲瀷',
+    qty          int                                 not null comment '棰勭害鏁伴噺',
+    state        varchar(255)                        not null comment '棰勭害鐘舵��',
+    reason       varchar(255)                        null comment '鍘熷洜',
+    expire_time  timestamp                           null comment '杩囨湡鏃堕棿',
+    waiting_at   timestamp                           null comment '寮�濮嬬瓑寰呮椂闂�',
+    confirmed_at timestamp                           null comment '纭瀹屾垚鏃堕棿',
+    cancelled_at timestamp                           null comment '鍙栨秷鏃堕棿',
+    uniq_key     varchar(255)                        null comment '骞傜瓑閿�',
+    status       int(1)    default 1                 not null comment '鐘舵�亄1:姝e父,0:鍐荤粨}',
+    deleted      int(1)    default 0                 not null comment '鏄惁鍒犻櫎{1:鏄�,0:鍚',
+    tenant_id    int                                 null comment '绉熸埛[sys_tenant]',
+    create_by    bigint                              null comment '娣诲姞浜哄憳[sys_user]',
+    create_time  timestamp default CURRENT_TIMESTAMP not null comment '娣诲姞鏃堕棿',
+    update_by    bigint                              null comment '淇敼浜哄憳[sys_user]',
+    update_time  timestamp default CURRENT_TIMESTAMP null comment '淇敼鏃堕棿',
+    memo         varchar(255)                        null comment '澶囨敞'
+)
+    charset = utf8;
+
+-- menu
+194,menu.staReserve,55,menu.equipment,55,menu.equipment,/manager/staReserve,staReserve,null,null,0,null,AccessTime,101,null,1,1,0,null,null,2025-12-26 10:56:42,2,null
+195,Query StaReserve,194,null,null,null,null,null,null,null,1,manager:staReserve:list,null,0,null,1,1,0,null,null,null,null,null
+196,Create StaReserve,194,null,null,null,null,null,null,null,1,manager:staReserve:save,null,1,null,1,1,0,null,null,null,null,null
+197,Update StaReserve,194,null,null,null,null,null,null,null,1,manager:staReserve:update,null,2,null,1,1,0,null,null,null,null,null
+    198,Delete StaReserve,194,null,null,null,null,null,null,null,1,manager:staReserve:remove,null,3,null,1,1,0,null,null,null,null,null
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/UndockingChargeAction.java b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/UndockingChargeAction.java
new file mode 100644
index 0000000..50f27c4
--- /dev/null
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/UndockingChargeAction.java
@@ -0,0 +1,33 @@
+package com.zy.acs.common.domain.protocol.action;
+
+import com.zy.acs.common.domain.protocol.IActionBody;
+import com.zy.acs.common.utils.Utils;
+import com.zy.acs.framework.common.RadixTools;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 鏂紑鍏呯數妗�
+ * Created by vincent on 2023/3/23
+ */
+@Data
+public class UndockingChargeAction implements IActionBody, Serializable {
+
+    private static final long serialVersionUID = -4740059102909409953L;
+
+    private short temp;
+
+    @Override
+    public byte[] writeToBytes() {
+        return Utils.reverse(RadixTools.shortToByte(this.temp));
+    }
+
+    @Override
+    public void readFromBytes(byte[] messageBodyBytes) {
+
+    }
+
+
+
+}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvActionCmdType.java b/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvActionCmdType.java
index cc0e71e..fe29a7e 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvActionCmdType.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvActionCmdType.java
@@ -21,6 +21,8 @@
 
     DOCKING_CHARGE(0x30, "瀵规帴鍏呯數妗�", DockingChargeAction.class),
 
+    UNDOCKING_CHARGE(0x31, "鏂紑鍏呯數妗�", UndockingChargeAction.class),
+
     READY_TAKE_FROM_AGV_SITE(0x75, "鍑嗗浠嶢GV鏆傚瓨璐т綅鍙栬揣", ReadyTakeFromAgvSite.class),
 
     READY_RELEASE_FROM_AGV_SITE(0x76, "鍑嗗浠嶢GV鏆傚瓨璐т綅鏀捐揣", ReadyReleaseToAgvSite.class),
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/enums/error/AgvErrorType.java b/zy-acs-common/src/main/java/com/zy/acs/common/enums/error/AgvErrorType.java
index 6f4fbb3..6d78fe2 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/enums/error/AgvErrorType.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/enums/error/AgvErrorType.java
@@ -67,6 +67,42 @@
     ERROR_0x9001("9001", "鍏呯數瀵规帴浼犳劅鍣ㄥ紓甯�"),
     ERROR_0x9002("9002", "鍏呯數瀵规帴瓒呮椂"),
     ERROR_0x9003("9003", "瀵规帴鍚庨暱鏃堕棿鏈厖鐢�"),
+
+    ERROR_0xA000("A000", "灏忚溅鑴辫建"),
+    ERROR_0xA001("A001", "璇荤爜瑙掑害鍋忓樊杩囧ぇ"),
+    ERROR_0xA002("A002", "閲岀▼璁℃暟鎹孩鍑�"),
+    ERROR_0xA003("A003", "IMU鏁版嵁寮傚父"),
+    ERROR_0xA004("A004", "婵�鍏夎繎璺濈鎬ュ仠"),
+    ERROR_0xA005("A005", "椹卞姩鍣ㄦ姤璀�"),
+    ERROR_0xA008("A008", "杞�0椹卞姩鍣ㄦ姤璀�"),
+    ERROR_0xA009("A009", "杞�1椹卞姩鍣ㄦ姤璀�"),
+    ERROR_0xA00A("A00A", "鎬ュ仠淇″彿瑙﹀彂"),
+    ERROR_0xA00B("A00B", "璐у弶浼犳劅鍣ㄦ娴嬪紓甯�"),
+    ERROR_0xA00C("A00C", "鏀拺鏈埌浣�"),
+    ERROR_0xA00D("A00D", "鏉剧怀妫�娴�"),
+
+    ERROR_0xA028("A028", "宸﹀彇璐ц揣鏋舵棤璐�"),
+    ERROR_0xA029("A029", "宸﹀彇璐ц溅鍐呮湁璐�"),
+    ERROR_0xA02A("A02A", "宸︽斁璐ц揣鏋舵湁璐�"),
+    ERROR_0xA02B("A02B", "宸︽斁璐ц溅鍐呮棤璐�"),
+
+    ERROR_0xA02C("A02C", "鍙冲彇璐ц揣鏋舵棤璐�"),
+    ERROR_0xA02D("A02D", "鍙冲彇璐ц溅鍐呮湁璐�"),
+    ERROR_0xA02E("A02E", "鍙虫斁璐ц揣鏋舵湁璐�"),
+    ERROR_0xA02F("A02F", "鍙虫斁璐ц溅鍐呮棤璐�"),
+
+    ERROR_0xA030("A030", "杞粨妫�娴嬪墠寮傚父"),
+    ERROR_0xA031("A031", "杞粨妫�娴嬪悗寮傚父"),
+    ERROR_0xA032("A032", "杞粨妫�娴嬪乏寮傚父"),
+    ERROR_0xA033("A033", "杞粨妫�娴嬪彸寮傚父"),
+    ERROR_0xA034("A034", "杞粨妫�娴嬩笂寮傚父"),
+
+    ERROR_0xA03C("A03C", "浠庣珯1鏈氨缁�"),
+    ERROR_0xA03D("A03D", "浠庣珯2鏈氨缁�"),
+    ERROR_0xA03E("A03E", "浠庣珯3鏈氨缁�"),
+    ERROR_0xA03F("A03F", "浠庣珯4鏈氨缁�"),
+    ERROR_0xA040("A040", "浠庣珯5鏈氨缁�"),
+    ERROR_0xA041("A041", "浠庣珯6鏈氨缁�");
     ;
 
     public String sign;
@@ -82,7 +118,7 @@
             return null;
         }
         for (AgvErrorType type : AgvErrorType.values()) {
-            if (sign.equals(type.sign)) {
+            if (sign.equalsIgnoreCase(type.sign)) {
                 return type;
             }
         }
diff --git a/zy-acs-flow/public/map/asr/ASREmptyFullBattery.svg b/zy-acs-flow/public/map/asr/ASREmptyFullBattery.svg
new file mode 100644
index 0000000..4dd6d63
--- /dev/null
+++ b/zy-acs-flow/public/map/asr/ASREmptyFullBattery.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="_鍦栧堡_1" data-name="鍦栧堡 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.81 131.26">
+  <defs>
+    <style>
+      .cls-1, .cls-2 {
+        fill: #fff;
+      }
+
+      .cls-1, .cls-3 {
+        stroke: #fff;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-4 {
+        fill: #4c4c4c;
+      }
+
+      .cls-5 {
+        fill: #4ec5d6;
+      }
+
+      .cls-3 {
+        fill: none;
+        stroke-width: 2.5px;
+      }
+
+      .cls-6 {
+        fill: #19a2ba;
+      }
+    </style>
+  </defs>
+  <path class="cls-4" d="M50.38,131.27H6.37c-3.45,0-6.25-2.81-6.25-6.28V6.97C.12,2.24,7.87.1,12.57.1h31.35c4.7,0,12.71,2.14,12.71,6.87v118.02c0,3.47-2.8,6.28-6.25,6.28Z"/>
+  <path class="cls-6" d="M1.81,85.56h53.12c.38,0,.68.31.68.68v38.88c0,2.55-2.07,4.61-4.61,4.61H5.74c-2.55,0-4.61-2.07-4.61-4.61v-38.88c0-.38.31-.68.68-.68Z"/>
+  <path class="cls-6" d="M56.72,13.56H.02v-6.79C.02,2.43,7.84.12,12.23.12h32.29c4.38,0,12.2,2.31,12.2,6.65v6.79Z"/>
+  <rect class="cls-6" x="1.54" y="81.7" width="53.67" height="3.7"/>
+  <rect class="cls-3" x="4.28" y="16.13" width="48.19" height="48.19" rx="1.63" ry="1.63"/>
+  <rect class="cls-5" x="2.75" y="66.84" width="51.24" height="28.73" rx="2.56" ry="2.56"/>
+  <g>
+    <rect class="cls-1" x="8.75" y="101.98" width="35.03" height="20.77" rx="2.32" ry="2.32"/>
+    <polygon class="cls-2" points="47.99 115.78 45.26 117.27 45.26 108.09 47.99 109.59 47.99 115.78"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/zy-acs-flow/public/map/asr/ASREmptyHalfBattery.svg b/zy-acs-flow/public/map/asr/ASREmptyHalfBattery.svg
new file mode 100644
index 0000000..75dd7fa
--- /dev/null
+++ b/zy-acs-flow/public/map/asr/ASREmptyHalfBattery.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="_鍦栧堡_1" data-name="鍦栧堡 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.93 131.17">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #fff;
+      }
+
+      .cls-2, .cls-3 {
+        fill: none;
+        stroke: #fff;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-4 {
+        fill: #4c4c4c;
+      }
+
+      .cls-5 {
+        fill: #4ec5d6;
+      }
+
+      .cls-3 {
+        stroke-width: 2.5px;
+      }
+
+      .cls-6 {
+        fill: #19a2ba;
+      }
+    </style>
+  </defs>
+  <path class="cls-4" d="M50.49,131.2H6.48c-3.45,0-6.25-2.81-6.25-6.28V6.9C.23,2.17,7.98.03,12.68.03h31.35c4.7,0,12.71,2.14,12.71,6.87v118.02c0,3.47-2.8,6.28-6.25,6.28Z"/>
+  <path class="cls-6" d="M1.92,85.49h53.12c.38,0,.68.31.68.68v38.88c0,2.55-2.07,4.61-4.61,4.61H5.85c-2.55,0-4.61-2.07-4.61-4.61v-38.88c0-.38.31-.68.68-.68Z"/>
+  <path class="cls-6" d="M56.83,13.49H.14v-6.79C.14,2.36,7.95.05,12.34.05h32.29c4.38,0,12.2,2.31,12.2,6.65v6.79Z"/>
+  <rect class="cls-6" x="1.65" y="81.62" width="53.67" height="3.7"/>
+  <rect class="cls-3" x="4.39" y="16.05" width="48.19" height="48.19" rx="1.63" ry="1.63"/>
+  <rect class="cls-5" x="2.87" y="66.77" width="51.24" height="28.73" rx="2.56" ry="2.56"/>
+  <g>
+    <rect class="cls-2" x="8.86" y="101.91" width="35.03" height="20.77" rx="2.32" ry="2.32"/>
+    <path class="cls-1" d="M11.18,101.91h18.05v20.77H11.18c-1.28,0-2.32-1.04-2.32-2.32v-16.13c0-1.28,1.04-2.32,2.32-2.32Z"/>
+    <polygon class="cls-1" points="48.11 115.39 45.38 116.89 45.38 107.71 48.11 109.2 48.11 115.39"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/zy-acs-flow/public/map/asr/ASREmptyNoBattery.svg b/zy-acs-flow/public/map/asr/ASREmptyNoBattery.svg
new file mode 100644
index 0000000..3ca6ce1
--- /dev/null
+++ b/zy-acs-flow/public/map/asr/ASREmptyNoBattery.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="_鍦栧堡_1" data-name="鍦栧堡 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.78 131.12">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #fff;
+      }
+
+      .cls-2, .cls-3 {
+        fill: none;
+        stroke: #fff;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-4 {
+        fill: #4c4c4c;
+      }
+
+      .cls-5 {
+        fill: #4ec5d6;
+      }
+
+      .cls-3 {
+        stroke-width: 2.5px;
+      }
+
+      .cls-6 {
+        fill: #19a2ba;
+      }
+
+      .cls-7 {
+        fill: #ed2123;
+      }
+    </style>
+  </defs>
+  <path class="cls-4" d="M50.4,131.15H6.39c-3.45,0-6.25-2.81-6.25-6.28V6.85C.14,2.12,7.89-.02,12.59-.02h31.35c4.7,0,12.71,2.14,12.71,6.87v118.02c0,3.47-2.8,6.28-6.25,6.28Z"/>
+  <path class="cls-6" d="M1.83,85.45h53.12c.38,0,.68.31.68.68v38.88c0,2.55-2.07,4.61-4.61,4.61H5.76c-2.55,0-4.61-2.07-4.61-4.61v-38.88c0-.38.31-.68.68-.68Z"/>
+  <path class="cls-6" d="M56.74,13.44H.05v-6.79C.05,2.32,7.86,0,12.25,0h32.29c4.38,0,12.2,2.31,12.2,6.65v6.79Z"/>
+  <rect class="cls-6" x="1.56" y="81.58" width="53.67" height="3.7"/>
+  <rect class="cls-3" x="4.3" y="16.01" width="48.19" height="48.19" rx="1.63" ry="1.63"/>
+  <rect class="cls-5" x="2.78" y="66.72" width="51.24" height="28.73" rx="2.56" ry="2.56"/>
+  <g>
+    <rect class="cls-2" x="8.77" y="101.87" width="35.03" height="20.77" rx="2.32" ry="2.32"/>
+    <path class="cls-7" d="M11.04,102.37h.87v19.75h-.87c-.98,0-1.78-.8-1.78-1.78v-16.19c0-.98.8-1.78,1.78-1.78Z"/>
+    <polygon class="cls-1" points="48.01 115.35 45.28 116.84 45.28 107.66 48.01 109.16 48.01 115.35"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/zy-acs-flow/public/map/asr/ASRLoadedFullBattery.svg b/zy-acs-flow/public/map/asr/ASRLoadedFullBattery.svg
new file mode 100644
index 0000000..3683b42
--- /dev/null
+++ b/zy-acs-flow/public/map/asr/ASRLoadedFullBattery.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="_鍦栧堡_1" data-name="鍦栧堡 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.75 131.28">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #cc9d5a;
+      }
+
+      .cls-2, .cls-3 {
+        fill: #fff;
+      }
+
+      .cls-2, .cls-4 {
+        stroke: #fff;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-5 {
+        fill: #4c4c4c;
+      }
+
+      .cls-6 {
+        fill: #4ec5d6;
+      }
+
+      .cls-4 {
+        fill: none;
+        stroke-width: 2.5px;
+      }
+
+      .cls-7 {
+        fill: #19a2ba;
+      }
+    </style>
+  </defs>
+  <path class="cls-5" d="M50.38,131.29H6.37c-3.45,0-6.25-2.81-6.25-6.28V6.99C.12,2.26,7.87.12,12.57.12h31.35c4.7,0,12.71,2.14,12.71,6.87v118.02c0,3.47-2.8,6.28-6.25,6.28Z"/>
+  <path class="cls-7" d="M1.81,85.58h53.12c.38,0,.68.31.68.68v38.88c0,2.55-2.07,4.61-4.61,4.61H5.74c-2.55,0-4.61-2.07-4.61-4.61v-38.88c0-.38.31-.68.68-.68Z"/>
+  <path class="cls-7" d="M56.72,13.58H.03v-6.79C.03,2.45,7.85.14,12.23.14h32.29c4.38,0,12.2,2.31,12.2,6.65v6.79Z"/>
+  <rect class="cls-7" x="1.54" y="81.72" width="53.67" height="3.7"/>
+  <rect class="cls-4" x="4.28" y="16.15" width="48.19" height="48.19" rx="1.63" ry="1.63"/>
+  <rect class="cls-6" x="2.76" y="66.86" width="51.24" height="28.73" rx="2.56" ry="2.56"/>
+  <g>
+    <rect class="cls-2" x="8.76" y="102" width="35.03" height="20.77" rx="2.32" ry="2.32"/>
+    <polygon class="cls-3" points="48 115.8 45.27 117.29 45.27 108.11 48 109.61 48 115.8"/>
+  </g>
+  <rect class="cls-1" x="7.12" y="19.22" width="42.52" height="42.52"/>
+</svg>
\ No newline at end of file
diff --git a/zy-acs-flow/public/map/asr/ASRLoadedHalfBattery.svg b/zy-acs-flow/public/map/asr/ASRLoadedHalfBattery.svg
new file mode 100644
index 0000000..a573e6e
--- /dev/null
+++ b/zy-acs-flow/public/map/asr/ASRLoadedHalfBattery.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="_鍦栧堡_1" data-name="鍦栧堡 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.69 131.18">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #cc9d5a;
+      }
+
+      .cls-2 {
+        fill: #fff;
+      }
+
+      .cls-3, .cls-4 {
+        fill: none;
+        stroke: #fff;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-5 {
+        fill: #4c4c4c;
+      }
+
+      .cls-6 {
+        fill: #4ec5d6;
+      }
+
+      .cls-4 {
+        stroke-width: 2.5px;
+      }
+
+      .cls-7 {
+        fill: #19a2ba;
+      }
+    </style>
+  </defs>
+  <path class="cls-5" d="M50.34,131.21H6.33c-3.45,0-6.25-2.81-6.25-6.28V6.91C.08,2.18,7.83.04,12.54.04h31.35c4.7,0,12.71,2.14,12.71,6.87v118.02c0,3.47-2.8,6.28-6.25,6.28Z"/>
+  <path class="cls-7" d="M1.78,85.51h53.12c.38,0,.68.31.68.68v38.88c0,2.55-2.07,4.61-4.61,4.61H5.71c-2.55,0-4.61-2.07-4.61-4.61v-38.88c0-.38.31-.68.68-.68Z"/>
+  <path class="cls-7" d="M56.68,13.5H0v-6.79C0,2.38,7.81.06,12.19.06h32.29c4.38,0,12.2,2.31,12.2,6.65v6.79Z"/>
+  <rect class="cls-7" x="1.5" y="81.64" width="53.67" height="3.7"/>
+  <rect class="cls-4" x="4.24" y="16.07" width="48.19" height="48.19" rx="1.63" ry="1.63"/>
+  <rect class="cls-6" x="2.72" y="66.78" width="51.24" height="28.73" rx="2.56" ry="2.56"/>
+  <g>
+    <rect class="cls-3" x="8.72" y="101.93" width="35.03" height="20.77" rx="2.32" ry="2.32"/>
+    <path class="cls-2" d="M11.04,101.93h18.05v20.77H11.04c-1.28,0-2.32-1.04-2.32-2.32v-16.13c0-1.28,1.04-2.32,2.32-2.32Z"/>
+    <polygon class="cls-2" points="47.96 115.41 45.23 116.9 45.23 107.72 47.96 109.21 47.96 115.41"/>
+  </g>
+  <rect class="cls-1" x="7.08" y="19.14" width="42.52" height="42.52"/>
+</svg>
\ No newline at end of file
diff --git a/zy-acs-flow/public/map/asr/ASRLoadedNoBattery.svg b/zy-acs-flow/public/map/asr/ASRLoadedNoBattery.svg
new file mode 100644
index 0000000..876db35
--- /dev/null
+++ b/zy-acs-flow/public/map/asr/ASRLoadedNoBattery.svg
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="_鍦栧堡_1" data-name="鍦栧堡 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.71 131.19">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #cc9d5a;
+      }
+
+      .cls-2 {
+        fill: #fff;
+      }
+
+      .cls-3, .cls-4 {
+        fill: none;
+        stroke: #fff;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-5 {
+        fill: #4c4c4c;
+      }
+
+      .cls-6 {
+        fill: #4ec5d6;
+      }
+
+      .cls-4 {
+        stroke-width: 2.5px;
+      }
+
+      .cls-7 {
+        fill: #19a2ba;
+      }
+
+      .cls-8 {
+        fill: #ed2123;
+      }
+    </style>
+  </defs>
+  <path class="cls-5" d="M50.35,131.2H6.34c-3.45,0-6.25-2.81-6.25-6.28V6.9C.09,2.17,7.84.03,12.54.03h31.35c4.7,0,12.71,2.14,12.71,6.87v118.02c0,3.47-2.8,6.28-6.25,6.28Z"/>
+  <path class="cls-7" d="M1.78,85.49h53.12c.38,0,.68.31.68.68v38.88c0,2.55-2.07,4.61-4.61,4.61H5.71c-2.55,0-4.61-2.07-4.61-4.61v-38.88c0-.38.31-.68.68-.68Z"/>
+  <path class="cls-7" d="M56.69,13.49H0v-6.79C0,2.36,7.82.05,12.2.05h32.29c4.38,0,12.2,2.31,12.2,6.65v6.79Z"/>
+  <rect class="cls-7" x="1.51" y="81.62" width="53.67" height="3.7"/>
+  <rect class="cls-4" x="4.25" y="16.05" width="48.19" height="48.19" rx="1.63" ry="1.63"/>
+  <rect class="cls-6" x="2.73" y="66.77" width="51.24" height="28.73" rx="2.56" ry="2.56"/>
+  <g>
+    <rect class="cls-3" x="8.73" y="101.91" width="35.03" height="20.77" rx="2.32" ry="2.32"/>
+    <path class="cls-8" d="M11,102.42h.87v19.75h-.87c-.98,0-1.78-.8-1.78-1.78v-16.19c0-.98.8-1.78,1.78-1.78Z"/>
+    <polygon class="cls-2" points="47.97 115.39 45.24 116.89 45.24 107.71 47.97 109.2 47.97 115.39"/>
+  </g>
+  <rect class="cls-1" x="7.09" y="19.12" width="42.52" height="42.52"/>
+</svg>
\ No newline at end of file
diff --git a/zy-acs-flow/public/model/asr/body.fbx b/zy-acs-flow/public/model/asr/body.fbx
new file mode 100644
index 0000000..5356a03
--- /dev/null
+++ b/zy-acs-flow/public/model/asr/body.fbx
Binary files differ
diff --git a/zy-acs-flow/public/model/asr/fork.fbx b/zy-acs-flow/public/model/asr/fork.fbx
new file mode 100644
index 0000000..a8cf2be
--- /dev/null
+++ b/zy-acs-flow/public/model/asr/fork.fbx
Binary files differ
diff --git a/zy-acs-flow/public/model/asr/loader.fbx b/zy-acs-flow/public/model/asr/loader.fbx
new file mode 100644
index 0000000..9393240
--- /dev/null
+++ b/zy-acs-flow/public/model/asr/loader.fbx
Binary files differ
diff --git a/zy-acs-flow/src/i18n/en.js b/zy-acs-flow/src/i18n/en.js
index 81ce4fd..d9eb20f 100644
--- a/zy-acs-flow/src/i18n/en.js
+++ b/zy-acs-flow/src/i18n/en.js
@@ -273,6 +273,7 @@
                 y: "y",
                 corner: "corner",
                 scale: "scale",
+                spin: "spin",
             },
             sta: {
                 uuid: "uuid",
@@ -364,6 +365,8 @@
                 allDirection: "all direction",
                 protocol: "protocol",
                 mqttTopic: "mqtt topic",
+                needUndocking: "need undocking",
+                backupAction: "backup action",
             },
             agv: {
                 uuid: "agv No.",
@@ -583,6 +586,15 @@
         }
     },
     page: {
+        code: {
+            enums: {
+                spin: {
+                    na: 'N/A',
+                    cw: 'CW',
+                    ccw: 'CCW',
+                },
+            },
+        },
         loc: {
             init: 'INITIALIZE',
             start: {
diff --git a/zy-acs-flow/src/i18n/zh.js b/zy-acs-flow/src/i18n/zh.js
index a86346a..5a16492 100644
--- a/zy-acs-flow/src/i18n/zh.js
+++ b/zy-acs-flow/src/i18n/zh.js
@@ -273,6 +273,7 @@
                 y: "y",
                 corner: "鎷愯",
                 scale: "姣斾緥",
+                spin: "鏃嬭浆",
             },
             sta: {
                 uuid: "缂栧彿",
@@ -364,6 +365,8 @@
                 allDirection: "鍏ㄥ悜",
                 protocol: "鍗忚",
                 mqttTopic: "mqtt",
+                needUndocking: "鏂厖鍔ㄤ綔",
+                backupAction: "鑳岀瘬鍔ㄤ綔",
             },
             agv: {
                 uuid: "杞﹁締缂栧彿",
@@ -583,6 +586,15 @@
         }
     },
     page: {
+        code: {
+            enums: {
+                spin: {
+                    na: '鍏ㄥ悜',
+                    cw: '椤烘椂閽�',
+                    ccw: '閫嗘椂閽�',
+                },
+            },
+        },
         loc: {
             init: '鍒濆鍖�',
             start: {
diff --git a/zy-acs-flow/src/map/insight/agv/AgvMain.jsx b/zy-acs-flow/src/map/insight/agv/AgvMain.jsx
index d15684b..0167d0a 100644
--- a/zy-acs-flow/src/map/insight/agv/AgvMain.jsx
+++ b/zy-acs-flow/src/map/insight/agv/AgvMain.jsx
@@ -63,8 +63,12 @@
                     loadModel('model/agv/body.fbx'),
                     loadModel('model/agv/loader.fbx'),
                     loadModel('model/agv/fork.fbx'),
+                    // loadModel('model/asr/body.fbx'),
+                    // loadModel('model/asr/loader.fbx'),
+                    // loadModel('model/asr/fork.fbx'),
                 ]).then(([bodyMesh, loaderMesh, forkMesh]) => {
                     const scaleVal = 1;
+                    // const scaleVal = 0.48;
                     bodyMesh.scale.set(scaleVal, scaleVal, scaleVal);
                     loaderMesh.scale.set(scaleVal, scaleVal, scaleVal);
                     forkMesh.scale.set(scaleVal, scaleVal, scaleVal);
@@ -72,6 +76,9 @@
                     bodyMesh.position.set(55, 0, 0);;
                     loaderMesh.position.set(55, 150, 0);;
                     forkMesh.position.set(55, 165, 0);;
+                    // bodyMesh.position.set(55, 0, 0);;
+                    // loaderMesh.position.set(55, 150, 0);;
+                    // forkMesh.position.set(55, 165, 0);;
 
                     const agvGroup = new THREE.Group();
                     agvGroup.add(bodyMesh);
@@ -177,13 +184,13 @@
                             <Grid item xs={12}>
                                 <KeyValuePair label={translate('common.field.status')} value={info?.agvStatus} />
                             </Grid>
-                            <Grid item xs={12}>
-                                <KeyValuePair label={translate('table.field.agvDetail.vol')} value={info?.vol} />
-                            </Grid>
                             {/* <Grid item xs={12}>
-                                <KeyValuePair label={translate('table.field.agvDetail.soc')} value={info?.soc} />
+                                <KeyValuePair label={translate('table.field.agvDetail.vol')} value={info?.vol} />
                             </Grid> */}
                             <Grid item xs={12}>
+                                <KeyValuePair label={translate('table.field.agvDetail.soc')} value={info?.soc} />
+                            </Grid>
+                            <Grid item xs={12}>
                                 <KeyValuePair label={translate('table.field.agvDetail.agvAngle')} value={info?.direction} />
                             </Grid>
                             <Grid item xs={12}>
diff --git a/zy-acs-flow/src/map/insight/agv/AgvThree.js b/zy-acs-flow/src/map/insight/agv/AgvThree.js
index b4671bd..5f5aad9 100644
--- a/zy-acs-flow/src/map/insight/agv/AgvThree.js
+++ b/zy-acs-flow/src/map/insight/agv/AgvThree.js
@@ -121,6 +121,28 @@
         this.scene.add(dirLight1);
     }
 
+    // initLight = () => {
+    //     const hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 8);
+    //     hemiLight.color.setHSL(0.6, 1, 0.75);
+    //     hemiLight.groundColor.setHSL(0.095, 1, 0.85);
+    //     hemiLight.position.set(0, 1500, 0);
+    //     this.scene.add(hemiLight);
+
+    //     const dirLight = new THREE.DirectionalLight(0xffffff, 4);
+    //     dirLight.color.setHSL(0.1, 1, 1.0);
+    //     dirLight.position.set(-300, 300, 300);
+    //     this.scene.add(dirLight);
+
+    //     const dirLight1 = new THREE.DirectionalLight(0xffffff, 4);
+    //     dirLight1.color.setHSL(0.1, 1, 1.0);
+    //     dirLight1.position.set(300, 300, -300);
+    //     dirLight1.position.multiplyScalar(30);
+    //     this.scene.add(dirLight1);
+
+    //     const ambient = new THREE.AmbientLight(0xffffff, 1.0);
+    //     // this.scene.add(ambient);
+    // }
+
 
     generateMesh = (fn) => {
         const loader = new FBXLoader();
diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index ad5d6e9..3011ce6 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -29,6 +29,13 @@
 import ctuLoadedNoBattery from '/map/agv/ctuLoadedNoBattery.svg';
 import ctuLoadedHalfBattery from '/map/agv/ctuLoadedHalfBattery.svg';
 import ctuLoadedFullBattery from '/map/agv/ctuLoadedFullBattery.svg';
+// asr
+import ASREmptyNoBattery from '/map/sca/ASREmptyNoBattery.svg';
+import ASREmptyHalfBattery from '/map/sca/ASREmptyHalfBattery.svg';
+import ASREmptyFullBattery from '/map/sca/ASREmptyFullBattery.svg';
+import ASRLoadedNoBattery from '/map/sca/ASRLoadedNoBattery.svg';
+import ASRLoadedHalfBattery from '/map/sca/ASRLoadedHalfBattery.svg';
+import ASRLoadedFullBattery from '/map/sca/ASRLoadedFullBattery.svg';
 
 let app, mapContainer, themeMode;
 let selectedSprite, effectOverlay, effectTicker;
@@ -114,6 +121,11 @@
             sprite.width = 750;
             sprite.height = 1300;
             sprite.zIndex = DEVICE_Z_INDEX.AGV;
+
+            // // sprite.width = 750;
+            // // sprite.height = 1300;
+            // sprite.zIndex = DEVICE_Z_INDEX.AGV;
+            // sprite.scale.set(12, 10)
             break
         case DEVICE_TYPE.POINT:
             sprite = new PIXI.Sprite(PIXI.Texture.from(point, { resourceOptions: { scale: 1 } }));
@@ -706,6 +718,25 @@
     }
 }
 
+// export const generateAgvSpriteTexture = (agvStatusMode) => {
+//     switch (agvStatusMode) {
+//         case AGV_STATUS_MODE.EMPTY_NO_BATTERY:
+//             return ASREmptyNoBattery;
+//         case AGV_STATUS_MODE.EMPTY_HALF_BATTERY:
+//             return ASREmptyHalfBattery;
+//         case AGV_STATUS_MODE.EMPTY_FULL_BATTERY:
+//             return ASREmptyFullBattery;
+//         case AGV_STATUS_MODE.LOADED_NO_BATTERY:
+//             return ASRLoadedNoBattery;
+//         case AGV_STATUS_MODE.LOADED_HALF_BATTERY:
+//             return ASRLoadedHalfBattery;
+//         case AGV_STATUS_MODE.LOADED_FULL_BATTERY:
+//             return ASRLoadedFullBattery;
+//         default:
+//             return;
+//     }
+// }
+
 export function createAgvJobPanel(parentContainer, text) {
     const panelScale = 4;
 
@@ -800,12 +831,14 @@
         });
         agvText.anchor.set(0.5, 0.5);
         agvText.position.set(0, 8);
+        // agvText.position.set(0, 18);
         agvText.scale.set(MAP_MIRROR ? -1 : 1, 1)
         agvSprite.addChild(agvText);
 
         agvSprite.updateTextRotation = () => {
             if (agvText && agvSprite) {
                 agvText.rotation = -agvSprite.rotation - rotationParseNum(MAP_DEFAULT_ROTATION);
+                // agvText.rotation = -agvSprite.rotation - rotationParseNum(MAP_DEFAULT_ROTATION + 180);
             }
         };
         agvSprite.updateTextRotation();
diff --git a/zy-acs-flow/src/page/agvModel/AgvModelCreate.jsx b/zy-acs-flow/src/page/agvModel/AgvModelCreate.jsx
index 365b716..0f275b2 100644
--- a/zy-acs-flow/src/page/agvModel/AgvModelCreate.jsx
+++ b/zy-acs-flow/src/page/agvModel/AgvModelCreate.jsx
@@ -108,19 +108,19 @@
                                         validate={required()}
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                <Grid item xs={4} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.agvModel.length"
                                         source="length"
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                <Grid item xs={4} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.agvModel.width"
                                         source="width"
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                <Grid item xs={4} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.agvModel.height"
                                         source="height"
@@ -183,8 +183,8 @@
                                         label="table.field.agvModel.allDirection"
                                         source="allDirection"
                                         choices={[
-                                            { id: 0, name: '鍚�' },
-                                            { id: 1, name: '鏄�' },
+                                            { id: 0, name: 'common.enums.false' },
+                                            { id: 1, name: 'common.enums.true' },
                                         ]}
                                         validate={required()}
                                     />
@@ -196,12 +196,34 @@
                                         parse={v => v}
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.agvModel.mqttTopic"
                                         source="mqttTopic"
                                         parse={v => v}
                                     />
+                                </Grid> */}
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <SelectInput
+                                        label="table.field.agvModel.needUndocking"
+                                        source="needUndocking"
+                                        choices={[
+                                            { id: 0, name: 'common.enums.false' },
+                                            { id: 1, name: 'common.enums.true' },
+                                        ]}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <SelectInput
+                                        label="table.field.agvModel.backupAction"
+                                        source="backupAction"
+                                        choices={[
+                                            { id: 0, name: 'common.enums.false' },
+                                            { id: 1, name: 'common.enums.true' },
+                                        ]}
+                                        validate={required()}
+                                    />
                                 </Grid>
 
                                 <Grid item xs={6} display="flex" gap={1}>
diff --git a/zy-acs-flow/src/page/agvModel/AgvModelEdit.jsx b/zy-acs-flow/src/page/agvModel/AgvModelEdit.jsx
index 7a33b6f..f2de69c 100644
--- a/zy-acs-flow/src/page/agvModel/AgvModelEdit.jsx
+++ b/zy-acs-flow/src/page/agvModel/AgvModelEdit.jsx
@@ -85,15 +85,9 @@
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <NumberInput
-                                label="table.field.agvModel.backpack"
-                                source="backpack"
-                            />
-                            <NumberInput
                                 label="table.field.agvModel.length"
                                 source="length"
                             />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
                             <NumberInput
                                 label="table.field.agvModel.width"
                                 source="width"
@@ -111,6 +105,17 @@
                             <NumberInput
                                 label="table.field.agvModel.diameter"
                                 source="diameter"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.agvModel.password"
+                                source="password"
+                                parse={v => v}
+                            />
+                            <NumberInput
+                                label="table.field.agvModel.backpack"
+                                source="backpack"
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
@@ -139,11 +144,15 @@
                                 source="protocol"
                                 parse={v => v}
                             />
-                            <TextInput
+                            {/* <TextInput
                                 label="table.field.agvModel.mqttTopic"
                                 source="mqttTopic"
                                 parse={v => v}
-                            />
+                            /> */}
+                        </Stack>
+
+                        <Stack direction='row' gap={2}>
+
                         </Stack>
                     </Grid>
                     <Grid item xs={12} md={4}>
@@ -154,14 +163,27 @@
                             label="table.field.agvModel.allDirection"
                             source="allDirection"
                             choices={[
-                                { id: 0, name: '鍚�' },
-                                { id: 1, name: '鏄�' },
+                                { id: 0, name: 'common.enums.false' },
+                                { id: 1, name: 'common.enums.true' },
                             ]}
                         />
-                        <TextInput
-                            label="table.field.agvModel.password"
-                            source="password"
-                            parse={v => v}
+                        <SelectInput
+                            label="table.field.agvModel.needUndocking"
+                            source="needUndocking"
+                            choices={[
+                                { id: 0, name: 'common.enums.false' },
+                                { id: 1, name: 'common.enums.true' },
+                            ]}
+                            validate={required()}
+                        />
+                        <SelectInput
+                            label="table.field.agvModel.backupAction"
+                            source="backupAction"
+                            choices={[
+                                { id: 0, name: 'common.enums.false' },
+                                { id: 1, name: 'common.enums.true' },
+                            ]}
+                            validate={required()}
                         />
                         <StatusSelectInput />
                         <Box mt="2em" />
diff --git a/zy-acs-flow/src/page/agvModel/AgvModelList.jsx b/zy-acs-flow/src/page/agvModel/AgvModelList.jsx
index e97c9a1..a2cf6fa 100644
--- a/zy-acs-flow/src/page/agvModel/AgvModelList.jsx
+++ b/zy-acs-flow/src/page/agvModel/AgvModelList.jsx
@@ -153,6 +153,8 @@
                     <BooleanField source="allDirectionBool" label="table.field.agvModel.allDirection" sortable={false} />
                     <TextField source="protocol" label="table.field.agvModel.protocol" />
                     <TextField source="mqttTopic" label="table.field.agvModel.mqttTopic" />
+                    <BooleanField source="needUndockingBool" label="table.field.agvModel.needUndocking" sortable={false} />
+                    <BooleanField source="backupActionBool" label="table.field.agvModel.backupAction" sortable={false} />
 
                     <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                         <TextField source="nickname" />
diff --git a/zy-acs-flow/src/page/agvModel/AgvModelPanel.jsx b/zy-acs-flow/src/page/agvModel/AgvModelPanel.jsx
index deecbc0..39f4e31 100644
--- a/zy-acs-flow/src/page/agvModel/AgvModelPanel.jsx
+++ b/zy-acs-flow/src/page/agvModel/AgvModelPanel.jsx
@@ -42,107 +42,118 @@
                     <Grid container spacing={2}>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.uuid" 
+                                title="table.field.agvModel.uuid"
                                 property={record.uuid}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.type" 
+                                title="table.field.agvModel.type"
                                 property={record.type}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.name" 
+                                title="table.field.agvModel.name"
                                 property={record.name}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.length" 
+                                title="table.field.agvModel.length"
                                 property={record.length}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.width" 
+                                title="table.field.agvModel.width"
                                 property={record.width}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.height" 
+                                title="table.field.agvModel.height"
                                 property={record.height}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.liftHeight" 
+                                title="table.field.agvModel.liftHeight"
                                 property={record.liftHeight}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.diameter" 
+                                title="table.field.agvModel.diameter"
                                 property={record.diameter}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.password" 
+                                title="table.field.agvModel.password"
                                 property={record.password}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.backpack" 
+                                title="table.field.agvModel.backpack"
                                 property={record.backpack}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.lowBattery" 
+                                title="table.field.agvModel.lowBattery"
                                 property={record.lowBattery}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.quaBattery" 
+                                title="table.field.agvModel.quaBattery"
                                 property={record.quaBattery}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.travelSpeed" 
+                                title="table.field.agvModel.travelSpeed"
                                 property={record.travelSpeed}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.workDirection" 
+                                title="table.field.agvModel.workDirection"
                                 property={record.workDirection}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.allDirection" 
-                                property={record.allDirection$}
+                                title="table.field.agvModel.allDirection"
+                                property={record.allDirection ? translate('common.enums.true') : translate('common.enums.false')}
                             />
                         </Grid>
                         <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.protocol" 
+                                title="table.field.agvModel.protocol"
                                 property={record.protocol}
                             />
                         </Grid>
-                        <Grid item xs={6}>
+                        {/* <Grid item xs={6}>
                             <PanelTypography
-                                title="table.field.agvModel.mqttTopic" 
+                                title="table.field.agvModel.mqttTopic"
                                 property={record.mqttTopic}
                             />
+                        </Grid> */}
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.agvModel.needUndocking"
+                                property={record.needUndockingBool ? translate('common.enums.true') : translate('common.enums.false')}
+                            />
                         </Grid>
-
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.agvModel.backupAction"
+                                property={record.backupAction ? translate('common.enums.true') : translate('common.enums.false')}
+                            />
+                        </Grid>
                     </Grid>
                 </CardContent>
             </Card >
diff --git a/zy-acs-flow/src/page/code/CodeCreate.jsx b/zy-acs-flow/src/page/code/CodeCreate.jsx
index 0e72673..ce3d989 100644
--- a/zy-acs-flow/src/page/code/CodeCreate.jsx
+++ b/zy-acs-flow/src/page/code/CodeCreate.jsx
@@ -110,9 +110,10 @@
                                         label="table.field.code.corner"
                                         source="corner"
                                         choices={[
-                                            { id: 1, name: '鏄�' },
-                                            { id: 0, name: '鍚�' },
+                                            { id: 0, name: 'common.enums.false' },
+                                            { id: 1, name: 'common.enums.true' },
                                         ]}
+                                        validate={required()}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
@@ -127,12 +128,24 @@
                                         source="y"
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.code.scale"
                                         source="scale"
                                         parse={v => v}
                                     />
+                                </Grid> */}
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <SelectInput
+                                        label="table.field.code.spin"
+                                        source="spin"
+                                        choices={[
+                                            { id: 0, name: 'page.code.enums.spin.na' },
+                                            { id: 1, name: 'page.code.enums.spin.cw' },
+                                            { id: 2, name: 'page.code.enums.spin.ccw' },
+                                        ]}
+                                        validate={required()}
+                                    />
                                 </Grid>
 
                                 <Grid item xs={6} display="flex" gap={1}>
diff --git a/zy-acs-flow/src/page/code/CodeEdit.jsx b/zy-acs-flow/src/page/code/CodeEdit.jsx
index 9741cd5..b48d076 100644
--- a/zy-acs-flow/src/page/code/CodeEdit.jsx
+++ b/zy-acs-flow/src/page/code/CodeEdit.jsx
@@ -99,6 +99,16 @@
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
+                            <SelectInput
+                                label="table.field.code.spin"
+                                source="spin"
+                                choices={[
+                                    { id: 0, name: 'page.code.enums.spin.na' },
+                                    { id: 1, name: 'page.code.enums.spin.cw' },
+                                    { id: 2, name: 'page.code.enums.spin.ccw' },
+                                ]}
+                                validate={required()}
+                            />
                             <TextInput
                                 label="table.field.code.scale"
                                 source="scale"
diff --git a/zy-acs-flow/src/page/code/CodeList.jsx b/zy-acs-flow/src/page/code/CodeList.jsx
index 6387fa8..5f6f6f7 100644
--- a/zy-acs-flow/src/page/code/CodeList.jsx
+++ b/zy-acs-flow/src/page/code/CodeList.jsx
@@ -30,6 +30,7 @@
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
+    FunctionField,
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
@@ -76,9 +77,18 @@
             { id: '1', name: 'common.enums.true' },
             { id: '0', name: 'common.enums.false' },
         ]}
+        alwaysOn
     />,
-    <TextInput source="scale" label="table.field.code.scale" />,
-
+    // <TextInput source="scale" label="table.field.code.scale" />,
+    <SelectInput source="spin" label="table.field.code.spin"
+        choices={[
+            { id: 0, name: 'page.code.enums.spin.na' },
+            { id: 1, name: 'page.code.enums.spin.cw' },
+            { id: 2, name: 'page.code.enums.spin.ccw' },
+        ]}
+    // alwaysOn
+    // emptyText={false}
+    />,
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
         label="common.field.status"
@@ -128,7 +138,7 @@
                     rowClick={(id, resource, record) => false}
                     expand={() => <CodePanel />}
                     expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
+                    omit={['id', 'scale', 'createTime', 'createBy', 'memo']}
                 >
                     <NumberField source="id" />
                     <TextField source="uuid" label="table.field.code.uuid" />
@@ -137,7 +147,22 @@
                     <NumberField source="y" label="table.field.code.y" />
                     <BooleanField source="cornerBool" label="table.field.code.corner" sortable={false} />
                     <TextField source="scale" label="table.field.code.scale" />
-
+                    <FunctionField
+                        label="table.field.code.spin"
+                        sortable={false}
+                        render={(record) => {
+                            switch (record.spin) {
+                                case 0:
+                                    return translate('page.code.enums.spin.na');
+                                case 1:
+                                    return translate('page.code.enums.spin.cw');
+                                case 2:
+                                    return translate('page.code.enums.spin.ccw');
+                                default:
+                                    return 'N/A';
+                            }
+                        }}
+                    />
                     <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                         <TextField source="nickname" />
                     </ReferenceField>
diff --git a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolPojoType.java b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolPojoType.java
index 590f527..958f32a 100644
--- a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolPojoType.java
+++ b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolPojoType.java
@@ -22,6 +22,8 @@
 
     PATH_ACK_COMMAND(ProtocolType.PATH_ACK_RESPONSE, AGV_B1_DOWN.class),
 
+    PICK_PLACE_ACK(ProtocolType.PICK_PLACE_ACK, AGV_06_DOWN.class),
+
     ;
 
 
diff --git a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolType.java b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolType.java
index 6a7ae92..a109932 100644
--- a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolType.java
+++ b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/constant/ProtocolType.java
@@ -10,6 +10,8 @@
 
     PATH_COMMAND(0x01, "璺緞鏁版嵁鍖�", DirectionType.DOWN),
 
+    PICK_PLACE_ACK(0x06, "鍙栨斁璐у簲绛斿寘", DirectionType.DOWN),
+
     ACTION_COMMAND(0x02, "鍔ㄤ綔鍛戒护鍖�", DirectionType.DOWN),
 
     HEARTBEAT_COMMAND(0x03, "蹇冭烦鍖�", DirectionType.DOWN),
@@ -30,6 +32,8 @@
 
     PATH_ACK(0x01, "璺緞搴旂瓟鍖�", DirectionType.UP),
 
+    PICK_PLACE_REQUEST(0x06, "鍙栨斁璐ц姹傚寘", DirectionType.UP),
+
     COMMAND_ACK(0x02, "鍛戒护搴旂瓟鍖�", DirectionType.UP),
 
     ACTION_COMPLETE(0x11, "鍔ㄤ綔瀹屾垚鍖�", DirectionType.UP),
diff --git a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/handler/AgvPackageServerHandler.java b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/handler/AgvPackageServerHandler.java
index 49ad300..21d6741 100644
--- a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/handler/AgvPackageServerHandler.java
+++ b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/handler/AgvPackageServerHandler.java
@@ -57,6 +57,13 @@
 
                 break label;
 
+            case PICK_PLACE_REQUEST:   // 鍙栨斁璐ц姹傚寘
+
+                AGV_06_UP agv_06_up = (AGV_06_UP) pac.getBody().getMessageBody();
+                redis.push(RedisConstant.AGV_COMPLETE_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_06_up));
+
+                break label;
+
             case COMMAND_ACK:   // 鍛戒护鍖� ack
 
                 AGV_02_UP agv_02_up = (AGV_02_UP) pac.getBody().getMessageBody();
diff --git a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/listen/MessageListener.java b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/listen/MessageListener.java
index 31b0ad8..99904ef 100644
--- a/zy-acs-gateway/src/main/java/com/zy/acs/gateway/listen/MessageListener.java
+++ b/zy-acs-gateway/src/main/java/com/zy/acs/gateway/listen/MessageListener.java
@@ -48,7 +48,7 @@
                 }
                 // 闂撮殧
                 try {
-                    Thread.sleep(500);
+                    Thread.sleep(300);
                 } catch (Exception ignore) {}
             }
         });
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java
index b109ac2..afa5160 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java
@@ -156,6 +156,7 @@
             agvDetail.setStatus(AgvStatusType.IDLE.val);
             agvDetail.setAgvAngle(workDirection);
             agvDetail.setVol(5000);
+            agvDetail.setSoc(80);
 
             agvDetailService.updateById(agvDetail);
         }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
index d5b5c73..4ee2c04 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -54,7 +54,7 @@
         for (Agv agv : agvList) {
             AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
             AgvModel agvModel = agvModelService.getByAgvId(agv.getId());
-            if (null == agvDetail || null == agvDetail.getVol() || null == agvDetail.getAgvStatus()) {
+            if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus()) {
                 continue;
             }
             if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
@@ -96,7 +96,7 @@
         for (Agv agv : agvList) {
             AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
             AgvModel agvModel = agvModelService.getByAgvId(agv.getId());
-            if (null == agvDetail || null == agvDetail.getVol() || null == agvDetail.getAgvStatus() || null == agvDetail.getRecentCode()) {
+            if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus() || null == agvDetail.getRecentCode()) {
                 continue;
             }
             // low battery status, that need to go to charge
@@ -105,7 +105,7 @@
 //            }
             // is charging ?
             if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
-                if (agvDetail.getVol() < agvModel.getQuaBattery()) {
+                if (agvDetail.getSoc() < agvModel.getQuaBattery()) {
                     continue;
                 }
             }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java
index c63c585..ed9cf97 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java
@@ -134,13 +134,13 @@
             // detail
             String errorMSg = errorType != null ? errorType.getMsg() : agv_04_up.getHexFaultId();
             detail.setError(errorMSg);
-            detail.setErrorTime(new Date());
+            detail.setErrorTime(now);
         }
 
         // 鏁呴殰澶嶄綅
         if (!Cools.isEmpty(detail.realError())) {
             assert detail.getErrorTime() != null;
-            if (DateUtils.diffToSeconds(detail.getErrorTime(), new Date()) > 20) {
+            if (DateUtils.diffToSeconds(detail.getErrorTime(), now) > 10) {
                 detail.setError(MapDataConstant.EMPTY_OF_ERROR);
             }
         }
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..e33f1f6 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;
@@ -950,7 +947,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 +969,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 +993,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 +1044,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1066,6 +1063,7 @@
                 AgvDirectionType agvDirectionType;
                 Double staWorkDirection;
                 AgvBackpackType backpackType = AgvBackpackType.query(segment.getBackpack());
+                // todo agvModel backpackAction ?
                 switch (Objects.requireNonNull(TaskPosDto.queryPosType(segment.getPosType()))) {
                     case ORI_LOC:
                         assert backpackType != null;
@@ -1169,7 +1167,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1231,7 +1229,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(),    // 鍔ㄤ綔绫诲瀷
@@ -1288,7 +1286,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 +1361,28 @@
 
             }
 
+            // 濡傛灉鍏呯數涓紝鍒欏厛鏂紑鍏呯數
+            // todo agvModel backpackAction ?
+            if (agvModel.getNeedUndockingBool() && 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,6 +1400,7 @@
                     now    // 宸ヤ綔鏃堕棿
             ));
 
+            // todo asr need optimize sort ?
             List<Action> newActionList = actionSorter.optimizeSort(actionList);
             String groupId = String.valueOf(snowflakeIdWorker.nextId()).substring(3);
 
@@ -1574,6 +1595,11 @@
                                 .setQrCode(action.getCode())
                         );
                         break;
+                    case UndockingCharge:
+                        agvAction.add(new AgvActionItem<>(UndockingChargeAction.class)
+                                .setQrCode(action.getCode())
+                        );
+                        break;
                     default:
                         break;
                 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
index 5f4df21..9c975e1 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
@@ -13,6 +13,7 @@
 import com.zy.acs.manager.manager.entity.Loc;
 import com.zy.acs.manager.manager.entity.Segment;
 import com.zy.acs.manager.manager.entity.Sta;
+import com.zy.acs.manager.manager.enums.CodeSpinType;
 import com.zy.acs.manager.manager.service.ActionService;
 import com.zy.acs.manager.manager.service.CodeService;
 import com.zy.acs.manager.system.service.ConfigService;
@@ -430,6 +431,13 @@
         return turnMatrixNode == TurnNodeType.TURN.val;
     }
 
+    public CodeSpinType spinDirection(Code code) {
+        if (Cools.isEmpty(code)) {
+            return CodeSpinType.NA;
+        }
+        return CodeSpinType.of(code.getSpin());
+    }
+
     /**
      * That vehicle is walking if the dynamic node count > 1
      */
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvModelController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvModelController.java
index 2380ef6..39099aa 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvModelController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvModelController.java
@@ -11,6 +11,7 @@
 import com.zy.acs.manager.common.domain.PageParam;
 import com.zy.acs.manager.common.utils.ExcelUtil;
 import com.zy.acs.manager.manager.entity.AgvModel;
+import com.zy.acs.manager.manager.enums.StatusType;
 import com.zy.acs.manager.manager.service.AgvModelService;
 import com.zy.acs.manager.manager.service.impl.AgvModelServiceImpl;
 import com.zy.acs.manager.system.controller.BaseController;
@@ -71,11 +72,14 @@
                     .eq(AgvModel::getType, agvModel.getType())) > 0) {
                 return R.error("this model type has already exist !");
             }
-        }        agvModel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+        }
+        Date now = new Date();
+        agvModel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+        agvModel.setStatus(StatusType.ENABLE.val);
         agvModel.setCreateBy(getLoginUserId());
-        agvModel.setCreateTime(new Date());
+        agvModel.setCreateTime(now);
         agvModel.setUpdateBy(getLoginUserId());
-        agvModel.setUpdateTime(new Date());
+        agvModel.setUpdateTime(now);
         if (!agvModelService.save(agvModel)) {
             return R.error("Save Fail");
         }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/AgvModel.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/AgvModel.java
index f4f7e1f..df57d4f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/AgvModel.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/AgvModel.java
@@ -125,6 +125,18 @@
     private String mqttTopic;
 
     /**
+     * 鏂紑鍏呯數{1:鏄�,0:鍚
+     */
+    @ApiModelProperty(value= "鏂厖鍔ㄤ綔 1: 鏄�  0: 鍚�  ")
+    private Integer needUndocking;
+
+    /**
+     * 鑳岀瘬鍔ㄤ綔 {1:鏄�,0:鍚
+     */
+    @ApiModelProperty(value= "鑳岀瘬鍔ㄤ綔 1: 鏄�  0: 鍚�  ")
+    private Integer backupAction;
+
+    /**
      * 鐘舵�� 1: 姝e父  0: 绂佺敤  
      */
     @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
@@ -172,63 +184,29 @@
     @ApiModelProperty(value= "澶囨敞")
     private String memo;
 
-    public AgvModel() {}
-
-    public AgvModel(String uuid,String type,String name,Integer length,Integer width,Integer height,Integer liftHeight,Integer diameter,String password,Integer backpack,Integer lowBattery,Integer quaBattery,Integer travelSpeed,Double workDirection,Integer allDirection,String protocol,String mqttTopic,Integer status,Integer deleted,Long tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
-        this.uuid = uuid;
-        this.type = type;
-        this.name = name;
-        this.length = length;
-        this.width = width;
-        this.height = height;
-        this.liftHeight = liftHeight;
-        this.diameter = diameter;
-        this.password = password;
-        this.backpack = backpack;
-        this.lowBattery = lowBattery;
-        this.quaBattery = quaBattery;
-        this.travelSpeed = travelSpeed;
-        this.workDirection = workDirection;
-        this.allDirection = allDirection;
-        this.protocol = protocol;
-        this.mqttTopic = mqttTopic;
-        this.status = status;
-        this.deleted = deleted;
-        this.tenantId = tenantId;
-        this.createBy = createBy;
-        this.createTime = createTime;
-        this.updateBy = updateBy;
-        this.updateTime = updateTime;
-        this.memo = memo;
+    public Boolean getNeedUndockingBool(){
+        if (null == this.needUndocking){ return null; }
+        switch (this.needUndocking){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
     }
 
-//    AgvModel agvModel = new AgvModel(
-//            null,    // 缂栧彿
-//            null,    // 绫诲瀷
-//            null,    // 鍚嶇О
-//            null,    // 闀垮害
-//            null,    // 瀹藉害
-//            null,    // 楂樺害
-//            null,    // 涓惧崌楂樺害
-//            null,    // 鏃嬭浆鐩村緞
-//            null,    // 璁惧瀵嗙爜
-//            null,    // 鑳岀瘬
-//            null,    // 鏈�浣庣數閲�
-//            null,    // 棰濆畾鐢甸噺
-//            null,    // 璧拌閫熷害
-//            null,    // 浣滀笟鏂瑰悜
-//            null,    // 鍏ㄥ悜
-//            null,    // 鍗忚
-//            null,    // mqtt涓婚
-//            null,    // 鐘舵�乕闈炵┖]
-//            null,    // 鏄惁鍒犻櫎[闈炵┖]
-//            null,    // 绉熸埛
-//            null,    // 娣诲姞浜哄憳
-//            null,    // 娣诲姞鏃堕棿[闈炵┖]
-//            null,    // 淇敼浜哄憳
-//            null,    // 淇敼鏃堕棿
-//            null    // 澶囨敞
-//    );
+    public Boolean getBackupActionBool(){
+        if (null == this.backupAction){ return null; }
+        switch (this.backupAction){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
 
     public Boolean getAllDirectionBool(){
         if (null == this.allDirection){ return null; }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java
index fbf7529..4f78fd2 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java
@@ -59,6 +59,12 @@
     private String scale;
 
     /**
+     * 鏃嬭浆鏂瑰悜 0: N/A 1: 椤烘椂閽�  2: 閫嗘椂閽�
+     */
+    @ApiModelProperty(value= "鏃嬭浆鏂瑰悜 0: N/A 1: 椤烘椂閽�  2: 閫嗘椂閽�  ")
+    private Integer spin;
+
+    /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
      */
     @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
@@ -105,40 +111,6 @@
      */
     @ApiModelProperty(value= "澶囨敞")
     private String memo;
-
-    public Code() {}
-
-    public Code(String uuid,String data,Double x,Double y,Integer corner,Integer status,Integer deleted,Long tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
-        this.uuid = uuid;
-        this.data = data;
-        this.x = x;
-        this.y = y;
-        this.corner = corner;
-        this.status = status;
-        this.deleted = deleted;
-        this.tenantId = tenantId;
-        this.createBy = createBy;
-        this.createTime = createTime;
-        this.updateBy = updateBy;
-        this.updateTime = updateTime;
-        this.memo = memo;
-    }
-
-//    Code code = new Code(
-//            null,    // 缂栧彿
-//            null,    // 鏉$爜[闈炵┖]
-//            null,    // x鍧愭爣
-//            null,    // y鍧愭爣
-//            null,    // 杞[闈炵┖]
-//            null,    // 鐘舵�乕闈炵┖]
-//            null,    // 鏄惁鍒犻櫎[闈炵┖]
-//            null,    // 绉熸埛
-//            null,    // 娣诲姞浜哄憳
-//            null,    // 娣诲姞鏃堕棿[闈炵┖]
-//            null,    // 淇敼浜哄憳
-//            null,    // 淇敼鏃堕棿
-//            null    // 澶囨敞
-//    );
 
     public Boolean getCornerBool(){
         if (null == this.corner){ return null; }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/ActionTypeType.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/ActionTypeType.java
index c6a318d..2d5d590 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/ActionTypeType.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/ActionTypeType.java
@@ -24,6 +24,7 @@
     LoadPlatformLift("杞借揣鍙板崌闄�"), // 杞借揣鍙板崌闄�
     FinishPath("鏁翠釜璺緞缁撴潫"), // 	鏁翠釜璺緞缁撴潫
     DockingCharge("瀵规帴鍏呯數妗�"), // 	瀵规帴鍏呯數妗�
+    UndockingCharge("鏂紑鍏呯數妗�"), // 	鏂紑鍏呯數妗�
     ;
 
     ActionTypeType(String desc) {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/CodeSpinType.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/CodeSpinType.java
new file mode 100644
index 0000000..aa7dfbc
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/CodeSpinType.java
@@ -0,0 +1,25 @@
+package com.zy.acs.manager.manager.enums;
+
+public enum CodeSpinType {
+
+    NA(0),
+    CW(1),
+    CCW(2),
+    ;
+
+    public int val;
+
+    CodeSpinType(int val) {
+        this.val = val;
+    }
+
+    public static CodeSpinType of(int val) {
+        for (CodeSpinType type : CodeSpinType.values()) {
+            if (type.val == val) {
+                return type;
+            }
+        }
+        return NA;
+    }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvDetailServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvDetailServiceImpl.java
index e432eec..c8de9a4 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvDetailServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvDetailServiceImpl.java
@@ -73,9 +73,9 @@
             agvModel = agvModelService.getByAgvId(agv.getId());
         }
         if (null == agv.getChargeLine()) {
-            return agvDetail.getVol() < agvModel.getLowBattery();
+            return agvDetail.getSoc() < agvModel.getLowBattery();
         } else {
-            return agvDetail.getVol() < Math.max(agv.getChargeLine(), agvModel.getLowBattery());
+            return agvDetail.getSoc() < Math.max(agv.getChargeLine(), agvModel.getLowBattery());
         }
     }
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
index 72fe8ab..97ca4cd 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -206,7 +206,7 @@
             log.warn("[{}]鍙稟gv鏈敹鍒扮姸鎬佸寘......", agvNo);
             return false;
         }
-        if (agvDetail.getVol() == 0) {
+        if (null == agvDetail.getSoc() || agvDetail.getSoc() == 0) {
             return false;
         }
         if (!agvDetail.getAgvStatus().equals(AgvStatusType.IDLE) && !agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
@@ -214,7 +214,7 @@
             return false;
         }
         if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
-            if (agvDetail.getVol() < agvModel.getQuaBattery()) {
+            if (agvDetail.getSoc() < agvModel.getQuaBattery()) {
                 return false;
             }
         }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java
index aa83f0b..7044fea 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java
@@ -94,7 +94,7 @@
                     AgvModel agvModel = agvModelService.getByAgvId(agv.getId());
                     AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
                     if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
-                        if (agvDetail.getVol() < agvModel.getQuaBattery()) {
+                        if (agvDetail.getSoc() < agvModel.getQuaBattery()) {
                             return false;
                         }
                     } else {
diff --git a/zy-acs-manager/src/main/resources/mapper/manager/AgvDetailMapper.xml b/zy-acs-manager/src/main/resources/mapper/manager/AgvDetailMapper.xml
index 2e36048..c30d595 100644
--- a/zy-acs-manager/src/main/resources/mapper/manager/AgvDetailMapper.xml
+++ b/zy-acs-manager/src/main/resources/mapper/manager/AgvDetailMapper.xml
@@ -27,7 +27,7 @@
     </sql>
 
     <select id="selectMajorByAgvId" resultType="com.zy.acs.manager.manager.entity.AgvDetail">
-        SELECT id, agv_id, pos, code, last_code, agv_angle, vol, backpack, status, deleted
+        SELECT id, agv_id, pos, code, last_code, agv_angle, vol, soc, backpack, status, deleted
         FROM man_agv_detail
         WHERE agv_id = #{agvId}
         LIMIT 1

--
Gitblit v1.9.1