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