From fe2a1e74780259605cd230e6f9c629c3dd7fdf15 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 10 四月 2026 20:19:06 +0800
Subject: [PATCH] feat: 添加消防任务支持并修复堆垛机状态处理
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs | 242 ++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 201 insertions(+), 41 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
index 048b49a..9f8828c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
@@ -1,26 +1,9 @@
-锘�#region << 鐗� 鏈� 娉� 閲� >>
-
-/*----------------------------------------------------------------
- * 鍛藉悕绌洪棿锛歐IDESEAWCS_Tasks.ConveyorLineJob
- * 鍒涘缓鑰咃細鑳$搴�
- * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36
- * 鐗堟湰锛歏1.0.0
- * 鎻忚堪锛�
- *
- * ----------------------------------------------------------------
- * 淇敼浜猴細
- * 淇敼鏃堕棿锛�
- * 鐗堟湰锛歏1.0.1
- * 淇敼璇存槑锛�
- *
- *----------------------------------------------------------------*/
-
-#endregion << 鐗� 鏈� 娉� 閲� >>
-
using MapsterMapper;
+using Microsoft.Extensions.Logging;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
@@ -28,140 +11,317 @@
namespace WIDESEAWCS_Tasks
{
+ /// <summary>
+ /// 杈撻�佺嚎璋冨害澶勭悊鍣� - 澶勭悊杈撻�佺嚎鐨勫悇绉嶄笟鍔¤姹�
+ /// </summary>
+ /// <remarks>
+ /// 鏍稿績鑱岃矗锛�
+ /// 1. 澶勭悊杈撻�佺嚎鐨勫績璺筹紙淇濇寔杩炴帴锛�
+ /// 2. 澶勭悊鍏ュ簱璇锋眰锛圥LC 璇锋眰鍏ュ簱浠诲姟锛�
+ /// 3. 澶勭悊鍏ュ簱涓嬩竴鍦板潃锛堜换鍔℃墽琛屼腑鐨勫湴鍧�鏇存柊锛�
+ /// 4. 澶勭悊鍏ュ簱瀹屾垚
+ /// 5. 澶勭悊鍑哄簱璇锋眰
+ /// 6. 澶勭悊鍑哄簱涓嬩竴鍦板潃
+ /// 7. 澶勭悊鍑哄簱瀹屾垚
+ ///
+ /// 璇ョ被鏄緭閫佺嚎涓氬姟閫昏緫鐨勬牳蹇冿紝鏍规嵁 PLC 鐨勮姹傜被鍨嬭皟鐢ㄧ浉搴旂殑澶勭悊鏂规硶銆�
+ /// </remarks>
public class ConveyorLineDispatchHandler
{
+ /// <summary>
+ /// 浠诲姟鏈嶅姟
+ /// </summary>
private readonly ITaskService _taskService;
+
+ /// <summary>
+ /// 浠诲姟鎵ц鏄庣粏鏈嶅姟
+ /// </summary>
private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+
+ /// <summary>
+ /// 璺敱鏈嶅姟
+ /// </summary>
private readonly IRouterService _routerService;
+
+ /// <summary>
+ /// 瀵硅薄鏄犲皠鍣�
+ /// </summary>
private readonly IMapper _mapper;
+ /// <summary>
+ /// 鏃ュ織璁板綍鍣�
+ /// </summary>
+ private readonly ILogger _logger;
+
+ /// <summary>
+ /// 杈撻�佺嚎浠诲姟杩囨护鍣�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬鏌ヨ寰呭鐞嗗拰鎵ц涓殑浠诲姟銆�
+ /// </remarks>
private readonly ConveyorLineTaskFilter _taskFilter;
+
+ /// <summary>
+ /// 鐩爣鍦板潃閫夋嫨鍣�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬澶勭悊鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囩殑涓婁笅灞傝姹傘��
+ /// </remarks>
private readonly ConveyorLineTargetAddressSelector _targetAddressSelector;
- public ConveyorLineDispatchHandler(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper)
+ /// <summary>
+ /// 鏋勯�犲嚱鏁�
+ /// </summary>
+ /// <param name="taskService">浠诲姟鏈嶅姟</param>
+ /// <param name="taskExecuteDetailService">浠诲姟鎵ц鏄庣粏鏈嶅姟</param>
+ /// <param name="routerService">璺敱鏈嶅姟</param>
+ /// <param name="mapper">瀵硅薄鏄犲皠鍣�</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+ public ConveyorLineDispatchHandler(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ILogger logger)
{
_taskService = taskService;
_taskExecuteDetailService = taskExecuteDetailService;
_routerService = routerService;
_mapper = mapper;
+ _logger = logger;
- _taskFilter = new ConveyorLineTaskFilter(taskService);
- _targetAddressSelector = new ConveyorLineTargetAddressSelector();
+ // 鍒濆鍖栦换鍔¤繃婊ゅ櫒鍜岀洰鏍囧湴鍧�閫夋嫨鍣�
+ _taskFilter = new ConveyorLineTaskFilter(taskService, _logger);
+ _targetAddressSelector = new ConveyorLineTargetAddressSelector(_logger);
}
/// <summary>
- /// 蹇冭烦澶勭悊
+ /// 澶勭悊杈撻�佺嚎蹇冭烦
/// </summary>
+ /// <remarks>
+ /// 褰撴敹鍒� PLC 鐨勫績璺充俊鍙锋椂璋冪敤銆�
+ /// 娓呴櫎浠诲姟鍙凤紝琛ㄧず褰撳墠娌℃湁鎵ц浠诲姟銆�
+ /// 杩欐槸涓轰簡淇濇寔涓� PLC 鐨勮繛鎺ユ椿璺冦��
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void HeartBeat(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ // 娓呴櫎浠诲姟鍙凤紝琛ㄧず褰撳墠绌洪棽
conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, 0, childDeviceCode);
+ _logger.LogDebug("HeartBeat锛氬瓙璁惧 {ChildDeviceCode} 蹇冭烦", childDeviceCode);
+ QuartzLogger.Debug($"HeartBeat锛氬瓙璁惧 {childDeviceCode} 蹇冭烦", conveyorLine.DeviceCode);
}
/// <summary>
- /// 杈撻�佺嚎璇锋眰鍏ュ簱
+ /// 澶勭悊杈撻�佺嚎鍏ュ簱璇锋眰
/// </summary>
+ /// <remarks>
+ /// 褰� PLC 璇锋眰鍏ュ簱浠诲姟鏃惰皟鐢ㄣ��
+ /// 娴佺▼锛�
+ /// 1. 鍚� WMS 璇锋眰鏂颁换鍔�
+ /// 2. 鏌ヨ寰呭鐞嗕换鍔�
+ /// 3. 涓嬪彂浠诲姟鍒� PLC
+ /// 4. 鏇存柊浠诲姟鐘舵��
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void RequestInbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ _logger.LogInformation("RequestInbound锛氬瓙璁惧 {ChildDeviceCode} 璇锋眰鍏ュ簱", childDeviceCode);
+ QuartzLogger.Info($"璇锋眰鍏ュ簱锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
+
+ // 鍚� WMS 璇锋眰鏂颁换鍔★紙鍩轰簬鏉$爜锛�
if (_taskFilter.RequestWmsTask(command.Barcode, childDeviceCode))
{
+ // WMS 杩斿洖鎴愬姛锛屾煡璇㈠緟澶勭悊浠诲姟
Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode);
if (task != null)
{
+ // 灏嗕换鍔℃槧灏勪负 PLC 鍛戒护
ConveyorLineTaskCommandNew taskCommand = _mapper.Map<ConveyorLineTaskCommandNew>(task);
+
+ // 缁ф壙 WCS_ACK 鏍囧織
taskCommand.WCS_ACK = command.WCS_ACK;
+
+ // 鍙戦�佸懡浠ゅ埌 PLC
conveyorLine.SendCommand(taskCommand, childDeviceCode);
+ // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵
_taskService.UpdateTaskStatusToNext(task);
+
+ _logger.LogInformation("RequestInbound锛氬叆搴撲换鍔″凡涓嬪彂锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+ QuartzLogger.Info($"鍏ュ簱浠诲姟宸蹭笅鍙戯紝浠诲姟鍙�: {task.TaskNum}锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
}
}
}
/// <summary>
- /// 杈撻�佺嚎璇锋眰鍏ュ簱涓嬩竴鍦板潃
+ /// 澶勭悊杈撻�佺嚎鍏ュ簱涓嬩竴鍦板潃璇锋眰
/// </summary>
+ /// <remarks>
+ /// 褰撳叆搴撲换鍔℃墽琛屽埌鏌愪釜涓棿绔欑偣鏃惰皟鐢ㄣ��
+ /// 鏍规嵁涓嬩竴鍦板潃鍒ゆ柇鏄惁闇�瑕佷笌鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囦氦浜掋��
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void RequestInNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ // 鏌ヨ姝e湪鎵ц鐨勪换鍔�
Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode);
if (task == null)
{
+ _logger.LogDebug("RequestInNextAddress锛氫换鍔� {TaskNo} 涓嶅瓨鍦�", command.TaskNo);
+ QuartzLogger.Debug($"RequestInNextAddress锛氫换鍔� {command.TaskNo} 涓嶅瓨鍦�", conveyorLine.DeviceCode);
return;
}
+
+ _logger.LogInformation("RequestInNextAddress锛氬叆搴撲笅涓�鍦板潃锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+ QuartzLogger.Info($"RequestInNextAddress锛氬叆搴撲笅涓�鍦板潃锛屼换鍔″彿: {task.TaskNum}锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
+
+ // 濡傛灉涓嶆槸绌烘墭鐩樹换鍔★紝澶勭悊鐩爣鍦板潃锛堜笌鎷樻潫鏈�/鎻掓嫈閽夋満浜や簰锛�
if (task.TaskType != (int)TaskOutboundTypeEnum.OutEmpty)
{
_targetAddressSelector.HandleInboundNextAddress(conveyorLine, task.NextAddress, childDeviceCode);
}
+ // 鏇存柊浠诲姟褰撳墠浣嶇疆
_ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
- conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, childDeviceCode);
+ // 璁剧疆 WCS_STB 鏍囧織锛岃〃绀� WCS 宸插鐞�
+ conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
}
/// <summary>
- /// 杈撻�佺嚎鍏ュ簱瀹屾垚
+ /// 澶勭悊杈撻�佺嚎鍏ュ簱瀹屾垚
/// </summary>
+ /// <remarks>
+ /// 褰撳叆搴撲换鍔″畬鎴愭椂璋冪敤銆�
+ /// 鏇存柊浠诲姟鐘舵�佸苟鍥炲 PLC銆�
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void ConveyorLineInFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ // 鏌ヨ姝e湪鎵ц鐨勪换鍔�
Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode);
if (task != null)
{
- conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode);
- WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
- Console.Out.WriteLine(content.Serialize());
+
+ // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵锛堥�氬父鏄畬鎴愶級
+ if (_taskService.UpdateTaskStatusToNext(task).Status)
+ {
+
+ }
+
+ // 鍥炲 ACK 纭
+ conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+
+ _logger.LogInformation("ConveyorLineInFinish锛氬叆搴撳畬鎴愶紝浠诲姟鍙�: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+ QuartzLogger.Info($"鍏ュ簱瀹屾垚锛屼换鍔″彿: {task.TaskNum}", conveyorLine.DeviceCode);
}
}
/// <summary>
- /// 杈撻�佺嚎璇锋眰鍑轰俊鎭�
+ /// 澶勭悊杈撻�佺嚎鍑哄簱璇锋眰
/// </summary>
+ /// <remarks>
+ /// 褰� PLC 璇锋眰鍑哄簱浠诲姟鏃惰皟鐢ㄣ��
+ /// 娴佺▼锛�
+ /// 1. 鏌ヨ寰呭鐞嗕换鍔�
+ /// 2. 涓嬪彂浠诲姟鍒� PLC
+ /// 3. 鏇存柊浠诲姟鐘舵��
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ // 鏌ヨ寰呭鐞嗕换鍔�
Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode);
if (task != null)
{
+ // 璁剧疆浠诲姟鍙�
conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode);
- conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
- conveyorLine.SetValue(ConveyorLineDBNameNew.Target, task.NextAddress, childDeviceCode);
- conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode);
+ // 璁剧疆鎵樼洏鏉$爜
+ conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
+
+ // 璁剧疆鐩爣鍦板潃
+ conveyorLine.SetValue(ConveyorLineDBNameNew.Target, task.NextAddress, childDeviceCode);
+
+ // 鍥炲 ACK 纭
+ conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+
+ // 鏇存柊浠诲姟鐘舵��
_taskService.UpdateTaskStatusToNext(task);
+
+ _logger.LogInformation("RequestOutbound锛氬嚭搴撲换鍔″凡涓嬪彂锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+ QuartzLogger.Info($"鍑哄簱浠诲姟宸蹭笅鍙戯紝浠诲姟鍙�: {task.TaskNum}", conveyorLine.DeviceCode);
}
}
/// <summary>
- /// 杈撻�佺嚎璇锋眰鍑哄簱涓嬩竴鍦板潃
+ /// 澶勭悊杈撻�佺嚎鍑哄簱涓嬩竴鍦板潃璇锋眰
/// </summary>
+ /// <remarks>
+ /// 褰撳嚭搴撲换鍔℃墽琛屽埌鏌愪釜涓棿绔欑偣鏃惰皟鐢ㄣ��
+ /// 鏍规嵁涓嬩竴鍦板潃鍒ゆ柇鏄惁闇�瑕佷笌鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囦氦浜掋��
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void RequestOutNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ // 鏌ヨ姝e湪鎵ц鐨勪换鍔�
Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode);
if (task == null)
{
+ _logger.LogDebug("RequestOutNextAddress锛氫换鍔� {TaskNo} 涓嶅瓨鍦�", command.TaskNo);
+ QuartzLogger.Debug($"RequestOutNextAddress锛氫换鍔� {command.TaskNo} 涓嶅瓨鍦�", conveyorLine.DeviceCode);
return;
}
+ _logger.LogInformation("RequestOutNextAddress锛氬嚭搴撲笅涓�鍦板潃锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+ QuartzLogger.Info($"RequestOutNextAddress锛氬嚭搴撲笅涓�鍦板潃锛屼换鍔″彿: {task.TaskNum}锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
+
+ // 濡傛灉涓嶆槸绌烘墭鐩樹换鍔★紝澶勭悊鐩爣鍦板潃
if (task.TaskType != (int)TaskOutboundTypeEnum.OutEmpty)
{
_targetAddressSelector.HandleOutboundNextAddress(conveyorLine, task.NextAddress, childDeviceCode);
}
+ // 鏇存柊浠诲姟褰撳墠浣嶇疆
_ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
-
- conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode);
+ // 鍥炲 ACK 纭
+ conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
}
/// <summary>
- /// 杈撻�佺嚎鍑哄簱瀹屾垚
+ /// 澶勭悊杈撻�佺嚎鍑哄簱瀹屾垚
/// </summary>
+ /// <remarks>
+ /// 褰撳嚭搴撲换鍔″畬鎴愭椂璋冪敤銆�
+ /// 鏇存柊浠诲姟鐘舵�佸苟鍥炲 PLC銆�
+ /// </remarks>
+ /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+ /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+ /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
public void ConveyorLineOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
{
+ // 鏌ヨ姝e湪鎵ц鐨勪换鍔�
Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode);
if (task != null)
{
- conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode);
+ // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵锛堥�氬父鏄畬鎴愶級
WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
- Console.Out.WriteLine(content.Serialize());
+
+ // 鍥炲 ACK 纭
+ conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+
+ _logger.LogInformation("ConveyorLineOutFinish锛氬嚭搴撳畬鎴愶紝浠诲姟鍙�: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+ QuartzLogger.Info($"鍑哄簱瀹屾垚锛屼换鍔″彿: {task.TaskNum}", conveyorLine.DeviceCode);
}
}
}
}
-
--
Gitblit v1.9.3