From b0327633d7d0c19693a4e577d1e17b3b22e8274e Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期日, 12 四月 2026 01:23:56 +0800
Subject: [PATCH] refactor(WCS&WMS): 新增手动下发输送线任务

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs |  383 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 232 insertions(+), 151 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
index 73df26f..144ba00 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 << 版 本 注 释 >>
-
-/*----------------------------------------------------------------
- * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob
- * 创建者:胡童庆
- * 创建时间:2024/8/2 16:13:36
- * 版本:V1.0.0
- * 描述:
- *
- * ----------------------------------------------------------------
- * 修改人:
- * 修改时间:
- * 版本:V1.0.1
- * 修改说明:
- *
- *----------------------------------------------------------------*/
-
-#endregion << 版 本 注 释 >>
-
-using AutoMapper;
-using System.Data;
+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,218 +11,316 @@
 
 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;
 
-        public ConveyorLineDispatchHandler(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper)
+        /// <summary>
+        /// 鏃ュ織璁板綍鍣�
+        /// </summary>
+        private readonly ILogger _logger;
+
+        /// <summary>
+        /// 杈撻�佺嚎浠诲姟杩囨护鍣�
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬鏌ヨ寰呭鐞嗗拰鎵ц涓殑浠诲姟銆�
+        /// </remarks>
+        private readonly ConveyorLineTaskFilter _taskFilter;
+
+        /// <summary>
+        /// 鐩爣鍦板潃閫夋嫨鍣�
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬澶勭悊鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囩殑涓婁笅灞傝姹傘��
+        /// </remarks>
+        private readonly ConveyorLineTargetAddressSelector _targetAddressSelector;
+
+        /// <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, _logger);
+            _targetAddressSelector = new ConveyorLineTargetAddressSelector(_logger);
         }
 
         /// <summary>
-        /// 心跳处理
+        /// 澶勭悊杈撻�佺嚎蹇冭烦
         /// </summary>
-        /// <param name="conveyorLine"></param>
-        /// <param name="command"></param>
-        /// <param name="childDeviceCode"></param>
+        /// <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>
-        /// <param name="conveyorLine">输送线实例对象</param>
-        /// <param name="command">读取的请求信息</param>
-        /// <param name="childDeviceCode">子设备编号</param>
+        /// <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)
         {
-            if (_taskService.RequestWMSTask(command.Barcode, childDeviceCode).Status)
+            _logger.LogInformation("RequestInbound锛氬瓙璁惧 {ChildDeviceCode} 璇锋眰鍏ュ簱", childDeviceCode);
+            QuartzLogger.Info($"璇锋眰鍏ュ簱锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
+
+            // 鍚� WMS 璇锋眰鏂颁换鍔★紙鍩轰簬鏉$爜锛�
+            if (_taskFilter.RequestWmsTask(command.Barcode, childDeviceCode))
             {
-                Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, 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>
-        /// <param name="conveyorLine">输送线实例对象</param>
-        /// <param name="command">读取的请求信息</param>
-        /// <param name="childDeviceCode">子设备编号</param>
+        /// <remarks>
+        /// 褰撳叆搴撲换鍔℃墽琛屽埌鏌愪釜涓棿绔欑偣鏃惰皟鐢ㄣ��
+        /// 鏍规嵁涓嬩竴鍦板潃鍒ゆ柇鏄惁闇�瑕佷笌鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囦氦浜掋��
+        /// </remarks>
+        /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+        /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
         public void RequestInNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
         {
-            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode);
-            if (task != null)
+            // 鏌ヨ姝e湪鎵ц鐨勪换鍔�
+            Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode);
+            if (task == null)
             {
-                const string ConstraintMachineName = "拘束机";
-                const string PinMachineName = "插拔钉机";
-
-                var devices = Storage.Devices;
-
-                if (string.Equals(task.NextAddress, ConstraintMachineName, StringComparison.Ordinal))
-                {
-                    ConstraintMachine? constraint = devices.OfType<ConstraintMachine>().FirstOrDefault(d => d.DeviceName == ConstraintMachineName);
-                    if (constraint == null) return;
-
-                    ProcessDeviceRequest(conveyorLine, constraint, childDeviceCode,
-                    () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.MaterialRequestUpper),
-                    () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.OutputRequestUpper),
-                    outputReq => constraint.SetValue(ConstraintMachineDBName.ConstraintTrayOutputReadyUpper, outputReq ? 1 : 0));
-                }
-                else if (string.Equals(task.NextAddress, PinMachineName, StringComparison.Ordinal))
-                {
-                    PinMachine? pinMachine = devices.OfType<PinMachine>().FirstOrDefault(d => d.DeviceName == PinMachineName);
-                    if (pinMachine == null) return;
-
-                    ProcessDeviceRequest(conveyorLine, pinMachine, childDeviceCode,
-                    () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.MaterialRequestUpper),
-                    () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.OutputRequestUpper),
-                    outputReq => pinMachine.SetValue(PinMachineDBName.PlugPinTrayOutputReadyUpper, outputReq ? 1 : 0));
-                }
-
-                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
-                if (newTask != null)
-                {
-                    _taskService.UpdateTaskStatusToNext(task);
-                }
+                _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);
+
+            // 璁剧疆 WCS_STB 鏍囧織锛岃〃绀� WCS 宸插鐞�
+            conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
         }
 
         /// <summary>
