From f56441867f2cc77567f97a92348a5d878f0dca05 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 12 三月 2026 18:24:15 +0800
Subject: [PATCH] Add AGENTS instructions and updates

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs |  134 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 103 insertions(+), 31 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 707e404..463547d 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -1,6 +1,9 @@
-锘縰sing System.Diagnostics.CodeAnalysis;
-using System.Linq;
+锘縰sing Newtonsoft.Json;
+using System.Diagnostics.CodeAnalysis;
+using WIDESEA_Core;
+using WIDESEAWCS_Common.HttpEnum;
 using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob;
@@ -16,55 +19,124 @@
     {
         private readonly ITaskService _taskService;
         private readonly IRouterService _routerService;
+        private readonly Func<int, Dt_Task?> _transferCheck;
 
-        public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService)
+        public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService, HttpClientHelper httpClientHelper)
+            : this(taskService, routerService, taskNum => QueryTransferTask(httpClientHelper, taskNum))
+        {
+        }
+
+        public StackerCraneTaskSelector(ITaskService taskService, IRouterService routerService, Func<int, Dt_Task?> transferCheck)
         {
             _taskService = taskService;
             _routerService = routerService;
+            _transferCheck = transferCheck;
         }
 
         public Dt_Task? SelectTask(IStackerCrane commonStackerCrane)
         {
-            Dt_Task? task;
+            Dt_Task? candidateTask;
             if (commonStackerCrane.LastTaskType == null)
             {
-                task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
+                candidateTask = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
             }
             else if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
             {
-                task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
-                task ??= _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+                candidateTask = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+                candidateTask ??= _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
             }
             else
             {
-                task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+                candidateTask = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
             }
 
-            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+            if (candidateTask == null)
             {
-                if (IsOutTaskStationAvailable(task))
-                {
-                    return task;
-                }
-
-                var otherOutStationCodes = _routerService
-                    .QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress, task.TaskType)
-                    .Select(x => x.ChildPosi)
-                    .ToList();
-
-                var tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStationCodes);
-                foreach (var alternativeTask in tasks)
-                {
-                    if (IsOutTaskStationAvailable(alternativeTask))
-                    {
-                        return alternativeTask;
-                    }
-                }
-
-                task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+                return null;
             }
 
-            return task;
+            if (candidateTask.TaskType.GetTaskTypeGroup() != TaskTypeGroup.OutbondGroup)
+            {
+                return candidateTask;
+            }
+
+            Dt_Task? selectedTask = TrySelectOutboundTask(candidateTask);
+            if (selectedTask != null)
+            {
+                return selectedTask;
+            }
+
+            var otherOutStationCodes = _routerService
+                .QueryNextRoutes(commonStackerCrane.DeviceCode, candidateTask.NextAddress, candidateTask.TaskType)
+                .Select(x => x.ChildPosi)
+                .ToList();
+
+            var tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStationCodes);
+            foreach (var alternativeTask in tasks)
+            {
+                selectedTask = TrySelectOutboundTask(alternativeTask);
+                if (selectedTask != null)
+                {
+                    return selectedTask;
+                }
+            }
+
+            return _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+        }
+
+        private Dt_Task? TrySelectOutboundTask(Dt_Task outboundTask)
+        {
+            // 鍙鏄嚭搴撲换鍔★紝蹇呴』鍏堣皟鐢╓MS鍒ゆ柇鏄惁闇�瑕佺Щ搴撱��
+            var taskAfterTransferCheck = _transferCheck(outboundTask.TaskNum) ?? outboundTask;
+            var taskGroup = taskAfterTransferCheck.TaskType.GetTaskTypeGroup();
+
+            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;
+        }
+
+        private static Dt_Task? QueryTransferTask(HttpClientHelper httpClientHelper, int taskNum)
+        {
+            var response = httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.TransferCheck),
+                taskNum.ToString());
+
+            if (response == null || !response.IsSuccess || response.Data == null || !response.Data.Status || response.Data.Data == null)
+            {
+                return null;
+            }
+
+            var taskJson = response.Data.Data.ToString();
+            return string.IsNullOrWhiteSpace(taskJson) ? null : JsonConvert.DeserializeObject<Dt_Task>(taskJson);
+        }
+
+        private void TryAddTaskFromWms(Dt_Task task)
+        {
+            if (task.TaskNum <= 0)
+            {
+                return;
+            }
+
+            var existingTask = _taskService.QueryByTaskNum(task.TaskNum);
+            if (existingTask != null)
+            {
+                return;
+            }
+
+            _taskService.AddData(task);
         }
 
         private bool IsOutTaskStationAvailable([NotNull] Dt_Task task)
@@ -87,4 +159,4 @@
             return conveyorLine.IsOccupied(router.ChildPosi);
         }
     }
-}
+}
\ No newline at end of file

--
Gitblit v1.9.3