From f2518583da4cc3d3737986e112b92154535aea4d Mon Sep 17 00:00:00 2001
From: pengmn <pmn@HanInfo>
Date: 星期四, 29 五月 2025 17:32:48 +0800
Subject: [PATCH] 1

---
 HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs       |  313 +++++++++----
 HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs  |    9 
 HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs       |   62 --
 HH.WCS.Mobox3.HangYang/core/WCSCore.cs        |  142 +++--
 HH.WCS.Mobox3.HangYang/api/MoboxController.cs |    3 
 HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs  |    7 
 HH.WCS.Mobox3.HangYang/util/HttpHelper.cs     |    2 
 HH.WCS.Mobox3.HangYang/process/TaskProcess.cs |  246 ++++++++++
 HH.WCS.Mobox3.HangYang/models/Container.cs    |   12 
 HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs |  510 +----------------------
 10 files changed, 572 insertions(+), 734 deletions(-)

diff --git a/HH.WCS.Mobox3.HangYang/api/MoboxController.cs b/HH.WCS.Mobox3.HangYang/api/MoboxController.cs
index 0a8df63..78f0c60 100644
--- a/HH.WCS.Mobox3.HangYang/api/MoboxController.cs
+++ b/HH.WCS.Mobox3.HangYang/api/MoboxController.cs
@@ -143,8 +143,7 @@
 
         #region 鏉哀PDA鎺ュ彛
 
-
-
+        
 
         #endregion
     }
