From 1515ffa15c11e106f35e1447bc990b7867c449bb Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 16 四月 2026 16:07:14 +0800
Subject: [PATCH] feat(Robot): 机械手换盘任务特殊处理
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 119 insertions(+), 0 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
index fb5ef53..e30d316 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
@@ -268,6 +268,125 @@
}
/// <summary>
+ /// 璁$畻鎵规缂栧彿鑼冨洿
+ /// </summary>
+ /// <remarks>
+ /// 杩斿洖鏍煎紡锛�(start, end)
+ /// - remaining >= 4: (currentIndex, currentIndex + 3)
+ /// - remaining > 1: (currentIndex, currentIndex + remaining - 1)
+ /// - remaining == 1: (currentIndex, 0) -- 鍗曚釜鐗╁搧鐢� 0 琛ㄧず end
+ /// </remarks>
+ /// <param name="currentIndex">褰撳墠鎵规璧峰缂栧彿</param>
+ /// <param name="remaining">鍓╀綑鏁伴噺</param>
+ /// <returns>(start, end) 鍏冪粍</returns>
+ public (int Start, int End) BuildBatchRange(int currentIndex, int remaining)
+ {
+ if (remaining >= 4)
+ return (currentIndex, currentIndex + 3);
+ else if (remaining > 1)
+ return (currentIndex, currentIndex + remaining - 1);
+ else // remaining == 1
+ return (currentIndex, 0);
+ }
+
+ /// <summary>
+ /// 涓嬪彂鍙栬揣鎸囦护锛堝甫鎵规鏍煎紡鍜屾�绘暟锛�
+ /// </summary>
+ /// <remarks>
+ /// 鍙戦�侀『搴忥細
+ /// 1. PickTotalNum,{N} -- 鐪熷疄鐢佃姱鎬绘暟
+ /// 2. Pickbattery,{浣嶇疆},{start}-{end} -- 鎵规鍙栬揣鎸囦护
+ ///
+ /// 涓嬪彂鎴愬姛鍚庢洿鏂颁换鍔$姸鎬佷负"鏈哄櫒浜烘墽琛屼腑"銆�
+ /// </remarks>
+ /// <param name="task">瑕佷笅鍙戠殑浠诲姟瀵硅薄</param>
+ /// <param name="state">鏈哄櫒浜哄綋鍓嶇姸鎬�</param>
+ /// <param name="position">鍙栬揣浣嶇疆</param>
+ /// <param name="batchStart">鎵规璧峰缂栧彿</param>
+ /// <param name="batchEnd">鎵规缁撴潫缂栧彿</param>
+ public async Task SendPickWithBatchAsync(Dt_RobotTask task, RobotSocketState state, string position, int batchStart, int batchEnd)
+ {
+ // 鍏堝彂閫佹�绘暟鎸囦护
+ string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}";
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
+
+ // 鍐嶅彂閫佹壒娆″彇璐ф寚浠�
+ string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
+ string taskString = $"Pickbattery,{position},{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>
+ /// 鍙戦�侀『搴忥細
+ /// 1. PutTotalNum,{N} -- 鐪熷疄鐢佃姱鎬绘暟
+ /// 2. Putbattery,{浣嶇疆},{start}-{end} -- 鎵规鏀捐揣鎸囦护
+ ///
+ /// 涓嬪彂鎴愬姛鍚庢洿鏂颁换鍔$姸鎬佷负"鏈哄櫒浜烘墽琛屼腑"銆�
+ /// </remarks>
+ /// <param name="task">瑕佷笅鍙戠殑浠诲姟瀵硅薄</param>
+ /// <param name="state">鏈哄櫒浜哄綋鍓嶇姸鎬�</param>
+ /// <param name="position">鏀捐揣浣嶇疆</param>
+ /// <param name="batchStart">鎵规璧峰缂栧彿</param>
+ /// <param name="batchEnd">鎵规缁撴潫缂栧彿</param>
+ public async Task SendPutWithBatchAsync(Dt_RobotTask task, RobotSocketState state, string position, int batchStart, int batchEnd)
+ {
+ // 鍏堝彂閫佹�绘暟鎸囦护
+ string totalNumCmd = $"PutTotalNum,{task.RobotTaskTotalNum}";
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
+
+ // 鍐嶅彂閫佹壒娆℃斁璐ф寚浠�
+ string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
+ string taskString = $"Putbattery,{position},{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>
--
Gitblit v1.9.3