From 419159c8611dca81b94b3103cdeaeb9272aed5ea Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 23 四月 2026 16:40:32 +0800
Subject: [PATCH] feat(机器人任务): 实现本地创建机器人任务功能

---
 Code/.omc/state/mission-state.json                                                         |   90 ++++++++++++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs                  |   72 ++++++++++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs     |    9 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs                |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs    |   23 +-
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json                              |    7 -
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs                            |   21 +++
 Code/docs/superpowers/specs/2026-04-23-local-robot-task-creation-design.md                 |   43 ++++++
 Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue                               |   24 ++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs |   16 +
 Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue                                |   18 +-
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json                              |    9 +
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs                        |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs       |   10 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs                |   13 +
 Code/.omc/state/subagent-tracking.json                                                     |   22 ++
 16 files changed, 332 insertions(+), 49 deletions(-)

diff --git a/Code/.omc/state/mission-state.json b/Code/.omc/state/mission-state.json
index 0740a61..ba6d475 100644
--- a/Code/.omc/state/mission-state.json
+++ b/Code/.omc/state/mission-state.json
@@ -1,5 +1,5 @@
 {
-  "updatedAt": "2026-04-22T08:00:38.578Z",
+  "updatedAt": "2026-04-23T06:52:14.501Z",
   "missions": [
     {
       "id": "session:9007b9ea-1eb6-4d24-8fe7-2c3a949eac88:none",
@@ -2534,6 +2534,94 @@
           "sourceKey": "session-stop:a70a5d0efcc81d263"
         }
       ]
+    },
+    {
+      "id": "session:97f7871e-58c9-49b8-b7b1-d67ca866e495:none",
+      "source": "session",
+      "name": "none",
+      "objective": "Session mission",
+      "createdAt": "2026-04-23T02:51:49.771Z",
+      "updatedAt": "2026-04-23T02:55:09.431Z",
+      "status": "done",
+      "workerCount": 1,
+      "taskCounts": {
+        "total": 1,
+        "pending": 0,
+        "blocked": 0,
+        "inProgress": 0,
+        "completed": 1,
+        "failed": 0
+      },
+      "agents": [
+        {
+          "name": "Explore:a90c490",
+          "role": "Explore",
+          "ownership": "a90c490b825a81654",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-23T02:55:09.431Z"
+        }
+      ],
+      "timeline": [
+        {
+          "id": "session-start:a90c490b825a81654:2026-04-23T02:51:49.771Z",
+          "at": "2026-04-23T02:51:49.771Z",
+          "kind": "update",
+          "agent": "Explore:a90c490",
+          "detail": "started Explore:a90c490",
+          "sourceKey": "session-start:a90c490b825a81654"
+        },
+        {
+          "id": "session-stop:a90c490b825a81654:2026-04-23T02:55:09.431Z",
+          "at": "2026-04-23T02:55:09.431Z",
+          "kind": "completion",
+          "agent": "Explore:a90c490",
+          "detail": "completed",
+          "sourceKey": "session-stop:a90c490b825a81654"
+        }
+      ]
+    },
+    {
+      "id": "session:7faab803-bef5-44c3-a296-6a6757237fd7:none",
+      "source": "session",
+      "name": "none",
+      "objective": "Session mission",
+      "createdAt": "2026-04-23T06:52:14.501Z",
+      "updatedAt": "2026-04-23T06:52:14.501Z",
+      "status": "running",
+      "workerCount": 1,
+      "taskCounts": {
+        "total": 1,
+        "pending": 0,
+        "blocked": 0,
+        "inProgress": 1,
+        "completed": 0,
+        "failed": 0
+      },
+      "agents": [
+        {
+          "name": "Explore:a20f390",
+          "role": "Explore",
+          "ownership": "a20f390d480b5890b",
+          "status": "running",
+          "currentStep": null,
+          "latestUpdate": null,
+          "completedSummary": null,
+          "updatedAt": "2026-04-23T06:52:14.501Z"
+        }
+      ],
+      "timeline": [
+        {
+          "id": "session-start:a20f390d480b5890b:2026-04-23T06:52:14.501Z",
+          "at": "2026-04-23T06:52:14.501Z",
+          "kind": "update",
+          "agent": "Explore:a20f390",
+          "detail": "started Explore:a20f390",
+          "sourceKey": "session-start:a20f390d480b5890b"
+        }
+      ]
     }
   ]
 }
\ No newline at end of file
diff --git a/Code/.omc/state/subagent-tracking.json b/Code/.omc/state/subagent-tracking.json
index ed732a5..2ac468f 100644
--- a/Code/.omc/state/subagent-tracking.json
+++ b/Code/.omc/state/subagent-tracking.json
@@ -1571,10 +1571,26 @@
       "status": "completed",
       "completed_at": "2026-04-22T08:00:38.576Z",
       "duration_ms": 191600