diff --git a/HH.WCS.Mobox3.HangYang/core/WCSCore.cs b/HH.WCS.Mobox3.HangYang/core/WCSCore.cs
index fb28d63..6abfd39 100644
--- a/HH.WCS.Mobox3.HangYang/core/WCSCore.cs
+++ b/HH.WCS.Mobox3.HangYang/core/WCSCore.cs
@@ -13,64 +13,91 @@
     {
         public static void OperateAgvTaskStatus(AgvTaskState model)
         {
-            var TN_Task = WCSHelper.GetTask(model.No);
-            if (TN_Task != null)
+            if (model == null) return;
+
+            var task = WCSHelper.GetTask(model.No);
+            if (task == null) return;
+
+            if (model.State > 7) return;
+
+            // 鐘舵�涓庢搷浣滅殑鏄犲皠瀛楀吀
+            var stateActions = new Dictionary<int, Action>
             {
-                if (model.State <= 7)
-                {
+                [1] = () => WCSHelper.Begin(task),
+                [2] = () => HandleTaskCompletion(task),
+                [3] = () => WCSHelper.UpdateStatus(task, "寮�鍙栬揣"),
+                [4] = () => HandlePickCompletion(task),
+                [5] = () => WCSHelper.UpdateStatus(task, "寮�鍗歌揣"),
+                [6] = () => HandleUnloadCompletion(task),
+                [7] = () => HandleTaskFailure(task)
+            };
 
-                    //鏈変换鍔″彿璇锋眰
-                    switch (model.State)
-                    {
-                        case 1:
-                            WCSHelper.Begin(TN_Task);
-                            break;
-                        #region MyRegion
-                        case 3:
-                            WCSHelper.UpdateStatus(TN_Task, "寮�鍙栬揣");
-                            break;
-                        case 4:
-                            WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚");
-                            TaskProcess.OperateStatus(TN_Task, 4);
-                            break;
-                        case 5:
-                            WCSHelper.UpdateStatus(TN_Task, "寮�鍗歌揣");
-                            break;
-                        case 6:
-                            WCSHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚");
-                            TaskProcess.OperateStatus(TN_Task, 6);
-                            break;
-                        #endregion
-                        case 2:
-                            WCSHelper.End(TN_Task);
-                            //鏍规嵁浠诲姟绫诲瀷鏇存柊浣滀笟鐘舵�鍜岀粓鐐�-                            var taskList = Settings.CompleteTasks;
-                            if (taskList.taskType.Contains(TN_Task.S_TYPE))
-                            {
-                                //瀹屾垚浣滀笟
-                                WMSHelper.UpdateWmsTask(TN_Task, 2);
-                                WMSHelper.UpdateDistributionCntrState(2, 3, TN_Task.S_CNTR_CODE);
-                            }
-                            if (new List<string> { "鏂欑鍏ュ簱", "鎵樼洏鍏ュ簱" }.Contains(TN_Task.S_TYPE))
-                            {
-                                ContainerHelper.UpdateCntrItem(TN_Task.S_CNTR_CODE);
-                            }
-                            //if (WMSHelper.DeleteChange(TN_Task))
-                            //{
-                            //    WMSHelper.AddChange(TN_Task);
-                            //}
-                            break;
-                        case 7:
-                            TaskProcess.OperateStatus(TN_Task, 7);
-                            WCSHelper.Fail(TN_Task);
-                            break;
-                    }
-                    WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
-
-                }
-
+            if (stateActions.TryGetValue(model.State, out var action))
+            {
+                action.Invoke();
+                WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
             }
         }
+
+        // 澶勭悊浠诲姟瀹屾垚閫昏緫
+        private static void HandleTaskCompletion(WCSTask task)
+        {
+            WCSHelper.End(task);
+
+            // 鏍规嵁浠诲姟绫诲瀷澶勭悊涓嶅悓鐨勫畬鎴愰�杈�+            if (Settings.CompleteTasks.taskType.Contains(task.S_TYPE))
+            {
+                WMSHelper.UpdateWmsTask(task, 2);
+                WMSHelper.UpdateDistributionCntrState(2, 3, task.S_CNTR_CODE);
+            }
+
+            if (new List<string> { "鏂欑鍏ュ簱", "鎵樼洏鍏ュ簱" }.Contains(task.S_TYPE))
+            {
+                ContainerHelper.UpdateCntrItem(task.S_CNTR_CODE);
+            }
+
+            // 澶勭悊鍖哄煙鍙樻洿
+            HandleAreaChange(task);
+        }
+
+        // 澶勭悊鍙栬揣瀹屾垚閫昏緫
+        private static void HandlePickCompletion(WCSTask task)
+        {
+            WCSHelper.UpdateStatus(task, "鍙栬揣瀹屾垚");
+            TaskProcess.OperateStatus(task, 4);
+        }
+
+        // 澶勭悊鍗歌揣瀹屾垚閫昏緫
+        private static void HandleUnloadCompletion(WCSTask task)
+        {
+            WCSHelper.UpdateStatus(task, "鍗歌揣瀹屾垚");
+            TaskProcess.OperateStatus(task, 6);
+        }
+
+        // 澶勭悊浠诲姟澶辫触閫昏緫
+        private static void HandleTaskFailure(WCSTask task)
+        {
+            TaskProcess.OperateStatus(task, 7);
+            WCSHelper.Fail(task);
+        }
+
+        // 澶勭悊鍖哄煙鍙樻洿閫昏緫
+        private static void HandleAreaChange(WCSTask task)
+        {
+            var areas = new List<string> { "TPLKQ", "LXLKQ" };
+
+            if (areas.Contains(task.S_START_AREA))
+            {
+                WMSHelper.DeleteChange(task);
+            }
+
+            if (areas.Contains(task.S_END_AREA))
+            {
+                WMSHelper.AddChange(task);
+            }
+        }
+
+
 
         /// <summary>
         /// 浠诲姟鍒嗗彂锛屾牴鎹皟搴︾被鍨嬪彂缁欎笉鍚岀殑璋冨害绯荤粺
@@ -104,11 +131,10 @@
                 var list = WMSHelper.GetWmsTaskListByState("绛夊緟");
                 if (list.Count > 0)
                 {
-
-                    list.ForEach(task =>
+                    list.ForEach(async task =>
                     {
                         //鐢熸垚鍏ュ簱浠诲姟
-                        TaskProcess.CreateInTask(task);
+                        await TaskProcess.CreateInTask(task);
                     });
                 }
                 //鏌ヨ浠诲姟
@@ -118,7 +144,7 @@
                 {
                     exelist.ForEach(task =>
                     {
-                        //鐢熸垚鍏ュ簱浠诲姟
+                        //鐢熸垚浠庡垎鎷f殏瀛樺尯鍒伴泦璐ф墭鐩樹綅鐨勪换鍔′换鍔�                         TaskProcess.exeCreateInTask(task);
                     });
                 }
diff --git a/HH.WCS.Mobox3.HangYang/models/Container.cs b/HH.WCS.Mobox3.HangYang/models/Container.cs
index b3cf3ef..76b1e56 100644
--- a/HH.WCS.Mobox3.HangYang/models/Container.cs
+++ b/HH.WCS.Mobox3.HangYang/models/Container.cs
@@ -12,11 +12,11 @@
         public string S_TYPE { get; set; }
         public string S_SPEC { get; set; }
         public float F_WEIGHT { get; set; }
-        public float F_LOAD_WEIGHT { get; set; }
+        //public float F_LOAD_WEIGHT { get; set; }
         public float F_MAX_WEIGHT { get; set; }
-        public int N_LENGTH { get; set; }
-        public int N_WIDTH { get; set; }
-        public int N_HEIGHT { get; set; }
+        //public int N_LENGTH { get; set; }
+        //public int N_WIDTH { get; set; }
+        //public int N_HEIGHT { get; set; }
         public string C_IS_VIRTUAL { get; set; } = "N";
         public int N_TYPE { get; set; }
         public string C_ENABLE { get; set; } = "Y";
@@ -31,8 +31,8 @@
         /// <summary>
         /// 码盘时候标记
         /// </summary>
-        public string S_SRC { get; internal set; }
-        public string S_DEST { get; internal set; }
+        //public string S_SRC { get; internal set; }
+        //public string S_DEST { get; internal set; }
 
 
         [SugarColumn(IsIgnore = true)]
diff --git a/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs b/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs
index 4139f22..11c1ae1 100644
--- a/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs
+++ b/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs
@@ -26,8 +26,6 @@
     /// </summary>
     public class Outbound
     {
-
-
         /// <summary>
         /// 搴撳尯
         /// </summary>
@@ -57,6 +55,11 @@
         /// 浣滀笟浠诲姟鍙�         /// </summary>
         public string opCode { get; set; }
+
+        /// <summary>
+        /// 鍛煎彨绌烘墭鏁�+        /// </summary>
+        public int requiredCount { get; set; }
     }
 
     public class LocationParams
diff --git a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
index b5b0ab4..178735f 100644
--- a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
+++ b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
@@ -924,12 +924,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 +947,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 +1141,7 @@
         }
 
         /// <summary>
-        /// 鍚堟墭鍥炲簱 || 鍒嗘嫞鍥炲簱
+        /// 鍚堟墭鍥炲簱
         /// </summary>
         /// <param name="mst"></param>
         /// <param name="reservoirs"></param>
@@ -1237,6 +1243,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 +1588,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 +1817,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
diff --git a/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs b/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs
index f0970dc..4b68dc5 100644
--- a/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs
+++ b/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs
@@ -55,7 +55,7 @@
         #endregion
 
         #region WebHelper
-        public string WebPost(string url, string postData, string cotentType = "application/json")
+        public string WebHttpPost(string url, string postData, string cotentType = "application/json")
         {
             Console.WriteLine(url);
             WebRequest request = WebRequest.Create(url);
diff --git a/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs b/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs
index a2053d2..af119f9 100644
--- a/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs
+++ b/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs
@@ -21,160 +21,7 @@
             var date = DateTime.Now.ToString("yyMMdd");
             return $"TP{date}{id.ToString().PadLeft(4, '0')}";
         }
-        /// <summary>
-        /// 鏍规嵁瀹瑰櫒绫诲瀷銆佺洰鐨勫湴銆佺姸鎬佹煡璇㈠鍣�-        /// </summary>
-        /// <param name="dest"></param>
-        /// <param name="cntrType"></param>
-        /// <param name="state"></param>
-        /// <returns></returns>
-        internal static List<Container> GetCntrListByPurpose(string dest, string cntrType, int state)
-        {
-            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
-            var db = new SqlHelper<object>().GetInstance();
-            var list = db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.N_B_STATE == state).ToList();
-            return list;
 
-        }
-        /// <summary>
-        /// 鍒涘缓鎵樼洏鐗╂枡缁戝畾鍏崇郴
-        /// </summary>
-        /// <param name="loc"></param>
-        /// <param name="cntr"></param>
-        /// <param name="itemcode"></param>
-        /// <returns></returns>
-        internal static bool CreateCntrItem(string loc, string cntr, string itemcode, string itemname, string itemtype, string cntrtype, string batch, int weight, string unit)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            try
-            {
-                var location = db.Queryable<Location>().Where(a => a.S_CODE == loc).First();
-                if (location != null)
-                {
-                    LogHelper.Info($"鎵樼洏{cntr}锛氭坊鍔犺揣浣峽loc}缁戝畾鍏崇郴锛屾坊鍔犲鍣ㄨ揣鍝佽〃");
-                    db.BeginTran();
-                    var con = db.Queryable<Container>().Where(a => a.S_CODE.Trim() == cntr).First();
-                    if (con == null)
-                    {
-                        var container = new Container { S_CODE = cntr, S_TYPE = cntrtype };
-                        db.Insertable<Container>(container).ExecuteCommand();
-                    }
-
-                    var cntritem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr).First();
-                    if (cntritem == null)
-                    {
-                        var cir = new CntrItemDetail { S_CNTR_CODE = cntr, S_ITEM_CODE = itemcode, S_ITEM_NAME = itemname, S_ITEM_SPEC = itemtype, S_WU = unit, F_NET_WEIGHT = weight, S_BATCH_NO = batch };
-                        db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
-                    }
-
-                    var loctp = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntr };
-
-
-                    db.Insertable<LocCntrRel>(loctp).ExecuteCommand();
-                    location.N_CURRENT_NUM = location.N_CURRENT_NUM + 1;
-
-
-                    db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
-                    db.Ado.CommitTran();
-                    res = true;
-                }
-
-            }
-            catch (Exception ex)
-            {
-                LogHelper.Info($"CreateCntrItem => erro锛氭墭鐩榹cntr}娣诲姞澶辫触" + ex.Message.ToString());
-                db.Ado.RollbackTran();
-            }
-
-            return res;
-        }
-
-        /// <summary>
-        /// 鍒涘缓鎵樼洏鐗╂枡缁戝畾鍏崇郴
-        /// </summary>
-        /// <param name="loc"></param>
-        /// <param name="cntr"></param>
-        /// <param name="itemcode"></param>
-        /// <returns></returns>
-        internal static bool CreateCntrItem(string cntr, string itemcode, string itemname, string batch, string weight)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            try
-            {
-                LogHelper.Info($"鎵樼洏{cntr}锛氭坊鍔犵墿鏂檣itemcode}缁戝畾鍏崇郴");
-                db.BeginTran();
-                var cntritem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr).First();
-                if (cntritem == null)
-                {
-                    var cir = new CntrItemDetail { S_CNTR_CODE = cntr, S_ITEM_CODE = itemcode, S_ITEM_NAME = itemname, F_NET_WEIGHT = float.Parse(weight), S_BATCH_NO = batch };
-                    db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
-                }
-                else
-                {
-                    cntritem.S_ITEM_CODE = itemcode;
-                    cntritem.S_ITEM_NAME = itemname;
-                    cntritem.F_NET_WEIGHT = float.Parse(weight);
-                    cntritem.S_BATCH_NO = batch;
-                    db.Updateable<CntrItemDetail>(cntritem).ExecuteCommand();
-                }
-                var con = db.Queryable<Container>().Where(a => a.S_CODE.Trim() == cntr).First();
-                if (con == null)
-                {
-                    var container = new Container { S_CODE = cntr };
-                    db.Insertable<Container>(container).ExecuteCommand();
-                }
-                db.Ado.CommitTran();
-                res = true;
-
-
-            }
-            catch (Exception ex)
-            {
-                LogHelper.Info($"CreateCntrItem => erro锛氭墭鐩榹cntr}娣诲姞澶辫触" + ex.Message.ToString());
-                db.Ado.RollbackTran();
-            }
-
-            return res;
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇瀹瑰櫒鏄惁鏈夌墿鏂欎俊鎭�-        /// </summary>
-        /// <param name="cntr"></param>
-        /// <returns></returns>
-        internal static bool CheckEmpty(string cntr)
-        {
-            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<LocCntrRel>().Count(a => a.S_LOC_CODE.Trim() == cntr) == 0;
-
-        }
-
-        internal static bool AddCntr(string cntrCode, string itemCode)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var TN_Container = new Container { S_CODE = cntrCode };
-            var cntrItemRel = new CntrItemDetail { S_CNTR_CODE = cntrCode, S_ITEM_CODE = itemCode };
-            try
-            {
-                db.BeginTran();
-
-                db.Insertable<Container>(TN_Container).ExecuteCommand();
-                db.Insertable<CntrItemDetail>(cntrItemRel).ExecuteCommand();
-
-                db.CommitTran();
-                res = true;
-            }
-            catch (Exception ex)
-            {
-                db.RollbackTran();
-
-            }
-            return res;
-        }
 
         /// <summary>
         /// 鏍规嵁瀹瑰櫒鍙疯幏鍙栧鍣ㄤ俊鎭�@@ -208,335 +55,6 @@
             var db = new SqlHelper<object>().GetInstance();
             var list = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr).ToList();
             return list;
