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/wms/WMSHelper.cs |  478 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 330 insertions(+), 148 deletions(-)

diff --git a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
index e083743..d86ece3 100644
--- a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
+++ b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
@@ -11,6 +11,7 @@
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.IdentityModel.Protocols.WSTrust;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
@@ -41,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)
@@ -272,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();
@@ -292,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)
         {
@@ -371,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>
@@ -635,7 +566,15 @@
             }
             catch (Exception ex)
             {
-                LogHelper.Error("鍒涘缓鍏ュ簱鍗曞け璐�, ex, "鏉哀");
+                var sugarEx = ex as SqlSugar.SqlSugarException;
+                if (sugarEx != null)
+                {
+                    LogHelper.Error($"鍒涘缓鍏ュ簱鍗昐QL閿欒: {sugarEx.Sql}", sugarEx, "鏉哀");
+                }
+                else
+                {
+                    LogHelper.Error($"鍒涘缓鍏ュ簱鍗曞け璐�{ex.Message}", ex, "鏉哀");
+                }
                 return false;
             }
 
@@ -664,7 +603,7 @@
             }
             catch (Exception ex)
             {
-                LogHelper.Error("鍒涘缓鍑哄簱鍗曞け璐�, ex, "鏉哀");
+                LogHelper.Error($"鍒涘缓鍑哄簱鍗曞け璐�{ex.Message}", ex, "鏉哀");
                 return false;
             }
 
@@ -730,6 +669,28 @@
         }
 
         /// <summary>
+        /// 鏍规嵁鎵樼洏鏌ヨ璐т綅鏄庣粏
+        /// </summary>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <returns></returns>
+        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
+            && p.S_LOCK_STATE.Trim() == "鏃�
+            && p.S_AREA_CODE == "JXHCQ").First();
+            if (locList == null)
+            {
+                return null;
+            }
+            return locCntr;
+
+        }
+
+        /// <summary>
         /// 浠诲姟鐘舵�杞崲
         /// </summary>
         /// <param name="state">鐘舵�鍙�/param>
@@ -755,28 +716,48 @@
         /// </summary>
         /// <param name="state">閰嶇洏鍗曠姸鎬�/param>
         /// <returns></returns>
-        internal static List<DistributionCntr> GetPickingListByState(string state)
+        internal static List<DistributionCntr> GetPickingListByState(int state)
         {
             var db = new SqlHelper<object>().GetInstance();
-            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.S_B_STATE.Trim() == state).ToList();
+            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == state).ToList();
             return distributionCntr;
+        }
+
+
+        /// <summary>
+        /// 閰嶇洏鍗曠姸鎬佽浆鎹�+        /// </summary>
+        /// <param name="state">鐘舵�鍙�/param>
+        /// <returns></returns>
+        internal static string GetDistributionStateStr(int state)
+        {
+            var status = "";
+            switch (state)
+            {
+                case 1: status = "宸查厤璐�; break;
+                case 2: status = "鍑哄簱涓�; break;
+                case 3: status = "宸插嚭搴�; break;
+                case 4: status = "鍒嗘嫞瀹屾垚 "; break;
+
+            }
+            return status;
         }
 
         /// <summary>
         /// 淇敼閰嶇洏鍗曠姸鎬�         /// </summary>
+        /// <param name="taskState">浣滀笟鐘舵�</param>
         /// <param name="state">鐘舵�</param>
         /// <param name="trayCode">鎵樼洏鍙�/param>
         /// <returns></returns>
-        internal static bool UpdateDistributionCntrState(string 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.S_B_STATE.Trim() == "閰嶈揣瀹屾垚" && 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.S_B_STATE = state;
-                distributionCntr.N_B_STATE = 2;
+                distributionCntr.N_B_STATE = state;
+                distributionCntr.S_B_STATE = GetDistributionStateStr(state);
                 return db.Updateable<DistributionCntr>(distributionCntr).UpdateColumns(it => new { it.S_B_STATE, it.N_B_STATE }).ExecuteCommand() > 0;
             }
             return false;
