From 2f7c7a0621ee2e84c47ccd054889a71e8ce4fdd0 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期六, 18 四月 2026 22:08:14 +0800
Subject: [PATCH] feat(机械手任务): 实现换盘任务多阶段处理逻辑
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs | 47 ++
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotPrefixCommandHandler.cs | 39 +
Code/.omc/state/mission-state.json | 58 +++
项目资料/设备协议/上位系统对接/高温2常温1及机械手设备账号信息表(1).xlsx | 0
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotSocketState.cs | 9
Code/WCS/WIDESEAWCS_Server/docs/换盘任务流程图.md | 291 +++++++++++++++++
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs | 244 +++++++++----
Code/.omc/state/subagent-tracking.json | 15
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs | 301 +++++++----------
项目资料/设备协议/机械手协议/~$交互流程表(1).xlsx | 0
10 files changed, 730 insertions(+), 274 deletions(-)
diff --git a/Code/.omc/state/mission-state.json b/Code/.omc/state/mission-state.json
index 82a351a..67025a1 100644
--- a/Code/.omc/state/mission-state.json
+++ b/Code/.omc/state/mission-state.json
@@ -1,5 +1,5 @@
{
- "updatedAt": "2026-04-18T07:46:50.058Z",
+ "updatedAt": "2026-04-18T08:52:24.581Z",
"missions": [
{
"id": "session:9007b9ea-1eb6-4d24-8fe7-2c3a949eac88:none",
@@ -1212,6 +1212,62 @@
"sourceKey": "session-stop:aa71986c72a8dd1f4"
}
]
+ },
+ {
+ "id": "session:78e67b30-83ce-4757-a175-68c3442c4534:none",
+ "source": "session",
+ "name": "none",
+ "objective": "Session mission",
+ "createdAt": "2026-04-18T08:34:11.529Z",
+ "updatedAt": "2026-04-18T08:52:24.581Z",
+ "status": "done",
+ "workerCount": 1,
+ "taskCounts": {
+ "total": 1,
+ "pending": 0,
+ "blocked": 0,
+ "inProgress": 0,
+ "completed": 1,
+ "failed": 0
+ },
+ "agents": [
+ {
+ "name": "general-purpose:a6a0c97",
+ "role": "general-purpose",
+ "ownership": "a6a0c97facebc27a6",
+ "status": "done",
+ "currentStep": null,
+ "latestUpdate": "completed",
+ "completedSummary": null,
+ "updatedAt": "2026-04-18T08:52:24.581Z"
+ }
+ ],
+ "timeline": [
+ {
+ "id": "session-start:a6a0c97facebc27a6:2026-04-18T08:34:11.529Z",
+ "at": "2026-04-18T08:34:11.529Z",
+ "kind": "update",
+ "agent": "general-purpose:a6a0c97",
+ "detail": "started general-purpose:a6a0c97",
+ "sourceKey": "session-start:a6a0c97facebc27a6"
+ },
+ {
+ "id": "session-stop:acc34e8d2cd052b69:2026-04-18T08:42:23.674Z",
+ "at": "2026-04-18T08:42:23.674Z",
+ "kind": "completion",
+ "agent": "general-purpose:a6a0c97",
+ "detail": "completed",
+ "sourceKey": "session-stop:acc34e8d2cd052b69"
+ },
+ {
+ "id": "session-stop:a6a0c97facebc27a6:2026-04-18T08:52:24.581Z",
+ "at": "2026-04-18T08:52:24.581Z",
+ "kind": "completion",
+ "agent": "general-purpose:a6a0c97",
+ "detail": "completed",
+ "sourceKey": "session-stop:a6a0c97facebc27a6"
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Code/.omc/state/subagent-tracking.json b/Code/.omc/state/subagent-tracking.json
index 40d7562..5ef95e2 100644
--- a/Code/.omc/state/subagent-tracking.json
+++ b/Code/.omc/state/subagent-tracking.json
@@ -758,10 +758,19 @@
"status": "completed",
"completed_at": "2026-04-18T07:46:15.279Z",
"duration_ms": 58126
+ },
+ {
+ "agent_id": "a6a0c97facebc27a6",
+ "agent_type": "general-purpose",
+ "started_at": "2026-04-18T08:34:11.529Z",
+ "parent_mode": "none",
+ "status": "completed",
+ "completed_at": "2026-04-18T08:52:24.581Z",
+ "duration_ms": 1093052
}
],
- "total_spawned": 82,
- "total_completed": 82,
+ "total_spawned": 83,
+ "total_completed": 83,
"total_failed": 0,
- "last_updated": "2026-04-18T07:46:50.164Z"
+ "last_updated": "2026-04-18T14:04:59.113Z"
}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotSocketState.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotSocketState.cs
index 66f25b9..06c8d92 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotSocketState.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotSocketState.cs
@@ -197,10 +197,11 @@
/// <remarks>
/// 闃舵瀹氫箟锛�
/// 0: 鏈紑濮�
- /// 1: 鍙栨甯哥數鑺紙娴佸悜B锛� / 鍙栧亣鐢佃姱锛堟祦鍚慉锛�
- /// 2: 鏀炬甯哥數鑺紙娴佸悜B锛� / 鏀惧亣鐢佃姱锛堟祦鍚慉锛�
- /// 3: 鍙栧亣鐢佃姱锛堟祦鍚態 Phase2锛�
- /// 4: 鏀惧亣鐢佃姱鍒�5鍙蜂綅锛堟祦鍚態 Phase2锛�
+ /// 1: 鍙栨甯哥數鑺紙涓ゆ祦鍚戠浉鍚岋級
+ /// 2: 鏀炬甯哥數鑺埌鐩爣鎵樼洏锛堜袱娴佸悜鐩稿悓锛�
+ /// 3: 娴佸悜A锛氭甯稿彇瀹屸啋绌烘墭鐩樺洖搴撯啋鍙栧亣鐢佃姱浠�5鍙蜂綅 / 娴佸悜B锛氭甯稿彇瀹屸啋鍙栧亣鐢佃姱浠庢簮鍦板潃
+ /// 4: 娴佸悜A锛氭斁鍋囩數鑺埌鐩爣鎵樼洏 / 娴佸悜B锛氭斁鍋囩數鑺埌5鍙蜂綅
+ /// 5: 娴佸悜A锛氬亣鏀惧畬鈫抋llputfinished鍏ュ簱HCSC1 / 娴佸悜B锛氬亣鍙栧畬鈫掔┖鎵樼洏鍥炲簱HCSC1+缁勭洏鍏ュ簱GWSC1
/// </remarks>
public int ChangePalletPhase { get; set; }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
index 62cb7ba..b109398 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
@@ -344,6 +344,53 @@
}
/// <summary>
+ /// 涓嬪彂鍋囩數鑺彇璐ф寚浠わ紙甯︽壒娆℃牸寮忓拰鎬绘暟锛�
+ /// </summary>
+ /// <remarks>
+ /// 鍙戦�侀『搴忥細
+ /// 1. PickTotalNum,{N} -- 鐪熷疄鐢佃姱鎬绘暟
+ /// 2. Pickbattery,5,{start}-{end} -- 鎵规鍙栬揣鎸囦护锛堝浐瀹氫粠5鍙蜂綅鍙栵級
+ ///
+ /// 涓嬪彂鎴愬姛鍚庢洿鏂颁换鍔$姸鎬佷负"鏈哄櫒浜烘墽琛屼腑"銆�
+ /// </remarks>
+ /// <param name="task">瑕佷笅鍙戠殑浠诲姟瀵硅薄</param>
+ /// <param name="state">鏈哄櫒浜哄綋鍓嶇姸鎬�</param>
+ /// <param name="batchStart">鎵规璧峰缂栧彿</param>
+ /// <param name="batchEnd">鎵规缁撴潫缂栧彿</param>
+ public async Task SendFakeBatteryPickWithBatchAsync(Dt_RobotTask task, RobotSocketState state, int batchStart, int batchEnd)
+ {
+ // 鍏堝彂閫佹�绘暟鎸囦护
+ string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}";
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
+
+ // 鍐嶅彂閫佹壒娆″彇璐ф寚浠わ紙鍋囩數鑺浐瀹氫粠5鍙蜂綅鍙栵級
+ string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
+ string taskString = $"Pickbattery,5,{range}";
+
+ bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+
+ if (result)
+ {
+ _logger.LogInformation("涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {TaskString}锛屾壒娆�: {Range}锛岃澶�: {DeviceName}",
+ taskString, range, state.RobotCrane?.DeviceName);
+ QuartzLogger.Info($"涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {taskString}锛屾壒娆�: {range}", state.RobotCrane?.DeviceName);
+
+ task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
+ state.CurrentTask = task;
+
+ if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
+ {
+ await _robotTaskService.UpdateRobotTaskAsync(task);
+ }
+ }
+ else
+ {
+ _logger.LogError("涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゅけ璐ワ紝鎸囦护: {TaskString}锛岃澶�: {DeviceName}", taskString, state.RobotCrane?.DeviceName);
+ QuartzLogger.Error($"涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゅけ璐ワ紝鎸囦护: {taskString}", state.RobotCrane?.DeviceName);
+ }
+ }
+
+ /// <summary>
/// 涓嬪彂鏀捐揣鎸囦护锛堝甫鎵规鏍煎紡鍜屾�绘暟锛�
/// </summary>
/// <remarks>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotPrefixCommandHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotPrefixCommandHandler.cs
index 691bde5..e365ffb 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotPrefixCommandHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotPrefixCommandHandler.cs
@@ -270,28 +270,47 @@
// 鎹㈢洏浠诲姟锛氭牴鎹樁娈靛尯鍒嗗鐞�
if (state.ChangePalletPhase == 2)
{
+ // Phase 2锛氭斁姝e父鐢佃姱鍒扮洰鏍囨墭鐩樺畬鎴愶紝閫掑璁℃暟
+ state.RobotTaskTotalNum += positions.Length;
+ if (task != null)
+ task.RobotTaskTotalNum -= positions.Length;
+
if (isFlowA)
{
- // 娴佸悜A Phase2锛氭斁鍋囩數鑺埌鐩爣鎵樼洏锛屼笉璋冪敤 API锛屼笉閫掑璁℃暟
- // 浠呮洿鏂扮姸鎬�
+ // 娴佸悜A锛氫笉璋冪敤 API锛屼粎閫掑璁℃暟
}
else
{
- // 娴佸悜B Phase2锛氭斁姝e父鐢佃姱锛岄�掑璁℃暟
- state.RobotTaskTotalNum += positions.Length;
- if (task != null)
- task.RobotTaskTotalNum -= positions.Length;
-
- // 鏋勫缓搴撳瓨 DTO 骞惰皟鐢� ChangePalletAsync API
+ // 娴佸悜B锛氳皟鐢ㄦ崲鐩� API
var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.ChangePalletAsync), stockDTO);
putSuccess = result.Data.Status && result.IsSuccess;
}
+
+ // 鍒囧洖 Phase 1锛岀户缁彇姝e父鐢佃姱
+ state.ChangePalletPhase = 1;
}
else if (state.ChangePalletPhase == 4)
{
- // 娴佸悜B Phase4锛氭斁鍋囩數鑺埌5鍙蜂綅锛屼笉璋冪敤 API锛屼笉閫掑璁℃暟锛岄噴鏀剧偣浣�
- _fakeBatteryPositionService.MarkAsAvailable(positions.ToList());
+ if (isFlowA)
+ {
+ // 娴佸悜A锛氭斁鍋囩數鑺埌鐩爣鎵樼洏锛岄�掑璁℃暟锛岃皟鐢ㄦ崲鐩� API
+ state.RobotTaskTotalNum += positions.Length;
+ if (task != null)
+ task.RobotTaskTotalNum -= positions.Length;
+
+ var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
+ var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.ChangePalletAsync), stockDTO);
+ putSuccess = result.Data.Status && result.IsSuccess;
+ }
+ else
+ {
+ // 娴佸悜B锛氭斁鍋囩數鑺埌5鍙蜂綅锛岄噴鏀剧偣浣�
+ _fakeBatteryPositionService.MarkAsAvailable(positions.ToList());
+ }
+
+ // 鍒囧洖 Phase 3锛岀户缁彇鍋囩數鑺�
+ state.ChangePalletPhase = 3;
}
else
{
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
index 6c13f96..cc354d5 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
@@ -143,35 +143,72 @@
// 鍒ゆ柇浠诲姟绫诲瀷
var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
- // 鎹㈢洏浠诲姟锛氫粎褰撴墍鏈夐樁娈靛畬鎴愭椂鎵嶅鐞嗗叆搴�
+ // 鎹㈢洏浠诲姟锛氭牴鎹樁娈靛尯鍒嗗鐞�
if (robotTaskType == RobotTaskTypeEnum.ChangePallet)
{
- if (state.ChangePalletPhase == 0)
+ // 璋冪敤鎵归噺鎷嗙洏纭鎺ュ彛
+ var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode;
+ var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet, state.RobotCrane?.DeviceName);
+ if (!confirmResult.IsSuccess)
{
- // 璋冪敤鎵归噺鎷嗙洏纭鎺ュ彛锛堟崲鐩樺彇瀹岄樁娈碉級
- var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode;
- var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet, state.RobotCrane?.DeviceName);
- if (!confirmResult.IsSuccess)
- {
- QuartzLogger.Error($"鎵归噺鎷嗙洏纭澶辫触: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
- }
-
- // 鎵�鏈夐樁娈靛畬鎴愶紝澶勭悊鍏ュ簱
- if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
- {
- // 鍏ュ簱鎴愬姛锛屽垹闄や换鍔¤褰�
- _taskProcessor.DeleteTask(currentTask.RobotTaskId);
- await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
- QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
-
- // 閲嶇疆鎵规鐘舵��
- state.ChangePalletPhase = 0;
- state.CurrentBatchIndex = 1;
- state.IsInFakeBatteryMode = false;
- return true;
- }
+ QuartzLogger.Error($"鎵归噺鎷嗙洏纭澶辫触: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
}
- // 涓棿闃舵涓嶅鐞嗭紝浠呮洿鏂扮姸鎬�
+
+ if (state.ChangePalletPhase == 5)
+ {
+ // FlowB 鏈�缁堥樁娈碉細鍋囩數鑺彇瀹岋紝婧愮┖鎵樼洏鍥炲簱 HCSC1
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
+ {
+ return false;
+ }
+
+ if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
+ {
+ QuartzLogger.Error($"allpickfinished锛氬垹闄や换鍔¤褰曞け璐ワ紝浠诲姟鍙�: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
+ QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
+
+ state.CurrentTask = null;
+ state.RobotTaskTotalNum = 0;
+ state.CellBarcode = new List<string>();
+ state.ChangePalletPhase = 0;
+ state.CurrentBatchIndex = 1;
+ state.IsInFakeBatteryMode = false;
+ return true;
+ }
+ else if (state.ChangePalletPhase != 0)
+ {
+ // FlowA 涓棿闃舵锛氭甯哥數鑺彇瀹岋紝婧愮┖鎵樼洏鍥炲簱 GWSC1
+ // 涓嶅垹闄や换鍔★紝涓嶉噸缃姸鎬侊紝缁х画 Phase 3-4 鍋囩數鑺祦绋�
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ // Phase == 0: 闈炴壒娆℃ā寮忥紙鐩爣鎬绘暟==48锛�
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
+ {
+ return false;
+ }
+
+ if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
+ {
+ QuartzLogger.Error($"allpickfinished锛氬垹闄や换鍔¤褰曞け璐ワ紝浠诲姟鍙�: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
+ QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
+
+ state.ChangePalletPhase = 0;
+ state.CurrentBatchIndex = 1;
+ state.IsInFakeBatteryMode = false;
return true;
}
@@ -184,16 +221,24 @@
if (!confirmResult.IsSuccess)
{
QuartzLogger.Error($"鎵归噺鎷嗙洏纭澶辫触: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
}
- if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
{
- // 鍏ュ簱鎴愬姛锛屽垹闄や换鍔¤褰�
- _taskProcessor.DeleteTask(currentTask.RobotTaskId);
- await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
- QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
- return true;
+ return false;
}
+
+ // 鍏ュ簱鎴愬姛锛屽垹闄や换鍔¤褰�
+ if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
+ {
+ QuartzLogger.Error($"allpickfinished锛氬垹闄や换鍔¤褰曞け璐ワ紝浠诲姟鍙�: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
+ QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
+ return true;
}
return false;
}
@@ -214,41 +259,77 @@
// 鍒ゆ柇浠诲姟绫诲瀷
var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType;
- // 鎹㈢洏浠诲姟锛氫粎褰撴墍鏈夐樁娈靛畬鎴愭椂鎵嶅鐞嗗叆搴�
+ // 鎹㈢洏浠诲姟锛氭牴鎹樁娈靛尯鍒嗗鐞�
if (robotTaskType == RobotTaskTypeEnum.ChangePallet)
{
- if (state.ChangePalletPhase == 0)
+ // 璋冪敤鎵归噺缁勭洏纭鎺ュ彛
+ var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode;
+ var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet, state.RobotCrane?.DeviceName);
+ if (!confirmResult.IsSuccess)
{
- // 璋冪敤鎵归噺缁勭洏纭鎺ュ彛锛堟崲鐩樻斁瀹岄樁娈碉級
- var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode;
- var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet, state.RobotCrane?.DeviceName);
- if (!confirmResult.IsSuccess)
- {
- QuartzLogger.Error($"鎵归噺缁勭洏纭澶辫触: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
- }
-
- // 鎵�鏈夐樁娈靛畬鎴愶紝澶勭悊鍏ュ簱
- if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
- {
- // 鍏ュ簱鎴愬姛锛屽垹闄や换鍔¤褰�
- _taskProcessor.DeleteTask(currentTask.RobotTaskId);
-
- // 娓呯悊鐘舵�侊紝涓轰笅涓�涓换鍔″仛鍑嗗
- state.CurrentTask = null; // 娓呴櫎褰撳墠浠诲姟
- state.RobotTaskTotalNum = 0; // 閲嶇疆浠诲姟璁℃暟
- state.CellBarcode = new List<string>(); // 娓呯┖鏉$爜鍒楄〃
-
- await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished");
- QuartzLogger.Info($"鍙戦�佹秷鎭細銆怗roup,diskFinished銆�", state.RobotCrane.DeviceName);
-
- // 閲嶇疆鎵规鐘舵��
- state.ChangePalletPhase = 0;
- state.CurrentBatchIndex = 1;
- state.IsInFakeBatteryMode = false;
- return true;
- }
+ QuartzLogger.Error($"鎵归噺缁勭洏纭澶辫触: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
}
- // 涓棿闃舵涓嶅鐞嗭紝浠呮洿鏂扮姸鎬�
+
+ if (state.ChangePalletPhase == 5)
+ {
+ // FlowA 鏈�缁堥樁娈碉細鍋囩數鑺斁瀹岋紝鐩爣鎵樼洏婊�48鍏ュ簱 HCSC1
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
+ {
+ return false;
+ }
+
+ if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
+ {
+ QuartzLogger.Error($"allputfinished锛氬垹闄や换鍔¤褰曞け璐ワ紝浠诲姟鍙�: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
+
+ state.CurrentTask = null;
+ state.RobotTaskTotalNum = 0;
+ state.CellBarcode = new List<string>();
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
+ QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
+
+ state.ChangePalletPhase = 0;
+ state.CurrentBatchIndex = 1;
+ state.IsInFakeBatteryMode = false;
+ return true;
+ }
+ else if (state.ChangePalletPhase != 0)
+ {
+ // FlowB 涓棿闃舵锛氭甯哥數鑺斁瀹岋紝鏈夎揣鎵樼洏缁勭洏鍏ュ簱 GWSC1
+ // 涓嶅垹闄や换鍔★紝涓嶉噸缃姸鎬侊紝缁х画 Phase 3-4 鍋囩數鑺祦绋�
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ // Phase == 0: 闈炴壒娆℃ā寮忥紙鐩爣鎬绘暟==48锛�
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
+ {
+ return false;
+ }
+
+ if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
+ {
+ QuartzLogger.Error($"allputfinished锛氬垹闄や换鍔¤褰曞け璐ワ紝浠诲姟鍙�: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
+
+ state.CurrentTask = null;
+ state.RobotTaskTotalNum = 0;
+ state.CellBarcode = new List<string>();
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished");
+ QuartzLogger.Info($"鍙戦�佹秷鎭細銆怱wap,diskFinished銆�", state.RobotCrane.DeviceName);
+
+ state.ChangePalletPhase = 0;
+ state.CurrentBatchIndex = 1;
+ state.IsInFakeBatteryMode = false;
return true;
}
@@ -256,25 +337,36 @@
if (robotTaskType == RobotTaskTypeEnum.GroupPallet)
{
// 璋冪敤鎵归噺缁勭洏纭鎺ュ彛
- //var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode;
- //_taskProcessor.PostGroupPalletConfirmAsync(targetPallet, state.RobotCrane?.DeviceName);
+ var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode;
+ var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet, state.RobotCrane?.DeviceName);
+ if (!confirmResult.IsSuccess)
+ {
+ QuartzLogger.Error($"鎵归噺缁勭洏纭澶辫触: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
// 澶勭悊鍏ュ簱浠诲姟鍥炰紶
// useSourceAddress: false 琛ㄧず浣跨敤鐩爣鍦板潃锛堢粍鐩樺満鏅級
- if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
+ if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
{
- // 鍏ュ簱鎴愬姛锛屽垹闄や换鍔¤褰�
- _taskProcessor.DeleteTask(currentTask.RobotTaskId);
-
- // 娓呯悊鐘舵�侊紝涓轰笅涓�涓换鍔″仛鍑嗗
- state.CurrentTask = null; // 娓呴櫎褰撳墠浠诲姟
- state.RobotTaskTotalNum = 0; // 閲嶇疆浠诲姟璁℃暟
- state.CellBarcode = new List<string>(); // 娓呯┖鏉$爜鍒楄〃
-
- await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished");
- QuartzLogger.Info($"鍙戦�佹秷鎭細銆怗roup,diskFinished銆�", state.RobotCrane.DeviceName);
- return true;
+ return false;
}
+
+ // 鍏ュ簱鎴愬姛锛屽垹闄や换鍔¤褰�
+ if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
+ {
+ QuartzLogger.Error($"allputfinished锛氬垹闄や换鍔¤褰曞け璐ワ紝浠诲姟鍙�: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ return false;
+ }
+
+ // 娓呯悊鐘舵�侊紝涓轰笅涓�涓换鍔″仛鍑嗗
+ state.CurrentTask = null; // 娓呴櫎褰撳墠浠诲姟
+ state.RobotTaskTotalNum = 0; // 閲嶇疆浠诲姟璁℃暟
+ state.CellBarcode = new List<string>(); // 娓呯┖鏉$爜鍒楄〃
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished");
+ QuartzLogger.Info($"鍙戦�佹秷鎭細銆怗roup,diskFinished銆�", state.RobotCrane.DeviceName);
+ return true;
}
return false;
}
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 05f2357..fbb989d 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -166,7 +166,7 @@
var state = _stateManager.GetState(ipAddress);
- // 鎹㈢洏浠诲姟浣跨敤鎵规鏍煎紡
+ // 鎹㈢洏浠诲姟鎵规妯″紡
if (task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode())
{
int targetNormalCount = task.RobotTaskTotalNum;
@@ -174,78 +174,94 @@
bool isFlowA = task.RobotSourceAddressLineCode is "11001" or "11010";
- // 娴佸悜A Phase 2锛氭斁鍋囩數鑺埌鐩爣鎵樼洏
- if (isFlowA && state?.ChangePalletPhase == 2)
+ // ==================== Phase 2: 鏀炬甯哥數鑺埌鐩爣鎵樼洏锛堜袱娴佸悜鐩稿悓锛�====================
+ // PickFinished 鍒拌揪锛歅hase 1 鐨� Pick 鍛戒护瀹屾垚锛岀幇鍦ㄤ笅鍙� Put 鍛戒护鏀炬甯哥數鑺�
+ if (state?.ChangePalletPhase == 2)
{
- int remaining = 48 - currentCompletedCount;
- if (remaining <= 0) return;
+ int remainingNormal = targetNormalCount - currentCompletedCount;
+ if (remainingNormal <= 0)
+ {
+ // 姝e父鐢佃姱鍏ㄩ儴鏀惧畬锛岀瓑寰� HandlePutFinishedAsync 鍒囨崲鍒� Phase 3
+ return;
+ }
- int batchStart = targetNormalCount + 1 + (state.CurrentBatchIndex - 1);
- int putCount = Math.Min(4, remaining);
+ int batchStart = (currentCompletedCount / 4) * 4 + 1;
+ int putCount = Math.Min(4, remainingNormal);
var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount);
await _taskProcessor.SendPutWithBatchAsync(task, state, task.RobotTargetAddress, start, end);
+
+ // Phase 淇濇寔涓� 2锛岀瓑 HandlePutFinishedAsync 澶勭悊瀹屾斁璐ц鏁板悗鍐嶅垏鍥� Phase 1
+ _stateManager.TryUpdateStateSafely(ipAddress, state);
return;
}
- // 娴佸悜B Phase 4锛氭斁鍋囩數鑺埌5鍙蜂綅
- if (!isFlowA && state?.ChangePalletPhase == 4)
+ // ==================== Phase 4: 鏀惧亣鐢佃姱锛堜袱娴佸悜鍒嗗弶锛�====================
+ // PickFinished 鍒拌揪锛歅hase 3 鐨� Pick 鍛戒护瀹屾垚锛岀幇鍦ㄤ笅鍙� Put 鍛戒护鏀惧亣鐢佃姱
+ if (state?.ChangePalletPhase == 4)
{
int fakeCount = 48 - targetNormalCount;
int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount);
int remainingFake = fakeCount - completedFake;
- if (remainingFake <= 0) return;
-
- var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake));
- if (positions.Count == 0)
+ if (remainingFake <= 0)
{
- _logger.LogError("HandlePickFinishedStateAsync锛氭棤鍙敤鍋囩數鑺偣浣嶏紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ // 鍋囩數鑺叏閮ㄦ斁瀹岋紝绛夊緟 allputfinished 瑙﹀彂 Phase 5 鍏ュ簱
return;
}
- int start = positions.Min();
- int end = positions.Max();
-
- await _taskProcessor.SendPutWithBatchAsync(task, state, "5", start, end);
- return;
- }
-
- // 娴佸悜B Phase 2锛氭斁姝e父鐢佃姱鍒扮洰鏍囨墭鐩�
- if (!isFlowA && state?.ChangePalletPhase == 2)
- {
- int remainingNormal = targetNormalCount - currentCompletedCount;
- if (remainingNormal <= 0) return;
-
- int batchStart = ((currentCompletedCount - 1) / 4) * 4 + 1;
- int putCount = Math.Min(4, remainingNormal);
- var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount);
-
- await _taskProcessor.SendPutWithBatchAsync(task, state, task.RobotTargetAddress, start, end);
- return;
- }
-
- // 榛樿锛氫娇鐢ㄥ師鏈夋牸寮�
- taskString = $"Putbattery,{task.RobotTargetAddress}";
- }
- else
- {
- // 闈炴崲鐩樹换鍔★細浣跨敤鍘熸湁鏍煎紡
- if (state != null && state.IsGroupPallet && task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode())
- {
- // 缁勭洏浠诲姟锛氭斁璐ч渶鍒ゆ柇鏄惁NG锛屽鏋淣G鍒欐斁鍒癗G鍙�
- if (state.IsScanNG)
+ if (isFlowA)
{
- taskString = $"Putbattery,4";
+ // 娴佸悜A锛氭斁鍋囩數鑺埌鐩爣鎵樼洏
+ int batchStart = targetNormalCount + 1 + (state.CurrentBatchIndex - 1);
+ int putCount = Math.Min(4, remainingFake);
+ var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount);
+
+ await _taskProcessor.SendPutWithBatchAsync(task, state, task.RobotTargetAddress, start, end);
+
+ state.CurrentBatchIndex += putCount;
+ // Phase 淇濇寔涓� 4锛岀瓑 HandlePutFinishedAsync 澶勭悊瀹屽悗鍐嶅垏鍥� Phase 3
+ _stateManager.TryUpdateStateSafely(ipAddress, state);
}
else
{
- taskString = $"Putbattery,{task.RobotTargetAddress}";
+ // 娴佸悜B锛氭斁鍋囩數鑺埌5鍙蜂綅
+ var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake));
+ if (positions.Count == 0)
+ {
+ _logger.LogError("HandlePickFinishedStateAsync锛氭棤鍙敤鍋囩數鑺偣浣嶏紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ return;
+ }
+
+ int start = positions.Min();
+ int end = positions.Max();
+
+ await _taskProcessor.SendPutWithBatchAsync(task, state, "5", start, end);
+
+ // Phase 淇濇寔涓� 4锛岀瓑 HandlePutFinishedAsync 澶勭悊瀹屽悗鍐嶅垏鍥� Phase 3
+ _stateManager.TryUpdateStateSafely(ipAddress, state);
}
+ return;
+ }
+
+ // 闈炴壒娆℃ā寮忔垨鍏朵粬闃舵涓嶄笅鍙戞寚浠�
+ return;
+ }
+
+ // 闈炴崲鐩樹换鍔★細浣跨敤鍘熸湁鏍煎紡
+ if (state != null && state.IsGroupPallet && task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode())
+ {
+ if (state.IsScanNG)
+ {
+ taskString = $"Putbattery,4";
}
else
+ {
taskString = $"Putbattery,{task.RobotTargetAddress}";
+ }
}
+ else
+ taskString = $"Putbattery,{task.RobotTargetAddress}";
bool result = await _clientManager.SendToClientAsync(ipAddress, taskString);
@@ -376,7 +392,9 @@
else if (task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode())
{
const int targetTotal = 48;
+ // 鎹㈢洏浠诲姟杩涘叆鎵规妯″紡锛屽垎闃舵澶勭悊姝e父鐢佃姱鍜屽亣鐢佃姱 锛堟満鍣ㄤ汉浠诲姟鎬绘暟锛�
int targetNormalCount = task.RobotTaskTotalNum;
+ // 褰撳墠宸插畬鎴愭暟閲忥紙鍙栬揣瀹屾垚鐨勬暟閲忥級锛屽垵濮嬩负鐘舵�佷腑鐨� RobotTaskTotalNum锛屽悗缁牴鎹彇璐у畬鎴愮殑鏁伴噺鍔ㄦ�佹洿鏂�
int currentCompletedCount = stateForUpdate.RobotTaskTotalNum;
// 鍒ゆ柇娴佸悜锛坣ull-safe锛�
@@ -396,159 +414,82 @@
stateForUpdate.CurrentBatchIndex = 1;
_logger.LogInformation("HandlePutFinishedStateAsync锛氭崲鐩樹换鍔¤繘鍏ユ壒娆℃ā寮忥紝浠诲姟鍙�: {TaskNum}锛屾祦鍚�: {Flow}",
task.RobotTaskNum, isFlowA ? "A" : "B");
+ _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate);
}
- // ==================== 娴佸悜A锛氳ˉ鍋囩數鑺埌鐩爣鎵樼洏 ====================
- if (isFlowA)
+ // ==================== Phase 1: 鍙栨甯哥數鑺紙涓ゆ祦鍚戠浉鍚岋級====================
+ if (stateForUpdate.ChangePalletPhase == 1)
{
- // Phase 1: 鍙栧亣鐢佃姱锛堜粠5鍙蜂綅锛屼娇鐢� PositionIndex锛�
- if (stateForUpdate.ChangePalletPhase == 1)
+ int remainingNormal = targetNormalCount - currentCompletedCount;
+ if (remainingNormal <= 0)
{
- int remaining = targetTotal - currentCompletedCount;
- if (remaining <= 0)
- {
- stateForUpdate.ChangePalletPhase = 0;
- stateForUpdate.CurrentBatchIndex = 1;
- stateForUpdate.IsInFakeBatteryMode = false;
- _logger.LogInformation("HandlePutFinishedStateAsync锛氭祦鍚慉瀹屾垚锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
- return;
- }
-
- int pickCount = Math.Min(4, remaining);
- var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(pickCount);
- if (positions.Count == 0)
- {
- _logger.LogError("HandlePutFinishedStateAsync锛氭棤鍙敤鍋囩數鑺偣浣嶏紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
- return;
- }
-
- await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions);
- stateForUpdate.ChangePalletPhase = 2;
+ // 姝e父鐢佃姱鍙栧畬锛屽垏鎹㈠埌 Phase 3 鍙栧亣鐢佃姱
+ stateForUpdate.ChangePalletPhase = 3;
+ stateForUpdate.CurrentBatchIndex = 1; // 鍋囩數鑺壒娆′粠澶村紑濮�
+ _logger.LogInformation("HandlePutFinishedStateAsync锛氭甯哥數鑺彇瀹岋紝鍒囨崲鍒癙hase 3鍙栧亣鐢佃姱锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
+ _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate);
+ return;
}
- // Phase 2: 鏀惧亣鐢佃姱鍒扮洰鏍囨墭鐩橈紙浠� targetNormalCount+1 寮�濮嬮�掑锛�
- else if (stateForUpdate.ChangePalletPhase == 2)
- {
- int remaining = targetTotal - currentCompletedCount;
- if (remaining <= 0)
- {
- stateForUpdate.ChangePalletPhase = 0;
- stateForUpdate.CurrentBatchIndex = 1;
- stateForUpdate.IsInFakeBatteryMode = false;
- _logger.LogInformation("HandlePutFinishedStateAsync锛氭祦鍚慉瀹屾垚锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
- return;
- }
- // 璁$畻鏀捐揣鎵规缂栧彿锛氫粠 targetNormalCount + 1 寮�濮�
- int batchStart = targetNormalCount + 1 + (stateForUpdate.CurrentBatchIndex - 1);
- int putCount = Math.Min(4, remaining);
- var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount);
+ int pickCount = Math.Min(4, remainingNormal);
+ var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount);
- await _taskProcessor.SendPutWithBatchAsync(task, stateForUpdate, task.RobotTargetAddress, start, end);
+ await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end);
- stateForUpdate.CurrentBatchIndex += putCount;
- stateForUpdate.ChangePalletPhase = 1;
- }
+ stateForUpdate.CurrentBatchIndex += pickCount;
+ // 鍙戝畬 Pick 鍚庡垏鎹㈠埌 Phase=2锛岀瓑 PickFinished 瑙﹀彂 HandlePickFinishedStateAsync 涓嬪彂鏀捐揣鎸囦护
+ stateForUpdate.ChangePalletPhase = 2;
+ _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate);
+ return;
}
- // ==================== 娴佸悜B锛氬彇姝e父鐢佃姱 + 鍥炴敹鍋囩數鑺� ====================
- else
+
+ // ==================== Phase 3: 澶勭悊鍋囩數鑺紙娴佸悜A/B 鍒嗗弶锛夛紝鑷繁寰幆 ====================
+ if (stateForUpdate.ChangePalletPhase == 3)
{
- // Phase 1: 鍙栨甯哥數鑺紙浠庢簮鍦板潃锛屼粠1寮�濮嬮�掑锛�
- if (stateForUpdate.ChangePalletPhase == 1)
+ int fakeCount = targetTotal - targetNormalCount;
+ int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount);
+ int remainingFake = fakeCount - completedFake;
+
+ if (remainingFake <= 0)
{
- int remainingNormal = targetNormalCount - currentCompletedCount;
- if (remainingNormal <= 0)
- {
- // 姝e父鐢佃姱鍙栧畬锛屽垏鎹㈠埌 Phase 3
- stateForUpdate.ChangePalletPhase = 3;
- stateForUpdate.CurrentBatchIndex = targetNormalCount + 1;
- _logger.LogInformation("HandlePutFinishedStateAsync锛氭甯哥數鑺叏閮ㄥ彇瀹岋紝杩涘叆Phase 3鍥炴敹鍋囩數鑺紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
- return;
- }
-
- int pickCount = Math.Min(4, remainingNormal);
- var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount);
-
- await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end);
-
- stateForUpdate.CurrentBatchIndex += pickCount;
- stateForUpdate.ChangePalletPhase = 2;
+ // 鍋囩數鑺叏閮ㄥ鐞嗗畬锛屽垏鎹㈠埌 Phase 5 绛夊緟鍏ュ簱
+ stateForUpdate.ChangePalletPhase = 5;
+ _logger.LogInformation("HandlePutFinishedStateAsync锛氬亣鐢佃姱澶勭悊瀹屾瘯锛屽垏鎹㈠埌Phase 5绛夊緟鍏ュ簱锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
+ _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate);
+ return;
}
- // Phase 2: 鏀炬甯哥數鑺埌鐩爣鎵樼洏锛堟斁璐х紪鍙蜂笌鍙栬揣缂栧彿涓�鑷达級
- else if (stateForUpdate.ChangePalletPhase == 2)
+
+ if (isFlowA)
{
- int remainingNormal = targetNormalCount - currentCompletedCount;
- if (remainingNormal <= 0)
- {
- // 姝e父鐢佃姱鏀惧畬锛屽垏鎹㈠埌 Phase 3
- stateForUpdate.ChangePalletPhase = 3;
- stateForUpdate.CurrentBatchIndex = targetNormalCount + 1;
- _logger.LogInformation("HandlePutFinishedStateAsync锛氭甯哥數鑺叏閮ㄦ斁瀹岋紝杩涘叆Phase 3鍥炴敹鍋囩數鑺紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
- return;
- }
-
- // 璁$畻鏈壒鏀捐揣缂栧彿锛氬熀浜� currentCompletedCount 鎺ㄥ鎵规璧峰
- int batchStart = ((currentCompletedCount - 1) / 4) * 4 + 1;
- int putCount = Math.Min(4, remainingNormal);
- var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount);
-
- await _taskProcessor.SendPutWithBatchAsync(task, stateForUpdate, task.RobotTargetAddress, start, end);
-
- stateForUpdate.ChangePalletPhase = 1;
- }
- // Phase 3: 鍙栧亣鐢佃姱锛堜粠婧愬湴鍧�锛屼粠 targetNormalCount+1 寮�濮嬮�掑锛�
- else if (stateForUpdate.ChangePalletPhase == 3)
- {
- int fakeCount = targetTotal - targetNormalCount;
- int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount);
- int remainingFake = fakeCount - completedFake;
-
- if (remainingFake <= 0)
- {
- stateForUpdate.ChangePalletPhase = 0;
- stateForUpdate.CurrentBatchIndex = 1;
- stateForUpdate.IsInFakeBatteryMode = false;
- _logger.LogInformation("HandlePutFinishedStateAsync锛氭祦鍚態瀹屾垚锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
- return;
- }
-
- int pickCount = Math.Min(4, remainingFake);
- var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount);
-
- await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end);
-
- stateForUpdate.CurrentBatchIndex += pickCount;
- stateForUpdate.ChangePalletPhase = 4;
- }
- // Phase 4: 鏀惧亣鐢佃姱鍒�5鍙蜂綅锛堜娇鐢� PositionIndex锛�
- else if (stateForUpdate.ChangePalletPhase == 4)
- {
- int fakeCount = targetTotal - targetNormalCount;
- int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount);
- int remainingFake = fakeCount - completedFake;
-
- if (remainingFake <= 0)
- {
- stateForUpdate.ChangePalletPhase = 0;
- stateForUpdate.CurrentBatchIndex = 1;
- stateForUpdate.IsInFakeBatteryMode = false;
- _logger.LogInformation("HandlePutFinishedStateAsync锛氭祦鍚態瀹屾垚锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
- return;
- }
-
+ // 娴佸悜A锛氫粠5鍙蜂綅鍙栧亣鐢佃姱
var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake));
if (positions.Count == 0)
{
_logger.LogError("HandlePutFinishedStateAsync锛氭棤鍙敤鍋囩數鑺偣浣嶏紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
return;
}
-
- int start = positions.Min();
- int end = positions.Max();
-
- await _taskProcessor.SendPutWithBatchAsync(task, stateForUpdate, "5", start, end);
-
- stateForUpdate.ChangePalletPhase = 3;
+ await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions);
}
+ else
+ {
+ // 娴佸悜B锛氫粠婧愬湴鍧�鍙栧亣鐢佃姱
+ int pickCount = Math.Min(4, remainingFake);
+ var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount);
+ await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end);
+ stateForUpdate.CurrentBatchIndex += pickCount;
+ }
+
+ // 鍙戝畬 Pick 鍚庡垏鎹㈠埌 Phase=4锛岀瓑 PickFinished 瑙﹀彂 HandlePickFinishedStateAsync 涓嬪彂鏀捐揣鎸囦护
+ stateForUpdate.ChangePalletPhase = 4;
+ _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate);
+ return;
+ }
+
+ // ==================== Phase 5: 瀹屾垚鍏ュ簱锛坅llputfinished / allpickfinished 瑙﹀彂锛�====================
+ if (stateForUpdate.ChangePalletPhase == 5)
+ {
+ // Phase 5 鐢� allpickfinished/allputfinished 瑙﹀彂鍏ュ簱锛屾湰鏂规硶涓嶅啀涓嬪彂鎸囦护
+ return;
}
}
else
diff --git "a/Code/WCS/WIDESEAWCS_Server/docs/\346\215\242\347\233\230\344\273\273\345\212\241\346\265\201\347\250\213\345\233\276.md" "b/Code/WCS/WIDESEAWCS_Server/docs/\346\215\242\347\233\230\344\273\273\345\212\241\346\265\201\347\250\213\345\233\276.md"
new file mode 100644
index 0000000..2defd1b
--- /dev/null
+++ "b/Code/WCS/WIDESEAWCS_Server/docs/\346\215\242\347\233\230\344\273\273\345\212\241\346\265\201\347\250\213\345\233\276.md"
@@ -0,0 +1,291 @@
+# 鎹㈢洏浠诲姟瀹屾暣娴佺▼鍒嗘瀽
+
+## 浠诲姟鍙傛暟
+
+| 鍙傛暟 | 鍊� |
+|------|-----|
+| 娴佸悜 | **Flow A** (isFlowA = true, 婧愬湴鍧� LineCode = "11001") |
+| 婧愬湴鍧� | 11001 |
+| 鐩爣鍦板潃 | 2101 |
+| 姝e父鐢佃姱鏁伴噺 | **33** |
+| 鍋囩數鑺暟閲� | 48 - 33 = **15** |
+| 鐩爣鎬绘暟 | 48 |
+
+---
+
+## 闃舵鐘舵�佸畾涔�
+
+| Phase | 鍚箟 |
+|-------|------|
+| 0 | 鏈紑濮� |
+| 1 | 鍙栨甯哥數鑺� |
+| 2 | 鏀炬甯哥數鑺� |
+| 3 | 鍙栧亣鐢佃姱锛團low A: 浠�5鍙蜂綅鍙栵級 |
+| 4 | 鏀惧亣鐢佃姱锛團low A: 鏀惧埌鐩爣鎵樼洏锛� |
+| 5 | 绛夊緟鍏ュ簱瀹屾垚 |
+
+---
+
+## 瀹屾暣浠g爜鎵ц娴佺▼锛�33 姝e父 + 15 鍋� = 48 鎬昏锛�
+
+### 鍒濆鐘舵��
+
+```
+ChangePalletPhase = 0
+currentCompletedCount = 0
+targetNormalCount = 33
+```
+
+---
+
+### 绗�1杞細Pick 1-4 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 1 | HandlePutFinishedStateAsync | 1 | 0 | 33 - 0 = **33** | PickBatch(1, 4) 鈫� Phase=2 |
+| 2 | (鏈烘鎵嬫墽琛屽彇璐�) | - | - | - | - |
+| 3 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished, task鐘舵��=RobotPickFinish |
+| 4 | HandlePickFinishedStateAsync | 2 | 0 | 33 - 0 = **33** | PutBatch(1, 4) 鈫� Phase=1 |
+| 5 | (鏈烘鎵嬫墽琛屾斁璐�) | - | - | - | - |
+| 6 | HandlePutFinishedAsync | - | **4** | - | currentCompletedCount+=4, task.RobotTaskTotalNum-=4 |
+
+---
+
+### 绗�2杞細Pick 5-8 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 7 | HandlePutFinishedStateAsync | 1 | 4 | 33 - 4 = **29** | PickBatch(5, 8) 鈫� Phase=2 |
+| 8 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 9 | HandlePickFinishedStateAsync | 2 | 4 | 33 - 4 = **29** | PutBatch(1, 4) 鈫� Phase=1 |
+| 10 | HandlePutFinishedAsync | - | **8** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�3杞細Pick 9-12 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 11 | HandlePutFinishedStateAsync | 1 | 8 | 33 - 8 = **25** | PickBatch(9, 12) 鈫� Phase=2 |
+| 12 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 13 | HandlePickFinishedStateAsync | 2 | 8 | 33 - 8 = **25** | PutBatch(1, 4) 鈫� Phase=1 |
+| 14 | HandlePutFinishedAsync | - | **12** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�4杞細Pick 13-16 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 15 | HandlePutFinishedStateAsync | 1 | 12 | 33 - 12 = **21** | PickBatch(13, 16) 鈫� Phase=2 |
+| 16 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 17 | HandlePickFinishedStateAsync | 2 | 12 | 33 - 12 = **21** | PutBatch(1, 4) 鈫� Phase=1 |
+| 18 | HandlePutFinishedAsync | - | **16** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�5杞細Pick 17-20 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 19 | HandlePutFinishedStateAsync | 1 | 16 | 33 - 16 = **17** | PickBatch(17, 20) 鈫� Phase=2 |
+| 20 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 21 | HandlePickFinishedStateAsync | 2 | 16 | 33 - 16 = **17** | PutBatch(1, 4) 鈫� Phase=1 |
+| 22 | HandlePutFinishedAsync | - | **20** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�6杞細Pick 21-24 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 23 | HandlePutFinishedStateAsync | 1 | 20 | 33 - 20 = **13** | PickBatch(21, 24) 鈫� Phase=2 |
+| 24 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 25 | HandlePickFinishedStateAsync | 2 | 20 | 33 - 20 = **13** | PutBatch(1, 4) 鈫� Phase=1 |
+| 26 | HandlePutFinishedAsync | - | **24** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�7杞細Pick 25-28 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 27 | HandlePutFinishedStateAsync | 1 | 24 | 33 - 24 = **9** | PickBatch(25, 28) 鈫� Phase=2 |
+| 28 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 29 | HandlePickFinishedStateAsync | 2 | 24 | 33 - 24 = **9** | PutBatch(1, 4) 鈫� Phase=1 |
+| 30 | HandlePutFinishedAsync | - | **28** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�8杞細Pick 29-32 姝e父鐢佃姱
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 31 | HandlePutFinishedStateAsync | 1 | 28 | 33 - 28 = **5** | PickBatch(29, 32) 鈫� Phase=2 |
+| 32 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 33 | HandlePickFinishedStateAsync | 2 | 28 | 33 - 28 = **5** | PutBatch(1, 4) 鈫� Phase=1 |
+| 34 | HandlePutFinishedAsync | - | **32** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�9杞細Pick 33 姝e父鐢佃姱锛堟渶鍚�1涓級
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 35 | HandlePutFinishedStateAsync | 1 | 32 | 33 - 32 = **1** | PickBatch(33, 33) 鈫� Phase=2 |
+| 36 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 37 | HandlePickFinishedStateAsync | 2 | 32 | 33 - 32 = **1** | PutBatch(33, 33) 鈫� Phase=1 |
+| 38 | HandlePutFinishedAsync | - | **33** | - | currentCompletedCount+=1 |
+
+---
+
+### 绗�10杞細姝e父鐢佃姱鍏ㄩ儴瀹屾垚 鈫� 鍒囨崲 Phase 3
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingNormal | 鎿嶄綔 |
+|------|------|-------|---------------------|----------------|------|
+| 39 | HandlePutFinishedStateAsync | 1 | **33** | 33 - 33 = **0** 鈫� 鈮�0 | **鍒囨崲 Phase=3**, Pick fake from 5鍙蜂綅 |
+
+> **Flow A 鐗规��**锛氭甯哥數鑺彇瀹屽悗锛屾簮鎵樼洏锛�11001锛夊凡绌恒�傛鏃舵満姊版墜鎼哄甫鏈�鍚庝竴鎵规甯哥數鑺斁鍒扮洰鏍囨墭鐩樺悗锛屾簮鎵樼洏鑷姩绌哄嚭鍥炲簱銆備唬鐮佷腑涓嶉渶瑕佹樉寮忓鐞嗚繖涓洖搴撳姩浣溾�斺�旂敱杈撻�佺嚎鑷姩瀹屾垚銆�
+
+---
+
+### 绗�11杞細Pick 1-4 鍋囩數鑺紙浠�5鍙蜂綅锛�
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingFake | 鎿嶄綔 |
+|------|------|-------|---------------------|--------------|------|
+| 40 | HandlePutFinishedStateAsync | 3 | 33 | 15 - 0 = **15** | Pick fake from 5鍙蜂綅(1,4) 鈫� Phase=4 |
+| 41 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 42 | HandlePickFinishedStateAsync | 4 | 33 | 15 - 0 = **15** | Put fake to target(BatchStart=34, 4涓�) 鈫� Phase=3 |
+| 43 | HandlePutFinishedAsync | - | **37** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�12杞細Pick 5-8 鍋囩數鑺�
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingFake | 鎿嶄綔 |
+|------|------|-------|---------------------|--------------|------|
+| 44 | HandlePutFinishedStateAsync | 3 | 37 | 15 - 4 = **11** | Pick fake from 5鍙蜂綅(5,8) 鈫� Phase=4 |
+| 45 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 46 | HandlePickFinishedStateAsync | 4 | 37 | 15 - 4 = **11** | Put fake to target(BatchStart=38, 4涓�) 鈫� Phase=3 |
+| 47 | HandlePutFinishedAsync | - | **41** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�13杞細Pick 9-12 鍋囩數鑺�
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingFake | 鎿嶄綔 |
+|------|------|-------|---------------------|--------------|------|
+| 48 | HandlePutFinishedStateAsync | 3 | 41 | 15 - 8 = **7** | Pick fake from 5鍙蜂綅(9,12) 鈫� Phase=4 |
+| 49 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 50 | HandlePickFinishedStateAsync | 4 | 41 | 15 - 8 = **7** | Put fake to target(BatchStart=42, 4涓�) 鈫� Phase=3 |
+| 51 | HandlePutFinishedAsync | - | **45** | - | currentCompletedCount+=4 |
+
+---
+
+### 绗�14杞細Pick 13-15 鍋囩數鑺紙鏈�鍚�3涓級
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingFake | 鎿嶄綔 |
+|------|------|-------|---------------------|--------------|------|
+| 52 | HandlePutFinishedStateAsync | 3 | 45 | 15 - 12 = **3** | Pick fake from 5鍙蜂綅(13,15) 鈫� Phase=4 |
+| 53 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished |
+| 54 | HandlePickFinishedStateAsync | 4 | 45 | 15 - 12 = **3** | Put fake to target(BatchStart=46, 3涓�) 鈫� Phase=3 |
+| 55 | HandlePutFinishedAsync | - | **48** | - | currentCompletedCount+=3 |
+
+---
+
+### 绗�15杞細鍋囩數鑺叏閮ㄥ畬鎴� 鈫� 鍒囨崲 Phase 5
+
+| 姝ラ | 鏂规硶 | Phase | currentCompletedCount | remainingFake | 鎿嶄綔 |
+|------|------|-------|---------------------|--------------|------|
+| 56 | HandlePutFinishedStateAsync | 3 | **48** | 15 - 15 = **0** 鈫� 鈮�0 | **鍒囨崲 Phase=5**, 绛夊緟鍏ュ簱 |
+
+---
+
+### 绗�16杞細鍏ㄩ儴鏀捐揣瀹屾垚 鈫� 鍏ュ簱
+
+| 姝ラ | 鏂规硶 | Phase | 鎿嶄綔 |
+|------|------|-------|------|
+| 57 | HandlePutFinishedAsync | - | PutFinished 鈫� allputfinished |
+| 58 | ExecuteAsync | - | 妫�娴� allputfinished 鈫� RobotSimpleCommandHandler 澶勭悊 |
+| 59 | RobotSimpleCommandHandler | **5** | Phase=5 鈫� 璋冪敤 HandleInboundTaskAsync(useSourceAddress=false) 鍏ュ簱鍒� **HCSC1** |
+| 60 | - | - | 鍒犻櫎浠诲姟璁板綍锛岄噸缃姸鎬侊紝鍙戦�� "Group,diskFinished" |
+
+---
+
+## 鏁版嵁娴佹眹鎬�
+
+### currentCompletedCount 鍙樺寲
+
+```
+0 鈫� 4 鈫� 8 鈫� 12 鈫� 16 鈫� 20 鈫� 24 鈫� 28 鈫� 32 鈫� 33 鈫� 37 鈫� 41 鈫� 45 鈫� 48
+ | | | | | | | | | | | | | |
+ 姝e父鐢佃姱鎵规 姝e父瀹屾垚 鍋囩數鑺壒娆� 鎬诲畬鎴�
+ (姣忔壒4涓�) +0 (姣忔壒4涓�) +3
+```
+
+### Phase 鍒囨崲鍥�
+
+```
+Phase=0 鈹�鈹�(鍒濆鍖�)鈹�鈹�鈻� Phase=1 鈹�鈹�鈻� Phase=2 鈹�鈹�鈻� Phase=1 鈹�鈹�鈻� ... 鈹�鈹�鈻� Phase=1
+ (Pick 1-4) (Put 1-4) (Pick 5-8) (Pick 33)
+ 鈫�
+ Phase=2 鈹�鈹�鈻� ... 鈹�鈹�鈻� Phase=2
+ (Put 5-8) (Put 33)
+ 鈫�
+ 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ 鈹� Phase=1 (remainingNormal=0) 鈹�
+ 鈹� 鈫� 鈹�
+ 鈹� Phase=3 (鍙栧亣鐢佃姱) 鈹�
+ 鈹� Pick fake 鈫� Phase=4 鈫� Put fake 鈹�
+ 鈹� 鈫� 鈹�
+ 鈹� 鐩村埌 remainingFake=0 鈹�
+ 鈹� 鈫� 鈹�
+ 鈹� Phase=5 (鍏ュ簱) 鈹�
+ 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 鍏抽敭鏁版嵁瀵圭収琛�
+
+| 杞 | Phase | 鎿嶄綔 | currentCompletedCount | remainingNormal | remainingFake | 鍙戦�佹寚浠� |
+|------|-------|------|---------------------|----------------|--------------|---------|
+| 1 | 1鈫�2 | Pick 1-4 | 0 | 33 | - | PickBatch(1,4) |
+| 1 | 2鈫�1 | Put 1-4 | 4 | 33 | - | PutBatch(1,4) |
+| 2 | 1鈫�2 | Pick 5-8 | 4 | 29 | - | PickBatch(5,8) |
+| 2 | 2鈫�1 | Put 5-8 | 8 | 29 | - | PutBatch(1,4) |
+| 3 | 1鈫�2 | Pick 9-12 | 8 | 25 | - | PickBatch(9,12) |
+| 3 | 2鈫�1 | Put 9-12 | 12 | 25 | - | PutBatch(1,4) |
+| 4 | 1鈫�2 | Pick 13-16 | 12 | 21 | - | PickBatch(13,16) |
+| 4 | 2鈫�1 | Put 13-16 | 16 | 21 | - | PutBatch(1,4) |
+| 5 | 1鈫�2 | Pick 17-20 | 16 | 17 | - | PickBatch(17,20) |
+| 5 | 2鈫�1 | Put 17-20 | 20 | 17 | - | PutBatch(1,4) |
+| 6 | 1鈫�2 | Pick 21-24 | 20 | 13 | - | PickBatch(21,24) |
+| 6 | 2鈫�1 | Put 21-24 | 24 | 13 | - | PutBatch(1,4) |
+| 7 | 1鈫�2 | Pick 25-28 | 24 | 9 | - | PickBatch(25,28) |
+| 7 | 2鈫�1 | Put 25-28 | 28 | 9 | - | PutBatch(1,4) |
+| 8 | 1鈫�2 | Pick 29-32 | 28 | 5 | - | PickBatch(29,32) |
+| 8 | 2鈫�1 | Put 29-32 | 32 | 5 | - | PutBatch(1,4) |
+| 9 | 1鈫�2 | Pick 33 | 32 | 1 | - | PickBatch(33,33) |
+| 9 | 2鈫�1 | Put 33 | 33 | 0 | - | PutBatch(33,33) |
+| 10 | 1鈫�**3** | **鍒囨崲** | 33 | **0** | 15 | Pick fake(5鍙蜂綅 1-4) |
+| 11 | 3鈫�4 | Pick fake 1-4 | 33 | 0 | 15 | PickBattery,5,1-4 |
+| 11 | 4鈫�3 | Put fake 34-37 | 37 | 0 | 11 | PutBatch(34,37) |
+| 12 | 3鈫�4 | Pick fake 5-8 | 37 | 0 | 11 | PickBattery,5,5-8 |
+| 12 | 4鈫�3 | Put fake 38-41 | 41 | 0 | 7 | PutBatch(38,41) |
+| 13 | 3鈫�4 | Pick fake 9-12 | 41 | 0 | 7 | PickBattery,5,9-12 |
+| 13 | 4鈫�3 | Put fake 42-45 | 45 | 0 | 3 | PutBatch(42,45) |
+| 14 | 3鈫�4 | Pick fake 13-15 | 45 | 0 | 3 | PickBattery,5,13-15 |
+| 14 | 4鈫�3 | Put fake 46-48 | 48 | 0 | 0 | PutBatch(46,48) |
+| 15 | 3鈫�**5** | **鍒囨崲** | 48 | 0 | **0** | 绛夊緟鍏ュ簱 |
+| 16 | 5 | **鍏ュ簱** | - | - | - | allputfinished 鈫� HandleInboundTaskAsync 鈫� HCSC1 |
+
+---
+
+## 浠g爜鑱岃矗瀵圭収
+
+| 鏂规硶 | 浣曟椂璋冪敤 | 鑱岃矗 |
+|------|---------|------|
+| HandlePutFinishedStateAsync | `ExecuteAsync` 妫�娴� PutFinished | 鍙戦�� **Pick** 鎸囦护锛屾洿鏂� Phase |
+| HandlePickFinishedStateAsync | `ExecuteAsync` 妫�娴� PickFinished | 鍙戦�� **Put** 鎸囦护 |
+| HandlePickFinishedAsync | prefix command `pickfinished` | 鏇存柊鐘舵�� CurrentAction |
+| HandlePutFinishedAsync | prefix command `putfinished` | 鏇存柊 currentCompletedCount 璁℃暟 |
+| RobotSimpleCommandHandler | 鍛戒护 `allpickfinished` / `allputfinished` | 瑙﹀彂鍏ュ簱锛屾竻鐞嗙姸鎬� |
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\344\270\212\344\275\215\347\263\273\347\273\237\345\257\271\346\216\245/\351\253\230\346\270\2512\345\270\270\346\270\2511\345\217\212\346\234\272\346\242\260\346\211\213\350\256\276\345\244\207\350\264\246\345\217\267\344\277\241\346\201\257\350\241\250\0501\051.xlsx" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\344\270\212\344\275\215\347\263\273\347\273\237\345\257\271\346\216\245/\351\253\230\346\270\2512\345\270\270\346\270\2511\345\217\212\346\234\272\346\242\260\346\211\213\350\256\276\345\244\207\350\264\246\345\217\267\344\277\241\346\201\257\350\241\250\0501\051.xlsx"
index 9bd278e..3718bd3 100644
--- "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\344\270\212\344\275\215\347\263\273\347\273\237\345\257\271\346\216\245/\351\253\230\346\270\2512\345\270\270\346\270\2511\345\217\212\346\234\272\346\242\260\346\211\213\350\256\276\345\244\207\350\264\246\345\217\267\344\277\241\346\201\257\350\241\250\0501\051.xlsx"
+++ "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\344\270\212\344\275\215\347\263\273\347\273\237\345\257\271\346\216\245/\351\253\230\346\270\2512\345\270\270\346\270\2511\345\217\212\346\234\272\346\242\260\346\211\213\350\256\276\345\244\207\350\264\246\345\217\267\344\277\241\346\201\257\350\241\250\0501\051.xlsx"
Binary files differ
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\344\270\212\344\275\215\347\263\273\347\273\237\345\257\271\346\216\245/~$\351\253\230\346\270\2512\345\270\270\346\270\2511\345\217\212\346\234\272\346\242\260\346\211\213\350\256\276\345\244\207\350\264\246\345\217\267\344\277\241\346\201\257\350\241\250\0501\051.xlsx" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\346\234\272\346\242\260\346\211\213\345\215\217\350\256\256/~$\344\272\244\344\272\222\346\265\201\347\250\213\350\241\250\0501\051.xlsx"
similarity index 100%
rename from "\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\344\270\212\344\275\215\347\263\273\347\273\237\345\257\271\346\216\245/~$\351\253\230\346\270\2512\345\270\270\346\270\2511\345\217\212\346\234\272\346\242\260\346\211\213\350\256\276\345\244\207\350\264\246\345\217\267\344\277\241\346\201\257\350\241\250\0501\051.xlsx"
rename to "\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\346\234\272\346\242\260\346\211\213\345\215\217\350\256\256/~$\344\272\244\344\272\222\346\265\201\347\250\213\350\241\250\0501\051.xlsx"
Binary files differ
--
Gitblit v1.9.3