+    },
+    {
+      "agent_id": "a90c490b825a81654",
+      "agent_type": "Explore",
+      "started_at": "2026-04-23T02:51:49.771Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-23T02:55:09.429Z",
+      "duration_ms": 199658
+    },
+    {
+      "agent_id": "a20f390d480b5890b",
+      "agent_type": "Explore",
+      "started_at": "2026-04-23T06:52:14.501Z",
+      "parent_mode": "none",
+      "status": "running"
     }
   ],
-  "total_spawned": 147,
-  "total_completed": 170,
+  "total_spawned": 149,
+  "total_completed": 171,
   "total_failed": 0,
-  "last_updated": "2026-04-22T08:00:38.695Z"
+  "last_updated": "2026-04-23T06:52:14.616Z"
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue
index c90456f..cb5c486 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue
@@ -90,34 +90,46 @@
         {
           title: "鏄惁鎷嗙洏",
           field: "isSplitPallet",
-          type: "checkbox",
+          type: "select",
+          dataKey: "isTrue",
+          data: [],
         },
         {
           title: "鏄惁缁勭洏",
           field: "isGroupPallet",
-          type: "checkbox",
+          type: "select",
+          dataKey: "isTrue",
+          data: [],
         },
         {
           title: "鍋囩數鑺ā寮�",
           field: "isInFakeBatteryMode",
-          type: "checkbox",
+          type: "select",
+          dataKey: "isTrue",
+          data: [],
         },
       ],
       [
         {
           title: "鏄惁鎵爜NG",
           field: "isScanNG",
-          type: "checkbox",
+          type: "select",
+          dataKey: "isTrue",
+          data: [],
         },
         {
           title: "鐢佃姱鏄惁鍒颁綅",
           field: "batteryArrived",
-          type: "checkbox",
+          type: "select",
+          dataKey: "isTrue",
+          data: [],
         },
         {
           title: "娑堟伅宸茶闃�",
           field: "isEventSubscribed",
-          type: "checkbox",
+          type: "select",
+          dataKey: "isTrue",
+          data: [],
         },
       ],
     ]);
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue
index eff9af8..ac42c4e 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue
@@ -186,6 +186,7 @@
         type: "string",
         width: 120,
         align: "left",
+        hidden: true,
       },
       {
         field: "robotTargetAddress",
@@ -193,37 +194,35 @@
         type: "string",
         width: 120,
         align: "left",
+        hidden: true,
       },
       {
         field: "robotSourceAddressLineCode",
-        title: "鏉ユ簮绾夸唬鐮�",
+        title: "鏉ユ簮绾夸綋鍦板潃",
         type: "string",
         width: 130,
         align: "left",
       },
       {
         field: "robotTargetAddressLineCode",
-        title: "鐩爣绾夸唬鐮�",
+        title: "鐩爣绾夸綋鍦板潃",
         type: "string",
         width: 130,
         align: "left",
-        hidden: true,
       },
       {
         field: "robotSourceAddressPalletCode",
-        title: "鏉ユ簮鎵樼洏浠g爜",
+        title: "鏉ユ簮鎵樼洏",
         type: "string",
         width: 130,
         align: "left",
-        hidden: true,
       },
       {
         field: "robotTargetAddressPalletCode",
-        title: "鐩爣鎵樼洏浠g爜",
+        title: "鐩爣鎵樼洏",
         type: "string",
         width: 130,
         align: "left",
-        hidden: true,
       },
       {
         field: "robotExceptionMessage",
@@ -256,6 +255,7 @@
         type: "datetime",
         width: 160,
         align: "left",
+        hidden: true,
       },
       {
         field: "robotremark",
@@ -271,6 +271,7 @@
         type: "string",
         width: 100,
         align: "left",
+        hidden: true,
       },
       {
         field: "createDate",
@@ -279,6 +280,7 @@
         width: 160,
         align: "left",
         sortable: true,
+        hidden: true,
       },
       {
         field: "modifier",
@@ -286,6 +288,7 @@
         type: "string",
         width: 100,
         align: "left",
+        hidden: true,
       },
       {
         field: "modifyDate",
@@ -293,6 +296,7 @@
         type: "datetime",
         width: 160,
         align: "left",
+        hidden: true,
       },
     ]);
 
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs
index 6f9abcd..26cf6df 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs
@@ -75,12 +75,19 @@
         WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO);
 
         /// <summary>
-        /// 
+        /// 璋冪敤WMS鎺ュ彛鑾峰彇鏈烘鎵嬩换鍔�
         /// </summary>
-        /// <param name="task"></param>
-        /// <returns></returns>
+        /// <param name="task">鍑哄簱浠诲姟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
         WebResponseContent GetWMSRobotTask(Dt_Task task);
 
