From 5c766d7e5c969b7530a014ded771973e242f25e0 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 18 三月 2026 14:51:07 +0800
Subject: [PATCH] refactor: 拆分 TaskService 任务流程并补充注释

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IOutboundTaskFlowService.cs       |   34 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs                     |  416 ++++-----------------
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs                |    6 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs   |  187 +++++++++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskFlowService.cs          |   34 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IInboundTaskFlowService.cs        |   34 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRelocationTaskFlowService.cs     |   34 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs    |  148 +++++++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RobotTaskFlowService.cs      |   56 ++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs |  137 +++++++
 10 files changed, 751 insertions(+), 335 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IInboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IInboundTaskFlowService.cs
new file mode 100644
index 0000000..839aca8
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IInboundTaskFlowService.cs
@@ -0,0 +1,34 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_ITaskInfoService
+{
+    /// <summary>
+    /// 鍏ュ簱浠诲姟娴佺▼鏈嶅姟鎺ュ彛銆�
+    /// </summary>
+    public interface IInboundTaskFlowService : IDependency
+    {
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鍏ュ簱浠诲姟銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source);
+
+        /// <summary>
+        /// 鎺ㄨ繘鍏ュ簱浠诲姟鍒颁笅涓�鐘舵�併��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        WebResponseContent MoveToNextStatus([NotNull] Dt_Task task);
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈哄叆搴撳畬鎴愬姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        WebResponseContent CompleteStackerTask([NotNull] Dt_Task task);
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IOutboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IOutboundTaskFlowService.cs
new file mode 100644
index 0000000..ad69786
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IOutboundTaskFlowService.cs
@@ -0,0 +1,34 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_ITaskInfoService
+{
+    /// <summary>
+    /// 鍑哄簱浠诲姟娴佺▼鏈嶅姟鎺ュ彛銆�
+    /// </summary>
+    public interface IOutboundTaskFlowService : IDependency
+    {
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鍑哄簱浠诲姟銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source);
+
+        /// <summary>
+        /// 鎺ㄨ繘鍑哄簱浠诲姟鍒颁笅涓�鐘舵�併��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        WebResponseContent MoveToNextStatus([NotNull] Dt_Task task);
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈哄嚭搴撳畬鎴愬姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        WebResponseContent CompleteStackerTask([NotNull] Dt_Task task);
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRelocationTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRelocationTaskFlowService.cs
new file mode 100644
index 0000000..0e7c2e4
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRelocationTaskFlowService.cs
@@ -0,0 +1,34 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_ITaskInfoService
+{
+    /// <summary>
+    /// 绉诲簱浠诲姟娴佺▼鏈嶅姟鎺ュ彛銆�
+    /// </summary>
+    public interface IRelocationTaskFlowService : IDependency
+    {
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲绉诲簱浠诲姟銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source);
+
+        /// <summary>
+        /// 鎺ㄨ繘绉诲簱浠诲姟鍒颁笅涓�鐘舵�併��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        WebResponseContent MoveToNextStatus([NotNull] Dt_Task task);
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈虹Щ搴撳畬鎴愬姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        WebResponseContent CompleteStackerTask([NotNull] Dt_Task task);
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskFlowService.cs
new file mode 100644
index 0000000..ca99444
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskFlowService.cs
@@ -0,0 +1,34 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_ITaskInfoService
+{
+    /// <summary>
+    /// 鏈烘鎵嬩换鍔℃祦绋嬫湇鍔℃帴鍙c��
+    /// </summary>
+    public interface IRobotTaskFlowService : IDependency
+    {
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鏈烘鎵嬩换鍔°��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source);
+
+        /// <summary>
+        /// 鎺ㄨ繘鏈烘鎵嬩换鍔″埌涓嬩竴鐘舵�併��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        WebResponseContent MoveToNextStatus([NotNull] Dt_Task task);
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈哄姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        WebResponseContent CompleteStackerTask([NotNull] Dt_Task task);
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
new file mode 100644
index 0000000..81a5371
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
@@ -0,0 +1,148 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Common.HttpEnum;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEA_Core;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob.Models;
+using WIDESEAWCS_QuartzJob.Service;
+
+namespace WIDESEAWCS_TaskInfoService.Flows
+{
+    /// <summary>
+    /// 鍏ュ簱浠诲姟娴佺▼鏈嶅姟銆�
+    /// 璐熻矗鍏ュ簱浠诲姟鎺ユ敹鍒濆鍖栥�佺姸鎬佹帹杩涘強鍫嗗灈鏈哄畬鎴愬鐞嗐��
+    /// </summary>
+    public class InboundTaskFlowService : IInboundTaskFlowService
+    {
+        private readonly IRouterService _routerService;
+        private readonly HttpClientHelper _httpClientHelper;
+
+        /// <summary>
+        /// 鍒濆鍖栧叆搴撲换鍔℃祦绋嬫湇鍔°��
+        /// </summary>
+        /// <param name="routerService">璺敱鏈嶅姟銆�</param>
+        /// <param name="httpClientHelper">WMS鎺ュ彛璋冪敤甯姪绫汇��</param>
+        public InboundTaskFlowService(IRouterService routerService, HttpClientHelper httpClientHelper)
+        {
+            _routerService = routerService;
+            _httpClientHelper = httpClientHelper;
+        }
+
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鍏ュ簱浠诲姟銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
+        {
+            Dt_Router routers = _routerService.QueryNextRoute(source.SourceAddress);
+            if (routers.IsNullOrEmpty())
+            {
+                return;
+            }
+
+            task.TaskStatus = (int)TaskInStatusEnum.InNew;
+            task.CurrentAddress = source.SourceAddress;
+            task.NextAddress = routers.ChildPosi;
+        }
+
+        /// <summary>
+        /// 鎺ㄨ繘鍏ュ簱浠诲姟鐘舵�侊紝骞跺湪鍏抽敭鐘舵�佽皟鐢╓MS鎺ュ彛銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
+        {
+            if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
+            if (task.TaskStatus <= 0)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
+            {
+                return GetWMSInboundLocation(task);
+            }
+
+            return UpdateWMSTaskStatus(task);
+        }
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈哄叆搴撳畬鎴愬姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            if (task.TaskStatus != (int)TaskInStatusEnum.SC_InExecuting)
+            {
+                return WebResponseContent.Instance.OK();
+            }
+
+            int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
+            task.TaskStatus = nextStatus;
+            task.ModifyDate = DateTime.Now;
+            task.Modifier = "System";
+
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.InboundFinishTaskAsync),
+                (new CreateTaskDto { PalletCode = task.PalletCode }).ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+            {
+                return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+            }
+
+            return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+        }
+
+        /// <summary>
+        /// 浠嶹MS鑾峰彇鍏ュ簱鐩爣鍦板潃骞跺洖鍐欎换鍔°��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>璋冪敤缁撴灉銆�</returns>
+        private WebResponseContent GetWMSInboundLocation(Dt_Task task)
+        {
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.GetTasksLocation),
+                new CreateTaskDto { PalletCode = task.PalletCode }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            string? nextAddress = result.Data.Data?.ToString();
+            if (string.IsNullOrEmpty(nextAddress))
+                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆愭湭鑾峰彇鍒版湁鏁堢殑鐩爣鍦板潃銆�");
+
+            task.CurrentAddress = task.NextAddress;
+            task.NextAddress = nextAddress;
+            task.TargetAddress = nextAddress;
+
+            return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 灏嗕换鍔$姸鎬佸悓姝ュ埌WMS銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鍚屾缁撴灉銆�</returns>
+        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
+        {
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.UpdateTaskByStatus),
+                new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            return WebResponseContent.Instance.OK();
+        }
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
new file mode 100644
index 0000000..5a3b045
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
@@ -0,0 +1,187 @@
+锘縰sing Newtonsoft.Json;
+using System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Common.HttpEnum;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEA_Core;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO;
+using WIDESEAWCS_DTO.Stock;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob.DTO;
+using WIDESEAWCS_QuartzJob.Models;
+using WIDESEAWCS_QuartzJob.Service;
+
+namespace WIDESEAWCS_TaskInfoService.Flows
+{
+    /// <summary>
+    /// 鍑哄簱浠诲姟娴佺▼鏈嶅姟銆�
+    /// 璐熻矗鍑哄簱浠诲姟鎺ユ敹鍒濆鍖栥�佺姸鎬佹帹杩涘強鍫嗗灈鏈哄畬鎴愬鐞嗐��
+    /// </summary>
+    public class OutboundTaskFlowService : IOutboundTaskFlowService
+    {
+        private readonly IRouterService _routerService;
+        private readonly HttpClientHelper _httpClientHelper;
+        private readonly IRobotTaskService _robotTaskService;
+
+        /// <summary>
+        /// 鍒濆鍖栧嚭搴撲换鍔℃祦绋嬫湇鍔°��
+        /// </summary>
+        /// <param name="routerService">璺敱鏈嶅姟銆�</param>
+        /// <param name="httpClientHelper">WMS鎺ュ彛璋冪敤甯姪绫汇��</param>
+        /// <param name="robotTaskService">鏈烘鎵嬩换鍔℃湇鍔°��</param>
+        public OutboundTaskFlowService(IRouterService routerService, HttpClientHelper httpClientHelper, IRobotTaskService robotTaskService)
+        {
+            _routerService = routerService;
+            _httpClientHelper = httpClientHelper;
+            _robotTaskService = robotTaskService;
+        }
+
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鍑哄簱浠诲姟銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
+        {
+            int taskType = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty ? 100 : task.TaskType;
+            Dt_Router router = _routerService.QueryNextRoute(source.Roadway, source.TargetAddress, taskType);
+            if (router == null)
+            {
+                return;
+            }
+
+            task.TaskStatus = (int)TaskOutStatusEnum.OutNew;
+            task.CurrentAddress = source.SourceAddress;
+            task.NextAddress = router.ChildPosi;
+        }
+
+        /// <summary>
+        /// 鎺ㄨ繘鍑哄簱浠诲姟鐘舵�侊紝骞跺湪鍏抽敭鐘舵�佽皟鐢╓MS鎺ュ彛銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
+        {
+            if (task.TaskStatus >= (int)TaskOutStatusEnum.OutFinish)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
+            if (task.TaskStatus <= 0)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
+            {
+                return GetWMSOutboundTrayTask(task);
+            }
+
+            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
+            {
+                return _robotTaskService.GetWMSRobotTask(task);
+            }
+
+            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting)
+            {
+                return WebResponseContent.Instance.OK();
+            }
+
+            return UpdateWMSTaskStatus(task);
+        }
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈哄嚭搴撳畬鎴愬姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            if (task.TaskStatus != (int)TaskOutStatusEnum.SC_OutExecuting)
+            {
+                return WebResponseContent.Instance.OK();
+            }
+
+            int taskType = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty ? 100 : task.TaskType;
+            Dt_Router router = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress, taskType);
+            if (router == null)
+            {
+                return WebResponseContent.Instance.Error("鏈壘鍒拌澶囪矾鐢变俊鎭�");
+            }
+
+            int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
+            task.TaskStatus = nextStatus;
+            task.CurrentAddress = task.NextAddress;
+            task.NextAddress = router.ChildPosi;
+            task.ModifyDate = DateTime.Now;
+            task.Modifier = "System";
+
+            content = NotifyWMSOutboundFinish(task);
+            if (!content.Status)
+            {
+                return content;
+            }
+
+            return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+        }
+
+        /// <summary>
+        /// 閫氱煡WMS鍑哄簱瀹屾垚銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>閫氱煡缁撴灉銆�</returns>
+        private WebResponseContent NotifyWMSOutboundFinish(Dt_Task task)
+        {
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.OutboundFinishTaskAsync),
+                new StockInfoDTO { PalletCode = task.PalletCode, TaskNum = task.TaskNum }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 浠嶹MS鑾峰彇绌烘墭鐩樺嚭搴撲换鍔°��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>璋冪敤缁撴灉锛屾垚鍔熸椂Data涓寘鍚竴涓猈MSTaskDTO闆嗗悎銆�</returns>
+        private WebResponseContent GetWMSOutboundTrayTask(Dt_Task task)
+        {
+            int warehouseId = _robotTaskService.MapWarehouseIdConfigKey(task.TargetAddress);
+            string sourceLineNo = _robotTaskService.ResolveRobotRuleValue(task.TargetAddress, "AddressSourceLineNoMap", task.TargetAddress);
+
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.GetOutBoundTrayTaskAsync),
+                new CreateTaskDto { WarehouseId = warehouseId, TargetAddress = sourceLineNo }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺绌烘墭鐩樺嚭搴撲换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            WMSTaskDTO? wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result.Data.Data?.ToString() ?? string.Empty);
+            if (wMSTask == null)
+                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺绌烘墭鐩樺嚭搴撲换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆怶MS鏈繑鍥炴湁鏁堜换鍔℃暟鎹��");
+
+            return WebResponseContent.Instance.OK("鎴愬姛", new List<WMSTaskDTO> { wMSTask });
+        }
+
+        /// <summary>
+        /// 灏嗕换鍔$姸鎬佸悓姝ュ埌WMS銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鍚屾缁撴灉銆�</returns>
+        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
+        {
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.UpdateTaskByStatus),
+                new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            return WebResponseContent.Instance.OK();
+        }
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs
new file mode 100644
index 0000000..4a35391
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs
@@ -0,0 +1,137 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Common.HttpEnum;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEA_Core;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_TaskInfoService.Flows
+{
+    /// <summary>
+    /// 绉诲簱浠诲姟娴佺▼鏈嶅姟銆�
+    /// 璐熻矗绉诲簱浠诲姟鎺ユ敹鍒濆鍖栥�佺姸鎬佹帹杩涗互鍙婂爢鍨涙満瀹屾垚鏃剁殑WMS閫氱煡娴佺▼銆�
+    /// </summary>
+    public class RelocationTaskFlowService : IRelocationTaskFlowService
+    {
+        private readonly HttpClientHelper _httpClientHelper;
+
+        /// <summary>
+        /// 鍒濆鍖栫Щ搴撲换鍔℃祦绋嬫湇鍔°��
+        /// </summary>
+        /// <param name="httpClientHelper">WMS鎺ュ彛璋冪敤甯姪绫汇��</param>
+        public RelocationTaskFlowService(HttpClientHelper httpClientHelper)
+        {
+            _httpClientHelper = httpClientHelper;
+        }
+
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲绉诲簱浠诲姟銆�
+        /// 褰撳墠绉诲簱浠诲姟涓嶅仛棰濆鍒濆鍖栥��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
+        {
+            // 褰撳墠鐗堟湰绉诲簱浠诲姟鎺ユ敹鏃朵笉闇�瑕侀澶栬缃矾鐢辨垨鐘舵�併��
+        }
+
+        /// <summary>
+        /// 灏嗙Щ搴撲换鍔℃帹杩涘埌涓嬩竴鐘舵�侊紝骞跺湪鍏抽敭鐘舵�佽皟鐢╓MS鎺ュ彛銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鐘舵�佹帹杩涚粨鏋溿��</returns>
+        public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
+        {
+            if (task.TaskStatus >= (int)TaskRelocationStatusEnum.RelocationFinish)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
+            if (task.TaskStatus <= 0)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
+            {
+                return UpdateWMSTaskStatus(task);
+            }
+
+            if (task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
+            {
+                return NotifyWMSRelocationFinish(task);
+            }
+
+            return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈虹Щ搴撳畬鎴愬姩浣溿��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            if (task.TaskStatus != (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
+            {
+                return WebResponseContent.Instance.OK();
+            }
+
+            int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
+            task.TaskStatus = nextStatus;
+            task.ModifyDate = DateTime.Now;
+            task.Modifier = "System";
+
+            WebResponseContent result = NotifyWMSRelocationFinish(task);
+            if (!result.Status)
+            {
+                return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Message}銆�");
+            }
+
+            return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+        }
+
+        /// <summary>
+        /// 灏嗙Щ搴撶姸鎬佸悓姝ュ埌WMS銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鍚屾缁撴灉銆�</returns>
+        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
+        {
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.UpdateTaskByStatus),
+                new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 閫氱煡WMS绉诲簱浠诲姟宸插畬鎴愩��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>閫氱煡缁撴灉銆�</returns>
+        private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task)
+        {
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                nameof(ConfigKey.RelocationFinishTask),
+                new CreateTaskDto
+                {
+                    PalletCode = task.PalletCode,
+                    SourceAddress = task.CurrentAddress,
+                    TargetAddress = task.TargetAddress,
+                    Roadway = task.Roadway,
+                    TaskType = task.TaskType
+                }.ToJson());
+
+            if (!result.IsSuccess || !result.Data.Status)
+                return WebResponseContent.Instance.Error($"閫氱煡WMS绯荤粺绉诲簱瀹屾垚澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+            return WebResponseContent.Instance.OK();
+        }
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RobotTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RobotTaskFlowService.cs
new file mode 100644
index 0000000..a87a9e5
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RobotTaskFlowService.cs
@@ -0,0 +1,56 @@
+锘縰sing System.Diagnostics.CodeAnalysis;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_TaskInfoService.Flows
+{
+    /// <summary>
+    /// 鏈烘鎵嬩换鍔℃祦绋嬫湇鍔°��
+    /// 璐熻矗鏈烘鎵嬩换鍔″湪涓绘祦绋嬩腑鐨勭姸鎬佹帹杩涗笌瀹屾垚澶勭悊銆�
+    /// </summary>
+    public class RobotTaskFlowService : IRobotTaskFlowService
+    {
+        /// <summary>
+        /// 鎺ユ敹WMS浠诲姟鏃跺垵濮嬪寲鏈烘鎵嬩换鍔°��
+        /// 褰撳墠鏈烘鎵嬩换鍔′笉鍋氶澶栧垵濮嬪寲銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS浠诲姟鍘熷鏁版嵁銆�</param>
+        public void InitializeOnReceive([NotNull] Dt_Task task, [NotNull] WMSTaskDTO source)
+        {
+            // 褰撳墠鐗堟湰鏈烘鎵嬩换鍔℃帴鏀舵椂涓嶉渶瑕侀澶栬缃矾鐢辨垨鐘舵�併��
+        }
+
+        /// <summary>
+        /// 鎺ㄨ繘鏈烘鎵嬩换鍔$姸鎬併��
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鎺ㄨ繘缁撴灉銆�</returns>
+        public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
+        {
+            if (task.TaskStatus >= (int)TaskRobotStatusEnum.RobotFinish)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRobotStatusEnum>();
+            if (task.TaskStatus <= 0)
+                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+            return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 澶勭悊鍫嗗灈鏈哄姩浣溿��
+        /// 鏈烘鎵嬩换鍔″綋鍓嶆棤棰濆瀹屾垚閫昏緫銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>澶勭悊缁撴灉銆�</returns>
+        public WebResponseContent CompleteStackerTask([NotNull] Dt_Task task)
+        {
+            return WebResponseContent.Instance.OK();
+        }
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index 00291e7..465fcb5 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -174,7 +174,7 @@
         /// 灏嗛厤缃换鍔$被鍨嬭浆鎹负鎺ュ彛閰嶇疆閿��
         /// 鏀寔鍊硷細Split/Group/Change锛堝ぇ灏忓啓涓嶆晱鎰燂級
         /// </summary>
-        private string MapRobotTaskTypeToConfigKey(string? taskType)
+        public string MapRobotTaskTypeToConfigKey(string? taskType)
         {
             string type = (taskType ?? string.Empty).Trim().ToLowerInvariant();
             return type switch
@@ -188,7 +188,7 @@
         /// <summary>
         /// 鏍规嵁鎺ュ彛绫诲瀷鏋勫缓鏈烘鎵嬩换鍔″叆鍙傘��
         /// </summary>
-        private StockDTO BuildRobotTaskStock(Dt_Task task, string configKey)
+        public StockDTO BuildRobotTaskStock(Dt_Task task, string configKey)
         {
             string targetAddress = task.TargetAddress ?? string.Empty;
             string roadway = ResolveRobotRuleValue(targetAddress, "AddressRoadwayMap", task.Roadway);
@@ -231,7 +231,7 @@
         /// <summary>
         /// 鏍规嵁鐩爣鍦板潃鎸夈�岀簿纭� > 鍥為��鍊笺�嶈В鏋愯鍒欏�笺��
         /// </summary>
-        private string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback)
+        public string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback)
         {
             string address = (targetAddress ?? string.Empty).Trim();
             string defaultValue = fallback ?? string.Empty;
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
index adc48a7..8622839 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -18,14 +18,10 @@
 #endregion << 鐗� 鏈� 娉� 閲� >>
 
 using MapsterMapper;
-using Microsoft.Extensions.Configuration;
 using Microsoft.IdentityModel.Tokens;
-using Newtonsoft.Json;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
 using SqlSugar;
 using System.Diagnostics.CodeAnalysis;
 using WIDESEA_Core;
-using WIDESEAWCS_Common.HttpEnum;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseServices;
@@ -51,8 +47,10 @@
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository;
         private readonly IMapper _mapper;
-        private readonly HttpClientHelper _httpClientHelper;
-        private readonly IRobotTaskService _robotTaskService;
+        private readonly IOutboundTaskFlowService _outboundTaskFlowService;
+        private readonly IInboundTaskFlowService _inboundTaskFlowService;
+        private readonly IRelocationTaskFlowService _relocationTaskFlowService;
+        private readonly IRobotTaskFlowService _robotTaskFlowService;
 
         private Dictionary<string, OrderByType> _taskOrderBy = new()
             {
@@ -71,14 +69,25 @@
 
         public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
 
-        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, HttpClientHelper httpClientHelper, IRobotTaskService robotTaskService) : base(BaseDal)
+        public TaskService(
+            ITaskRepository BaseDal,
+            IRouterService routerService,
+            ITaskExecuteDetailService taskExecuteDetailService,
+            ITaskExecuteDetailRepository taskExecuteDetailRepository,
+            IMapper mapper,
+            IOutboundTaskFlowService outboundTaskFlowService,
+            IInboundTaskFlowService inboundTaskFlowService,
+            IRelocationTaskFlowService relocationTaskFlowService,
+            IRobotTaskFlowService robotTaskFlowService) : base(BaseDal)
         {
             _routerService = routerService;
             _taskExecuteDetailService = taskExecuteDetailService;
             _taskExecuteDetailRepository = taskExecuteDetailRepository;
             _mapper = mapper;
-            _httpClientHelper = httpClientHelper;
-            _robotTaskService = robotTaskService;
+            _outboundTaskFlowService = outboundTaskFlowService;
+            _inboundTaskFlowService = inboundTaskFlowService;
+            _relocationTaskFlowService = relocationTaskFlowService;
+            _robotTaskFlowService = robotTaskFlowService;
         }
 
         /// <summary>
@@ -100,35 +109,7 @@
                     }
                     Dt_Task task = _mapper.Map<Dt_Task>(item);
                     task.Creater = "WMS";
-                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-                    {
-                        int taskType = 0;
-                        if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
-                        {
-                            taskType = 100;
-                        }
-                        else
-                            taskType = task.TaskType;
-                        Dt_Router router = _routerService.QueryNextRoute(item.Roadway, item.TargetAddress, taskType);
-                        //鏆備笉鑰冭檻澶氳矾寰�
-                        if (router != null)
-                        {
-                            task.TaskStatus = (int)TaskOutStatusEnum.OutNew;
-                            task.CurrentAddress = item.SourceAddress;
-                            task.NextAddress = router.ChildPosi;
-                        }
-                    }
-                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
-                    {
-                        Dt_Router routers = _routerService.QueryNextRoute(item.SourceAddress);
-                        //鏆備笉鑰冭檻澶氳矾寰�
-                        if (!routers.IsNullOrEmpty())
-                        {
-                            task.TaskStatus = (int)TaskInStatusEnum.InNew;
-                            task.CurrentAddress = item.SourceAddress;
-                            task.NextAddress = routers.ChildPosi;
-                        }
-                    }
+                    InitializeTaskOnReceive(task, item);
                     tasks.Add(task);
                 }
                 BaseDal.AddData(tasks);
@@ -175,6 +156,32 @@
                 content = WebResponseContent.Instance.Error(ex.Message);
             }
             return content;
+        }
+
+        /// <summary>
+        /// 鎸変换鍔″垎缁勫垵濮嬪寲浠诲姟鎺ユ敹淇℃伅銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <param name="source">WMS鍘熷浠诲姟瀵硅薄銆�</param>
+        private void InitializeTaskOnReceive(Dt_Task task, WMSTaskDTO source)
+        {
+            switch (task.TaskType.GetTaskTypeGroup())
+            {
+                case TaskTypeGroup.OutbondGroup:
+                    _outboundTaskFlowService.InitializeOnReceive(task, source);
+                    break;
+                case TaskTypeGroup.InboundGroup:
+                    _inboundTaskFlowService.InitializeOnReceive(task, source);
+                    break;
+                case TaskTypeGroup.RelocationGroup:
+                    _relocationTaskFlowService.InitializeOnReceive(task, source);
+                    break;
+                case TaskTypeGroup.OtherGroup:
+                    _robotTaskFlowService.InitializeOnReceive(task, source);
+                    break;
+                default:
+                    break;
+            }
         }
 
         /// <summary>
@@ -369,15 +376,23 @@
 
             var result = task.TaskType.GetTaskTypeGroup() switch
             {
-                TaskTypeGroup.OutbondGroup => ProcessOutboundTaskStatus(task),
-                TaskTypeGroup.InboundGroup => ProcessInboundTaskStatus(task),
-                TaskTypeGroup.RelocationGroup => ProcessRelocationTaskStatus(task),
-                TaskTypeGroup.OtherGroup => ProcessRobotTaskStatus(task),
+                TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task),
+                TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task),
+                TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task),
+                TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task),
                 _ => WebResponseContent.Instance.Error($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�")
             };
 
             if (!result.Status)
                 return result;
