From ce1292c9cf37195b6abd2699dfc5d6cb3e143c9b Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期日, 12 四月 2026 23:38:19 +0800
Subject: [PATCH] feat(MES): 添加MES接口相关实体和DTO JS扩展文件至JSX格式并更新配置

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs |  539 +++++++++++++++++++++++++----------------------------------
 1 files changed, 226 insertions(+), 313 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
index 5831db5..69ec861 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -1,402 +1,315 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Components.Routing;
+using Microsoft.Extensions.Logging;
 using Quartz;
-using WIDESEAWCS_Common.TaskEnum;
-using WIDESEAWCS_Communicator;
-using WIDESEAWCS_Core.Enums;
-using WIDESEAWCS_Core.Helper;
+using WIDESEA_Core;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.LogHelper;
 using WIDESEAWCS_ITaskInfoRepository;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob;
-using WIDESEAWCS_QuartzJob.DeviceBase;
-using WIDESEAWCS_QuartzJob.Models;
 using WIDESEAWCS_QuartzJob.Service;
+using WIDESEAWCS_QuartzJob.StackerCrane;
 using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
-using WIDESEAWCS_TaskInfoService;
+using WIDESEAWCS_Common.Constants;
 using WIDESEAWCS_Tasks.StackerCraneJob;
 
 namespace WIDESEAWCS_Tasks
 {
+    /// <summary>
+    /// 鍫嗗灈鏈轰换鍔′綔涓氾紙Quartz Job锛�- 鏍稿績璋冨害閫昏緫
+    /// </summary>
+    /// <remarks>
+    /// Quartz 瀹氭椂浠诲姟锛岃礋璐e爢鍨涙満鐨勪换鍔¤皟搴︺��
+    /// 浣跨敤 [DisallowConcurrentExecution] 绂佹骞跺彂鎵ц锛岀‘淇濆悓涓�鍫嗗灈鏈虹殑浠诲姟涓茶澶勭悊銆�
+    ///
+    /// 鏍稿績鑱岃矗锛�
+    /// 1. 浠庨厤缃枃浠跺姞杞藉懡浠ょ被鍨嬫槧灏�
+    /// 2. 妫�鏌ュ爢鍨涙満浠诲姟瀹屾垚鐘舵��
+    /// 3. 閫夋嫨鍚堥�傜殑浠诲姟锛堝鎵樼粰 StackerCraneTaskSelector锛�
+    /// 4. 鏋勫缓鍛戒护瀵硅薄锛堝鎵樼粰 StackerCraneCommandBuilder锛�
+    /// 5. 鍙戦�佸懡浠ゅ埌鍫嗗灈鏈�
+    /// 6. 澶勭悊浠诲姟瀹屾垚浜嬩欢
+    ///
+    /// 鏋舵瀯璁捐锛�
+    /// - StackerCraneTaskSelector锛氳礋璐i�夋嫨鍚堥�傜殑浠诲姟
+    /// - StackerCraneCommandBuilder锛氳礋璐e皢浠诲姟杞崲涓哄懡浠ゅ璞�
+    /// - CommonStackerCraneJob锛氳礋璐h皟搴︽祦绋嬫帶鍒�
+    /// </remarks>
     [DisallowConcurrentExecution]
     public class CommonStackerCraneJob : IJob
     {
+        /// <summary>
+        /// 浠诲姟鏈嶅姟
+        /// </summary>
         private readonly ITaskService _taskService;
+
+        /// <summary>
+        /// 浠诲姟鎵ц鏄庣粏鏈嶅姟
+        /// </summary>
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+
+        /// <summary>
+        /// 浠诲姟浠撳偍
+        /// </summary>
         private readonly ITaskRepository _taskRepository;
-        private readonly IRouterService _routerService;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄懡浠ら厤缃�
+        /// </summary>
+        /// <remarks>
+        /// 鍖呭惈宸烽亾涓庡懡浠ょ被鍨嬬殑鏄犲皠鍏崇郴銆�
+        /// 浠� JSON 鏂囦欢鍔犺浇銆�
+        /// </remarks>
         private readonly StackerCraneCommandConfig _config;
 
-        public CommonStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService)
+        /// <summary>
+        /// 鍫嗗灈鏈轰换鍔¢�夋嫨鍣�
+        /// </summary>
+        /// <remarks>
+        /// 璐熻矗閫夋嫨鍚堥�傜殑浠诲姟杩涜鎵ц銆�
+        /// </remarks>
+        private readonly StackerCraneTaskSelector _taskSelector;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄懡浠ゆ瀯寤哄櫒
+        /// </summary>
+        /// <remarks>
+        /// 璐熻矗灏嗕换鍔¤浆鎹负鍫嗗灈鏈哄彲鎵ц鐨勫懡浠ゅ璞°��
+        /// </remarks>
+        private readonly StackerCraneCommandBuilder _commandBuilder;
+
+        /// <summary>
+        /// 鏃ュ織璁板綍鍣�
+        /// </summary>
+        private readonly ILogger<CommonStackerCraneJob> _logger;
+
+        /// <summary>
+        /// 鍫嗗灈鏈鸿澶囩紪鐮�
+        /// </summary>
+        private string _deviceCode = string.Empty;
+
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="taskService">浠诲姟鏈嶅姟</param>
+        /// <param name="taskExecuteDetailService">浠诲姟鎵ц鏄庣粏鏈嶅姟</param>
+        /// <param name="taskRepository">浠诲姟浠撳偍</param>
+        /// <param name="routerService">璺敱鏈嶅姟</param>
+        /// <param name="httpClientHelper">HTTP 瀹㈡埛绔府鍔╃被</param>
+        /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+        public CommonStackerCraneJob(
+            ITaskService taskService,
+            ITaskExecuteDetailService taskExecuteDetailService,
+            ITaskRepository taskRepository,
+            IRouterService routerService,
+            HttpClientHelper httpClientHelper,
+            ILogger<CommonStackerCraneJob> logger)
         {
             _taskService = taskService;
             _taskExecuteDetailService = taskExecuteDetailService;
             _taskRepository = taskRepository;
-            _routerService = routerService;
+            _logger = logger;
+
+            // 鍔犺浇閰嶇疆鏂囦欢
             _config = LoadConfig();
+
+            // 鍒濆鍖栦换鍔¢�夋嫨鍣�
+            _taskSelector = new StackerCraneTaskSelector(taskService, routerService, httpClientHelper, _logger);
+
+            // 鍒濆鍖栧懡浠ゆ瀯寤哄櫒
+            _commandBuilder = new StackerCraneCommandBuilder(taskService, routerService, _config, _logger);
         }
 
         /// <summary>
-        /// 鍔犺浇閰嶇疆锛堜紭鍏堢骇锛氶厤缃枃浠� > 榛樿閰嶇疆锛�
+        /// 鍔犺浇閰嶇疆鏂囦欢锛堜紭鍏堢骇锛氶厤缃枃浠� > 榛樿閰嶇疆锛�
         /// </summary>
+        /// <remarks>
+        /// 浠庡簲鐢ㄧ▼搴忕洰褰曚笅鐨� StackerCraneJob/stackercrane-command-config.json 璇诲彇閰嶇疆銆�
+        /// 濡傛灉鏂囦欢涓嶅瓨鍦ㄦ垨瑙f瀽澶辫触锛屼娇鐢ㄩ粯璁ら厤缃��
+        /// </remarks>
+        /// <returns>鍫嗗灈鏈哄懡浠ら厤缃�</returns>
         private static StackerCraneCommandConfig LoadConfig()
         {
             try
             {
+                // 鏋勯�犻厤缃枃浠惰矾寰�
                 string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "StackerCraneJob", "stackercrane-command-config.json");
                 if (File.Exists(configPath))
                 {
+                    // 璇诲彇骞惰В鏋� JSON 閰嶇疆
                     string json = File.ReadAllText(configPath);
                     return System.Text.Json.JsonSerializer.Deserialize<StackerCraneCommandConfig>(json) ?? new StackerCraneCommandConfig();
                 }
             }
             catch (Exception ex)
             {
+                // 閰嶇疆鍔犺浇澶辫触锛屼娇鐢ㄩ粯璁ら厤缃�
                 Console.WriteLine($"閰嶇疆鍔犺浇澶辫触: {ex.Message}锛屼娇鐢ㄩ粯璁ら厤缃�");
             }
+
             return new StackerCraneCommandConfig();
         }
 
