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 | 269 +++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 248 insertions(+), 21 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 605fcc6..96be485 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -1,169 +1,396 @@
-锘縰sing Newtonsoft.Json;
+using Newtonsoft.Json;
+using Serilog;
using System.Diagnostics.CodeAnalysis;
using WIDESEA_Core;
+using WIDESEAWCS_Common.Constants;
using WIDESEAWCS_Common.HttpEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
namespace WIDESEAWCS_Tasks
{
/// <summary>
- /// 鍫嗗灈鏈轰换鍔¢�夋嫨鍣細灏佽浠诲姟鎸戦�変笌绔欏彴鍙敤鎬у垽鏂��
+ /// 鍫嗗灈鏈轰换鍔¢�夋嫨鍣� - 灏佽浠诲姟鎸戦�変笌绔欏彴鍙敤鎬у垽鏂�
/// </summary>
+ /// <remarks>
+ /// 鏍稿績鑱岃矗锛�
+ /// 1. 鏍规嵁鍫嗗灈鏈轰笂涓�浠诲姟绫诲瀷閫夋嫨涓嬩竴涓悎閫傜殑浠诲姟
+ /// 2. 瀵瑰嚭搴撲换鍔¤繘琛岀Щ搴撴鏌ワ紙WMS 鍒ゆ柇锛�
+ /// 3. 鍒ゆ柇鍑哄簱绔欏彴鏄惁鍙敤锛堟槸鍚﹁鍗犵敤锛�
+ /// 4. 灏濊瘯閫夋嫨澶囬�夊嚭搴撶珯鍙�
+ ///
+ /// 浠诲姟閫夋嫨绛栫暐锛�
+ /// - 濡傛灉涓婁竴浠诲姟鏄嚭搴擄紝浼樺厛閫夋嫨鍏ュ簱浠诲姟
+ /// - 濡傛灉涓婁竴浠诲姟鏄叆搴擄紝浼樺厛閫夋嫨鍑哄簱浠诲姟
+ /// - 瀵逛簬鍑哄簱浠诲姟锛屽厛妫�鏌ユ槸鍚﹂渶瑕佺Щ搴�
+ /// </remarks>
public class StackerCraneTaskSelector
{
+ /// <summary>
+ /// 浠诲姟鏈嶅姟
+ /// </summary>
private readonly ITaskService _taskService;
+
+ /// <summary>
+ /// 璺敱鏈嶅姟
+ /// </summary>
private readonly IRouterService _routerService;
+
+ /// <summary>
+ /// 鏃ュ織璁板綍鍣�
+ /// </summary>
+ private readonly ILogger _logger;
+
+ /// <summary>
+ /// 绉诲簱妫�鏌ュ鎵樺嚱鏁�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬璋冪敤 WMS 鍒ゆ柇鍑哄簱浠诲姟鏄惁闇�瑕佸厛鎵ц绉诲簱銆�
+ /// </remarks>
private readonly Func<int, Dt_Task?> _transferCheck;
- public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService, HttpClientHelper httpClientHelper)
- : this(taskService, routerService, taskNum => QueryTransferTask(httpClientHelper, taskNum))
+ /// <summary>
+ /// 鏋勯�犲嚱鏁帮紙浣跨敤 HTTP 瀹㈡埛绔府鍔╃被锛�
+ /// </summary>
+ /// <param name="taskService">浠诲姟鏈嶅姟</param>
+ /// <param name="routerService">璺敱鏈嶅姟</param>
+ /// <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), logger)
{
}
- public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService, Func<int, Dt_Task?> transferCheck)
+ /// <summary>
+ /// 鏋勯�犲嚱鏁帮紙浣跨敤濮旀墭鍑芥暟锛�
+ /// </summary>
+ /// <param name="taskService">浠诲姟鏈嶅姟</param>
+ /// <param name="routerService">璺敱鏈嶅姟</param>
+ /// <param name="transferCheck">绉诲簱妫�鏌ュ嚱鏁�</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+ public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService, Func<int, Dt_Task?> transferCheck, ILogger logger)
{
_taskService = taskService;
_routerService = routerService;
_transferCheck = transferCheck;
+ _logger = logger;
}
+ /// <summary>
+ /// 閫夋嫨鍚堥�傜殑浠诲姟
+ /// </summary>
+ /// <remarks>
+ /// 鏍规嵁鍫嗗灈鏈虹殑涓婁竴浠诲姟绫诲瀷鍜屽綋鍓嶇姸鎬侊紝閫夋嫨涓嬩竴涓簲璇ユ墽琛岀殑浠诲姟銆�
+ ///
+ /// 閫夋嫨绛栫暐锛�
+ /// 1. 濡傛灉娌℃湁涓婁竴浠诲姟绫诲瀷锛屾煡璇㈡櫘閫氫换鍔�
+ /// 2. 濡傛灉涓婁竴浠诲姟鏄嚭搴擄紝浼樺厛鏌ュ叆搴撲换鍔★紝鍐嶆煡鍑哄簱浠诲姟
+ /// 3. 濡傛灉涓婁竴浠诲姟鏄叆搴擄紝浼樺厛鏌ュ嚭搴撲换鍔�
+ /// 4. 瀵逛簬鍑哄簱浠诲姟锛岄渶瑕佸垽鏂珯鍙版槸鍚﹀彲鐢�
+ /// </remarks>
+ /// <param name="commonStackerCrane">鍫嗗灈鏈鸿澶囧璞�</param>
+ /// <returns>閫変腑鐨勪换鍔★紝濡傛灉娌℃湁鍙敤浠诲姟杩斿洖 null</returns>
public Dt_Task? SelectTask(IStackerCrane commonStackerCrane)
{
Dt_Task? candidateTask;
- if (commonStackerCrane.LastTaskType == null)
+ var deviceCode = commonStackerCrane.DeviceCode;
+
+ QuartzLogHelper.LogDebug(_logger, $"寮�濮嬮�夋嫨浠诲姟锛岃澶�: {deviceCode}锛屼笂涓�浠诲姟绫诲瀷: {commonStackerCrane.LastTaskType}",commonStackerCrane.DeviceName);
+
+ // 鏍规嵁涓婁竴浠诲姟绫诲瀷鍐冲畾鏌ヨ绛栫暐
+ if (commonStackerCrane.LastTaskType == null || commonStackerCrane.LastTaskType == TaskRelocationTypeEnum.Relocation.GetHashCode())
{
- candidateTask = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
+ // 娌℃湁涓婁竴浠诲姟绫诲瀷锛屾煡璇㈡櫘閫氫换鍔�
+ candidateTask = _taskService.QueryStackerCraneTask(deviceCode);
+ QuartzLogHelper.LogDebug(_logger, $"鏌ヨ鏅�氫换鍔★紝璁惧: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
}
else if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
{
- candidateTask = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
- candidateTask ??= _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+ // 涓婁竴浠诲姟鏄嚭搴擄紝浼樺厛鏌ュ叆搴撲换鍔�
+ candidateTask = _taskService.QueryStackerCraneInTask(deviceCode);
+ // 濡傛灉娌℃湁鍏ュ簱浠诲姟锛屽啀鏌ヤ竴涓嬪嚭搴撲换鍔�
+ candidateTask ??= _taskService.QueryStackerCraneOutTask(deviceCode);
+ QuartzLogHelper.LogDebug(_logger, $"鍑哄簱鍚庝紭鍏堟煡鍏ュ簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
}
else
{
- candidateTask = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+ // 涓婁竴浠诲姟鏄叆搴擄紙闈炲嚭搴擄級锛屼紭鍏堟煡鍑哄簱浠诲姟
+ candidateTask = _taskService.QueryStackerCraneOutTask(deviceCode);
+ QuartzLogHelper.LogDebug(_logger, $"鍏ュ簱鍚庝紭鍏堟煡鍑哄簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
}
+ // 濡傛灉娌℃湁鍊欓�変换鍔★紝杩斿洖 null
if (candidateTask == null)
{
+ QuartzLogHelper.LogDebug(_logger, $"娌℃湁鍊欓�変换鍔★紝璁惧: {deviceCode}", commonStackerCrane.DeviceName);
return null;
}
+ // 濡傛灉涓嶆槸鍑哄簱浠诲姟锛岀洿鎺ヨ繑鍥�
if (candidateTask.TaskType.GetTaskTypeGroup() != TaskTypeGroup.OutbondGroup)
{
+ QuartzLogHelper.LogDebug(_logger, $"閫変腑闈炲嚭搴撲换鍔★紝浠诲姟鍙�: {candidateTask.TaskNum}锛屼换鍔$被鍨�: {candidateTask.TaskType}", commonStackerCrane.DeviceName);
return candidateTask;
}
+ // 灏濊瘯閫夋嫨鍑哄簱浠诲姟锛堝彲鑳介渶瑕佺Щ搴撴鏌ュ拰绔欏彴鍙敤鎬у垽鏂級
Dt_Task? selectedTask = TrySelectOutboundTask(candidateTask);
if (selectedTask != null)
{
+ QuartzLogHelper.LogDebug(_logger, $"閫変腑鍑哄簱浠诲姟锛屼换鍔″彿: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
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(commonStackerCrane.DeviceCode, candidateTask.NextAddress, candidateTask.TaskType)
+ .QueryNextRoutes(deviceCode, candidateTask.NextAddress, candidateTask.TaskType)
.Select(x => x.ChildPosi)
.ToList();
- var tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStationCodes);
+ // 鏌ヨ鍏朵粬绔欏彴鐨勫嚭搴撲换鍔�
+ var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, otherOutStationCodes);
foreach (var alternativeTask in tasks)
{
selectedTask = TrySelectOutboundTask(alternativeTask);
if (selectedTask != null)
{
+ QuartzLogHelper.LogDebug(_logger, $"閫変腑澶囬�夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
return selectedTask;
}
}
- return _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+ // 娌℃湁鍙敤鍑哄簱浠诲姟锛屽皾璇曡繑鍥炲叆搴撲换鍔�
+ var inboundTask = _taskService.QueryStackerCraneInTask(deviceCode);
+ QuartzLogHelper.LogDebug(_logger, $"杩斿洖鍏ュ簱浠诲姟锛屼换鍔″彿: {inboundTask?.TaskNum}", commonStackerCrane.DeviceName);
+ return inboundTask;
}
+ /// <summary>
+ /// 灏濊瘯閫夋嫨鍑哄簱浠诲姟
+ /// </summary>
+ /// <remarks>
+ /// 瀵瑰�欓�夊嚭搴撲换鍔¤繘琛岋細
+ /// 1. 绉诲簱妫�鏌ワ紙璋冪敤 WMS 鍒ゆ柇鏄惁闇�瑕佺Щ搴擄級
+ /// 2. 绔欏彴鍙敤鎬у垽鏂�
+ ///
+ /// 濡傛灉浠诲姟琚垽瀹氫负闇�瑕佺Щ搴擄紝鍒欒繑鍥炵Щ搴撳悗鐨勪换鍔°��
+ /// </remarks>
+ /// <param name="outboundTask">鍊欓�夊嚭搴撲换鍔�</param>
+ /// <returns>鍙�変腑鐨勪换鍔★紝鎴� null锛堢珯鍙颁笉鍙敤锛�</returns>
private Dt_Task? TrySelectOutboundTask(Dt_Task outboundTask)
{
- // 鍙鏄嚭搴撲换鍔★紝蹇呴』鍏堣皟鐢╓MS鍒ゆ柇鏄惁闇�瑕佺Щ搴撱��
+ // 鍏堣繘琛屾湰鍦扮珯鍙版鏌ワ紙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();
+ // 濡傛灉鏄Щ搴撲换鍔℃垨鍑哄簱浠诲姟锛屽皾璇曚粠 WMS 娣诲姞浠诲姟
if (taskGroup == TaskTypeGroup.RelocationGroup || taskGroup == TaskTypeGroup.OutbondGroup)
{
TryAddTaskFromWms(taskAfterTransferCheck);
}
+ // 濡傛灉鏄Щ搴撲换鍔★紝鐩存帴杩斿洖
if (taskGroup == TaskTypeGroup.RelocationGroup)
{
return taskAfterTransferCheck;
}
+ // 濡傛灉涓嶆槸鍑哄簱浠诲姟锛岃繑鍥炲師浠诲姟
if (taskGroup != TaskTypeGroup.OutbondGroup)
{
return taskAfterTransferCheck;
}
- return IsOutTaskStationAvailable(taskAfterTransferCheck) ? taskAfterTransferCheck : null;
+ return taskAfterTransferCheck;
}
- private static Dt_Task? QueryTransferTask(HttpClientHelper httpClientHelper, int taskNum)
+ /// <summary>
+ /// 璋冪敤 WMS 妫�鏌ョЩ搴�
+ /// </summary>
+ /// <remarks>
+ /// 閫氳繃 HTTP 璇锋眰璋冪敤 WMS 鐨勭Щ搴撴鏌ユ帴鍙c��
+ /// </remarks>
+ /// <param name="httpClientHelper">HTTP 瀹㈡埛绔府鍔╃被</param>
+ /// <param name="taskNum">浠诲姟鍙�</param>
+ /// <returns>濡傛灉闇�瑕佺Щ搴撹繑鍥炵Щ搴撲换鍔★紝鍚﹀垯杩斿洖 null</returns>
+ private static Dt_Task? QueryTransferTask(HttpClientHelper httpClientHelper, int taskNum, ILogger logger)
{
- var response = httpClientHelper.Post<WebResponseContent>(
- nameof(ConfigKey.TransferCheck),
- taskNum.ToString());
+ // 璋冪敤 WMS 鐨勭Щ搴撴鏌ユ帴鍙�
+ string configKey = nameof(ConfigKey.TransferCheck);
+ string requestParam = taskNum.ToString();
+ var response = httpClientHelper.Post<WebResponseContent>(
+ 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();
return string.IsNullOrWhiteSpace(taskJson) ? null : JsonConvert.DeserializeObject<Dt_Task>(taskJson);
}
+ /// <summary>
+ /// 灏濊瘯浠� WMS 娣诲姞浠诲姟
+ /// </summary>
+ /// <remarks>
+ /// 濡傛灉浠诲姟涓嶅瓨鍦ㄤ簬鏈湴鏁版嵁搴擄紝浠� WMS 杩斿洖鐨勬暟鎹坊鍔犲埌鏈湴銆�
+ /// </remarks>
+ /// <param name="task">浠诲姟瀵硅薄</param>
private void TryAddTaskFromWms(Dt_Task task)
{
+ // 妫�鏌ヤ换鍔″彿鏄惁鏈夋晥
if (task.TaskNum <= 0)
{
return;
}
+ // 妫�鏌ヤ换鍔℃槸鍚﹀凡瀛樺湪
var existingTask = _taskService.QueryByTaskNum(task.TaskNum);
if (existingTask != null)
{
return;
}
+ // 娣诲姞鍒版湰鍦版暟鎹簱
_taskService.AddData(task);
}
+ /// <summary>
+ /// 鍒ゆ柇鍑哄簱绔欏彴鏄惁鍙敤
+ /// </summary>
+ /// <remarks>
+ /// 妫�鏌ョ洰鏍囩珯鍙板搴旂殑杈撻�佺嚎鏄惁琚崰鐢ㄣ��
+ /// 濡傛灉绔欏彴涓婃湁璐х墿锛屽垯璇ョ珯鍙颁笉鍙敤銆�
+ /// </remarks>
+ /// <param name="task">鍑哄簱浠诲姟</param>
+ /// <returns>绔欏彴鍙敤杩斿洖 true</returns>
private bool IsOutTaskStationAvailable([NotNull] Dt_Task task)
{
+ // 纭畾浠诲姟绫诲瀷
int taskType = 0;
if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
{
- taskType = 100;
+ // 绌烘墭鐩樺嚭搴�
+ taskType = StackerCraneConst.EmptyPalletTaskType;
}
else
taskType = task.TaskType;
+
+ // 鏌ヨ绔欏彴璺敱淇℃伅
Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.NextAddress, taskType);
if (router == null)
{
+ // 鏈壘鍒扮珯鍙拌矾鐢变俊鎭�
+ QuartzLogHelper.LogWarn(_logger, "IsOutTaskStationAvailable锛氭湭鎵惧埌绔欏彴璺敱淇℃伅锛岀珯鍙�: {NextAddress}锛屼换鍔″彿: {TaskNum}", $"IsOutTaskStationAvailable锛氭湭鎵惧埌绔欏彴璺敱淇℃伅锛岀珯鍙�: {task.NextAddress}", task.Roadway, task.NextAddress, task.TaskNum);
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
return false;
}
+ // 鏌ユ壘绔欏彴瀵瑰簲鐨勮澶�
IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode);
if (device == null)
{
+ // 鏈壘鍒拌澶�
+ QuartzLogHelper.LogWarn(_logger, "IsOutTaskStationAvailable锛氭湭鎵惧埌鍑哄簱绔欏彴瀵瑰簲鐨勯�氳瀵硅薄锛岀珯鍙�: {ChildPosiDeviceCode}锛屼换鍔″彿: {TaskNum}", $"IsOutTaskStationAvailable锛氭湭鎵惧埌鍑哄簱绔欏彴瀵瑰簲鐨勯�氳瀵硅薄锛岀珯鍙�: {router.ChildPosiDeviceCode}", task.Roadway, router.ChildPosiDeviceCode, task.TaskNum);
_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵router.ChildPosiDeviceCode}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
return false;
}
+ // 杞崲涓鸿緭閫佺嚎璁惧
CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
- return conveyorLine.IsOccupied(router.ChildPosi);
+
+ // 妫�鏌ョ珯鍙版槸鍚﹁鍗犵敤
+ bool isOccupied = conveyorLine.IsOccupied(router.ChildPosi);
+ QuartzLogHelper.LogInfo(_logger, "IsOutTaskStationAvailable锛氱珯鍙� {ChildPosi}锛屾槸鍚﹁鍗犵敤: {IsOccupied}锛屼换鍔″彿: {TaskNum}", $"IsOutTaskStationAvailable锛氱珯鍙� {router.ChildPosi}锛屾槸鍚﹁鍗犵敤: {!isOccupied}", task.Roadway, router.ChildPosi, !isOccupied, task.TaskNum);
+
+ 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