+        /// <summary>
+        /// 鍦ㄦ湰鍦扮洿鎺ュ垱寤烘満姊版墜浠诲姟锛屼笉璋冪敤WMS鎺ュ彛
+        /// </summary>
+        /// <param name="task">鍑哄簱浠诲姟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        WebResponseContent CreateLocalRobotTask(Dt_Task task);
+
         int MapWarehouseIdConfigKey(string? targetAddress);
         string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback);
     }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
index acebc6b..991f38a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
@@ -18,7 +18,7 @@
   },
   "Logging": {
     "LogLevel": {
-      "Default": "Debug",
+      "Default": "Warning",
       "Microsoft.AspNetCore": "Warning",
       "Quartz": "Debug"
     }
@@ -103,6 +103,13 @@
       "10030": "11010"
     }
   },
+  "RobotAddressRules": {
+    "11068": [ "1", "2" ],
+    "11001": [ "3", "1" ],
+    "11010": [ "4", "2" ],
+    "2101": [ "1", "3" ],
+    "2103": [ "2", "4" ]
+  },
   "RedisConfig": {
     "Enabled": true, //鏄惁鍚敤Redis锛宖alse鏃朵粎浣跨敤鍐呭瓨缂撳瓨
     "ConnectionString": "127.0.0.1:6379,password=P@ssw0rd,defaultDatabase=0,connectTimeout=5000,abortConnect=false", //Redis杩炴帴瀛楃涓�
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
index 2db6032..b93568a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
@@ -99,7 +99,7 @@
 
             if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
             {
-                 _robotTaskService.GetWMSRobotTask(task);
+                _robotTaskService.CreateLocalRobotTask(task);
                 //if (!content.Status)
                 //{
                 //    return content;
@@ -143,7 +143,7 @@
             task.Modifier = "System";
 
             // 閫氱煡WMS鍑哄簱瀹屾垚骞惰幏鍙栬繑鍥炵粨鏋�
-            return  NotifyWMSOutboundFinish(task);
+            return NotifyWMSOutboundFinish(task);
         }
 
         /// <summary>
@@ -228,7 +228,10 @@
             if (wMSTask == null)
                 return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺绌烘墭鐩樺嚭搴撲换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆怶MS鏈繑鍥炴湁鏁堜换鍔℃暟鎹��");
 
-            return WebResponseContent.Instance.OK("鎴愬姛", new List<WMSTaskDTO> { wMSTask });
+            if (TaskService.ReceiveWMSTask(new List<WMSTaskDTO> { wMSTask }).Status)
+                return WebResponseContent.Instance.OK("鎴愬姛");
+
+            return WebResponseContent.Instance.Error("鎺ユ敹WMS浠诲姟澶辫触");
         }
 
         /// <summary>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index 1e60a39..ebaa465 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -157,6 +157,78 @@
         }
 
         /// <summary>