+        /// <summary>
+        /// Quartz Job 鐨勬墽琛屽叆鍙�
+        /// </summary>
+        /// <remarks>
+        /// 鎵ц娴佺▼锛�
+        /// 1. 浠� JobDataMap 鑾峰彇鍫嗗灈鏈鸿澶囦俊鎭�
+        /// 2. 璁㈤槄浠诲姟瀹屾垚浜嬩欢锛堜粎绗竴娆℃墽琛屾椂锛�
+        /// 3. 妫�鏌ュ爢鍨涙満浠诲姟瀹屾垚鐘舵��
+        /// 4. 妫�鏌ユ槸鍚﹀彲浠ュ彂閫佷换鍔�
+        /// 5. 閫夋嫨浠诲姟
+        /// 6. 鏋勫缓鍛戒护
+        /// 7. 鍙戦�佸懡浠�
+        /// 8. 鏇存柊浠诲姟鐘舵�佸拰鍫嗗灈鏈虹姸鎬�
+        /// </remarks>
+        /// <param name="context">Quartz 浣滀笟鎵ц涓婁笅鏂�</param>
         public Task Execute(IJobExecutionContext context)
         {
             try
             {
-                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " CommonStackerCraneJob Start");
-
+                // 浠� JobDataMap 鑾峰彇鍫嗗灈鏈鸿澶囧弬鏁�
                 bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
-                if (!flag || value is not IStackerCrane commonStackerCrane)
+                if (!flag || value is not CommonStackerCrane commonStackerCrane)
                 {
+                    // 鍙傛暟鏃犳晥锛岀洿鎺ヨ繑鍥�
+                    _logger.LogWarning("Execute锛氬弬鏁版棤鏁�");
+                    QuartzLogger.Warn("Execute锛氬弬鏁版棤鏁�", "CommonStackerCraneJob");
                     return Task.CompletedTask;
                 }
 
+                _deviceCode = commonStackerCrane.DeviceCode;
+
+                // ========== 璁㈤槄浠诲姟瀹屾垚浜嬩欢锛堝叏灞�鍙闃呬竴娆★級 ==========
                 if (!commonStackerCrane.IsEventSubscribed)
                 {
+                    // 缁戝畾浠诲姟瀹屾垚浜嬩欢澶勭悊鏂规硶
                     commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;
+                    _logger.LogInformation("Execute锛氳闃呬换鍔″畬鎴愪簨浠讹紝璁惧: {DeviceCode}", _deviceCode);
+                    QuartzLogger.Info($"璁㈤槄浠诲姟瀹屾垚浜嬩欢", _deviceCode);
                 }
 
-                if (commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs))
-                {
-                    commonStackerCrane.CheckStackerCraneTaskCompleted();
+                // ========== 妫�鏌ュ爢鍨涙満浠诲姟瀹屾垚鐘舵�� ==========
+                commonStackerCrane.CheckStackerCraneTaskCompleted();
+                //_logger.LogDebug("Execute锛氭鏌ヤ换鍔″畬鎴愮姸鎬侊紝璁惧: {DeviceCode}", _deviceCode);
+                //QuartzLogger.Debug($"妫�鏌ヤ换鍔″畬鎴愮姸鎬侊紝璁惧: {_deviceCode}", _deviceCode);
 
-                    Dt_Task? task = GetTask(commonStackerCrane);
-                    if (task != null)
-                    {
-                        object? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
-                        if (stackerCraneTaskCommand != null)
-                        {
-                            bool sendFlag = SendStackerCraneCommand(commonStackerCrane, stackerCraneTaskCommand);
-                            if (sendFlag)
-                            {
-                                commonStackerCrane.LastTaskType = task.TaskType;
-                                _taskService.UpdateTaskStatusToNext(task.TaskNum);
-                            }
-                        }
-                    }
+                // ========== 妫�鏌ユ槸鍚﹀彲浠ュ彂閫佹柊浠诲姟 ==========
+                //if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs))
+                if (commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal)
+                {
+                    // 鍫嗗灈鏈轰笉鍙敤锛堝姝e湪鎵ц涓婁竴浠诲姟锛夛紝鐩存帴杩斿洖
+                    _logger.LogDebug("Execute锛氬爢鍨涙満涓嶅彲鐢紝璁惧: {DeviceCode}", _deviceCode);
+                    QuartzLogger.Debug($"鍫嗗灈鏈轰笉鍙敤锛岃澶�: {_deviceCode}", _deviceCode);
+                    return Task.CompletedTask;
+                }
+
+                // ========== 閫夋嫨浠诲姟 ==========
+                // 浠诲姟閫夋嫨涓嬫矇鍒颁笓鐢ㄩ�夋嫨鍣�
+                Dt_Task? task = _taskSelector.SelectTask(commonStackerCrane);
+                if (task == null)
+                {
+                    // 娌℃湁鍙敤浠诲姟
+                    //_logger.LogDebug("Execute锛氭病鏈夊彲鐢ㄤ换鍔★紝璁惧: {DeviceCode}", _deviceCode);
+                    //QuartzLogger.Debug($"娌℃湁鍙敤浠诲姟锛岃澶�: {_deviceCode}", _deviceCode);
+                    return Task.CompletedTask;
+                }
+
+                //_logger.LogInformation("Execute锛氶�夋嫨浠诲姟锛岃澶�: {DeviceCode}锛屼换鍔″彿: {TaskNum}", _deviceCode, task.TaskNum);
+                //QuartzLogger.Info($"閫夋嫨浠诲姟锛屼换鍔″彿: {task.TaskNum}", _deviceCode);
+
+                // ========== 鏋勫缓鍛戒护 ==========
+                // 鍛戒护鏋勫缓涓嬫矇鍒颁笓鐢ㄦ瀯寤哄櫒
+                object? stackerCraneTaskCommand = _commandBuilder.ConvertToStackerCraneTaskCommand(task);
+                if (stackerCraneTaskCommand == null)
+                {
+                    // 鍛戒护鏋勫缓澶辫触
+                    _logger.LogWarning("Execute锛氬懡浠ゆ瀯寤哄け璐ワ紝璁惧: {DeviceCode}锛屼换鍔″彿: {TaskNum}", _deviceCode, task.TaskNum);
+                    QuartzLogger.Warn($"鍛戒护鏋勫缓澶辫触锛屼换鍔″彿: {task.TaskNum}", _deviceCode);
+                    return Task.CompletedTask;
+                }
+
+                // ========== 鍙戦�佸懡浠� ==========
+                bool sendFlag = SendStackerCraneCommand(commonStackerCrane, stackerCraneTaskCommand);
+                if (sendFlag)
+                {
+                    Task.Delay(1000).Wait();
+                    commonStackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)StackerCraneWorkActionEnum.StartTask);
+                    // 鍙戦�佹垚鍔燂紝鏇存柊鐘舵��
+                    commonStackerCrane.LastTaskType = task.TaskType;
+                    _taskService.UpdateTaskStatusToNext(task.TaskNum);
+
+                    _logger.LogInformation("Execute锛氬懡浠ゅ彂閫佹垚鍔燂紝璁惧: {DeviceCode}锛屼换鍔″彿: {TaskNum}", _deviceCode, task.TaskNum);
+                    QuartzLogger.Info($"鍛戒护鍙戦�佹垚鍔燂紝浠诲姟鍙�: {task.TaskNum}", _deviceCode);
+                }
+                else
+                {
+                    _logger.LogError("Execute锛氬懡浠ゅ彂閫佸け璐ワ紝璁惧: {DeviceCode}锛屼换鍔″彿: {TaskNum}", _deviceCode, task.TaskNum);
+                    QuartzLogger.Error($"鍛戒护鍙戦�佸け璐�", _deviceCode);
                 }
             }
             catch (Exception ex)
             {
-                Console.WriteLine($"CommonStackerCraneJob Error: {ex.Message}");
+                // 璁板綍寮傚父
+                _logger.LogError(ex, "Execute锛氭墽琛屽紓甯革紝璁惧: {DeviceCode}", _deviceCode);
+                QuartzLogger.Error($"鎵ц寮傚父: {ex.Message}", _deviceCode, ex);
             }