@@ -866,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>
@@ -888,7 +877,7 @@
             {
                 var db = new SqlHelper<object>().GetInstance();
                 var locations = db.Queryable<Location>().Where(a => a.S_AREA_CODE == inbound.areaCode).ToList();
-                if(!string.IsNullOrEmpty(inbound.roadWay.ToString()))
+                if (inbound.roadWay != 0)
                 {
                     locations.RemoveAll(s => s.N_ROADWAY != inbound.roadWay);
                 }
@@ -1010,7 +999,7 @@
                 return null; // 鏃犲彲鐢ㄤ綅缃�             }
             private readonly ConcurrentDictionary<string, SemaphoreSlim> _locationLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
-            
+
             public async Task<LocationParams> StoreItemAsync()
             {
                 LocationParams location = null;
@@ -1048,7 +1037,7 @@
         }
 
         /// <summary>
-        /// 绔嬪簱鍑哄簱灏佽绠楁硶
+        /// 閰嶇洏鍑哄簱灏佽绠楁硶
         /// </summary>
         public class DoubleDeepOutboundScheduler
         {
@@ -1066,7 +1055,7 @@
 
             // 鐢熸垚鍑哄簱浠诲姟闃熷垪锛堝惈绉诲簱浠诲姟锛�             /// <summary>
-            /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴撱�绌烘墭鍑哄簱锛�+            /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴擄級
             /// </summary>
             /// <param name="outbound">鍑哄簱鍙傛暟</param>
             /// <returns></returns>
@@ -1075,16 +1064,17 @@
                 // 闃舵1: 鏍囪鏈潵闇�淇濈暀鐨勮揣浣�                 MarkReservedLocations(outbound);
                 var tasks = new List<WCSTask>();
+                var outboundLocCodes = outbound.Select(o => o.locCode).ToHashSet();
                 foreach (var outboundItem in outbound)
                 {
                     // 1. 鏌ユ壘鐩爣璐т綅
                     var targetLoc = FindTargetLocation(outboundItem.locCode);
                     if (targetLoc == null) continue;
                     var wmsTask = WMSHelper.GetWmsTaskList("鎵ц", outboundItem.trayCode);
-                    if (wmsTask == null)
+                    if (wmsTask != null)
                     {
-                        LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀");
-                        outboundItem.opCode = "";
+                        //LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀");
+                        outboundItem.opCode = wmsTask.S_CODE;
                     }
 
                     // 2. 澶勭悊鍙屾繁浣嶉�杈戯紙绗�鎺掓垨绗�鎺掞級
@@ -1098,45 +1088,52 @@
                             //濡傛灉璐т綅宸叉弧锛屽垯鐢熸垚绉诲簱浠诲姟
                             if (outerLoc.N_CURRENT_NUM == outerLoc.N_CAPACITY)
                             {
-                                // 浼樺厛绉诲埌娣变綅锛屽叾娆″渚�-                                var bestTarget = FindBestRelocationTarget(outerLoc);
-                                if (bestTarget != null)
+                                if (outboundLocCodes.Contains(outerLoc.S_CODE))
                                 {
-                                    //璁$畻鍒颁簡澶栦晶鎶婂渚х殑璐т綅閿佸畾
-                                    _allLocations
-                                .Where(x => x.S_CODE == outerLoc.S_CODE)
-                                .ToList()
-                                .ForEach(x => x.N_LOCK_STATE = 3);
-                                    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 = wmsTask.S_CODE,
-                                        N_PRIORITY = 1,
-                                        N_SCHEDULE_TYPE = 1,
-                                        N_B_STATE = 0,
-                                        S_B_STATE = WCSTask.GetStateStr(0),
-                                        S_CNTR_CODE = outboundItem.trayCode,
-                                        N_START_LAYER = 1,
-                                        N_END_LAYER = 1,
-                                        N_CNTR_COUNT = 1
-                                    });
+                                    // 鏂规1锛氬悎骞朵换鍔★紙鐩存帴鍑哄簱澶栦晶璐т綅锛�+                                    tasks.Add(CreateOutboundTask(outerLoc,
+                                        outbound.First(o => o.locCode == outerLoc.S_CODE),"1"));
                                 }
-                                else continue;
+                                else
+                                {
+                                    // 浼樺厛绉诲埌娣变綅锛屽叾娆″渚�+                                    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 = outboundItem.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;
+                                }
 
-                            }
-                            else
-                            {
-                                //璐т綅涓虹┖鐩存帴鐢熸垚鍑哄簱浠诲姟
-                                tasks.Add(CreateOutboundTask(targetLoc,outboundItem));
                             }
                         }
-                        else continue;
-
+                        else
+                        {
+                            continue;
+                        }
                         // 2.2 鐢熸垚鍑哄簱浠诲姟锛堟繁浣嶏級
                         tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
                     }
@@ -1145,6 +1142,7 @@
                         // 3. 闈炲弻娣变綅鐩存帴鍑哄簱
                         tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
                     }
+                    break;
                 }
                 // 4. 浠诲姟鎺掑簭锛氱Щ搴撲换鍔′紭鍏�+ 楂樹紭鍏堢骇浼樺厛
                 return tasks;
@@ -1164,24 +1162,24 @@
                     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 == 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();
+                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,string priority = "") =>
                 new WCSTask
                 {
                     S_CODE = GenerateTaskNo(),
@@ -1191,7 +1189,7 @@
                     S_END_LOC = outbound.endBit,
                     S_TYPE = outbound.taskType,
                     S_OP_CODE = outbound.opCode,
-                    N_PRIORITY = 1,
+                    N_PRIORITY = string.IsNullOrEmpty(priority) ? 0 : int.Parse(priority),
                     N_SCHEDULE_TYPE = 1,
                     N_B_STATE = 0,
                     S_B_STATE = WCSTask.GetStateStr(0),
@@ -1232,7 +1230,187 @@
                             _allLocations
                                 .Where(x => x.S_CODE == outerLoc.S_CODE)
                                 .ToList()
+                                .ForEach(x => x.N_LOCK_STATE = 5);
+                            //鏍囪娣变綅鐨勫渚ц揣浣嶄负5
+                        }
+                    }
+                }
+
+            }
+        }
+
+        /// <summary>
+        /// 绌烘墭鍑哄簱灏佽绠楁硶
+        /// </summary>
+        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
                         }
                     }
                 }