+        /// 鍦ㄦ湰鍦扮洿鎺ュ垱寤烘満姊版墜浠诲姟锛屼笉璋冪敤WMS鎺ュ彛銆�
+        /// 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷锛屾瀯寤轰换鍔℃暟鎹苟鍐欏叆鏁版嵁搴撱��
+        /// </summary>
+        /// <param name="task">鍑哄簱浠诲姟瀹炰綋</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public WebResponseContent CreateLocalRobotTask(Dt_Task task)
+        {
+            WebResponseContent content = new();
+            try
+            {
+                // 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷閰嶇疆閿�
+                string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
+
+                // 鏋勫缓Stock鏁版嵁
+                StockDTO stock = BuildRobotTaskStock(task, configKey);
+
+                // 鑾峰彇鎶撳彇鍜屾斁缃湴鍧�鐨勭嚎浣撻厤缃紙濡傛灉鏈夛級
+                var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
+                if (section.Length < 2)
+                    return WebResponseContent.Instance.Error($"鏈壘鍒扮嚎浣揫{stock?.TargetLineNo}]鐨勫湴鍧�閰嶇疆");
+
+                // 鍒涘缓鏈湴鏈哄櫒浜轰换鍔�
+                Dt_RobotTask robotTask = new()
+                {
+                    RobotTaskNum = Random.Shared.Next(),
+                    RobotSourceAddress = section[0]!,
+                    RobotTargetAddress = section[1]!,
+                    RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty,
+                    RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty,
+                    RobotRoadway = stock?.Roadway ?? string.Empty,
+                    RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty,
+                    RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty,
+                    RobotTaskType = MapConfigKeyToRobotTaskType(configKey),
+                    RobotTaskState = (int)TaskRobotStatusEnum.RobotNew,
+                    RobotGrade = task.Grade,
+                    Creater = "WCS_Local",
+                    RobotTaskTotalNum = 1,
+                    CreateDate = DateTime.Now
+                };
+
+                BaseDal.AddData(robotTask);
+
+                _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { robotTask.RobotTaskNum }, "鏈湴鍒涘缓鏈哄櫒浜轰换鍔�");
+
+                QuartzLogHelper.LogInfo(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�,浠诲姟鍙�:銆恵robotTask.RobotTaskNum}銆�,婧愬湴鍧�:銆恵robotTask.RobotSourceAddress}銆�,鐩爣鍦板潃:銆恵robotTask.RobotTargetAddress}銆�,浠诲姟绫诲瀷:銆恵configKey}銆�", "RobotTaskService");
+
+                content = WebResponseContent.Instance.OK("鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�", robotTask);
+            }
+            catch (Exception ex)
+            {
+                QuartzLogHelper.LogError(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:{ex.Message}", "RobotTaskService");
+                content = WebResponseContent.Instance.Error($"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,閿欒淇℃伅:{ex.Message}");
+            }
+            return content;
+        }
+
+        /// <summary>
+        /// 灏嗛厤缃敭鏄犲皠鍒版満姊版墜浠诲姟绫诲瀷鏋氫妇鍊笺��
+        /// </summary>
+        /// <param name="configKey">閰嶇疆閿悕绉�</param>
+        /// <returns>浠诲姟绫诲瀷鏋氫妇鍊�</returns>
+        public int MapConfigKeyToRobotTaskType(string? configKey)
+        {
+            return configKey switch
+            {
+                nameof(ConfigKey.CreateRobotGroupPalletTask) => (int)RobotTaskTypeEnum.GroupPallet,
+                nameof(ConfigKey.CreateRobotSplitPalletTask) => (int)RobotTaskTypeEnum.SplitPallet,
+                _ => (int)RobotTaskTypeEnum.ChangePallet
+            };
+        }
+
+        /// <summary>
         /// 鏍规嵁杈撻�佺嚎鐩爣鍦板潃瑙f瀽鏈烘鎵嬩换鍔℃帴鍙c��
         /// 瑙勫垯锛�
         /// 1. 浠庨厤缃鍙栫簿纭湴鍧�鏄犲皠锛圓ddressMap锛�
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
index c78fc4f..ec3d757 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -118,7 +118,7 @@
                 // - 鎵嬭噦涓婃湁鐗╂枡锛圧obotArmObject == 1锛�
                 // - 浠诲姟鐘舵�佷负 RobotPickFinish锛堝凡璁板綍鍙栬揣瀹屾垚锛�
                 if ((latestState.CurrentAction == "PickFinished" || latestState.CurrentAction == "AllPickFinished")
-                    && (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 1)
+                    //&& (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 1)
                     && task.RobotTaskState == TaskRobotStatusEnum.RobotPickFinish.GetHashCode())
                 {
                     QuartzLogHelper.LogInfo(_logger, $"ExecuteAsync锛氭弧瓒虫斁璐ф潯浠讹紝寮�濮嬩笅鍙戞斁璐т换鍔�,浠诲姟鍙�: {task.RobotTaskNum}", latestState.RobotCrane?.DeviceName ?? ipAddress);
@@ -133,7 +133,7 @@
                 // - 鎵嬭噦涓婃棤鐗╂枡锛圧obotArmObject == 0锛�
                 // - 浠诲姟鐘舵�佷负 RobotPutFinish 鎴栦笉鏄� RobotExecuting
                 else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished" || latestState.CurrentAction.IsNullOrEmpty())
-                    && (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 0)
+                    //&& (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 0)
                     && (task.RobotTaskState == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() || task.RobotTaskState != TaskRobotStatusEnum.RobotExecuting.GetHashCode()))
                 {
                     QuartzLogHelper.LogInfo(_logger, $"ExecuteAsync锛氭弧瓒冲彇璐ф潯浠讹紝寮�濮嬩笅鍙戝彇璐т换鍔★紝浠诲姟鍙�: {task.RobotTaskNum}", latestState.RobotCrane?.DeviceName ?? ipAddress);
@@ -339,7 +339,7 @@
                 {
                     if (stateForUpdate.CellBarcode.Contains(trayBarcode1) || stateForUpdate.CellBarcode.Contains(trayBarcode2))
                     {
-                        QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫殑鎵樼洏鏉$爜宸插瓨鍦紝鍙兘瀛樺湪閲嶅锛屼换鍔″彿: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
+                        QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫殑鐢佃姱鏉$爜宸插瓨鍦紝鍙兘瀛樺湪閲嶅锛屼换鍔″彿: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
 
                         // 鍙戦�佸彇璐ф寚浠� 鏍囪鎵爜NG锛屾斁璐ф椂涓嶄娇鐢ㄨ繖浜涙潯鐮侊紝骞舵斁鍏G鍙�
                         //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true);
@@ -347,7 +347,13 @@
                     }
                     else
                     {
-                        QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫殑鎵樼洏鏉$爜鍞竴锛岀户缁墽琛岋紝浠诲姟鍙�: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
+                        if (trayBarcode1.Length < 13 || trayBarcode2.Length < 13)
+                        {
+                            QuartzLogHelper.LogError(_logger, $"HandlePutFinishedStateAsync锛氱數鑺潯鐮侀暱搴︿笉杈炬爣锛屼换鍔″彿: {task.RobotTaskNum}锛岃鍙栫數鑺潯鐮佹垚鍔�: 銆恵trayBarcode1}銆�-----銆恵trayBarcode2}銆�", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
+                            return;
+                        }
+
+                        QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫殑鐢佃姱鏉$爜鍞竴锛岀户缁墽琛岋紝浠诲姟鍙�: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
 
                         // 灏嗘潯鐮佹坊鍔犲埌鐘舵�佷腑锛屼緵鍚庣画鏀捐揣鏃朵娇鐢�
                         stateForUpdate.CellBarcode = new List<string>()
@@ -357,7 +363,7 @@
                     }
 
                     // 璁板綍鏃ュ織锛氳鍙栨墭鐩樻潯鐮佹垚鍔�
-                    QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栨墭鐩樻潯鐮佹垚鍔�: 銆恵trayBarcode1}銆�-----銆恵trayBarcode2}銆戯紝浠诲姟鍙�: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
+                    QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫數鑺潯鐮佹垚鍔�: 銆恵trayBarcode1}銆�-----銆恵trayBarcode2}銆戯紝浠诲姟鍙�: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
 
                     // 鍙戦�佸彇璐ф寚浠�
                     await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