+
             return Task.CompletedTask;
         }
 
         /// <summary>
-        /// 浠诲姟瀹屾垚浜嬩欢璁㈤槄鐨勬柟娉�
+        /// 鍫嗗灈鏈轰换鍔″畬鎴愪簨浠跺鐞�
         /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
+        /// <remarks>
+        /// 褰撳爢鍨涙満鎶ュ憡浠诲姟瀹屾垚鏃惰皟鐢ㄦ鏂规硶銆�
+        /// 澶勭悊锛�
+        /// 1. 璁板綍鏃ュ織
+        /// 2. 鏇存柊浠诲姟鐘舵�佷负瀹屾垚
+        /// 3. 娓呴櫎鍫嗗灈鏈虹殑浣滀笟鎸囦护
+        /// </remarks>
+        /// <param name="sender">浜嬩欢鍙戦�佽�咃紙鍫嗗灈鏈鸿澶囷級</param>
+        /// <param name="e">浜嬩欢鍙傛暟锛屽寘鍚畬鎴愮殑浠诲姟鍙�</param>
+        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, StackerCraneTaskCompletedEventArgs e)
         {
-            CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane;
-            if (commonStackerCrane != null)
+            IStackerCrane? stackerCrane = sender as IStackerCrane;
+            if (stackerCrane != null)
             {
-                //if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
-                //{
-                Console.Out.WriteLine("TaskCompleted" + e.TaskNum);
-                _taskService.StackCraneTaskCompleted(e.TaskNum);
-                commonStackerCrane.SetValue(StackerCraneDBName.WorkAction, 5);
-                //}
+                // 璁板綍鏃ュ織
+                _logger.LogInformation("CommonStackerCrane_StackerCraneTaskCompletedEventHandler锛氫换鍔″畬鎴愶紝浠诲姟鍙�: {TaskNum}", e.TaskNum);
+                QuartzLogger.Info($"浠诲姟瀹屾垚锛屼换鍔″彿: {e.TaskNum}", stackerCrane.DeviceCode);
+
+                // 鏇存柊浠诲姟鐘舵�佷负瀹屾垚
+                if (_taskService.StackCraneTaskCompleted(e.TaskNum).Status)
+                {
+                    // 娓呴櫎鍫嗗灈鏈虹殑浣滀笟鎸囦护锛堣缃负绌洪棽锛�
+                    stackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)StackerCraneWorkActionEnum.TaskComplete);
+                }
             }
         }
 
         /// <summary>