-        }
-
-        /// <summary>
-        /// 鏍规嵁鐗╂枡鑾峰彇瀹瑰櫒淇℃伅
-        /// </summary>
-        /// <param name="cntr"></param>
-        /// <returns></returns>
-        internal static List<CntrItemDetail> GetItemCntrRel(string itemcode)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            var list = db.Queryable<CntrItemDetail>().Where(a => a.S_ITEM_CODE.Trim() == itemcode.Trim()).ToList();
-            return list;
-        }
-
-        /// <summary>
-        /// 鐗╂枡淇℃伅缁戝畾鍒版弧瀹瑰櫒涓�-        /// </summary>
-        /// <param name="cntrCode"></param>
-        /// <param name="itemCode"></param>
-        /// <param name="batchNo"></param>
-        /// <param name="qty"></param>
-        /// <param name="purpose">瀹瑰櫒鐢ㄩ�锛岀敤浜庡摢涓嚎杈硅繕鏄洰鐨勭偣</param>
-        /// <returns></returns>
-        internal static bool BindCntrItemSingle(Container cntr, string itemCode, string batchNo, float qty)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            try
-            {
-                db.BeginTran();
-                db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
-                //1.灏嗗師鏈夊鍣ㄧ墿鏂欎俊鎭垹闄�-                db.Deleteable<CntrItemDetail>().Where(it => it.S_CNTR_CODE == cntr.S_CODE.Trim()).ExecuteCommand();
-                //2.鎻掑叆鏂扮殑瀹瑰櫒鐗╂枡淇℃伅锛堝鍣ㄥ彿涓嶅彉锛�-                var cir = new CntrItemDetail { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode };
-                db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
-
-                db.CommitTran();
-                res = true;
-            }
-            catch (Exception ex)
-            {
-                db.RollbackTran();
-            }
-
-            return res;
-        }
-        /// <summary>
-        /// 鏍规嵁瀹瑰櫒鏉ユ簮鍜岀姸鎬佽幏鍙栨墭鐩�-        /// </summary>
-        /// <param name="src"></param>
-        /// <param name="state"></param>
-        /// <returns></returns>
-        internal static List<Container> GetCntr(string dest, int state, string cntrType = "")
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            if (cntrType == "")
-            {
-                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state).ToList();
-            }
-            else
-            {
-                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
-            }
-        }
-        internal static bool UpdateCntr(List<string> cntrs, string dest, int state)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
-            if (models.Count > 0)
-            {
-                models.ForEach(a =>
-                {
-                    a.S_DEST = dest; a.N_B_STATE = state;
-                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE }).ExecuteCommand();
-                });
-                res = true;
-            }
-            return res;
-        }
-        internal static bool UpdateCntrDest(List<string> cntrs, string dest)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
-            if (models.Count > 0)
-            {
-                models.ForEach(a =>
-                {
-                    a.S_DEST = dest;
-                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
-                });
-                res = true;
-            }
-            return res;
-        }
-        /// <summary>
-        /// 鏇存柊鎵樼洏鏉ユ簮
-        /// </summary>
-        /// <param name="cntr"></param>
-        /// <param name="src"></param>
-        /// <returns></returns>
-        internal static bool UpdateCntrSrc(string cntr, string src)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
-            if (model != null)
-            {
-                model.S_SRC = src;
-                model.T_MODIFY = DateTime.Now;
-                res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0;
-            }
-            return res;
-        }
-        internal static bool UpdateCntrState(List<string> cntrs, int state)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
-            if (models.Count > 0)
-            {
-                models.ForEach(a =>
-                {
-                    a.N_B_STATE = state;
-                    db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
-                });
-                res = true;
-            }
-            return res;
-        }
-
-        internal static bool UpdateCntr(List<string> cntrs, string src, string dest, int state)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
-            if (models.Count > 0)
-            {
-                models.ForEach(a =>
-                {
-                    a.S_DEST = dest; a.N_B_STATE = state; a.S_SRC = src;
-                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE, it.S_SRC }).ExecuteCommand();
-                });
-                res = true;
-            }
-            return res;
-        }
-        public static bool ClearCntrInfo(string cntr)
-        {
-
-            var db = new SqlHelper<object>().GetInstance();
-            var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
-            if (model != null)
-            {
-                model.S_SRC = "";
-                model.S_DEST = "";
-                model.N_B_STATE = 0;
-                model.T_MODIFY = DateTime.Now;
-
-            }
-            db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
-            return db.Deleteable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0;
-        }
-        internal static List<Container> GetCntrBySrc(string src, int state, string cntrType = "")
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            if (cntrType == "")
-            {
-                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state).ToList();
-            }
-            else
-            {
-                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
-            }
-        }
-        /// <summary>
-        /// enable 璁╂墭鐩樺厑璁歌鍑哄簱璁$畻鍒帮紝鍚屾椂澧炲姞閲忚〃鏁版嵁
-        /// </summary>
-        /// <param name="cntr"></param>
-        internal static void Enable(string cntr, string loc)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            var cntrInfo = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
-            //鑾峰彇浠撳簱閲忚〃
-            //鑾峰彇鐗╃悊搴撳尯
-            //鑾峰彇閫昏緫搴撳尯
-            if (cntrInfo != null)
-            {
-                try
-                {
-                    db.BeginTran();
-                    //闃叉鎺ュ彛閲嶅璋冪敤锛岄噺琛ㄩ噸澶嶅鍔�-                    if (cntrInfo.C_ENABLE == "N")
-                    {
-                        cntrInfo.C_ENABLE = "Y";
-                        db.Updateable(cntrInfo).UpdateColumns(a => new { a.C_ENABLE, a.T_MODIFY }).ExecuteCommand();
-                        var cirList = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == cntr).ToList();
-                        if (cirList.Count > 0)
-                        {
-                            cirList.ForEach(a =>
-                            {
-                                var wh = db.Queryable<WHInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE).First();
-                                if (wh != null)
-                                {
-                                    //鏇存柊浠撳簱閲忚〃
-                                    wh.F_QTY += a.F_QTY;
-                                    wh.T_MODIFY = DateTime.Now;
-                                    db.Updateable(wh).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
-                                }
-                                else
-                                {
-                                    //鏂板浠撳簱閲忚〃
-                                    wh = new WHInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE };
-                                    db.Insertable(wh).ExecuteCommand();
-                                }
-                                //鍐欏叆绗笁鏂逛腑闂磋〃
-                                //濡傛灉瑕佺粺璁″垎鎷d腑锛屽垎鎷e洖鐨勯噺锛屾棤娉曡窡韪墭鐩橈紝闄ら潪瀵规墭鐩樺姞鏍囪瘑锛屽睘浜庡摢涓簱鍖恒�
-                                //鍙﹀鍒嗘嫞鍥炲彲鑳藉幓鍒殑宸烽亾锛屽埆鐨勯�杈戝簱鍖猴紝閫昏緫搴撳尯鐨勯噺鎺у埗鏇村鏉傦紝涓嶈兘璁$畻鍒嗘嫞涓拰鍒嗘嫞鍥炪�鎵�互搴撳尯閲忚〃鏈」鐩殏涓嶈�铏�-                                /*
-                                //鑾峰彇璐т綅鐨勭墿鐞嗗簱鍖哄拰鎵�湁閫昏緫搴撳尯
-                                var location = db.Queryable<Location>().Where(l => l.S_CODE == loc).First();
-                                if (location != null) {
-                                    var az = db.Queryable<AZInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == location.S_AREA_CODE).First();
-                                    if (az != null) {
-                                        //鏇存柊搴撳尯閲忚〃
-                                        az.F_QTY += a.F_QTY;
-                                        az.T_MODIFY = DateTime.Now;
-                                        db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
-                                    }
-                                    else {
-                                        //鏂板搴撳尯閲忚〃
-                                        az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = location.S_AREA_CODE };
-                                        db.Insertable(az).ExecuteCommand();
-                                    }
-
-                                }
-                                //閫昏緫搴撳尯鐨勯噺琛�-                                var zoneList = db.Queryable<ZoneLoc>().Where(l => l.S_LOC_CODE == loc).ToList();
-                                if (zoneList.Count > 0) {
-                                    zoneList.ForEach(z => {
-                                        var az = db.Queryable<AZInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == z.S_ZONE_CODE).First();
-                                        if (az != null) {
-                                            //鏇存柊搴撳尯閲忚〃
-                                            az.F_QTY += a.F_QTY;
-                                            az.T_MODIFY = DateTime.Now;
-                                            db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
-                                        }
-                                        else {
-                                            //鏂板搴撳尯閲忚〃
-                                            az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = z.S_ZONE_CODE, C_IS_LOGIC_AREA = "Y" };
-                                            db.Insertable(az).ExecuteCommand();
-                                        }
-                                    });
-                                }
-                                */
-
-                            });
-                        }
-                    }
-                    db.CommitTran();
-                }
-                catch (Exception ex)
-                {
-                    Console.WriteLine(ex.Message);
-                    db.RollbackTran();
-
-                }
-            }
-        }
-
-        /// <summary>
-        /// 缁戝畾璐т綅瀹瑰櫒琛�-        /// </summary>
-        /// <param name="cntr"></param>
-        /// <returns></returns>
-        internal static bool BindLocCntrs(string loc, string cntr, string itemCode, string itemName)
-        {
-            bool result = true;
-            List<string> list = new List<string>(cntr.Split(','));
-            var db = new SqlHelper<object>().GetInstance();
-            for (int i = 0; i < list.Count; i++)
-            {
-                if (!string.IsNullOrEmpty(list[i]))
-                {
-                    string cntrCode = list[i];
-                    if (db.Queryable<LocCntrRel>().Count(a => a.S_CNTR_CODE.Trim() == cntrCode) == 0)
-                    {
-                        var cir = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntrCode };
-                        var con = new Container { S_CODE = cntrCode,N_DETAIL_COUNT = 1 };
-                        db.Insertable<LocCntrRel>(cir).ExecuteCommand();
-                        db.Insertable<Container>(con).ExecuteCommand();
-                        if (!string.IsNullOrEmpty(itemCode))
-                        {
-                            ContainerHelper.BindCntrItem(cntrCode, itemCode, itemName);
-                        }
-                    }
-                }
-            }
-            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
-            return result;
-        }
-
-        /// <summary>
-        /// 缁戝畾瀹瑰櫒鐗╂枡琛�-        /// </summary>
-        /// <param name="itemCode"></param>
-        /// <param name="batchNo"></param>
-        /// <param name="qty"></param>
-        /// <returns></returns>
-        internal static bool BindCntrItem(string trayCode, string itemCode, string itemName)
-        {
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            try
-            {
-                db.BeginTran();
-                var cir = new CntrItemDetail { S_CNTR_CODE = trayCode, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName };
-                db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
-
-                db.Ado.CommitTran();
-                res = true;
-            }
-            catch (Exception ex)
-            {
-                db.Ado.RollbackTran();
-            }
-            return res;
         }
 
         #region 鏉哀璐т綅瀹瑰櫒鐗╂枡甯姪鏂规硶