@@ -1263,7 +1441,7 @@
         /// 鏍规嵁浠诲姟鍗囬噺
         /// </summary>
         /// <param name="task"></param>
-        internal static void AddChange(WCSTask task)
+        internal static bool AddChange(WCSTask task)
         {
             var db = new SqlHelper<object>().GetInstance();
             var result = true;
@@ -1349,34 +1527,36 @@
             catch (Exception ex)
             {
                 LogHelper.Error($"浠撳簱鍗囬噺寮傚父 寮傚父淇℃伅={ex.Message}", ex);
+                result = false;
             }
+            return result;
         }
 
         /// <summary>
         /// 鏍规嵁浠诲姟闄嶉噺
         /// </summary>
         /// <param name="task"></param>
-        internal static void DeleteChange(WCSTask task)
+        internal static bool DeleteChange(WCSTask wmstask)
         {
             var db = new SqlHelper<object>().GetInstance();
             var result = true;
             try
             {
-                var wmstask = db.Queryable<WMSTask>().Where(a => a.S_CODE == task.S_OP_CODE).First();
+                //var wmstask = db.Queryable<WCSTask>().Where(a => a == task.S_OP_CODE).First();
                 if (wmstask != null)
                 {
-                    var itemlist = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ToList();
+                    var itemlist = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == wmstask.S_CNTR_CODE).ToList();
                     if (itemlist.Count > 0)
                     {
                         var url = Settings.MoboxSeverUrl + "inventory/AddChange";
-                        //浠撳簱閲忚〃鍗囬噺
-                        var req = new AddChangeModel { op_type = 4 };
-                        //搴撳尯閲忚〃鍗囬噺
-                        var req2 = new AddChangeModel { op_type = 7 };
+                        //浠撳簱閲忚〃闄嶉噺
+                        var req = new AddChangeModel { op_type = 8 };
+                        //搴撳尯閲忚〃闄嶉噺
+                        var req2 = new AddChangeModel { op_type = 9 };
                         itemlist.ForEach(a =>
                         {
                             LogHelper.Info($"濉厖鏁版嵁");
-                            LogHelper.Info($"鍑忎粨搴撻噺琛ㄦ暟鎹�浠撳簱{task.S_END_WH} 鐗╂枡缂栫爜{a.S_ITEM_CODE} 鐗╂枡鍚嶇О{a.S_ITEM_NAME} 鏁伴噺{a.F_QTY}");
+                            LogHelper.Info($"鍑忎粨搴撻噺琛ㄦ暟鎹�浠撳簱{wmstask.S_START_WH} 鐗╂枡缂栫爜{a.S_ITEM_CODE} 鐗╂枡鍚嶇О{a.S_ITEM_NAME} 鏁伴噺{a.F_QTY}");
                             req.item_info.Add(new AddChangeModel.itemModel
                             {
                                 wh_code = wmstask.S_START_WH,
@@ -1384,7 +1564,7 @@
                                 item_name = a.S_ITEM_NAME,
                                 qty = a.F_QTY
                             });
-                            LogHelper.Info($"鍑忓簱鍖洪噺琛ㄦ暟鎹�搴撳尯{task.S_END_AREA} 鐗╂枡缂栫爜{a.S_ITEM_CODE} 鐗╂枡鍚嶇О{a.S_ITEM_NAME} 鏁伴噺{a.F_QTY}");
+                            LogHelper.Info($"鍑忓簱鍖洪噺琛ㄦ暟鎹�搴撳尯{wmstask.S_START_AREA} 鐗╂枡缂栫爜{a.S_ITEM_CODE} 鐗╂枡鍚嶇О{a.S_ITEM_NAME} 鏁伴噺{a.F_QTY}");
                             req2.item_info.Add(new AddChangeModel.itemModel
                             {
                                 wh_code = wmstask.S_START_WH,
@@ -1440,15 +1620,17 @@
                         }
 
                     }
-                    else LogHelper.Info($"鎵樼洏{task.S_CNTR_CODE} 鍦ㄥ鍣ㄨ揣鍝佹槑缁嗕腑鎵句笉鍒版暟鎹�);
+                    else LogHelper.Info($"鎵樼洏{wmstask.S_CNTR_CODE} 鍦ㄥ鍣ㄨ揣鍝佹槑缁嗕腑鎵句笉鍒版暟鎹�);
                 }
-                else LogHelper.Info($"鏈壘鍒颁换鍔task.S_CODE} 瀵瑰簲鐨勪綔涓�);
+                else LogHelper.Info($"鏈壘鍒颁换鍔wmstask.S_CODE} 瀵瑰簲鐨勪换鍔�);
 
             }
             catch (Exception ex)
             {
                 LogHelper.Error($"浠撳簱闄嶉噺寮傚父 寮傚父淇℃伅={ex.Message}", ex);
+                result = false;
             }
+            return result;
         }
 
 

--
Gitblit v1.9.1