-        /// 鑾峰彇浠诲姟
+        /// 鍙戦�佸爢鍨涙満鍛戒护
         /// </summary>
-        /// <param name="commonStackerCrane">鍫嗗灈鏈哄璞�</param>
-        /// <returns></returns>
-        private Dt_Task? GetTask(IStackerCrane commonStackerCrane)
-        {
-            Dt_Task? task = null;
-            if (commonStackerCrane.LastTaskType == null)
-            {
-                task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
-            }
-            else
-            {
-                if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-                {
-                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
-                    task ??= _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
-                }
-                else
-                {
-                    task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
-                }
-            }
-
-            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-            {
-                if (IsOutTaskStationAvailable(task))
-                {
-                    return task;
-                }
-
-                List<string> otherOutStationCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress, task.TaskType)
-                    .Select(x => x.ChildPosi).ToList();
-                List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStationCodes);
-                foreach (var alternativeTask in tasks)
-                {
-                    if (IsOutTaskStationAvailable(alternativeTask))
-                    {
-                        return alternativeTask;
-                    }
-                }
-                task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
-            }
-
-            return task;
-        }
-
-        /// <summary>
-        /// 鍑哄簱浠诲姟鍒ゆ柇鍑哄簱绔欏彴鏄惁鍙敤
-        /// </summary>
-        /// <param name="task">浠诲姟瀹炰綋</param>
-        /// <returns>濡傛灉绔欏彴鍙敤杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
-        private bool IsOutTaskStationAvailable([NotNull] Dt_Task task)
-        {
-            Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.NextAddress, task.TaskType);
-            if (router == null)
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
-                return false;
-            }
-
-            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode);
-            if (device == null)
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵router.ChildPosiDeviceCode}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
-                return false;
-            }
-
-            CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
-            return conveyorLine.IsOccupied(router.ChildPosi);
-        }
-
-        /// <summary>
-        /// 浠诲姟瀹炰綋杞崲鎴愬懡浠odel
-        /// </summary>
-        public object? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task)
-        {
-            // 鏍规嵁閰嶇疆鍒ゆ柇鍛戒护绫诲瀷
-            string commandType = GetCommandType(task.Roadway);
-
-            // 鍒涘缓骞舵瀯寤哄懡浠�
-            return commandType switch
-            {
-                "Formation" => BuildCommand(task, CreateFormationCommand(task)),
-                _ => BuildCommand(task, CreateStandardCommand(task))
-            };
-        }
-
+        /// <remarks>
+        /// 鏍规嵁鍛戒护绫诲瀷璋冪敤鐩稿簲鐨勫彂閫佹柟娉曘��
+        /// 鏀寔鏍囧噯鍛戒护鍜屾垚鍨嬪懡浠や袱绉嶆牸寮忋��
+        /// </remarks>
+        /// <param name="commonStackerCrane">鍫嗗灈鏈鸿澶囧璞�</param>
+        /// <param name="command">鍛戒护瀵硅薄</param>
+        /// <returns>鍙戦�佹槸鍚︽垚鍔�</returns>
         private static bool SendStackerCraneCommand(IStackerCrane commonStackerCrane, object command)
         {
             return command switch
             {
+                // 鎴愬瀷鍛戒护锛堝 HC 宸烽亾锛�
                 FormationStackerCraneTaskCommand formationCommand => commonStackerCrane.SendCommand(formationCommand),
+                // 鏍囧噯鍛戒护锛堝 GW銆丆W 宸烽亾锛�
                 StackerCraneTaskCommand standardCommand => commonStackerCrane.SendCommand(standardCommand),
+                // 鏈煡鍛戒护绫诲瀷
                 _ => false
             };
-        }
-
-        /// <summary>
-        /// 鏍规嵁 Roadway 鑾峰彇鍛戒护绫诲瀷
-        /// </summary>
-        private string GetCommandType(string roadway)
-        {
-            foreach (var mapping in _config.RoadwayCommandMapping)
-            {
-                if (roadway.Contains(mapping.Key))
-                {
-                    return mapping.Value;
-                }
-            }
-            return _config.DefaultCommandType;
-        }
-
-        /// <summary>
-        /// 鍒涘缓鏍囧噯鍫嗗灈鏈哄懡浠�
-        /// </summary>
-        private static StackerCraneTaskCommand CreateStandardCommand(Dt_Task task)
-        {
-            return new StackerCraneTaskCommand
-            {
-                //Barcode = task.PalletCode,
-                TaskNum = task.TaskNum,
-                WorkType = 1,
-                WorkAction = 1
-            };
-        }
-
-        /// <summary>
-        /// 鍒涘缓鍒嗗鍫嗗灈鏈哄懡浠�
-        /// </summary>
-        private static FormationStackerCraneTaskCommand CreateFormationCommand(Dt_Task task)
-        {
-            return new FormationStackerCraneTaskCommand
-            {
-                Barcode = task.PalletCode,
-                TaskNum = task.TaskNum,
-                WorkType = 1,
-                WorkAction = 1,
-                FireAlarm = 0,
-                HeartBeat = 0,
-                FieldName = string.Empty
-            };
-        }
-
-        /// <summary>
-        /// 閫氱敤鍛戒护鏋勫缓鏂规硶
-        /// </summary>
-        private T? BuildCommand<T>(Dt_Task task, T command) where T : class
-        {
-            TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup();
-
-            return taskTypeGroup switch
-            {
-                TaskTypeGroup.InboundGroup => BuildInboundCommand(task, command),
-                TaskTypeGroup.OutbondGroup => BuildOutboundCommand(task, command),
-                TaskTypeGroup.RelocationGroup => BuildRelocationCommand(task, command),
-                _ => command
-            };
-        }
-
-        /// <summary>
-        /// 閫氱敤鍏ュ簱鍛戒护鏋勫缓
-        /// </summary>
-        private T? BuildInboundCommand<T>(Dt_Task task, T command) where T : class
-        {
-            Dt_Router? router = _routerService.QueryNextRoute(task.CurrentAddress, task.Roadway, task.TaskType);
-            if (router == null)
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.CurrentAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鍙栬揣绔欏彴淇℃伅");
-                return null;
-            }
-
-            SetCommandProperty(command, "StartRow", Convert.ToInt16(router.SrmRow));
-            SetCommandProperty(command, "StartColumn", Convert.ToInt16(router.SrmColumn));
-            SetCommandProperty(command, "StartLayer", Convert.ToInt16(router.SrmLayer));
-
-            if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer))
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟缁堢偣閿欒锛岀粓鐐癸細銆恵task.NextAddress}銆�");
-                return null;
-            }
-
-            SetCommandProperty(command, "EndRow", endRow);
-            SetCommandProperty(command, "EndColumn", endColumn);
-            SetCommandProperty(command, "EndLayer", endLayer);
-
-            return command;
-        }
-
-        /// <summary>
-        /// 閫氱敤鍑哄簱鍛戒护鏋勫缓
-        /// </summary>
-        private T? BuildOutboundCommand<T>(Dt_Task task, T command) where T : class
-        {
-            Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.TargetAddress, task.TaskType);
-            if (router == null)
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.TargetAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鏀捐揣绔欏彴淇℃伅");
-                return null;
-            }
-
-            SetCommandProperty(command, "EndRow", Convert.ToInt16(router.SrmRow));
-            SetCommandProperty(command, "EndColumn", Convert.ToInt16(router.SrmColumn));
-            SetCommandProperty(command, "EndLayer", Convert.ToInt16(router.SrmLayer));
-
-            if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer))
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍑哄簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-                return null;
-            }
-
-            SetCommandProperty(command, "StartRow", startRow);
-            SetCommandProperty(command, "StartColumn", startColumn);
-            SetCommandProperty(command, "StartLayer", startLayer);
-
-            return command;
-        }
-
-        /// <summary>
-        /// 閫氱敤绉诲簱鍛戒护鏋勫缓
-        /// </summary>
-        private T? BuildRelocationCommand<T>(Dt_Task task, T command) where T : class
-        {
-            if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer))
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟缁堢偣閿欒锛岀粓鐐癸細銆恵task.NextAddress}銆�");
-                return null;
-            }
-
-            SetCommandProperty(command, "EndRow", endRow);
-            SetCommandProperty(command, "EndColumn", endColumn);
-            SetCommandProperty(command, "EndLayer", endLayer);
-
-            if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer))
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-                return null;
-            }
-
-            SetCommandProperty(command, "StartRow", startRow);
-            SetCommandProperty(command, "StartColumn", startColumn);
-            SetCommandProperty(command, "StartLayer", startLayer);
-
-            return command;
-        }
-
-        /// <summary>
-        /// 浣跨敤鍙嶅皠璁剧疆鍛戒护灞炴��
-        /// </summary>
-        private static void SetCommandProperty<T>(T command, string propertyName, object value) where T : class
-        {
-            var property = typeof(T).GetProperty(propertyName);
-            property?.SetValue(command, value);
-        }
-
-        /// <summary>
-        /// 瑙f瀽鍦板潃瀛楃涓诧紙鏍煎紡锛氳-鍒�-灞傦級
-        /// </summary>
-        private bool TryParseAddress(string address, out short row, out short column, out short layer)
-        {
-            row = column = layer = 0;
-
-            string[] parts = address.Split("-");
-            if (parts.Length != 3)
-            {
-                return false;
-            }
-
-            return short.TryParse(parts[0], out row)
-                && short.TryParse(parts[1], out column)
-                && short.TryParse(parts[2], out layer);
         }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3