@@ -593,9 +111,9 @@
         {
             var db = new SqlHelper<object>().GetInstance();
             var model = db.Queryable<Location>().LeftJoin<LocCntrRel>((p, m) => p.S_CODE == m.S_LOC_CODE)
-                .Where((p,m)=>p.S_AREA_CODE == areaCode && p.S_LOCK_STATE == "鏃�)
-                .Where((p,m)=>m.S_ACTION_SRC == abouts)
-                .Select((p,m)=>m)
+                .Where((p, m) => p.S_AREA_CODE == areaCode && p.S_LOCK_STATE == "鏃�)
+                .Where((p, m) => m.S_ACTION_SRC == abouts)
+                .Select((p, m) => m)
                 .ToList();
             return model;
         }
@@ -603,10 +121,30 @@
         internal static LocCntrRel GetCntrLoc(string trayCode)
         {
             var db = new SqlHelper<object>().GetInstance();
-            var model = db.Queryable<LocCntrRel>().Where(s=>s.S_CNTR_CODE == trayCode).First();
+            var model = db.Queryable<LocCntrRel>().Where(s => s.S_CNTR_CODE == trayCode).First();
             return model;
         }
 
+        internal static LocCntrRel GetLocCntr(string loc)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == loc).First();
+            return model;
+        }
+
+        internal static bool GetLocItemRel(string loc)
+        {
+            bool result = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == loc).First();
+            if (model != null)
+            {
+                var list = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == model.S_CNTR_CODE).ToList();
+                result = list.Any() ? false : true;
+            }
+            return result;
+        }
+
         #endregion
 
 