+
+            // 鍑哄簱瀹屾垚绾夸綋鑺傜偣鏃讹紝鍙兘闇�瑕佹帴鏀跺叆搴撴柊浠诲姟銆�
+            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup
+                && result.Data is List<WMSTaskDTO> wmsTasks
+                && wmsTasks.Count > 0)
+            {
+                return ReceiveWMSTask(wmsTasks);
+            }
 
             // 鏇存柊浠诲姟鏁版嵁
             task.ModifyDate = DateTime.Now;
@@ -396,209 +411,6 @@
                 ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskStatus}銆�"
                 : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskStatus}銆�";
             _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage);
-
-            return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 澶勭悊鍑哄簱浠诲姟鐘舵�佽浆鎹�
-        /// </summary>
-        private WebResponseContent ProcessOutboundTaskStatus(Dt_Task task)
-        {
-            if (task.TaskStatus >= (int)TaskOutStatusEnum.OutFinish)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
-
-            if (task.TaskStatus <= 0)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            // 鏍规嵁鐘舵�佽皟鐢ㄤ笉鍚岀殑WMS鎺ュ彛
-            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
-            {
-                return GetWMSOutboundTrayTask(task);
-            }
-            else if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
-            {
-                return _robotTaskService.GetWMSRobotTask(task);
-            }
-            else
-            {
-                if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting)
-                    return WebResponseContent.Instance.OK();
-                else
-                    return UpdateWMSTaskStatus(task);
-            }
-        }
-
-        /// <summary>
-        /// 澶勭悊鍏ュ簱浠诲姟鐘舵�佽浆鎹�
-        /// </summary>
-        private WebResponseContent ProcessInboundTaskStatus(Dt_Task task)
-        {
-            if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
-
-            if (task.TaskStatus <= 0)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            // 鏍规嵁鐘舵�佽皟鐢ㄤ笉鍚岀殑WMS鎺ュ彛
-            if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
-            {
-                return GetWMSInboundLocation(task);
-            }
-            else
-            {
-                return UpdateWMSTaskStatus(task);
-            }
-        }
-
-        /// <summary>
-        /// 澶勭悊鏈烘鎵嬩换鍔$姸鎬佽浆鎹�
-        /// </summary>
-        private WebResponseContent ProcessRobotTaskStatus(Dt_Task task)
-        {
-            if (task.TaskStatus >= (int)TaskRobotStatusEnum.RobotFinish)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRobotStatusEnum>();
-
-            if (task.TaskStatus <= 0)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 澶勭悊绉诲簱浠诲姟鐘舵�佽浆鎹�
-        /// </summary>
-        private WebResponseContent ProcessRelocationTaskStatus(Dt_Task task)
-        {
-            if (task.TaskStatus >= (int)TaskRelocationStatusEnum.RelocationFinish)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
-
-            if (task.TaskStatus <= 0)
-                return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
-
-            // 绉诲簱浠诲姟寮�濮嬫椂锛屽悓姝MS浠诲姟鐘舵��
-            if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
-            {
-                return UpdateWMSTaskStatus(task);
-            }
-
-            // 绉诲簱浠诲姟瀹屾垚鏃讹紝璋冪敤WMS绉诲簱瀹屾垚鎺ュ彛
-            if (task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
-            {
-                return NotifyWMSRelocationFinish(task);
-            }
-
-            return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 閫氱煡WMS绯荤粺鍑哄簱瀹屾垚
-        /// </summary>
-        private WebResponseContent NotifyWMSOutboundFinish(Dt_Task task)
-        {
-            var result = _httpClientHelper.Post<WebResponseContent>(
-                nameof(ConfigKey.OutboundFinishTaskAsync),
-                new StockInfoDTO { PalletCode = task.PalletCode, TaskNum = task.TaskNum }.ToJson());
-
-            if (!result.IsSuccess || !result.Data.Status)
-                return WebResponseContent.Instance.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-
-            return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 鑾峰彇绌烘墭鍑哄簱浠诲姟
-        /// </summary>
-        private WebResponseContent GetWMSOutboundTrayTask(Dt_Task task)
-        {
-            var targetAddress = task.TargetAddress;
-            var warehouseId = _robotTaskService.MapWarehouseIdConfigKey(task.TargetAddress);
-            string sourceLineNo = _robotTaskService.ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.TargetAddress);
-
-            var result = _httpClientHelper.Post<WebResponseContent>(
-                nameof(ConfigKey.GetOutBoundTrayTaskAsync),
-                new CreateTaskDto { WarehouseId = warehouseId, TargetAddress = sourceLineNo }.ToJson());
-
-            if (!result.IsSuccess || !result.Data.Status)
-                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺绌烘墭鐩樺嚭搴撲换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-
-            var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result.Data.Data?.ToString() ?? string.Empty);
-
-            var tasks = new List<WMSTaskDTO>
-            {
-                wMSTask
-            };
-
-            return ReceiveWMSTask(tasks);
-        }
-
-       
-
-        /// <summary>
-        /// 浠嶹MS绯荤粺鑾峰彇鍏ュ簱鐩爣鍦板潃
-        /// </summary>
-        private WebResponseContent GetWMSInboundLocation(Dt_Task task)
-        {
-            var result = _httpClientHelper.Post<WebResponseContent>(
-                nameof(ConfigKey.GetTasksLocation),
-                new CreateTaskDto { PalletCode = task.PalletCode }.ToJson());
-
-            if (!result.IsSuccess || !result.Data.Status)
-                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-
-            var nextAddress = result.Data.Data?.ToString();
-            if (string.IsNullOrEmpty(nextAddress))
-                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鑾峰彇浠诲姟鐩爣鍦板潃澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆愭湭鑾峰彇鍒版湁鏁堢殑鐩爣鍦板潃銆�");
-
-            task.CurrentAddress = task.NextAddress;
-
-            task.NextAddress = nextAddress;
-            task.TargetAddress = nextAddress;
-
-            return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 鏇存柊WMS绯荤粺浠诲姟鐘舵��
-        /// </summary>
-        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
-        {
-            var result = _httpClientHelper.Post<WebResponseContent>(
-                nameof(ConfigKey.UpdateTaskByStatus),
-                new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
-
-            if (!result.IsSuccess || !result.Data.Status)
-                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-
-            return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 閫氱煡WMS绯荤粺绉诲簱浠诲姟瀹屾垚
-        /// </summary>
-        private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task)
-        {
-            var result = _httpClientHelper.Post<WebResponseContent>(
-                nameof(ConfigKey.RelocationFinishTask),
-                new CreateTaskDto
-                {
-                    PalletCode = task.PalletCode,
-                    SourceAddress = task.CurrentAddress,
-                    TargetAddress = task.TargetAddress,
-                    Roadway = task.Roadway,
-                    TaskType = task.TaskType
-                }.ToJson());
-
-            if (!result.IsSuccess || !result.Data.Status)
-                return WebResponseContent.Instance.Error($"閫氱煡WMS绯荤粺绉诲簱瀹屾垚澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
 
             return WebResponseContent.Instance.OK();
         }
@@ -655,101 +467,41 @@
             {
                 Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                 if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-
-                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutExecuting)
+                TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup();
+                content = taskTypeGroup switch
                 {
-                    int taskType = 0;
-                    if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
-                    {
-                        taskType = 100;
-                    }
-                    else
-                        taskType = task.TaskType;
-                    Dt_Router router = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress, taskType);
-                    if (router == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌澶囪矾鐢变俊鎭�");
-
-                    int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
-                    task.TaskStatus = nextStatus;
-                    task.CurrentAddress = task.NextAddress;
-                    task.NextAddress = router.ChildPosi;
-                    task.ModifyDate = DateTime.Now;
-                    task.Modifier = "System";
-
-                    content = NotifyWMSOutboundFinish(task);
-                    if (content.Status)
-                    {
-                        BaseDal.UpdateData(task);
-
-                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄嚭搴撳畬鎴�");
-                        return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
-                    }
-
-                    //var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.OutboundFinishTaskAsync), (new StockInfoDTO() { PalletCode = task.PalletCode, TaskNum = task.TaskNum }).ToJson());
-                    //if (result.IsSuccess && result.Data.Status)
-                    //{
-                    //    BaseDal.UpdateData(task);
-
-                    //    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄嚭搴撳畬鎴�");
-                    //    return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
-
-                    //}
-                    //else
-                    //{
-                    //    return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data.Message}銆�");
-                    //}
-                }
-                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InExecuting)
+                    TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.CompleteStackerTask(task),
+                    TaskTypeGroup.InboundGroup => _inboundTaskFlowService.CompleteStackerTask(task),
+                    TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.CompleteStackerTask(task),
+                    TaskTypeGroup.OtherGroup => _robotTaskFlowService.CompleteStackerTask(task),
+                    _ => throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�")
+                };
+                if (!content.Status)
                 {
-                    int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
-                    task.TaskStatus = nextStatus;
-                    task.ModifyDate = DateTime.Now;
-                    task.Modifier = "System";
+                    return content;
+                }
 
-                    var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.InboundFinishTaskAsync), (new CreateTaskDto()
-                    {
-                        PalletCode = task.PalletCode,
-                    }).ToJson());
+                if (taskTypeGroup == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutFinish)
+                {
+                    BaseDal.UpdateData(task);
+                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "鍫嗗灈鏈哄嚭搴撳畬鎴�");
+                    return content;
+                }
 
