From 5171d3f59b89389bf75293afd210cfa6de4ccff7 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 10 四月 2026 23:03:49 +0800
Subject: [PATCH] feat: 添加堆垛机相关常量类并重构代码使用常量

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs |  270 +++++++----------------------------------------------
 1 files changed, 37 insertions(+), 233 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs
index a006e83..00e4b70 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs
@@ -1,12 +1,11 @@
 锘縰sing Quartz;
-using System.Diagnostics.CodeAnalysis;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_ITaskInfoRepository;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob;
-using WIDESEAWCS_QuartzJob.Models;
 using WIDESEAWCS_QuartzJob.Service;
+using WIDESEAWCS_QuartzJob.StackerCrane;
 using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
 using WIDESEAWCS_Tasks.StackerCraneJob;
 
@@ -18,14 +17,22 @@
         private readonly ITaskService _taskService;
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskRepository _taskRepository;
-        private readonly IRouterService _routerService;
 
-        public FormationCommonStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService)
+        private readonly FormationStackerCraneTaskSelector _taskSelector;
+        private readonly FormationStackerCraneCommandBuilder _commandBuilder;
+
+        public FormationCommonStackerCraneJob(
+            ITaskService taskService,
+            ITaskExecuteDetailService taskExecuteDetailService,
+            ITaskRepository taskRepository,
+            IRouterService routerService)
         {
             _taskService = taskService;
             _taskExecuteDetailService = taskExecuteDetailService;
             _taskRepository = taskRepository;
-            _routerService = routerService;
+
+            _taskSelector = new FormationStackerCraneTaskSelector(taskService, routerService);
+            _commandBuilder = new FormationStackerCraneCommandBuilder(taskService, routerService);
         }
 
         public Task Execute(IJobExecutionContext context)
@@ -52,37 +59,42 @@
 
                 commonStackerCrane.CheckStackerCraneTaskCompleted();
 
-                if (commonStackerCrane.StackerCraneWorkStatusValue == FormationStackerCraneOperationStatus.Idle)
+                if (commonStackerCrane.StackerCraneWorkStatusValue != FormationStackerCraneOperationStatus.Idle)
                 {
-                    Dt_Task? task = GetTask(commonStackerCrane);
-                    if (task != null)
-                    {
-                        FormationStackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
-                        if (stackerCraneTaskCommand != null)
-                        {
-                            bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
-                            if (sendFlag)
-                            {
-                                commonStackerCrane.LastTaskType = task.TaskType;
-                                _taskService.UpdateTaskStatusToNext(task.TaskNum);
-                            }
-                        }
-                    }
+                    return Task.CompletedTask;
+                }
+
+                Dt_Task? task = _taskSelector.SelectTask(commonStackerCrane);
+                if (task == null)
+                {
+                    return Task.CompletedTask;
+                }
+
+                var stackerCraneTaskCommand = _commandBuilder.ConvertToStackerCraneTaskCommand(task);
+                if (stackerCraneTaskCommand == null)
+                {
+                    return Task.CompletedTask;
+                }
+
+                bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
+                if (sendFlag)
+                {
+                    commonStackerCrane.LastTaskType = task.TaskType;
+                    _taskService.UpdateTaskStatusToNext(task.TaskNum);
                 }
             }
             catch (Exception ex)
             {
                 Console.WriteLine($"FormationCommonStackerCraneJob Error: {ex.Message}");
             }
+
             return Task.CompletedTask;
         }
 
         /// <summary>
         /// 浠诲姟瀹屾垚浜嬩欢璁㈤槄鐨勬柟娉�
         /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
+        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, StackerCraneTaskCompletedEventArgs e)
         {
             SpeFormationStackerCrane? commonStackerCrane = sender as SpeFormationStackerCrane;
             if (commonStackerCrane != null)
@@ -95,214 +107,6 @@
                 }
             }
         }
-
-        /// <summary>
-        /// 鑾峰彇浠诲姟
-        /// </summary>
-        /// <param name="commonStackerCrane">鍫嗗灈鏈哄璞�</param>
-        /// <returns></returns>
-        private Dt_Task? GetTask(SpeFormationStackerCrane 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>
-        /// <param name="task">浠诲姟瀹炰綋</param>
-        /// <returns></returns>
-        public FormationStackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task)
-        {
-            FormationStackerCraneTaskCommand stackerCraneTaskCommand = new FormationStackerCraneTaskCommand
-            {
-                Barcode = task.PalletCode,
-                TaskNum = task.TaskNum,
-                WorkType = 4,
-                WorkAction = 1,
-                FireAlarm = 0,
-                FieldName = ""
-            };
-
-            TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup();
-
-            return taskTypeGroup switch
-            {
-                TaskTypeGroup.InboundGroup => BuildInboundCommand(task, stackerCraneTaskCommand),
-                TaskTypeGroup.OutbondGroup => BuildOutboundCommand(task, stackerCraneTaskCommand),
-                TaskTypeGroup.RelocationGroup => BuildRelocationCommand(task, stackerCraneTaskCommand),
-                _ => stackerCraneTaskCommand
-            };
-        }
-
-        /// <summary>
-        /// 鏋勫缓鍏ュ簱鍛戒护
-        /// </summary>
-        private FormationStackerCraneTaskCommand? BuildInboundCommand(Dt_Task task, FormationStackerCraneTaskCommand command)
-        {
-            Dt_Router? router = _routerService.QueryNextRoute(task.CurrentAddress, task.Roadway, task.TaskType);
-            if (router == null)
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.CurrentAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鍙栬揣绔欏彴淇℃伅");
-                return null;
-            }
-
-            command.StartRow = Convert.ToInt16(router.SrmRow);
-            command.StartColumn = Convert.ToInt16(router.SrmColumn);
-            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;
-            }
-
-            command.EndRow = endRow;
-            command.EndColumn = endColumn;
-            command.EndLayer = endLayer;
-
-            return command;
-        }
-
-        /// <summary>
-        /// 鏋勫缓鍑哄簱鍛戒护
-        /// </summary>
-        private FormationStackerCraneTaskCommand? BuildOutboundCommand(Dt_Task task, FormationStackerCraneTaskCommand command)
-        {
-            Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.TargetAddress, task.TaskType);
-            if (router == null)
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.TargetAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鏀捐揣绔欏彴淇℃伅");
-                return null;
-            }
-
-            command.EndRow = Convert.ToInt16(router.SrmRow);
-            command.EndColumn = Convert.ToInt16(router.SrmColumn);
-            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;
-            }
-
-            command.StartRow = startRow;
-            command.StartColumn = startColumn;
-            command.StartLayer = startLayer;
-
-            return command;
-        }
-
-        /// <summary>
-        /// 鏋勫缓绉诲簱鍛戒护
-        /// </summary>
-        private FormationStackerCraneTaskCommand? BuildRelocationCommand(Dt_Task task, FormationStackerCraneTaskCommand command)
-        {
-            if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer))
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟缁堢偣閿欒锛岀粓鐐癸細銆恵task.NextAddress}銆�");
-                return null;
-            }
-
-            command.EndRow = endRow;
-            command.EndColumn = endColumn;
-            command.EndLayer = endLayer;
-
-            if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer))
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-                return null;
-            }
-
-            command.StartRow = startRow;
-            command.StartColumn = startColumn;
-            command.StartLayer = startLayer;
-
-            return command;
-        }
-
-        /// <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