-        /// 输送线入库完成
+        /// 澶勭悊杈撻�佺嚎鍏ュ簱瀹屾垚
         /// </summary>
-        /// <param name="conveyorLine">输送线实例对象</param>
-        /// <param name="command">读取的请求信息</param>
-        /// <param name="childDeviceCode">子设备编号</param>
+        /// <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)
         {
-            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, 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>
-        /// <param name="conveyorLine">输送线实例对象</param>
-        /// <param name="command">读取的请求信息</param>
-        /// <param name="childDeviceCode">子设备编号</param>
+        /// <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 = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
+            // 鏌ヨ寰呭鐞嗕换鍔�
+            Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode);
             if (task != null)
             {
-                ConveyorLineTaskCommandNew taskCommand = _mapper.Map<ConveyorLineTaskCommandNew>(task);
-                taskCommand.WCS_ACK = command.WCS_ACK;
-                conveyorLine.SendCommand(taskCommand, childDeviceCode);
+                // 璁剧疆浠诲姟鍙�
+                conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, 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>
-        /// <param name="conveyorLine">输送线实例对象</param>
-        /// <param name="command">读取的请求信息</param>
-        /// <param name="childDeviceCode">子设备编号</param>
+        /// <remarks>
+        /// 褰撳嚭搴撲换鍔℃墽琛屽埌鏌愪釜涓棿绔欑偣鏃惰皟鐢ㄣ��
+        /// 鏍规嵁涓嬩竴鍦板潃鍒ゆ柇鏄惁闇�瑕佷笌鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囦氦浜掋��
+        /// </remarks>
+        /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
+        /// <param name="command">PLC 鍛戒护鏁版嵁</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
         public void RequestOutNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
         {
-            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode);
-            if (task != null)
+            // 鏌ヨ姝e湪鎵ц鐨勪换鍔�
+            Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode);
+            if (task == null)
             {
-                const string ConstraintMachineName = "拘束机";
-                const string PinMachineName = "插拔钉机";
-
-                var devices = Storage.Devices;
-
-                if (string.Equals(task.NextAddress, ConstraintMachineName, StringComparison.Ordinal))
-                {
-                    ConstraintMachine? constraint = devices.OfType<ConstraintMachine>().FirstOrDefault(d => d.DeviceName == ConstraintMachineName);
-                    if (constraint == null)
-                    {
-                        // 处理 processing 为空的情况(可根据实际业务需求添加处理逻辑)
-                        return;
-                    }
-                    ProcessDeviceRequest(conveyorLine, constraint, childDeviceCode,
-                    () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.MaterialRequestLower),
-                    () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.OutputRequestLower),
-                    outputReq => constraint.SetValue(ConstraintMachineDBName.ConstraintTrayOutputReadyLower, outputReq ? 1 : 0));
-                }
-                else if (string.Equals(task.NextAddress, PinMachineName, StringComparison.Ordinal))
-                {
-                    PinMachine? pinMachine = devices.OfType<PinMachine>().FirstOrDefault(d => d.DeviceName == PinMachineName);
-                    if (pinMachine == null)
-                    {
-                        // 处理 pinMachine 为空的情况(可根据实际业务需求添加处理逻辑)
-                        return;
-                    }
-                    ProcessDeviceRequest(conveyorLine, pinMachine, childDeviceCode,
-                    () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.MaterialRequestLower),
-                    () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.OutputRequestLower),
-                    outputReq => pinMachine.SetValue(PinMachineDBName.PlugPinTrayOutputReadyLower, outputReq ? 1 : 0));
-                }
-
-                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
+                _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);
+
+            // 鍥炲 ACK 纭
+            conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
         }
 
         /// <summary>
-        /// 输送线出库完成
+        /// 澶勭悊杈撻�佺嚎鍑哄簱瀹屾垚
         /// </summary>
-        /// <param name="conveyorLine">输送线实例对象</param>
-        /// <param name="command">读取的请求信息</param>
-        /// <param name="childDeviceCode">子设备编号</param>
+        /// <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)
         {
-            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, 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());
-            }
-        }
 
-        /// <summary>
-        /// 通用的设备请求处理方法
-        /// </summary>
-        private void ProcessDeviceRequest<T>(CommonConveyorLine conveyorLine, T device, string childDeviceCode,
-            Func<bool> getMaterialRequest, Func<bool> getOutputRequest, Action<bool> setOutputReady)
-        {
-            bool materialReq = getMaterialRequest();
-            bool outputReq = getOutputRequest();
+                // 鍥炲 ACK 纭
+                conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
 
-            if (materialReq)
-            {
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, 1, childDeviceCode);
-                conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode);
-            }
-            else
-            {
-                setOutputReady(outputReq);
+                _logger.LogInformation("ConveyorLineOutFinish锛氬嚭搴撳畬鎴愶紝浠诲姟鍙�: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", task.TaskNum, childDeviceCode);
+                QuartzLogger.Info($"鍑哄簱瀹屾垚锛屼换鍔″彿: {task.TaskNum}", conveyorLine.DeviceCode);
             }
         }
     }
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3