diff --git a/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs b/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs
index 27dd3ee..0a53cb9 100644
--- a/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs
+++ b/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs
@@ -460,15 +460,6 @@
             return db.Queryable<ZoneLoc>().Where(a => a.S_LOC_CODE == loc).ToList();
 
         }
-        
-        internal static void Test()
-        {
-            //澶氭煡璇竴娆′篃鏄彲浠ョ殑锛屽厛鏌ュ嚭鍙敤鐨勮揣浣嶇粍锛岀劧鍚庨�鎷╄揣浣嶇粍涓垪姣旇緝澶х殑锛屾垨鑰呭垪姣旇緝灏忕殑
-            var availableRowGroups = new List<Location>().GroupBy(l => l.N_ROW_GROUP).Where(g => !g.Any(l => l.N_LOCK_STATE != 0)).Select(g => g.Key);
-
-            var db = new SqlHelper<object>().GetInstance();
-            //db.Queryable<Location>().Where(a => a.S_AREA_CODE == "11").Where(a => SqlFunc.Subqueryable<Location>().Where(b => b.)).GroupBy(z => z.N_ROW_GROUP).ToList();
-        }
 
         #region 鏉哀璐т綅甯姪Helper
 
diff --git a/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs
index 4d2250f..40afff4 100644
--- a/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs
+++ b/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs
@@ -44,16 +44,7 @@
             db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand();
             return res;
         }
-        internal static bool UpdateInfo(WCSTask task, string sourceNo, string endBit, string status)
-        {
-            var res = false;
-            var db = new SqlHelper<WCSTask>().GetInstance();
-            task.S_B_STATE = status;
-            task.S_OP_CODE = sourceNo;
-            task.S_END_LOC = endBit;
-            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.S_OP_CODE, it.S_END_LOC }).ExecuteCommand();
-            return res;
-        }
+        
         internal static WCSTask GetTask(string no)
         {
             var db = new SqlHelper<WCSTask>().GetInstance();
@@ -62,35 +53,8 @@
         }
 
 
-        internal static List<WCSTask> GetTaskBycntrcode(string no)
-        {
-            var db = new SqlHelper<WCSTask>().GetInstance();
-            var task = db.Queryable<WCSTask>().Where(a => a.S_CNTR_CODE.Trim() == no && a.S_B_STATE.Trim() == "瀹屾垚").ToList();
-            return task;
-        }
-        internal static WCSTask GetTaskBySrcNo(string no)
-        {
-            var db = new SqlHelper<WCSTask>().GetInstance();
-            var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == no).First();
-            return task;
-        }
-        internal static List<WCSTask> GetTaskByStart(string bit)
-        {
-            var db = new SqlHelper<WCSTask>().GetInstance();
-            var task = db.Queryable<WCSTask>().Where(a => a.S_START_LOC == bit).ToList();
-            return task;
-        }
-        internal static List<WCSTask> GetTaskByEnd(string bit)
-        {
-            var db = new SqlHelper<WCSTask>().GetInstance();
-            var task = db.Queryable<WCSTask>().Where(a => a.S_END_LOC == bit).ToList();
-            return task;
-        }
-        internal static List<WCSTask> GetTaskByType(string taskType)
-        {
-            var db = new SqlHelper<WCSTask>().GetInstance();
-            return db.Queryable<WCSTask>().Where(a => a.S_TYPE == taskType).ToList();
-        }
+       
+        
         internal static bool CreateTask(string no, string from, string to, string taskType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1)
         {
             var whCode = Settings.WHCode;
@@ -142,10 +106,7 @@
             };
             return CreateTask(TN_Task);
         }
