From ad64840cc04dac2278ca02f22ddc02b1a218e9cf Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 15 四月 2026 22:44:18 +0800
Subject: [PATCH] feat(机器人任务): 实现换盘任务假电芯补充逻辑
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 254 insertions(+), 10 deletions(-)
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 190a8d6..e0211a5 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -1,5 +1,8 @@
+using Microsoft.Extensions.Logging;
using WIDESEA_Core;
using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Tasks.Workflow.Abstractions;
@@ -7,102 +10,343 @@
namespace WIDESEAWCS_Tasks.Workflow
{
/// <summary>
- /// RobotJob 流程编排器:迁移原 RobotJob 状态机分支,降低 Job 类复杂度。
+ /// 鏈哄櫒浜轰换鍔$紪鎺掑櫒 - 璐熻矗 RobotJob 涓殑鐘舵�佹満娴佽浆鍜屾墽琛屾楠ょ紪鎺�
/// </summary>
+ /// <remarks>
+ /// 杩佺Щ鍘� RobotJob 鐘舵�佹満娴佽浆鏀寔锛岄檷浣� Job 灞傜殑澶嶆潅搴︺��
+ ///
+ /// 鏍稿績鑱岃矗锛�
+ /// 1. 鏍规嵁鏈哄櫒浜哄綋鍓嶇姸鎬佸拰浠诲姟鐘舵�侊紝鍐冲畾涓嬩竴姝ュ姩浣�
+ /// 2. 澶勭悊鍙栬揣瀹屾垚鍚庣殑鏀捐揣鎸囦护涓嬪彂
+ /// 3. 澶勭悊鏀捐揣瀹屾垚鍚庣殑鍙栬揣鎸囦护涓嬪彂锛堢粍鐩樺満鏅級
+ ///
+ /// 鐘舵�佹満娴佽浆瑙勫垯锛�
+ /// - 鏉′欢锛歊obotRunMode == 2锛堣嚜鍔ㄦā寮忥級涓� RobotControlMode == 1锛堝鎴风鎺у埗锛変笖 OperStatus != "Running"
+ /// - 鍙栬揣瀹屾垚 -> 鏀捐揣锛歅ickFinished + RobotArmObject == 1 + RobotPickFinish -> 鍙戦�� Putbattery
+ /// - 鏀捐揣瀹屾垚 -> 鍙栬揣锛歅utFinished + Homed + RobotArmObject == 0 -> 鍙戦�� Pickbattery锛堢粍鐩�/鎹㈢洏鍦烘櫙锛�
+ /// </remarks>
public class RobotWorkflowOrchestrator : IRobotWorkflowOrchestrator
{
+ /// <summary>
+ /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬璇诲彇鍜屾洿鏂版満鍣ㄤ汉鐨勭姸鎬併��
+ /// </remarks>
private readonly RobotStateManager _stateManager;
+
+ /// <summary>
+ /// 鏈烘鎵嬪鎴风绠$悊鍣�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬鍚戞満鍣ㄤ汉瀹㈡埛绔彂閫佹寚浠ゃ��
+ /// </remarks>
private readonly RobotClientManager _clientManager;
+
+ /// <summary>
+ /// 浠诲姟澶勭悊鍣�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬鎵ц浠诲姟鐩稿叧鐨勪笟鍔¢�昏緫锛屽鍙戦�佸彇璐ф寚浠ゃ��
+ /// </remarks>
private readonly RobotTaskProcessor _taskProcessor;
+
+ /// <summary>
+ /// 鏈哄櫒浜轰换鍔℃湇鍔�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬鏇存柊浠诲姟鐘舵�併��
+ /// </remarks>
private readonly IRobotTaskService _robotTaskService;
+ /// <summary>
+ /// 鏃ュ織璁板綍鍣�
+ /// </summary>
+ private readonly ILogger _logger;
+
+ /// <summary>
+ /// 鏋勯�犲嚱鏁�
+ /// </summary>
+ /// <param name="stateManager">鐘舵�佺鐞嗗櫒</param>
+ /// <param name="clientManager">瀹㈡埛绔鐞嗗櫒</param>
+ /// <param name="taskProcessor">浠诲姟澶勭悊鍣�</param>
+ /// <param name="robotTaskService">浠诲姟鏈嶅姟</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
public RobotWorkflowOrchestrator(
RobotStateManager stateManager,
RobotClientManager clientManager,
RobotTaskProcessor taskProcessor,
- IRobotTaskService robotTaskService)
+ IRobotTaskService robotTaskService,
+ ILogger logger)
{
_stateManager = stateManager;
_clientManager = clientManager;
_taskProcessor = taskProcessor;
_robotTaskService = robotTaskService;
+ _logger = logger;
}
+ /// <summary>
+ /// 鎵ц浠诲姟缂栨帓娴佺▼
+ /// </summary>
+ /// <remarks>
+ /// 鏍规嵁鏈哄櫒浜哄綋鍓嶇姸鎬佸拰浠诲姟鐘舵�侊紝鍐冲畾鏄惁涓嬪彂鎸囦护銆�
+ ///
+ /// 鎵ц鏉′欢锛�
+ /// 1. 鏈哄櫒浜哄浜庤嚜鍔ㄦā寮忥紙RobotRunMode == 2锛�
+ /// 2. 鏈哄櫒浜哄浜庡鎴风鎺у埗妯″紡锛圧obotControlMode == 1锛�
+ /// 3. 鏈哄櫒浜轰笉鍦ㄨ繍琛屼腑锛圤perStatus != "Running"锛�
+ ///
+ /// 娴佽浆閫昏緫锛�
+ /// - 鍙栬揣瀹屾垚涓旀墜鑷傛湁璐� -> 鍙戦�佹斁璐ф寚浠わ紙Putbattery锛�
+ /// - 鏀捐揣瀹屾垚涓旀墜鑷傛棤璐� -> 鍙戦�佸彇璐ф寚浠わ紙Pickbattery锛�
+ /// </remarks>
+ /// <param name="latestState">鏈哄櫒浜烘渶鏂扮姸鎬�</param>
+ /// <param name="task">寰呮墽琛岀殑鏈哄櫒浜轰换鍔�</param>
+ /// <param name="ipAddress">鏈哄櫒浜� IP 鍦板潃</param>
public async Task ExecuteAsync(RobotSocketState latestState, Dt_RobotTask task, string ipAddress)
{
- // 保持原有分支判定条件不变,确保行为一致。
- if (latestState.RobotRunMode == 2 && latestState.RobotControlMode == 1 && latestState.OperStatus != "Running")
+ // 鎸夊師鏂规鍒嗘敮鍒ゆ柇锛岀‘淇濋�昏緫涓�鑷�
+ // 妫�鏌ユ槸鍚︽弧瓒宠嚜鍔ㄦ帶鍒舵潯浠讹細
+ // 1. 杩愯妯″紡涓鸿嚜鍔紙2锛�
+ // 2. 鎺у埗妯″紡涓哄鎴风鎺у埗锛�1锛�
+ // 3. 杩愯鐘舵�佹槸 Running
+ if (latestState.RobotRunMode == 2 /*&& latestState.RobotControlMode == 1*/ && latestState.OperStatus == "Running" && latestState.Homed == "Homed")
{
+ // ========== 鍙栬揣瀹屾垚鍚庣殑鏀捐揣澶勭悊 ==========
+ // 鏉′欢锛�
+ // - 褰撳墠鍔ㄤ綔鏄� PickFinished 鎴� AllPickFinished锛堝彇璐у畬鎴愶級
+ // - 鎵嬭噦涓婃湁鐗╂枡锛圧obotArmObject == 1锛�
+ // - 浠诲姟鐘舵�佷负 RobotPickFinish锛堝凡璁板綍鍙栬揣瀹屾垚锛�
if ((latestState.CurrentAction == "PickFinished" || latestState.CurrentAction == "AllPickFinished")
&& latestState.RobotArmObject == 1
&& task.RobotTaskState == TaskRobotStatusEnum.RobotPickFinish.GetHashCode())
{
+ _logger.LogInformation("ExecuteAsync锛氭弧瓒虫斁璐ф潯浠讹紝寮�濮嬪鐞嗗彇璐у畬鎴愶紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Info($"ExecuteAsync锛氭弧瓒虫斁璐ф潯浠讹紝寮�濮嬪鐞嗗彇璐у畬鎴�", latestState.RobotCrane?.DeviceName ?? ipAddress);
+ // 鍙戦�佹斁璐ф寚浠�
await HandlePickFinishedStateAsync(task, ipAddress);
}
- else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished" || latestState.CurrentAction == null)
- && latestState.OperStatus == "Homed"
+
+ // ========== 鍒濆鍖栨垨鑰呮斁璐у畬鎴愬悗鐨勫彇璐у鐞� ==========
+ // 鏉′欢锛�
+ // - 褰撳墠鍔ㄤ綔鏄� PutFinished銆丄llPutFinished 鎴� null锛堟斁璐у畬鎴愶級
+ // - 杩愯鐘舵�佷负 Homed锛堝凡褰掍綅锛�
+ // - 鎵嬭噦涓婃棤鐗╂枡锛圧obotArmObject == 0锛�
+ // - 浠诲姟鐘舵�佷负 RobotPutFinish 鎴栦笉鏄� RobotExecuting
+ else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished" || latestState.CurrentAction.IsNullOrEmpty())
&& latestState.RobotArmObject == 0
&& (task.RobotTaskState == TaskRobotStatusEnum.RobotPutFinish.GetHashCode()
|| task.RobotTaskState != TaskRobotStatusEnum.RobotExecuting.GetHashCode()))
{
+ _logger.LogInformation("ExecuteAsync锛氭弧瓒冲彇璐ф潯浠讹紝寮�濮嬪鐞嗘斁璐у畬鎴愶紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Info($"ExecuteAsync锛氭弧瓒冲彇璐ф潯浠讹紝寮�濮嬪鐞嗘斁璐у畬鎴�", latestState.RobotCrane?.DeviceName ?? ipAddress);
+ // 鍙戦�佸彇璐ф寚浠�
await HandlePutFinishedStateAsync(task, ipAddress);
}
}
}
+ /// <summary>
+ /// 澶勭悊鍙栬揣瀹屾垚鍚庣殑鏀捐揣鎸囦护
+ /// </summary>
+ /// <remarks>
+ /// 褰撳彇璐у畬鎴愬悗锛屽悜鏈哄櫒浜哄彂閫佹斁璐ф寚浠わ紙Putbattery锛夈��
+ /// 鏈哄櫒浜烘敹鍒版寚浠ゅ悗浼氬皢璐х墿鏀剧疆鍒扮洰鏍囧湴鍧�銆�
+ ///
+ /// 鎸囦护鏍煎紡锛歅utbattery,{鐩爣鍦板潃}
+ /// 渚嬪锛歅utbattery,B01 琛ㄧず灏嗚揣鐗╂斁缃埌 B01 浣嶇疆
+ /// </remarks>
+ /// <param name="task">褰撳墠浠诲姟</param>
+ /// <param name="ipAddress">鏈哄櫒浜� IP 鍦板潃</param>
private async Task HandlePickFinishedStateAsync(Dt_RobotTask task, string ipAddress)
{
+ // 鏋勫缓鏀捐揣鎸囦护锛屾牸寮忥細Putbattery,{鐩爣鍦板潃}
string taskString = $"Putbattery,{task.RobotTargetAddress}";
+
+ // 閫氳繃瀹㈡埛绔鐞嗗櫒鍙戦�佹寚浠ゅ埌鏈哄櫒浜�
bool result = await _clientManager.SendToClientAsync(ipAddress, taskString);
+
if (result)
{
+ // 鍙戦�佹垚鍔燂紝璁板綍 Info 鏃ュ織
+ _logger.LogInformation("HandlePickFinishedStateAsync锛氫笅鍙戞斁璐ф寚浠ゆ垚鍔燂紝鎸囦护: {TaskString}锛屼换鍔″彿: {TaskNum}", taskString, task.RobotTaskNum);
+ QuartzLogger.Info($"涓嬪彂鏀捐揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}", task.RobotRoadway);
+
+ // 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
+ // 鑾峰彇鏈�鏂扮姸鎬佸苟鏇存柊浠诲姟鍏宠仈
var stateToUpdate = _stateManager.GetState(ipAddress);
if (stateToUpdate != null)
{
stateToUpdate.CurrentTask = task;
+
+ // 瀹夊叏鏇存柊鐘舵�佸埌 Redis
if (_stateManager.TryUpdateStateSafely(ipAddress, stateToUpdate))
{
+ // 鐘舵�佹洿鏂版垚鍔熷悗锛屾洿鏂颁换鍔¤褰�
await _robotTaskService.UpdateRobotTaskAsync(task);
}
}
}
+ else
+ {
+ // 鍙戦�佸け璐ワ紝璁板綍 Error 鏃ュ織
+ _logger.LogError("HandlePickFinishedStateAsync锛氫笅鍙戞斁璐ф寚浠ゅけ璐ワ紝鎸囦护: {TaskString}锛屼换鍔″彿: {TaskNum}", taskString, task.RobotTaskNum);
+ QuartzLogger.Error($"涓嬪彂鏀捐揣鎸囦护澶辫触锛屾寚浠�: {taskString}", task.RobotRoadway);
+ }
}
+ /// <summary>
+ /// 澶勭悊鏀捐揣瀹屾垚鍚庣殑鍙栬揣鎸囦护
+ /// </summary>
+ /// <remarks>
+ /// 褰撴斁璐у畬鎴愬悗锛屾牴鎹换鍔$被鍨嬪喅瀹氫笅涓�姝ワ細
+ ///
+ /// 1. 濡傛灉涓嶆槸鎷嗙洏涔熶笉鏄粍鐩橈紙鏅�氫换鍔★級锛�
+ /// - 鐩存帴鍙戦�佸彇璐ф寚浠�
+ ///
+ /// 2. 濡傛灉鏄粍鐩樻垨鎹㈢洏浠诲姟锛�
+ /// - 鐢熸垚鏂扮殑鎵樼洏鏉$爜
+ /// - 灏嗘潯鐮佹坊鍔犲埌鐘舵�佷腑
+ /// - 鍙戦�佸彇璐ф寚浠�
+ ///
+ /// 缁勭洏浠诲姟鐨勬潯鐮佺敤浜庢爣璇嗘柊鐢熸垚鐨勬墭鐩橈紝
+ /// 鍚庣画鏀捐揣鏃朵細鐢ㄥ埌杩欎簺鏉$爜淇℃伅銆�
+ /// </remarks>
+ /// <param name="task">褰撳墠浠诲姟</param>
+ /// <param name="ipAddress">鏈哄櫒浜� IP 鍦板潃</param>
private async Task HandlePutFinishedStateAsync(Dt_RobotTask task, string ipAddress)
{
+ // 鑾峰彇鏈�鏂扮姸鎬�
var stateForUpdate = _stateManager.GetState(ipAddress);
if (stateForUpdate == null)
{
+ _logger.LogWarning("HandlePutFinishedStateAsync锛氳幏鍙栫姸鎬佸け璐ワ紝IP: {IpAddress}", ipAddress);
+ QuartzLogger.Warn($"HandlePutFinishedStateAsync锛氳幏鍙栫姸鎬佸け璐ワ紝IP: {ipAddress}", ipAddress);
return;
}
+ // 濡傛灉鐘舵�佷腑杩樻病鏈夎缃换鍔$被鍨嬫爣蹇楋紝鏍规嵁浠诲姟绫诲瀷璁剧疆
if (!stateForUpdate.IsSplitPallet && !stateForUpdate.IsGroupPallet)
{
+ // 鍒ゆ柇浠诲姟绫诲瀷骞惰缃浉搴旂殑鏍囧織
stateForUpdate.IsSplitPallet = task.RobotTaskType == RobotTaskTypeEnum.SplitPallet.GetHashCode();
stateForUpdate.IsGroupPallet = task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode()
|| task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode();
}
+ // 濡傛灉鏄粍鐩樹换鍔�
if (task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode())
{
+ // 鐢熸垚鎵樼洏鏉$爜鍓嶇紑
const string prefix = "TRAY";
+
+ // 鐢熸垚涓や釜鎵樼洏鏉$爜锛堢敤浜庣粍鐩樻搷浣滐級锛堟祴璇曠敤锛屽悗缁鍙栫嚎浣撴潯鐮侊級
string trayBarcode1 = RobotBarcodeGenerator.GenerateTrayBarcode(prefix);
string trayBarcode2 = RobotBarcodeGenerator.GenerateTrayBarcode(prefix);
+
+ // 濡傛灉鏉$爜鐢熸垚鎴愬姛
if (!string.IsNullOrEmpty(trayBarcode1) && !string.IsNullOrEmpty(trayBarcode2))
{
- stateForUpdate.CellBarcode.Add(trayBarcode1);
- stateForUpdate.CellBarcode.Add(trayBarcode2);
+ if(stateForUpdate.CellBarcode.Contains(trayBarcode1)|| stateForUpdate.CellBarcode.Contains(trayBarcode2))
+ {
+ _logger.LogError("HandlePutFinishedStateAsync锛氱敓鎴愮殑鎵樼洏鏉$爜宸插瓨鍦紝鍙兘瀛樺湪閲嶅锛屼换鍔″彿: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Error($"鐢熸垚鐨勬墭鐩樻潯鐮佸凡瀛樺湪锛屽彲鑳藉瓨鍦ㄩ噸澶�", stateForUpdate.RobotCrane.DeviceName);
+
+ // 鏉$爜閲嶅锛岃褰曢敊璇棩蹇楀苟鍋滄鍚庣画鎿嶄綔(鍚庣画鏀捐揣鏃朵細鐢ㄥ埌杩欎簺鏉$爜淇℃伅锛屼緵鍚庣画鏀捐揣鏃朵娇鐢紝璋冭瘯鍚庡彲鑳戒細鍙栨秷姝ら�昏緫)
+ return;
+ }
+ else
+ {
+ _logger.LogInformation("HandlePutFinishedStateAsync锛氱敓鎴愮殑鎵樼洏鏉$爜鍞竴锛岀户缁墽琛岋紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Info($"鐢熸垚鐨勬墭鐩樻潯鐮佸敮涓�锛岀户缁墽琛�", stateForUpdate.RobotCrane.DeviceName);
+ // 灏嗘潯鐮佹坊鍔犲埌鐘舵�佷腑锛屼緵鍚庣画鏀捐揣鏃朵娇鐢�
+ stateForUpdate.CellBarcode.Add(trayBarcode1);
+ stateForUpdate.CellBarcode.Add(trayBarcode2);
+ }
+
+
+ // 璁板綍鏃ュ織锛氱敓鎴愭墭鐩樻潯鐮佹垚鍔�
+ _logger.LogInformation("HandlePutFinishedStateAsync锛氱敓鎴愭墭鐩樻潯鐮佹垚鍔�: {Barcode1}+{Barcode2}锛屼换鍔″彿: {TaskNum}", trayBarcode1, trayBarcode2, task.RobotTaskNum);
+ QuartzLogger.Info($"鐢熸垚鎵樼洏鏉$爜鎴愬姛: {trayBarcode1}+{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName);
+
+ // 鍙戦�佸彇璐ф寚浠�
await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
+ }
+ else
+ {
+ // 鏉$爜鐢熸垚澶辫触锛岃褰曢敊璇棩蹇�
+ _logger.LogError("HandlePutFinishedStateAsync锛氱敓鎴愭墭鐩樻潯鐮佸け璐ワ紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Error($"鐢熸垚鎵樼洏鏉$爜澶辫触", stateForUpdate.RobotCrane.DeviceName);
+ }
+ }
+ else if (task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode())
+ {
+ // 鎹㈢洏浠诲姟
+ // 鐩爣锛氭甯哥數鑺姄鍙栧畬鎴愬悗锛岃ˉ鍏呭亣鐢佃姱鑷�48涓�
+ const int targetTotal = 48;
+ const int fakeBatteryPickPosition = 5; // 鍋囩數鑺姄鍙栦綅缃�
+ const int pickCountPerExecution = 4; // 姣忔鎶撳彇鏁伴噺
+
+ int targetNormalCount = task.RobotTaskTotalNum; // 姝e父鐢佃姱鐩爣鏁伴噺
+ int currentCompletedCount = stateForUpdate.RobotTaskTotalNum; // 宸插畬鎴愭暟閲�
+
+ // 濡傛灉鐩爣鏁伴噺涓�48锛岀洿鎺ヤ笅鍙戞甯镐换鍔�
+ if (targetNormalCount == targetTotal)
+ {
+ await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
+ }
+ // 濡傛灉宸插畬鎴愭暟閲忓皬浜庣洰鏍囨暟閲忥紝缁х画鎶撳彇姝e父鐢佃姱
+ else if (currentCompletedCount < targetNormalCount)
+ {
+ await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
+ }
+ // 姝e父鐢佃姱宸插畬鎴愶紝杩涘叆鍋囩數鑺ˉ鍏呮ā寮�
+ else if (currentCompletedCount == targetNormalCount && !stateForUpdate.IsInFakeBatteryMode)
+ {
+ // 棣栨杩涘叆鍋囩數鑺ā寮忥紝璁剧疆鏍囧織
+ stateForUpdate.IsInFakeBatteryMode = true;
+ _logger.LogInformation("HandlePutFinishedStateAsync锛氭甯哥數鑺姄鍙栧畬鎴愶紝杩涘叆鍋囩數鑺ˉ鍏呮ā寮忥紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Info($"姝e父鐢佃姱鎶撳彇瀹屾垚锛岃繘鍏ュ亣鐢佃姱琛ュ厖妯″紡", stateForUpdate.RobotCrane?.DeviceName);
+ }
+
+ // 濡傛灉澶勪簬鍋囩數鑺ˉ鍏呮ā寮忥紝璁$畻骞朵笅鍙戣ˉ鏁颁换鍔�
+ if (stateForUpdate.IsInFakeBatteryMode)
+ {
+ int remaining = targetTotal - currentCompletedCount;
+ if (remaining > 0)
+ {
+ // 璁$畻姣忔鎶撳彇鐨勬暟閲忥紙鏈�澶�4涓級
+ int pickCount = Math.Min(pickCountPerExecution, remaining);
+
+ // 鑾峰彇鍙敤鐨勫亣鐢佃姱骞抽潰鐐逛綅
+ var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(pickCount);
+ if (positions.Count == 0)
+ {
+ _logger.LogError("HandlePutFinishedStateAsync锛氭棤鍙敤鍋囩數鑺偣浣嶏紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Error($"鏃犲彲鐢ㄥ亣鐢佃姱鐐逛綅", stateForUpdate.RobotCrane?.DeviceName);
+ return;
+ }
+
+ // 涓嬪彂鍋囩數鑺彇璐ф寚浠�
+ await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions);
+ }
+ else
+ {
+ // 鍋囩數鑺ˉ鍏呭畬鎴愶紝閲嶇疆鏍囧織
+ stateForUpdate.IsInFakeBatteryMode = false;
+ _logger.LogInformation("HandlePutFinishedStateAsync锛氭崲鐩樹换鍔″畬鎴愶紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ QuartzLogger.Info($"鎹㈢洏浠诲姟瀹屾垚", stateForUpdate.RobotCrane?.DeviceName);
+ }
}
}
else
{
+ // 闈炵粍鐩樹换鍔★紝鐩存帴鍙戦�佸彇璐ф寚浠�
await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
}
}
}
}
-
-
--
Gitblit v1.9.3