From 853f7a71577bd8694c848985e1eb21c74d30eba9 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 21 四月 2026 21:19:23 +0800
Subject: [PATCH] fix(WCS): 修复输送线任务处理逻辑并更新设备映射
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs | 93 +++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 86 insertions(+), 7 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 80771a1..96be485 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -9,6 +9,7 @@
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
@@ -62,7 +63,7 @@
/// <param name="httpClientHelper">HTTP 瀹㈡埛绔府鍔╃被</param>
/// <param name="logger">鏃ュ織璁板綍鍣�</param>
public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService, HttpClientHelper httpClientHelper, ILogger logger)
- : this(taskService, routerService, taskNum => QueryTransferTask(httpClientHelper, taskNum), logger)
+ : this(taskService, routerService, taskNum => QueryTransferTask(httpClientHelper, taskNum, logger), logger)
{
}
@@ -146,6 +147,23 @@
return selectedTask;
}
+ // ===== TargetAddress 涓嶅彲鐢ㄦ椂锛屽厛灏濊瘯鍚� NextAddress 鐨勫叾浠栦换鍔� =====
+ var sameStationTasks = _taskService
+ .QueryStackerCraneOutTasks(deviceCode, new List<string> { candidateTask.NextAddress })
+ .Where(x => x.TaskId != candidateTask.TaskId)
+ .ToList();
+
+ foreach (var sameStationTask in sameStationTasks)
+ {
+ selectedTask = TrySelectOutboundTask(sameStationTask);
+ if (selectedTask != null)
+ {
+ QuartzLogHelper.LogDebug(_logger, $"閫変腑鍚岀珯鍙板閫夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
+ return selectedTask;
+ }
+ }
+
+ // ===== 鍚� NextAddress 鏃犲彲鐢ㄤ换鍔★紝灏濊瘯涓嶅悓 NextAddress 鐨勪换鍔� =====
// 鏌ユ壘鍏朵粬鍙敤鐨勫嚭搴撶珯鍙�
var otherOutStationCodes = _routerService
.QueryNextRoutes(deviceCode, candidateTask.NextAddress, candidateTask.TaskType)
@@ -184,7 +202,21 @@
/// <returns>鍙�変腑鐨勪换鍔★紝鎴� null锛堢珯鍙颁笉鍙敤锛�</returns>
private Dt_Task? TrySelectOutboundTask(Dt_Task outboundTask)
{
- // 瀵逛簬鎵�鏈夊嚭搴撲换鍔★紝蹇呴』鍏堣皟鐢� WMS 鍒ゆ柇鏄惁闇�瑕佺Щ搴�
+ // 鍏堣繘琛屾湰鍦扮珯鍙版鏌ワ紙PLC 璇诲彇锛屽揩閫燂級锛岄伩鍏嶄笉蹇呰鐨� WMS HTTP 璋冪敤
+
+ // 鍒ゆ柇 TargetAddress 杈撻�佺嚎绔欏彴鏄惁绌洪棽
+ if (!IsTargetAddressConveyorStationAvailable(outboundTask))
+ {
+ return null;
+ }
+
+ // 鍒ゆ柇 NextAddress 鍑哄簱绔欏彴鏄惁鍙敤
+ if (!IsOutTaskStationAvailable(outboundTask))
+ {
+ return null;
+ }
+
+ // 绔欏彴妫�鏌ラ�氳繃鍚庯紝璋冪敤 WMS 鍒ゆ柇鏄惁闇�瑕佺Щ搴�
var taskAfterTransferCheck = _transferCheck(outboundTask.TaskNum) ?? outboundTask;
var taskGroup = taskAfterTransferCheck.TaskType.GetTaskTypeGroup();
@@ -206,8 +238,7 @@
return taskAfterTransferCheck;
}
- // 鍒ゆ柇鍑哄簱绔欏彴鏄惁鍙敤
- return IsOutTaskStationAvailable(taskAfterTransferCheck) ? taskAfterTransferCheck : null;
+ return taskAfterTransferCheck;
}
/// <summary>
@@ -219,18 +250,24 @@
/// <param name="httpClientHelper">HTTP 瀹㈡埛绔府鍔╃被</param>
/// <param name="taskNum">浠诲姟鍙�</param>
/// <returns>濡傛灉闇�瑕佺Щ搴撹繑鍥炵Щ搴撲换鍔★紝鍚﹀垯杩斿洖 null</returns>
- private static Dt_Task? QueryTransferTask(HttpClientHelper httpClientHelper, int taskNum)
+ private static Dt_Task? QueryTransferTask(HttpClientHelper httpClientHelper, int taskNum, ILogger logger)
{
// 璋冪敤 WMS 鐨勭Щ搴撴鏌ユ帴鍙�
+ string configKey = nameof(ConfigKey.TransferCheck);
+ string requestParam = taskNum.ToString();
+
var response = httpClientHelper.Post<WebResponseContent>(
- nameof(ConfigKey.TransferCheck),
- taskNum.ToString());
+ configKey,
+ requestParam);
// 妫�鏌ュ搷搴旀槸鍚︽垚鍔�
if (response == null || !response.IsSuccess || response.Data == null || !response.Data.Status || response.Data.Data == null)
{
+ QuartzLogHelper.LogError(logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵(response?.Data?.Message ?? "鏃犲搷搴�")}銆�", "StackerCraneTaskSelector");
return null;
}
+
+ QuartzLogHelper.LogInfo(logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵response.Data.Data}銆�", "StackerCraneTaskSelector");
// 瑙f瀽杩斿洖鐨勪换鍔℃暟鎹�
var taskJson = response.Data.Data.ToString();
@@ -313,5 +350,47 @@
return isOccupied;
}
+
+ /// <summary>
+ /// 鍒ゆ柇 TargetAddress 杈撻�佺嚎绔欏彴鏄惁绌洪棽
+ /// </summary>
+ /// <param name="task">鍑哄簱浠诲姟</param>
+ /// <returns>绔欏彴绌洪棽锛圕V_State == 2锛夎繑鍥� true</returns>
+ private bool IsTargetAddressConveyorStationAvailable([NotNull] Dt_Task task)
+ {
+ // 纭畾浠诲姟绫诲瀷
+ int taskType = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty
+ ? StackerCraneConst.EmptyPalletTaskType
+ : task.TaskType;
+
+ // 閫氳繃璺敱鏌ユ壘 TargetAddress 瀵瑰簲鐨勮澶囦俊鎭�
+ Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.TargetAddress, taskType);
+ if (router == null)
+ {
+ QuartzLogHelper.LogWarn(_logger, "IsTargetAddressConveyorStationAvailable锛氭湭鎵惧埌 TargetAddress 璺敱淇℃伅锛孴argetAddress: {TargetAddress}锛屼换鍔″彿: {TaskNum}",
+ $"IsTargetAddressConveyorStationAvailable锛氭湭鎵惧埌 TargetAddress 璺敱淇℃伅锛孴argetAddress: {task.TargetAddress}", task.Roadway, task.TargetAddress, task.TaskNum);
+ return false;
+ }
+
+ // 鏌ユ壘杈撻�佺嚎璁惧
+ IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode);
+ if (device == null)
+ {
+ QuartzLogHelper.LogWarn(_logger, "IsTargetAddressConveyorStationAvailable锛氭湭鎵惧埌杈撻�佺嚎璁惧锛孋hildPosiDeviceCode: {ChildPosiDeviceCode}锛屼换鍔″彿: {TaskNum}",
+ $"IsTargetAddressConveyorStationAvailable锛氭湭鎵惧埌杈撻�佺嚎璁惧锛孋hildPosiDeviceCode: {router.ChildPosiDeviceCode}", task.Roadway, router.ChildPosiDeviceCode, task.TaskNum);
+ return false;
+ }
+
+ // 杞崲涓鸿緭閫佺嚎璁惧
+ CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
+
+ // 璇诲彇 CV_State锛孋V_State == 2 琛ㄧず绌洪棽
+ byte cvState = conveyorLine.GetValue<ConveyorLineDBNameNew, byte>(ConveyorLineDBNameNew.CV_State, task.TargetAddress);
+ bool isAvailable = cvState == 2;
+ QuartzLogHelper.LogInfo(_logger, "IsTargetAddressConveyorStationAvailable锛歍argetAddress: {TargetAddress}锛孋V_State: {CV_State}锛屾槸鍚︾┖闂�: {IsAvailable}锛屼换鍔″彿: {TaskNum}",
+ $"IsTargetAddressConveyorStationAvailable锛歍argetAddress: {task.TargetAddress}锛孋V_State: {cvState}锛屾槸鍚︾┖闂�: {isAvailable}", task.Roadway, task.TargetAddress, cvState, isAvailable, task.TaskNum);
+
+ return isAvailable;
+ }
}
}
\ No newline at end of file
--
Gitblit v1.9.3