-        internal static bool CheckExist(string no)
-        {
-            return GetTask(no) != null;
-        }
+        
         internal static bool UpdateStatus(string no, int state)
         {
             var res = false;
@@ -237,20 +198,5 @@
             return db.Queryable<WCSTask>().Where(a => a.S_B_STATE.Trim() == status).OrderBy(s => s.T_CREATE).ToList();
 
         }
-
-
-
-        internal static List<WCSTask> GetTaskListByState(int state)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<WCSTask>().Where(a => a.N_B_STATE == state).ToList();
-        }
-        internal static List<WCSTask> GetWaitingTaskList()
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<WCSTask>().Where(a => a.N_B_STATE == 0).ToList();
-        }
-
-
     }
 }
diff --git a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
index 5270858..724875c 100644
--- a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
+++ b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
@@ -42,63 +42,10 @@
             var date = DateTime.Now.ToString("yyMMdd");
             return $"SO{date}{id.ToString().PadLeft(4, '0')}";
         }
-        internal static List<WMSTask> GetOperationListByState(string state)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<WMSTask>().Where(a => a.S_B_STATE == state).ToList();
-        }
-        internal static List<WMSTask> GetOperationListByState(int state)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == state).ToList();
-        }
         internal static List<WMSTask> GetWaitingOperationList()
         {
             var db = new SqlHelper<object>().GetInstance();
             return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == 0 || a.N_B_STATE == 3).ToList();
-        }
-        internal static PutawayOrder GetPutawayOrder(string no)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<PutawayOrder>().Where(a => a.S_NO == no).First();
-        }
-        internal static bool CreatePutawayOrder(PutawayOrder model)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            var result = db.Insertable<PutawayOrder>(model).ExecuteCommand() > 0;
-            db.Insertable<PutawayDetail>(model.Details).ExecuteCommand();
-            return result;
-        }
-
-        internal static PutawayDetail GetPutawayOrderDetail(string no, string item_code)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<PutawayDetail>().Where(a => a.S_PUTAWAY_NO == no && a.S_ITEM_CODE == item_code).First();
-        }
-        internal static PutawayDetail GetPutawayOrderDetail(string item_code)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<PutawayDetail>().Where(a => a.S_ITEM_CODE == item_code && a.F_QTY - a.F_ACC_B_QTY > 0).OrderByDescending(a => a.T_CREATE).First();
-        }
-
-        internal static void UpdatePutawayOrderDetailQty(PutawayDetail model)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            db.Updateable(model).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand();
-        }
-
-
-        internal static ShippingOrder GetShippingOrder(string no)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<ShippingOrder>().Includes(a => a.Details).Where(a => a.S_NO == no).First();
-        }
-        internal static bool CreateShippingOrder(ShippingOrder model)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            var result = db.Insertable<ShippingOrder>(model).ExecuteCommand() > 0;
-            db.Insertable<ShippingDetail>(model.Details).ExecuteCommand();
-            return result;
         }
 
         internal static bool CreateSortingOrder(List<string> list)
@@ -273,11 +220,6 @@
             throw new NotImplementedException();
         }
 
-        internal static Location GetStart(WMSTask a)
-        {
-            throw new NotImplementedException();
-        }
-
         internal static void UpdateTaskState(WMSTask task)
         {
             var db = new SqlHelper<object>().GetInstance();
@@ -293,11 +235,8 @@
             return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.S_END_LOC, it.T_MODIFY }).ExecuteCommand() > 0;
         }
 
-        internal static WMSTask GetWmsTask(string code)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<WMSTask>().Where(a => a.S_CODE == code).First();
-        }
+        
+
 
         internal static void CreateSortingOrderDetail(string so_no)
         {
@@ -372,15 +311,6 @@
             }
         }
 
-        /// <summary>
-        /// 鑾峰彇寮�閰嶈揣鐨勫垎鎷e崟锛屼竴娆℃�鐢熸垚鍒嗘嫞鏄庣粏锛岄伩鍏嶇敓鎴愪竴鍗婂啀鐢熸垚锛屾墍浠ュ垱寤哄垎鎷f槑缁嗙殑鏃跺�鍔犱笂浜嬪姟
-        /// </summary>
-        /// <returns></returns>
-        internal static List<SortingOrder> GetWaitingSortingOrderList()
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<SortingOrder>().Includes(a => a.Composes).Where(a => a.N_B_STATE == 1 || a.N_B_STATE == 20).ToList();
-        }
         /// <summary>
         /// 鑾峰彇閰嶈揣瀹屾垚鐨勫垎鎷e崟锛屾瘡涓垎鎷e崟鍗曠嫭鍒涘缓鍒嗘嫞浣滀笟
         /// </summary>
@@ -746,10 +676,10 @@
         internal static LocCntrRel GetCntrLoc(string trayCode)
         {
             var db = new SqlHelper<object>().GetInstance();
-           
+
             var locCntr = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE.Trim() == trayCode).First();
-            var locList = db.Queryable<Location>().Where(p => p.S_CODE == locCntr.S_LOC_CODE 
-            && p.N_CURRENT_NUM == p.N_CAPACITY 
+            var locList = db.Queryable<Location>().Where(p => p.S_CODE == locCntr.S_LOC_CODE
+            && p.N_CURRENT_NUM == p.N_CAPACITY
             && p.S_LOCK_STATE.Trim() == "鏃�
             && p.S_AREA_CODE == "JXHCQ").First();
             if (locList == null)
@@ -820,10 +750,10 @@
         /// <param name="state">鐘舵�</param>
         /// <param name="trayCode">鎵樼洏鍙�/param>
         /// <returns></returns>
-        internal static bool UpdateDistributionCntrState(int taskState,int state,string trayCode)
+        internal static bool UpdateDistributionCntrState(int taskState, int state, string trayCode)
         {
             var db = new SqlHelper<object>().GetInstance();
-            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == taskState && a.S_CNTR_CODE == trayCode ).First();
+            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == taskState && a.S_CNTR_CODE == trayCode).First();
             if (distributionCntr != null)
             {
                 distributionCntr.N_B_STATE = state;
@@ -917,11 +847,19 @@
             return res;
         }
 
