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 |  538 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 426 insertions(+), 112 deletions(-)

diff --git a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
index b5b0ab4..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;
@@ -924,12 +925,12 @@
         /// </summary>
         /// <param name="mst"></param>
         /// <returns></returns>
-        internal static bool CreateInTask(WMSTask mst)
+        internal static async Task<bool> CreateInTask(WMSTask mst)
         {
             try
             {
                 if (mst.S_B_STATE.Trim() != "绛夊緟") return true;
-                if (string.IsNullOrEmpty(mst.S_START_LOC)) return false;
+                //if (string.IsNullOrEmpty(mst.S_START_LOC)) return false;
 
                 var reservoirs = Settings.ReservoirAreas?.ToList();
                 if (reservoirs == null || !reservoirs.Any())
@@ -947,7 +948,13 @@
                     case "鍚堟墭鍥炲簱":
                         return HandleMergeReturn(mst, reservoirs);
                     case "鍒嗘嫞鍥炲簱":
-                        return HandleMergeReturn(mst, reservoirs);
+                        return await SortingReturn(mst, reservoirs);
+                    case "瑙g粦鍥炲簱":
+                        return await UnbindReturn(mst, reservoirs);
+                    case "绌烘墭鍥炲簱":
+                        return await EmptyPalletReturn(mst, reservoirs);
+                    case "绌烘墭鍑哄簱":
+                        return EmptyPalletOutbound(mst);
                     case "鏂欑鍑哄簱":
                         return HandleBoxOutbound(mst, reservoirs);
                     case "鍙戣揣鏆傚瓨":
@@ -1135,7 +1142,7 @@
         }
 
         /// <summary>
-        /// 鍚堟墭鍥炲簱 || 鍒嗘嫞鍥炲簱
+        /// 鍚堟墭鍥炲簱
         /// </summary>
         /// <param name="mst"></param>
         /// <param name="reservoirs"></param>
@@ -1237,6 +1244,218 @@
                 }
             }
             return true;