index 7fc1361..f24aa72 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -189,8 +189,11 @@
                     QuartzLogHelper.LogInfo(_logger, "Execute锛氳闃呬换鍔″畬鎴愪簨浠讹紝璁惧: {DeviceCode}", "璁㈤槄浠诲姟瀹屾垚浜嬩欢", _deviceCode, _deviceCode);
                 }
 
+                QuartzLogHelper.LogInfo(_logger, $"寮�濮嬫鏌ュ爢鍨涙満瀹屾垚鐘舵�侊紝銆恵_deviceCode}銆�", _deviceCode);
                 // ========== 妫�鏌ュ爢鍨涙満浠诲姟瀹屾垚鐘舵�� ==========
                 commonStackerCrane.CheckStackerCraneTaskCompleted();
+
+                QuartzLogHelper.LogInfo(_logger, $"妫�鏌ュ畬鎴愶紝姝e湪鐩戝惉鍫嗗灈鏈轰换鍔″畬鎴愶紝銆恵_deviceCode}銆�", _deviceCode);
 
                 // ========== 妫�鏌ユ槸鍚﹀彲浠ュ彂閫佹柊浠诲姟 ==========
                 //if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs))
@@ -199,6 +202,8 @@
                     // 鍫嗗灈鏈轰笉鍙敤锛堝姝e湪鎵ц涓婁竴浠诲姟锛夛紝鐩存帴杩斿洖
                     return Task.CompletedTask;
                 }
+
+                QuartzLogHelper.LogInfo(_logger, $"鍫嗗灈鏈哄彲涓嬪彂浠诲姟锛屻�恵_deviceCode}銆�", _deviceCode);
 
                 // ========== 閫夋嫨浠诲姟 ==========
                 // 浠诲姟閫夋嫨涓嬫矇鍒颁笓鐢ㄩ�夋嫨鍣�
@@ -209,7 +214,7 @@
                     return Task.CompletedTask;
                 }
 
-
+                QuartzLogHelper.LogInfo(_logger, $"鑾峰彇鍒颁换鍔★紝寮�濮嬫瀯寤轰换鍔′笅鍙戝懡浠わ紝銆恵_deviceCode}銆�", _deviceCode);
 
                 // ========== 鏋勫缓鍛戒护 ==========
                 // 鍛戒护鏋勫缓涓嬫矇鍒颁笓鐢ㄦ瀯寤哄櫒
@@ -221,6 +226,9 @@
                     return Task.CompletedTask;
                 }
 
+
+                QuartzLogHelper.LogInfo(_logger, $"鍛戒护鏋勫缓瀹屾垚锛屽紑濮嬩笅鍙戜换鍔★紝銆恵_deviceCode}銆�", _deviceCode);
+
                 // ========== 鍙戦�佸懡浠� ==========
                 bool sendFlag = SendStackerCraneCommand(commonStackerCrane, stackerCraneTaskCommand);
                 if (sendFlag)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 87e03ab..1e5c562 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -101,14 +101,14 @@
             Dt_Task? candidateTask;
             var deviceCode = commonStackerCrane.DeviceCode;
 
