From cd40ada4efe0d0a4036714cf597ce170b8cf5a54 Mon Sep 17 00:00:00 2001
From: pengmn <pmn@HanInfo>
Date: 星期五, 30 五月 2025 17:29:17 +0800
Subject: [PATCH] 测试

---
 HH.WCS.Mobox3.HangYang/process/TaskProcess.cs |  292 ++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 190 insertions(+), 102 deletions(-)

diff --git a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
index 178735f..2996c62 100644
--- a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
+++ b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
@@ -12,6 +12,7 @@
 using Swashbuckle.Swagger;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Reflection;
 using System.Security.Cryptography;
@@ -1880,123 +1881,210 @@
         /// <summary>
         /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�         /// </summary>
-        /// <param name="distributionCntr">閰嶇洏鍗�/param>
+        /// <param name="distributionCntrs">閰嶇洏鍗�/param>
         /// <returns></returns>
-        internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntr)
+        internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntrs)
         {
             try
             {
-                // 鍒涘缓璋冨害鍣�-                var scheduler = new DoubleDeepOutboundScheduler(distributionCntr);
+                // 1. 鍒濆鍖栬皟搴﹀櫒鍜屽嚭搴撲换鍔″垪琛�+                var scheduler = new DoubleDeepOutboundScheduler(distributionCntrs);
+                var outboundTasks = CreateOutboundTasks(distributionCntrs);
 
-                var listOut = new List<Outbound>();
-                foreach (var item in distributionCntr)
-                {
-                    listOut.Add(new Outbound
-                    {
-                        locCode = item.S_LOC_CODE,
-                        areaCode = item.S_AREA_CODE,
-                        endArea = item.S_EXIT_AREA_CODE,
-                        endBit = item.S_EXIT_LOC_CODE,
-                        trayCode = item.S_CNTR_CODE,
-                        taskType = "閰嶇洏鍑哄簱"
-                    });
-                }
-                // 璇锋眰鍑哄簱
-                var tasks = scheduler.GenerateOutboundTasks(listOut);
+                // 2. 璁$畻璐т綅鐢熸垚浠诲姟鏁版嵁
+                var tasks = scheduler.GenerateOutboundTasks(outboundTasks);
+                if (!tasks.Any()) return false;
 
-                foreach (var item in tasks)
-                {
-                    var wmsTask = new WMSTask();
-                    if (string.IsNullOrEmpty(item.S_OP_CODE))
-                    {
-                        wmsTask = new WMSTask
-                        {
-                            S_CNTR_CODE = item.S_CNTR_CODE,
-                            S_CODE = WMSHelper.GenerateTaskNo(),
-                            S_START_LOC = item.S_START_LOC,
-                            S_START_AREA = item.S_START_AREA,
-                            S_END_LOC = item.S_END_LOC,
-                            S_END_AREA = item.S_END_AREA,
-                            S_START_WH = "CK001",
-                            S_END_WH = "CK001",
-                            N_B_STATE = 1,
-                            S_B_STATE = "鎵ц",
-                            N_TYPE = 2,
-                            S_TYPE = "閰嶇洏鍑哄簱"
-                        };
-                        if (!WMSHelper.CreateWmsTask(wmsTask))
-                        {
-                            return false;
-                        }
-                    }
+                // 3. 鍒涘缓WMS浣滀笟
+                var mainTask = CreateMainWmsTask(tasks.Where(s=>s.S_TYPE == "閰嶇洏鍑哄簱").First());
+                if (!WMSHelper.CreateWmsTask(mainTask)) return false;
 
-                    if (item.S_END_AREA == "LXLKQ")
-                    {
-                        // 鍒涘缓鍑哄簱浠诲姟
-                        var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, wmsTask.S_CODE);
-                        UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE);
-                        if (!res)
-                        {
-                            LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                            return false;
-                        }
-                    }
-                    else
-                    {
-                        //鏍规嵁鍒嗘嫞璐т綅鍘绘煡璇㈤厤缃紝濡傛灉鍒嗘嫞鍖烘病鏈夌┖璐т綅灏卞幓鍑哄簱鍒嗘嫞鏆傚瓨鍖�-                        var relevancys = Settings.OutRelevancys.Where(s => s.conLoc == item.S_END_LOC).FirstOrDefault();
-                        if (relevancys == null)
-                        {
-                            LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽item.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀");
-                            break;
-                        }
-                        var locList = LocationHelper.GetLocListEmptyFree(relevancys.sorLoc.ToList());
-                        if (locList.Any())
-                        {
-                            // 鍒涘缓鍑哄簱浠诲姟
-                            var res = TaskProcess.HYCreateTransport(item.S_START_LOC, locList.FirstOrDefault().S_CODE, item.S_TYPE, item.S_CNTR_CODE, wmsTask.S_CODE);
-                            UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE);
-                            if (!res)
-                            {
-                                LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                                return false;
-                            }
-                        }
-                        else
-                        {
-                            var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "鎷i�缂撳瓨鍖�).FirstOrDefault();
-                            var lxLocations = LocationHelper.GetLocAreaList(reservoirs.areaCode);
-                            if (lxLocations.Any())
-                            {
-                                // 鍒涘缓鍑哄簱浠诲姟
-                                var res = TaskProcess.HYCreateTransport(item.S_START_LOC, lxLocations.FirstOrDefault().S_CODE, "閰嶇洏缂撳瓨", item.S_CNTR_CODE, wmsTask.S_CODE);
-                                UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE);
-                                if (!res)
-                                {
-                                    LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                                    return false;
-                                }
-                            }
-                        }
-                    }
-                }
-                return true;
+                // 4. 鐢熸垚WMS涓讳换鍔�+                return ProcessAllTransportTasks(tasks, mainTask.S_CODE);
             }
             catch (Exception ex)
             {
-                var st = new System.Diagnostics.StackTrace(ex, true);
-                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
-                if (frame != null)
+                LogErrorWithStackTrace("鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″け璐�, ex);
+                return false;
+            }
+        }
+
+        // --------------------- 杈呭姪鏂规硶 ---------------------
+
+        private static List<Outbound> CreateOutboundTasks(List<DistributionCntr> distributionCntrs)
+        {
+            return distributionCntrs.Select(item => new Outbound
+            {
+                locCode = item.S_LOC_CODE,
+                areaCode = item.S_AREA_CODE,
+                endArea = item.S_EXIT_AREA_CODE,
+                endBit = item.S_EXIT_LOC_CODE,
+                trayCode = item.S_CNTR_CODE,
+                taskType = "閰嶇洏鍑哄簱"
+            }).ToList();
+        }
+
+        private static WMSTask CreateMainWmsTask(WCSTask firstTask)
+        {
+            return new WMSTask
+            {
+                S_CNTR_CODE = firstTask.S_CNTR_CODE,
+                S_CODE = WMSHelper.GenerateTaskNo(),
+                S_START_LOC = firstTask.S_START_LOC,
+                S_START_AREA = firstTask.S_START_AREA,
+                S_END_LOC = firstTask.S_END_LOC,
+                S_END_AREA = firstTask.S_END_AREA,
+                S_START_WH = "CK001",
+                S_END_WH = "CK001",
+                N_B_STATE = 1,
+                S_B_STATE = "鎵ц",
+                N_TYPE = 2,
+                S_TYPE = "閰嶇洏鍑哄簱"
+            };
+        }
+
+        private static bool ProcessAllTransportTasks(List<WCSTask> tasks, string wmsTaskCode)
+        {
+            foreach (var task in tasks.OrderBy(t => t.N_PRIORITY))
+            {
+                if (IsLxLkqOrRelocationTask(task))
                 {
-                    LogHelper.Error($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″け璐ex.Message}锛侊紒", ex);
-                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
-                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
-                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                    if (!ProcessLxLkqTransportTask(task, wmsTaskCode))
+                        return false;
                 }
+                else
+                {
+                    if (!ProcessNormalTransportTask(task, wmsTaskCode))
+                        return false;
+                }
+            }
+            return true;
+        }
+
+        private static bool IsLxLkqOrRelocationTask(WCSTask task)
+        {
+            return task.S_START_AREA == "LXLKQ" || task.S_TYPE == "娣变綅绉诲簱";
+        }
+
+        /// <summary>
+        /// 鐢熸垚LXLKQ || 娣变綅绉诲簱鐨勯厤鐩樹换鍔�+        /// </summary>
+        /// <param name="task"></param>
+        /// <param name="wmsTaskCode"></param>
+        /// <returns></returns>
+        private static bool ProcessLxLkqTransportTask(WCSTask task, string wmsTaskCode)
+        {
+            bool success = false;
+            if (task.S_TYPE == "娣变綅绉诲簱")
+            {
+                success = TaskProcess.HYCreateTransport(
+                task.S_START_LOC,
+                task.S_END_LOC,
+                task.S_TYPE,
+                task.S_CNTR_CODE,
+                wmsTaskCode,
+                task.N_PRIORITY);
+                return  success;
+            }
+            var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC);
+            if (relevancy == null)
+            {
+                LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽task.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀");
                 return false;
             }
 
