From b698a2085fd090e90abedb1e91266ec496574b29 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 16 四月 2026 23:31:35 +0800
Subject: [PATCH] 1
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 257 insertions(+), 26 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
index a87a66e..c50f942 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
@@ -69,6 +69,14 @@
private readonly HttpClientHelper _httpClientHelper;
/// <summary>
+ /// 鍋囩數鑺钩闈㈢偣浣嶆湇鍔�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬绠$悊鍋囩數鑺钩闈㈢偣浣嶇殑鍒嗛厤鍜岀姸鎬併��
+ /// </remarks>
+ private readonly IFakeBatteryPositionService _fakeBatteryPositionService;
+
+ /// <summary>
/// 鏃ュ織璁板綍鍣�
/// </summary>
private readonly ILogger _logger;
@@ -88,7 +96,8 @@
IRobotTaskService robotTaskService,
ITaskService taskService,
HttpClientHelper httpClientHelper,
- ILogger logger)
+ ILogger logger,
+ IFakeBatteryPositionService fakeBatteryPositionService)
{
_socketClientGateway = socketClientGateway;
_stateManager = stateManager;
@@ -96,6 +105,7 @@
_taskService = taskService;
_httpClientHelper = httpClientHelper;
_logger = logger;
+ _fakeBatteryPositionService = fakeBatteryPositionService;
}
/// <summary>
@@ -154,7 +164,8 @@
/// </remarks>
/// <param name="task">瑕佷笅鍙戠殑浠诲姟瀵硅薄</param>
/// <param name="state">鏈哄櫒浜哄綋鍓嶇姸鎬�</param>
- public async Task SendSocketRobotPickAsync(Dt_RobotTask task, RobotSocketState state)
+ /// <param name="isScanNG">鏄惁鎵爜NG</param>
+ public async Task SendSocketRobotPickAsync(Dt_RobotTask task, RobotSocketState state, bool isScanNG)
{
// 鏋勫缓鍙栬揣鎸囦护锛屾牸寮忥細Pickbattery,{婧愬湴鍧�}
string taskString = $"Pickbattery,{task.RobotSourceAddress}";
@@ -174,6 +185,11 @@
// 灏嗕换鍔″叧鑱斿埌鐘舵�佸璞�
state.CurrentTask = task;
+ if(isScanNG)
+ {
+ state.IsScanNG = true;
+ }
+
// 淇濇寔鍘熻涔夛細浠呭湪鐘舵�佸畨鍏ㄥ啓鍏ユ垚鍔熷悗鍐嶆洿鏂颁换鍔$姸鎬�
// 杩欐牱鍙互纭繚鐘舵�佸拰浠诲姟璁板綍鐨勪竴鑷存��
if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
@@ -186,6 +202,193 @@
// 鍙戦�佸け璐ワ紝璁板綍 Error 鏃ュ織
_logger.LogError("涓嬪彂鍙栬揣鎸囦护澶辫触锛屾寚浠�: {TaskString}锛岃澶�: {DeviceName}", taskString, state.RobotCrane?.DeviceName);
QuartzLogger.Error($"涓嬪彂鍙栬揣鎸囦护澶辫触锛屾寚浠�: {taskString}", state.RobotCrane?.DeviceName);
+ }
+ }
+
+ /// <summary>
+ /// 涓嬪彂鍋囩數鑺彇璐ф寚浠ゅ埌鏈哄櫒浜哄鎴风
+ /// </summary>
+ /// <remarks>
+ /// 鍙戦�佹牸寮忥細Pickbattery,5,{startPosition}-{endPosition}
+ /// 渚嬪锛歅ickbattery,5,1-3 琛ㄧず浠庡亣鐢佃姱浣嶇疆5鎶撳彇锛屽钩闈㈢偣浣�1鍒�3
+ ///
+ /// 涓嬪彂鎴愬姛鍚庯細
+ /// 1. 鏍囪鐐逛綅涓哄凡浣跨敤
+ /// 2. 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
+ /// 3. 瀹夊叏鏇存柊鐘舵�佸埌 Redis
+ /// </remarks>
+ /// <param name="task">瑕佷笅鍙戠殑浠诲姟瀵硅薄</param>
+ /// <param name="state">鏈哄櫒浜哄綋鍓嶇姸鎬�</param>
+ /// <param name="positions">瑕佹姄鍙栫殑骞抽潰鐐逛綅鍒楄〃</param>
+ public async Task SendSocketRobotFakeBatteryPickAsync(Dt_RobotTask task, RobotSocketState state, List<int> positions)
+ {
+ if (positions == null || positions.Count == 0)
+ {
+ _logger.LogWarning("SendSocketRobotFakeBatteryPickAsync锛氬钩闈㈢偣浣嶅垪琛ㄤ负绌猴紝浠诲姟鍙�: {TaskNum}", task.RobotTaskNum);
+ return;
+ }
+
+ // 璁$畻鐐逛綅鑼冨洿锛屾牸寮忥細1-3
+ int startPos = positions.Min();
+ int endPos = positions.Max();
+ string taskString = $"Pickbattery,5,{startPos}-{endPos}";
+
+ // 鏍囪鐐逛綅涓哄凡浣跨敤
+ _fakeBatteryPositionService.MarkAsUsed(positions);
+
+ // 閫氳繃 Socket 缃戝叧鍙戦�佹寚浠ゅ埌鏈哄櫒浜哄鎴风
+ bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+
+ if (result)
+ {
+ _logger.LogInformation("涓嬪彂鍋囩數鑺彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {TaskString}锛岀偣浣�: {Positions}锛岃澶�: {DeviceName}",
+ taskString, string.Join(",", positions), state.RobotCrane?.DeviceName);
+ QuartzLogger.Info($"涓嬪彂鍋囩數鑺彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {taskString}", 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>
+ /// <param name="count">闇�瑕佽幏鍙栫殑鐐逛綅鏁伴噺</param>
+ /// <returns>鍙敤鐐逛綅鍒楄〃</returns>
+ public List<int> GetNextAvailableFakeBatteryPositions(int count)
+ {
+ return _fakeBatteryPositionService.GetNextAvailable(count);
+ }
+
+ /// <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);
}
}
@@ -317,37 +520,37 @@
}
// 瑙f瀽杩斿洖鐨勪换鍔′俊鎭�
- var taskInfos = JsonConvert.DeserializeObject<List<Dt_Task>>(content.Data.ToJson() ?? string.Empty) ?? new List<Dt_Task>();
- var taskInfo = taskInfos.FirstOrDefault();
+ //var taskInfos = JsonConvert.DeserializeObject<List<Dt_Task>>(content.Data.ToJson() ?? string.Empty) ?? new List<Dt_Task>();
+ //var taskInfo = taskInfos.FirstOrDefault();
- // 鑾峰彇婧愬湴鍧�
- string sourceAddress = taskDTO.SourceAddress;
+ //// 鑾峰彇婧愬湴鍧�
+ //string sourceAddress = taskDTO.SourceAddress;
- // 鏌ユ壘婧愬湴鍧�瀵瑰簲鐨勮緭閫佺嚎璁惧
- IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceAddress));
+ //// 鏌ユ壘婧愬湴鍧�瀵瑰簲鐨勮緭閫佺嚎璁惧
+ //IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceAddress));
- if (device != null)
- {
- // 灏嗚澶囪浆鎹负杈撻�佺嚎绫诲瀷
- CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
+ //if (device != null)
+ //{
+ // // 灏嗚澶囪浆鎹负杈撻�佺嚎绫诲瀷
+ // CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
- // 璁剧疆杈撻�佺嚎鐨勭洰鏍囧湴鍧�
- conveyorLine.SetValue(ConveyorLineDBNameNew.Target, taskInfo.NextAddress, sourceAddress);
+ // // 璁剧疆杈撻�佺嚎鐨勭洰鏍囧湴鍧�
+ // conveyorLine.SetValue(ConveyorLineDBNameNew.Target, taskInfo.NextAddress, sourceAddress);
- // 璁剧疆杈撻�佺嚎鐨勪换鍔″彿
- conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, taskInfo.TaskNum, sourceAddress);
+ // // 璁剧疆杈撻�佺嚎鐨勪换鍔″彿
+ // conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, taskInfo.TaskNum, sourceAddress);
- // 瑙﹀彂杈撻�佺嚎寮�濮嬫墽琛岋紙鍐欏叆 WCS_STB = 1锛�
- conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, sourceAddress);
+ // // 瑙﹀彂杈撻�佺嚎寮�濮嬫墽琛岋紙鍐欏叆 WCS_ACK = 1锛�
+ // conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, sourceAddress);
- // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵
- if (_taskService.UpdateTaskStatusToNext(taskInfo).Status)
- {
- _logger.LogInformation("HandleInboundTaskAsync锛氬叆搴撲换鍔″鐞嗘垚鍔燂紝浠诲姟鍙�: {TaskNum}", taskInfo.TaskNum);
- QuartzLogger.Info($"HandleInboundTaskAsync锛氬叆搴撲换鍔″鐞嗘垚鍔燂紝浠诲姟鍙�: {taskInfo.TaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
- return true;
- }
- }
+ // // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵
+ // if (_taskService.UpdateTaskStatusToNext(taskInfo).Status)
+ // {
+ // _logger.LogInformation("HandleInboundTaskAsync锛氬叆搴撲换鍔″鐞嗘垚鍔燂紝浠诲姟鍙�: {TaskNum}", taskInfo.TaskNum);
+ // QuartzLogger.Info($"HandleInboundTaskAsync锛氬叆搴撲换鍔″鐞嗘垚鍔燂紝浠诲姟鍙�: {taskInfo.TaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
+ // return true;
+ // }
+ //}
return false;
}
@@ -435,5 +638,33 @@
{
return _httpClientHelper.Post<WebResponseContent>(configKey, stockDTO.ToJson());
}
+
+ /// <summary>
+ /// 璋冪敤鎵归噺鎷嗙洏纭 API
+ /// </summary>
+ /// <remarks>
+ /// 褰撴媶鐩樹换鍔″叏閮ㄥ彇瀹屾椂璋冪敤锛屼竴娆℃�т笂浼犳暣涓墭鐩樼殑瑙g粦鏁版嵁鍒� MES銆�
+ /// </remarks>
+ /// <param name="palletCode">婧愭墭鐩樺彿</param>
+ /// <returns>HTTP 鍝嶅簲缁撴灉</returns>
+ public HttpResponseResult<WebResponseContent> PostSplitPalletConfirmAsync(string palletCode)
+ {
+ var request = new { PalletCode = palletCode };
+ return _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.SplitPalletConfirm), request.ToJson());
+ }
+
+ /// <summary>
+ /// 璋冪敤鎵归噺缁勭洏纭 API
+ /// </summary>
+ /// <remarks>
+ /// 褰撶粍鐩樹换鍔″叏閮ㄦ斁瀹屾椂璋冪敤锛屼竴娆℃�т笂浼犳暣涓墭鐩樼殑缁戝畾鏁版嵁鍒� MES銆�
+ /// </remarks>
+ /// <param name="palletCode">鐩爣鎵樼洏鍙�</param>
+ /// <returns>HTTP 鍝嶅簲缁撴灉</returns>
+ public HttpResponseResult<WebResponseContent> PostGroupPalletConfirmAsync(string palletCode)
+ {
+ var request = new { PalletCode = palletCode };
+ return _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.GroupPalletConfirm), request.ToJson());
+ }
}
}
--
Gitblit v1.9.3