-                    if (result.IsSuccess && result.Data.Status)
-                    {
-                        BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
-                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄叆搴撳畬鎴�");
-                        return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
-                    }
-                    else
-                    {
-                        return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄叆搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data.Message}銆�");
-                    }
-                }
-                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
+                if (taskTypeGroup == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InFinish)
                 {
-                    if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
-                    {
-                        int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
-                        task.TaskStatus = nextStatus;
-                        task.ModifyDate = DateTime.Now;
-                        task.Modifier = "System";
+                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "鍫嗗灈鏈哄叆搴撳畬鎴�");
+                    return content;
+                }
 
-                        WebResponseContent result = NotifyWMSRelocationFinish(task);
-                        if (result.Status)
-                        {
-                            BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
-                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈虹Щ搴撳畬鎴�");
-                            return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
-                        }
-                        else
-                        {
-                            return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Message}銆�");
-                        }
-                    }
-                }
-                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OtherGroup)
+                if (taskTypeGroup == TaskTypeGroup.RelocationGroup && task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
                 {
+                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "鍫嗗灈鏈虹Щ搴撳畬鎴�");
+                    return content;
                 }
-                else
-                {
-                    throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�");
-                }
+
                 content = WebResponseContent.Instance.OK();
             }
             catch (Exception ex)

--
Gitblit v1.9.3