+
+            // 灏濊瘯浣跨敤鍒嗘嫞浣�+            var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault();
+            if (emptyLoc != null)
+            {
+                success = TaskProcess.HYCreateTransport(
+                task.S_START_LOC,
+                emptyLoc.S_CODE,
+                task.S_TYPE,
+                task.S_CNTR_CODE,
+                wmsTaskCode,
+                task.N_PRIORITY);
+                if (success && task.S_TYPE != "娣变綅绉诲簱")
+                {
+                    UpdateDistributionCntrState(1, 2, task.S_CNTR_CODE);
+                }
+            }
+            return success;
+        }
+
+        /// <summary>
+        /// 鐢熸垚TPLKQ鐨勯厤鐩樹换鍔�+        /// </summary>
+        /// <param name="task"></param>
+        /// <param name="wmsTaskCode"></param>
+        /// <returns></returns>
+        private static bool ProcessNormalTransportTask(WCSTask task, string wmsTaskCode)
+        {
+            var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC);
+            if (relevancy == null)
+            {
+                LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽task.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀");
+                return false;
+            }
+
+            // 灏濊瘯浣跨敤鍒嗘嫞浣�+            var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault();
+            if (emptyLoc != null)
+            {
+                return CreateAndLogTransport(
+                    task.S_START_LOC,
+                    emptyLoc.S_CODE,
+                    task.S_TYPE,
+                    task.S_CNTR_CODE,
+                    wmsTaskCode,
+                    task.N_PRIORITY);
+            }
+
+            // 灏濊瘯浣跨敤鎷i�缂撳瓨鍖�+            var reservoir = Settings.ReservoirAreas.FirstOrDefault(s => s.areaName == "鎷i�缂撳瓨鍖�);
+            if (reservoir == null) return false;
+
+            var lxLocation = LocationHelper.GetLocAreaList(reservoir.areaCode).FirstOrDefault();
+            if (lxLocation == null) return false;
+
+            return CreateAndLogTransport(
+                task.S_START_LOC,
+                lxLocation.S_CODE,
+                "閰嶇洏缂撳瓨",
+                task.S_CNTR_CODE,
+                wmsTaskCode,
+                task.N_PRIORITY);
+        }
+
+        private static bool CreateAndLogTransport(string startLoc, string endLoc, string taskType,
+            string cntrCode, string wmsTaskCode, int priority)
+        {
+            var success = TaskProcess.HYCreateTransport(
+                startLoc, endLoc, taskType, cntrCode, wmsTaskCode, priority);
+
+            if (success)
+            {
+                UpdateDistributionCntrState(1, 2, cntrCode);
+            }
+            else
+            {
+                LogHelper.Info("鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
+            }
+
+            return success;
+        }
+
+        private static void LogErrorWithStackTrace(string message, Exception ex)
+        {
+            var st = new StackTrace(ex, true);
+            var frame = st.GetFrame(0);
+            if (frame == null) return;
+
+            LogHelper.Error($"{message}{ex.Message}锛侊紒", ex);
+            LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+            LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+            LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
         }
 
         #endregion

--
Gitblit v1.9.1