+        }
+
+        /// <summary>
+        /// 鍒嗘嫞鍥炲簱
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="reservoirs"></param>
+        /// <returns></returns>
+        private static async Task<bool> SortingReturn(WMSTask mst, List<ReservoirArea> reservoirs)
+        {
+            var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE);
+            if (trayLst != null && trayLst.S_TYPE.Equals("鎵樼洏"))
+            {
+                //鎵樼洏鍒嗘嫞鍥炲簱
+                var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault();
+                if (area == null)
+                {
+                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                    return false;
+                }
+                //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+                var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                if (anyLoc.Any())
+                {
+                    //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鎵樼洏鍒嗘嫞鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE);
+                    if (!res)
+                    {
+                        LogHelper.Info("鎵樼洏鍒嗘嫞鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                        return false;
+                    }
+                    WMSHelper.UpdateStatus(mst, 1);
+                }
+            }
+            else
+            {
+                //鏂欑鍥炲簱
+                var inbound = new Inbound()
+                {
+                    areaCode = "LXLKQ"
+                };
+                var wh = new Warehouse(inbound);
+                var stored = await wh.StoreItemAsync();
+                if (stored == null)
+                {
+                    LogHelper.Info($"鏈煡璇㈠埌{inbound.areaCode}鍙敤璐т綅锛�, "鏉哀");
+                    return false;
+                }
+                
+                var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "鏂欑鍒嗘嫞鍥炲簱" , mst.S_CNTR_CODE, mst.S_CODE);
+                if (!res)
+                {
+                    LogHelper.Info("鏂欑鍒嗘嫞鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                    return false;
+                }
+                WMSHelper.UpdateStatus(mst, 1);
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 瑙g粦鍥炲簱
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="reservoirs"></param>
+        /// <returns></returns>
+        private static async Task<bool> UnbindReturn(WMSTask mst, List<ReservoirArea> reservoirs)
+        {
+            var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE);
+            if (trayLst != null && trayLst.S_TYPE.Equals("鎵樼洏"))
+            {
+                //鎵樼洏鍒嗘嫞鍥炲簱
+                var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault();
+                if (area == null)
+                {
+                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                    return false;
+                }
+                //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+                var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                if (anyLoc.Any())
+                {
+                    //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鎵樼洏瑙g粦鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE);
+                    if (!res)
+                    {
+                        LogHelper.Info("鎵樼洏瑙g粦鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                        return false;
+                    }
+                    WMSHelper.UpdateStatus(mst, 1);
+                }
+            }
+            else
+            {
+                //鏂欑鍥炲簱
+                var inbound = new Inbound()
+                {
+                    areaCode = "LXLKQ"
+                };
+                var wh = new Warehouse(inbound);
+                var stored = await wh.StoreItemAsync();
+                if (stored == null)
+                {
+                    LogHelper.Info($"鏈煡璇㈠埌{inbound.areaCode}鍙敤璐т綅锛�, "鏉哀");
+                    return false;
+                }
+
+                var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "鏂欑瑙g粦鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE);
+                if (!res)
+                {
+                    LogHelper.Info("鏂欑瑙g粦鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                    return false;
+                }
+                WMSHelper.UpdateStatus(mst, 1);
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 绌烘墭鍥炲簱
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="reservoirs"></param>
+        /// <returns></returns>
+        private static async Task<bool> EmptyPalletReturn(WMSTask mst, List<ReservoirArea> reservoirs)
+        {
+            var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE);
+            if (trayLst != null && trayLst.S_TYPE.Equals("鎵樼洏"))
+            {
+                //鎵樼洏绌烘墭鍥炲簱
+                var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault();
+                if (area == null)
+                {
+                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                    return false;
+                }
+                //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+                var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                if (anyLoc.Any())
+                {
+                    //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鎵樼洏绌烘墭鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE);
+                    if (!res)
+                    {
+                        LogHelper.Info("鎵樼洏绌烘墭鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                        return false;
+                    }
+                    WMSHelper.UpdateStatus(mst, 1);
+                }
+            }
+            else
+            {
+                //鏂欑绌烘墭鍥炲簱
+                var inbound = new Inbound()
+                {
+                    areaCode = "LXLKQ"
+                };
+                var wh = new Warehouse(inbound);
+                var stored = await wh.StoreItemAsync();
+                if (stored == null)
+                {
+                    LogHelper.Info($"鏈煡璇㈠埌{inbound.areaCode}鍙敤璐т綅锛�, "鏉哀");
+                    return false;
+                }
+
+                var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "鏂欑绌烘墭鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE);
+                if (!res)
+                {
+                    LogHelper.Info("鏂欑绌烘墭鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                    return false;
+                }
+                WMSHelper.UpdateStatus(mst, 1);
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 绌烘墭鍑哄簱
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="reservoirs"></param>
+        /// <returns></returns>
+        private static bool EmptyPalletOutbound(WMSTask mst)
+        {
+            var result = true;
+            var scheduler = new EmptyPalletOutboundScheduler(mst.S_START_AREA);
+
+            var outbound = new Outbound
+            {
+                endArea = mst.S_END_AREA,
+                endBit = mst.S_END_LOC,
+                requiredCount = 1,
+                taskType = "绌烘墭鍑哄簱"
+            };
+            // 璇锋眰鍑哄簱
+            var tasks = scheduler.GenerateEmptyPalletTasks(outbound);
+
+            foreach (var item in tasks)
+            {
+                // 鍒涘缓鍑哄簱浠诲姟
+                var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, mst.S_CODE);
+                mst.S_START_LOC = item.S_START_LOC;
+                mst.S_CNTR_CODE  = item.S_CNTR_CODE;
+                //淇敼绌烘墭鍑哄簱璧风偣鍜屾墭鐩樼爜
+                UpdateTask(mst,1);
+                if (!res)
+                {
+                    LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
+                    return false;
+                }
+            }
+            return result;
         }
 
         /// <summary>
@@ -1370,13 +1589,17 @@
             if (locList.Any())
             {
                 var startLoc = WMSHelper.GetCntrLoc(mst.S_CNTR_CODE);
-                // 鍒涘缓鍑哄簱浠诲姟
-                var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, locList.FirstOrDefault().S_CODE, mst.S_TYPE, mst.S_CNTR_CODE, mst.S_CODE);
-                if (!res)
+                if (startLoc != null)
                 {
-                    LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                    return false;
+                    // 鍒涘缓鍑哄簱浠诲姟
+                    var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, locList.FirstOrDefault().S_CODE, mst.S_TYPE, mst.S_CNTR_CODE, mst.S_CODE);
+                    if (!res)
+                    {
+                        LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
+                        return false;
+                    }
                 }
+                
             }
 
             return true;
@@ -1595,13 +1818,17 @@
                     if (list == null)
                     {
                         list = WMSHelper.GetWmsTaskList("鎵ц", item.cntrNo);
+                        if (list != null && list.S_TYPE.Contains("鍥炲簱"))
+                        {
+                            list.S_END_AREA = "TPLKQ";
+                        }
                     }
                     if (list == null)
                     {
                         result.errMsg = "鏈煡璇㈠埌鍦ㄧ瓑寰呬腑鐨勪綔涓氾紒";
                         return result;
                     }
-
+                    
                     var inbound = new Inbound()
                     {
                         areaCode = list.S_END_AREA
@@ -1654,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