+        internal static bool UpdateTask(WMSTask a, int state)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            a.T_MODIFY = DateTime.Now;
+            a.N_B_STATE = state;
+            a.S_B_STATE = GetStateStr(state);
+            return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.S_CNTR_CODE, it.S_START_LOC, it.T_MODIFY }).ExecuteCommand() > 0;
+        }
 
         #endregion
 
         #region 鏉哀绔嬪簱鍑哄叆搴撻�杈戠畻娉�-        
+
         /// <summary>
         /// 绔嬪簱鍏ュ簱灏佽绠楁硶
         /// </summary>
@@ -939,7 +877,7 @@
             {
                 var db = new SqlHelper<object>().GetInstance();
                 var locations = db.Queryable<Location>().Where(a => a.S_AREA_CODE == inbound.areaCode).ToList();
-                if(inbound.roadWay != 0)
+                if (inbound.roadWay != 0)
                 {
                     locations.RemoveAll(s => s.N_ROADWAY != inbound.roadWay);
                 }
@@ -1061,7 +999,7 @@
                 return null; // 鏃犲彲鐢ㄤ綅缃�             }
             private readonly ConcurrentDictionary<string, SemaphoreSlim> _locationLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
-            
+
             public async Task<LocationParams> StoreItemAsync()
             {
                 LocationParams location = null;
@@ -1099,7 +1037,7 @@
         }
 
         /// <summary>
-        /// 绔嬪簱鍑哄簱灏佽绠楁硶
+        /// 閰嶇洏鍑哄簱灏佽绠楁硶
         /// </summary>
         public class DoubleDeepOutboundScheduler
         {
@@ -1117,7 +1055,7 @@
 
             // 鐢熸垚鍑哄簱浠诲姟闃熷垪锛堝惈绉诲簱浠诲姟锛�             /// <summary>
-            /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴撱�绌烘墭鍑哄簱锛�+            /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴擄級
             /// </summary>
             /// <param name="outbound">鍑哄簱鍙傛暟</param>
             /// <returns></returns>
@@ -1134,7 +1072,7 @@
                     var wmsTask = WMSHelper.GetWmsTaskList("鎵ц", outboundItem.trayCode);
                     if (wmsTask == null)
                     {
-                        LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀");
+                        //LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀");
                         outboundItem.opCode = "";
                     }
 
@@ -1158,6 +1096,7 @@
                                 .Where(x => x.S_CODE == outerLoc.S_CODE)
                                 .ToList()
                                 .ForEach(x => x.N_LOCK_STATE = 3);
+                                    var trayCode = ContainerHelper.GetLocCntr(outerLoc.S_CODE);
                                     tasks.Add(new WCSTask
                                     {
                                         S_CODE = GenerateTaskNo(),
@@ -1171,20 +1110,14 @@
                                         N_SCHEDULE_TYPE = 1,
                                         N_B_STATE = 0,
                                         S_B_STATE = WCSTask.GetStateStr(0),
-                                        S_CNTR_CODE = outboundItem.trayCode,
+                                        S_CNTR_CODE = trayCode.S_CNTR_CODE,
                                         N_START_LAYER = 1,
                                         N_END_LAYER = 1,
                                         N_CNTR_COUNT = 1
                                     });
                                 }
                                 else continue;
-
                             }
-                            //else
-                            //{
-                            //    //璐т綅涓虹┖鐩存帴鐢熸垚鍑哄簱浠诲姟
-                            //    tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
-                            //}
                         }
                         else
                         {
@@ -1223,19 +1156,19 @@
 
             private Location FindBestRelocationTarget(Location outerLoc)
             {
-                  return _allLocations
-                        .Where(loc =>
-                            loc.N_ROADWAY == outerLoc.N_ROADWAY &&
-                            loc.N_LOCK_STATE == 0 &&
-                            loc.N_CURRENT_NUM == 0 &&
-                            loc.S_CODE != outerLoc.S_CODE)
-                        .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0)
-                        .ThenBy(loc => loc.N_COL)
-                        .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER))
-                        .FirstOrDefault();
+                return _allLocations
+                      .Where(loc =>
+                          loc.N_ROADWAY == outerLoc.N_ROADWAY &&
+                          loc.N_LOCK_STATE == 0 &&
+                          loc.N_CURRENT_NUM == 0 &&
+                          loc.S_CODE != outerLoc.S_CODE)
+                      .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0)
+                      .ThenBy(loc => loc.N_COL)
+                      .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER))
+                      .FirstOrDefault();
             }
 
-            private WCSTask CreateOutboundTask(Location loc,Outbound outbound) =>
+            private WCSTask CreateOutboundTask(Location loc, Outbound outbound) =>
                 new WCSTask
                 {
                     S_CODE = GenerateTaskNo(),
@@ -1245,7 +1178,7 @@
                     S_END_LOC = outbound.endBit,
                     S_TYPE = outbound.taskType,
                     S_OP_CODE = outbound.opCode,
-                    N_PRIORITY = 1,
+                    N_PRIORITY = 0,
                     N_SCHEDULE_TYPE = 1,
                     N_B_STATE = 0,
                     S_B_STATE = WCSTask.GetStateStr(0),
@@ -1294,6 +1227,182 @@
 
             }
         }
