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 +++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 211 insertions(+), 102 deletions(-)

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