-            QuartzLogHelper.LogDebug(_logger, $"寮�濮嬮�夋嫨浠诲姟锛岃澶�: {deviceCode}锛屼笂涓�浠诲姟绫诲瀷: {commonStackerCrane.LastTaskType}",commonStackerCrane.DeviceName);
+            QuartzLogHelper.LogInfo(_logger, $"寮�濮嬮�夋嫨浠诲姟锛岃澶�: {deviceCode}锛屼笂涓�浠诲姟绫诲瀷: {commonStackerCrane.LastTaskType}", commonStackerCrane.DeviceName);
 
             // 鏍规嵁涓婁竴浠诲姟绫诲瀷鍐冲畾鏌ヨ绛栫暐
             if (commonStackerCrane.LastTaskType == null || commonStackerCrane.LastTaskType == TaskRelocationTypeEnum.Relocation.GetHashCode())
             {
                 // 娌℃湁涓婁竴浠诲姟绫诲瀷锛屾煡璇㈡櫘閫氫换鍔�
                 candidateTask = _taskService.QueryStackerCraneTask(deviceCode);
-                QuartzLogHelper.LogDebug(_logger, $"鏌ヨ鏅�氫换鍔★紝璁惧: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
+                QuartzLogHelper.LogInfo(_logger, $"鏌ヨ鏅�氫换鍔★紝璁惧: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
             }
             else if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
             {
@@ -116,26 +116,29 @@
                 candidateTask = _taskService.QueryStackerCraneInTask(deviceCode);
                 // 濡傛灉娌℃湁鍏ュ簱浠诲姟锛屽啀鏌ヤ竴涓嬪嚭搴撲换鍔�
                 candidateTask ??= _taskService.QueryStackerCraneOutTask(deviceCode);
-                QuartzLogHelper.LogDebug(_logger, $"鍑哄簱鍚庝紭鍏堟煡鍏ュ簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
+                QuartzLogHelper.LogInfo(_logger, $"鍑哄簱鍚庝紭鍏堟煡鍏ュ簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
             }
             else
             {
                 // 涓婁竴浠诲姟鏄叆搴擄紙闈炲嚭搴擄級锛屼紭鍏堟煡鍑哄簱浠诲姟
                 candidateTask = _taskService.QueryStackerCraneOutTask(deviceCode);
-                QuartzLogHelper.LogDebug(_logger, $"鍏ュ簱鍚庝紭鍏堟煡鍑哄簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
+
+                // 濡傛灉娌℃湁鍑哄簱浠诲姟锛屽啀鏌ヤ竴涓嬪叆搴撲换鍔�
+                candidateTask ??= _taskService.QueryStackerCraneInTask(deviceCode);
+                QuartzLogHelper.LogInfo(_logger, $"鍏ュ簱鍚庝紭鍏堟煡鍑哄簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
             }
 
             // 濡傛灉娌℃湁鍊欓�変换鍔★紝杩斿洖 null
             if (candidateTask == null)
             {
-                QuartzLogHelper.LogDebug(_logger, $"娌℃湁鍊欓�変换鍔★紝璁惧: {deviceCode}", commonStackerCrane.DeviceName);
+                QuartzLogHelper.LogInfo(_logger, $"娌℃湁鍊欓�変换鍔★紝璁惧: {deviceCode}", commonStackerCrane.DeviceName);
                 return null;
             }
 
             // 濡傛灉涓嶆槸鍑哄簱浠诲姟锛岀洿鎺ヨ繑鍥�
             if (candidateTask.TaskType.GetTaskTypeGroup() != TaskTypeGroup.OutbondGroup)
             {
-                QuartzLogHelper.LogDebug(_logger, $"閫変腑闈炲嚭搴撲换鍔★紝浠诲姟鍙�: {candidateTask.TaskNum}锛屼换鍔$被鍨�: {candidateTask.TaskType}", commonStackerCrane.DeviceName);
+                QuartzLogHelper.LogInfo(_logger, $"閫変腑闈炲嚭搴撲换鍔★紝浠诲姟鍙�: {candidateTask.TaskNum}锛屼换鍔$被鍨�: {candidateTask.TaskType}", commonStackerCrane.DeviceName);
                 return candidateTask;
             }
 
@@ -143,7 +146,7 @@
             Dt_Task? selectedTask = TrySelectOutboundTask(candidateTask);
             if (selectedTask != null)
             {
-                QuartzLogHelper.LogDebug(_logger, $"閫変腑鍑哄簱浠诲姟锛屼换鍔″彿: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
+                QuartzLogHelper.LogInfo(_logger, $"閫変腑鍑哄簱浠诲姟锛屼换鍔″彿: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
                 return selectedTask;
             }
 
@@ -158,7 +161,7 @@
                 selectedTask = TrySelectOutboundTask(sameStationTask);
                 if (selectedTask != null)
                 {
-                    QuartzLogHelper.LogDebug(_logger, $"閫変腑鍚岀珯鍙板閫夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
+                    QuartzLogHelper.LogInfo(_logger, $"閫変腑鍚岀珯鍙板閫夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
                     return selectedTask;
                 }
             }
@@ -177,14 +180,14 @@
                 selectedTask = TrySelectOutboundTask(alternativeTask);
                 if (selectedTask != null)
                 {
-                    QuartzLogHelper.LogDebug(_logger, $"閫変腑澶囬�夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
+                    QuartzLogHelper.LogInfo(_logger, $"閫変腑澶囬�夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
                     return selectedTask;
                 }
             }
 
             // 娌℃湁鍙敤鍑哄簱浠诲姟锛屽皾璇曡繑鍥炲叆搴撲换鍔�
             var inboundTask = _taskService.QueryStackerCraneInTask(deviceCode);
-            QuartzLogHelper.LogDebug(_logger, $"杩斿洖鍏ュ簱浠诲姟锛屼换鍔″彿: {inboundTask?.TaskNum}", commonStackerCrane.DeviceName);
+            QuartzLogHelper.LogInfo(_logger, $"杩斿洖鍏ュ簱浠诲姟锛屼换鍔″彿: {inboundTask?.TaskNum}", commonStackerCrane.DeviceName);
             return inboundTask;
         }
 
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
index 4d1a8f9..43f725f 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
@@ -13,7 +13,7 @@
         /// <summary>
         /// 楂樻俯1鍙峰嚭搴撳湴鍧�鍒楄〃锛堣疆璇級
         /// </summary>
-        public static readonly string[] GW1_ADDRESSES = { "11001", "11010" };
+        public static readonly string[] GW1_ADDRESSES = { "11001" };
 
         /// <summary>
         /// 楂樻俯2鍙峰嚭搴撳湴鍧�
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
index 59e0f51..10f0047 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -197,7 +197,7 @@
         /// <returns>搴撳瓨淇℃伅</returns>
         public async Task<Dt_StockInfo> GetStockInfoAsync(string palletCode, string locationCode)
         {
-            return await BaseDal.QueryFirstAsync(x => x.PalletCode == palletCode && x.LocationCode == locationCode);
+            return await BaseDal.QueryDataNavFirstAsync(x => x.PalletCode == palletCode && x.LocationCode == locationCode);
         }
 
         /// <summary>
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
index 4e7212c..03fa684 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -247,6 +247,14 @@
                     var result = await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
                     if (!result) return content.Error("鎹㈢洏澶辫触");
 
+                    // 妫�鏌ユ簮鎵樼洏鏄惁杩樻湁鍓╀綑搴撳瓨鏄庣粏锛岃嫢鏃犲垯鍒犻櫎婧愭墭鐩樺簱瀛樺ご
+                    var remainingSourceDetails = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id);
+                    if (!remainingSourceDetails.Any())
+                    {
+                        if (await StockInfoService.Repository.Db.Deleteable<Dt_StockInfo>().Where(s => s.Id == sourceStock.Id).ExecuteCommandAsync() <= 0)
+                            return content.Error("鍒犻櫎婧愭墭鐩樺簱瀛樺け璐�");
+                    }
+
                     return content.OK("鎹㈢洏鎴愬姛");
                 });
             }
@@ -315,6 +323,19 @@
                     if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock }, "鎷嗙洏")) <= 0)
                         return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
+                    // 鍒犻櫎宸叉媶鍑虹殑搴撳瓨鏄庣粏
+                    var detailIds = detailEntities.Select(d => d.Id).ToList();
+                    if (await StockInfoDetailService.Repository.Db.Deleteable<Dt_StockInfoDetail>().In(detailIds).ExecuteCommandAsync() <= 0)
+                        return content.Error("鍒犻櫎搴撳瓨鏄庣粏澶辫触");
+
+                    // 妫�鏌ユ簮鎵樼洏鏄惁杩樻湁鍓╀綑搴撳瓨鏄庣粏锛岃嫢鏃犲垯鍒犻櫎婧愭墭鐩樺簱瀛樺ご
+                    var remainingSourceDetails = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id);
+                    if (!remainingSourceDetails.Any())
+                    {
+                        if (await StockInfoService.Repository.Db.Deleteable<Dt_StockInfo>().Where(s => s.Id == sourceStock.Id).ExecuteCommandAsync() <= 0)
+                            return content.Error("鍒犻櫎婧愭墭鐩樺簱瀛樺け璐�");
+                    }
+
                     return content.OK("鎷嗙洏鎴愬姛");
                 });
             }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index 76114fd..8151757 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -74,13 +74,6 @@
     "BaseUrl": "http://192.168.98.11:20033",
     "Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjMwMTcyNzM5Mzk5NzYxOTIwIiwibmFtZSI6IlBBQ0voo4XphY3lt6XkvY0wMSIsIkZhY3RvcnlJZCI6IjEyMzQ1NiIsIlNpdGVJZCI6IjEyMzQ1NiIsIkNvZGUiOiJYWExQQUNLMDRBRTAzMiIsIm5iZiI6MTcwNDE4NzY5MCwiZXhwIjoyMTQ1NjkxNjkwLCJpc3MiOiJodHRwczovL3d3dy5oeW1zb24uY29tIiwiYXVkIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSJ9.An1BE7UgfcSP--LtTOmmmWVE2RQFPDahLkDg1xy5KqY"
   },