+
+        public class EmptyPalletOutboundScheduler
+        {
+            private readonly List<Location> _allLocations;
+
+            public EmptyPalletOutboundScheduler(string areaCode)
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                _allLocations = db.Queryable<Location>()
+                                 .Where(a => a.S_AREA_CODE == areaCode)
+                                 .ToList();
+            }
+
+            /// <summary>
+            /// 绌烘墭鐩樺嚭搴撶畻娉曪紙鑷姩瀵绘壘鍙敤绌烘墭骞剁敓鎴愪换鍔★級
+            /// </summary>
+            public List<WCSTask> GenerateEmptyPalletTasks(Outbound outbound)
+            {
+                var tasks = new List<WCSTask>();
+                var foundPallets = 0;
+
+                if (foundPallets < outbound.requiredCount)
+                {
+                    var doubleDeepPallets = FindDoubleDeepEmptyPallets();
+                    foreach (var palletLoc in doubleDeepPallets)
+                    {
+                        if (IsDoubleDeepRow(palletLoc.N_ROW))
+                        {
+                            var outerLoc = FindOuterLocation(palletLoc);
+                            if (outerLoc != null)
+                            {
+                                if (outerLoc.N_CURRENT_NUM == outerLoc.N_CAPACITY)
+                                {
+                                    // 浼樺厛绉诲埌娣变綅锛屽叾娆″渚�+                                    var bestTarget = FindBestRelocationTarget(outerLoc);
+                                    if (bestTarget != null)
+                                    {
+                                        //璁$畻鍒颁簡澶栦晶鎶婂渚х殑璐т綅閿佸畾
+                                        _allLocations
+                                    .Where(x => x.S_CODE == outerLoc.S_CODE)
+                                    .ToList()
+                                    .ForEach(x => x.N_LOCK_STATE = 3);
+                                        var trayCode = ContainerHelper.GetLocCntr(outerLoc.S_CODE);
+
+                                        tasks.Add(new WCSTask
+                                        {
+                                            S_CODE = GenerateTaskNo(),
+                                            S_START_AREA = outerLoc.S_AREA_CODE,
+                                            S_END_AREA = bestTarget.S_AREA_CODE,
+                                            S_START_LOC = outerLoc.S_CODE,
+                                            S_END_LOC = bestTarget.S_CODE,
+                                            S_TYPE = "娣变綅绉诲簱",
+                                            S_OP_CODE = outbound.opCode,
+                                            N_PRIORITY = 1,
+                                            N_SCHEDULE_TYPE = 1,
+                                            N_B_STATE = 0,
+                                            S_B_STATE = WCSTask.GetStateStr(0),
+                                            S_CNTR_CODE = trayCode.S_CNTR_CODE,
+                                            N_START_LAYER = 1,
+                                            N_END_LAYER = 1,
+                                            N_CNTR_COUNT = 1
+                                        });
+                                    }
+                                    else continue;
+                                }
+                            }
+                        }
+                        var tray = ContainerHelper.GetLocCntr(palletLoc.S_CODE);
+                        outbound.trayCode = tray.S_CNTR_CODE;
+                        tasks.Add(CreateEmptyPalletTask(palletLoc, outbound));
+                        foundPallets++;
+
+                        if (foundPallets >= outbound.requiredCount) break;
+                    }
+                }
+                return tasks;
+            }
+
+            // 鍏抽敭杈呭姪鏂规硶
+
+            private List<Location> FindDoubleDeepEmptyPallets() =>
+                _allLocations.Where(loc =>
+                    loc.N_LOCK_STATE == 0 &&
+                    loc.N_CURRENT_NUM == loc.N_CAPACITY &&
+                    ContainerHelper.GetLocItemRel(loc.S_CODE)
+                ).OrderBy(loc => loc.N_ROW)   // 鎸夋帓鎺掑簭
+                 .ThenBy(loc => loc.N_COL)
+                 .ToList();
+
+            private WCSTask CreateEmptyPalletTask(Location loc, Outbound outbound) =>
+                new WCSTask
+                {
+                    S_CODE = GenerateTaskNo(),
+                    S_START_AREA = loc.S_AREA_CODE,
+                    S_END_AREA = outbound.endArea,
+                    S_START_LOC = loc.S_CODE,
+                    S_END_LOC = outbound.endBit,
+                    S_TYPE = outbound.taskType,
+                    S_OP_CODE = outbound.opCode,
+                    N_PRIORITY = 0,
+                    N_SCHEDULE_TYPE = 1,
+                    N_B_STATE = 0,
+                    S_B_STATE = WCSTask.GetStateStr(0),
+                    S_CNTR_CODE = outbound.trayCode,
+                    N_START_LAYER = 1,
+                    N_END_LAYER = 1,
+                    N_CNTR_COUNT = 1
+                };
+
+            // 澶嶇敤鍘熸湁鍙屾繁浣嶆柟娉�+            private bool IsDoubleDeepRow(int row) => row == 1 || row == 4;
+
+            private Location FindTargetLocation(string code) =>
+                _allLocations.FirstOrDefault(loc =>
+                    loc.S_CODE == code && loc.N_LOCK_STATE == 0);
+
+            //鏌ヨ娣变綅澶栦晶鐨勮揣浣�+            private Location FindOuterLocation(Location deepLoc) =>
+                _allLocations.FirstOrDefault(loc =>
+                    loc.N_ROW != deepLoc.N_ROW &&
+                    loc.N_ROADWAY == deepLoc.N_ROADWAY &&
+                    loc.N_COL == deepLoc.N_COL &&
+                    loc.N_LAYER == deepLoc.N_LAYER &&
+                    loc.N_LOCK_STATE == 0 || loc.N_LOCK_STATE == 5
+            );
+            private Location FindBestRelocationTarget(Location outerLoc)
+            {
+                return _allLocations
+                      .Where(loc =>
+                          loc.N_ROADWAY == outerLoc.N_ROADWAY &&
+                          loc.N_LOCK_STATE == 0 &&
+                          loc.N_CURRENT_NUM == 0 &&
+                          loc.S_CODE != outerLoc.S_CODE)
+                      .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0)
+                      .ThenBy(loc => loc.N_COL)
+                      .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER))
+                      .FirstOrDefault();
+            }
+            private void MarkReservedLocations(List<Outbound> outbound)
+            {
+                //鏌ヨ宸茬粡琚攣浣忕殑璐т綅
+                var lockLoc = _allLocations
+                    .Where(loc => loc.N_LOCK_STATE != 0)
+                    .ToList();
+                //鎶婇攣浣忕殑璐т綅鏍囪涓哄崰鐢�+                foreach (var item in lockLoc)
+                {
+                    if (IsDoubleDeepRow(item.N_ROW))
+                    {
+                        _allLocations
+                                .Where(x => x.S_CODE == item.S_CODE)
+                                .ToList()
+                                .ForEach(x => x.N_LOCK_STATE = 3);
+                    }
+                }
+                foreach (var item in outbound)
+                {
+                    var loc = FindTargetLocation(item.locCode);
+                    if (loc != null && IsDoubleDeepRow(loc.N_ROW))
+                    {
+                        // 鏍囪璇ユ繁浣嶅搴旂殑澶栦晶璐т綅锛堝鏋滃瓨鍦級
+                        var outerLoc = FindOuterLocation(loc);
+                        if (outerLoc != null)
+                        {
+                            // 鏍囪娣变綅鐨勫渚ц揣浣嶏紙閬垮厤琚Щ搴撳崰鐢級
+                            _allLocations
+                                .Where(x => x.S_CODE == outerLoc.S_CODE)
+                                .ToList()
+                                .ForEach(x => x.N_LOCK_STATE = 5);
+                            //鏍囪娣变綅鐨勫渚ц揣浣嶄负5
+                        }
+                    }
+                }
+
+            }
+        }
         #endregion
 
         #region 鏉哀鍗囬檷閲忚〃甯姪鏂规硶

--
Gitblit v1.9.1