-  "RobotTaskAddressRules": {
-    "11068": [ "1", "2" ],
-    "11001": [ "3", "1" ],
-    "11010": [ "4", "2" ],
-    "2101": [ "1", "3" ],
-    "2103": [ "2", "4" ]
-  },
 
 
   "A0GV_OutTaskComplete": "http://localhost:9999/OutTaskComplete", // 涓婃姤AGV鍑哄簱杈撻�佺嚎瀹屾垚
diff --git a/Code/docs/superpowers/specs/2026-04-23-local-robot-task-creation-design.md b/Code/docs/superpowers/specs/2026-04-23-local-robot-task-creation-design.md
new file mode 100644
index 0000000..753287a
--- /dev/null
+++ b/Code/docs/superpowers/specs/2026-04-23-local-robot-task-creation-design.md
@@ -0,0 +1,43 @@
+# 鏈湴鍒涘缓鏈哄櫒浜轰换鍔¤璁�
+
+## 鑳屾櫙
+
+`RobotTaskService.GetWMSRobotTask` 褰撳墠閫氳繃 HTTP 璋冪敤 WMS 鑾峰彇鏈哄櫒浜轰换鍔℃暟鎹紝鍐嶅啓鍏ユ湰鍦版暟鎹簱銆傞渶姹傛槸璺宠繃 WMS 璋冪敤锛岀洿鎺ュ湪鏈湴鍒涘缓 `Dt_RobotTask`銆�
+
+## 鏂规
+
+鏂板 `CreateLocalRobotTask(Dt_Task task)` 鏂规硶锛屼繚鐣欏師 `GetWMSRobotTask` 涓嶅垹闄ゃ��
+
+### 鏀瑰姩鏂囦欢
+
+1. **RobotTaskService.cs** 鈥� 鏂板 `CreateLocalRobotTask` 鍜岃緟鍔╂柟娉� `MapConfigKeyToRobotTaskType`
+2. **IRobotTaskService.cs** 鈥� 鎺ュ彛鏂板鏂规硶澹版槑
+3. **OutboundTaskFlowService.cs** 鈥� 璋冪敤鐐逛粠 `GetWMSRobotTask` 鏀逛负 `CreateLocalRobotTask`
+
+### 鏂规硶閫昏緫
+
+1. 澶嶇敤 `ResolveRobotTaskConfigKey` 瑙f瀽浠诲姟绫诲瀷閰嶇疆閿�
+2. 澶嶇敤 `BuildRobotTaskStock` 鏋勫缓 StockDTO
+3. 鏂板 `MapConfigKeyToRobotTaskType` 鏄犲皠閰嶇疆閿埌 `RobotTaskTypeEnum`锛�
+   - `CreateRobotChangePalletTask` 鈫� `ChangePallet` (510)
+   - `CreateRobotGroupPalletTask` 鈫� `GroupPallet` (500)
+   - `CreateRobotSplitPalletTask` 鈫� `SplitPallet` (520)
+4. 鏋勫缓 `Dt_RobotTask`锛�
+   - `RobotTaskNum` = `Random.Shared.Next()`
+   - `RobotSourceAddress` / `RobotTargetAddress` = `task.SourceAddress` / `task.TargetAddress`
+   - `RobotSourceAddressLineCode` / `RobotTargetAddressLineCode` = stock 瀵瑰簲瀛楁
+   - `RobotRoadway` = `stock.Roadway`
+   - `RobotSourceAddressPalletCode` / `RobotTargetAddressPalletCode` = stock 瀵瑰簲瀛楁
+   - `RobotTaskType` = 鏄犲皠鍚庣殑鏋氫妇鍊�
+   - `RobotTaskState` = `RobotNew` (300)
+   - `RobotGrade` = `task.Grade`
+   - `Creater` = `"WCS_Local"`
+   - `RobotTaskTotalNum` = 1
+5. `BaseDal.AddData` 鎻掑叆鏁版嵁搴�
+6. `_taskExecuteDetailService.AddTaskExecuteDetail` 璁板綍鎵ц鏄庣粏
+
+### 涓嶅姩鐨勯儴鍒�
+
+- `GetWMSRobotTask` 鍜� `ReceiveWMSTask` 淇濇寔鍘熸牱
+- `ResolveRobotTaskConfigKey`銆乣BuildRobotTaskStock` 绛夌幇鏈夋柟娉曞鐢紝涓嶄慨鏀�
+- 閰嶇疆鏂囦欢 `appsettings.json` 涓嶆敼

--
Gitblit v1.9.3