From b7308bba3d7ffad271ce7fc7a93c8c45d76be87d Mon Sep 17 00:00:00 2001
From: 杨前锦 <1010338399@qq.com>
Date: 星期五, 13 六月 2025 17:21:03 +0800
Subject: [PATCH] 优化印尼佳通-硫化胚胎出入库逻辑策略优化

---
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/TEST.cs |  237 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 237 insertions(+), 0 deletions(-)

diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/TEST.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/TEST.cs
new file mode 100644
index 0000000..5c25b26
--- /dev/null
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/TEST.cs
@@ -0,0 +1,237 @@
+锘縰sing HH.WCS.Mobox3.FJJT.util;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+
+namespace HH.WCS.Mobox3.FJJT.wms
+{
+    /// <summary>
+    /// 瀵嗛泦鍨嬪簱鍖�+    /// </summary>
+    internal class TEST
+    {
+        static TEST() {
+            //InitRowLockTable(new List<string> { "PGKQ", "PGKTK" });
+        }
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧叆搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location GetTN_Location4In(string area, string itemCode, string itemBatch, int standardCarryQty = 1) {
+            Location result = null;
+
+            try {
+                //1.0 鑾峰彇姣忎竴鎺掓渶澶х殑鍒�+                //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+                var listMaxCol = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+
+                //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRels).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                if (list.Count > 0) {
+                    for (int i = list.Count - 1; i >= 0; i--) {
+                        //鎺掗櫎宸茬粡閿佸畾鐨勮揣浣�鍜�鏀炬弧浜嗕笖鏄渶澶у垪鐨勮揣浣�+                        //鍏跺畠椤圭洰杩橀渶瑕佹煡璇㈡帓閿�+                        if (list[i].N_LOCK_STATE== 0 || (list[i].N_CURRENT_NUM == list[i].N_CAPACITY && listMaxCol.Count(a => a.S_CODE == list[i].S_CODE) > 0)) {
+                            list.Remove(list[i]);
+                        }
+                    }
+                    if (list.Count > 0) {
+                        //1.21 鍔犺浇璐т綅鐨勫鍣ㄤ俊鎭�(mapper涔嬪墠鍙兘鏄煡璇㈠師濮嬫暟鎹紝濡傛灉鏈夊叾浠栨煡璇�mapper澶辨晥)
+                        #region MyRegion
+                        /*
+                        Console.WriteLine("鍔犺浇璐т綅鐨勫鍣ㄤ俊鎭�);
+                        db.ThenMapper(list, loc => {
+                            loc.LocCntrRel = db.Queryable<LocCntrRel>().SetContext(x => x.S_LOC_CODE, () => loc.S_LOC_CODE, loc).FirstOrDefault();
+                        });
+
+                        //1.22 鍔犺浇瀹瑰櫒鐨勭墿鏂欎俊鎭�+                        Console.WriteLine("鍔犺浇瀹瑰櫒鐨勭墿鏂欎俊鎭�);
+                        db.ThenMapper(list.Select(loc => loc.LocCntrRel), lcr => {
+                            lcr.CntrItemRel = db.Queryable<CntrItemRel>().SetContext(x => x.S_CNTR_CODE, () => lcr.S_CNTR_CODE, lcr).FirstOrDefault();
+                        });
+                      */
+                        #endregion
+                        //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                        for (int i = 0; i < list.Count; i++) {
+
+                            //todo 杩橀渶瑕佸垽鏂攣
+
+                            #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                            if (list[i].LocCntrRel != null) {
+                                //LogHelper.Info("itemCode=" + itemCode);
+                                if ((itemCode != null && list[i].LocCntrRel.CntrItemRels != null && list[i].LocCntrRel.CntrItemRels[0].S_ITEM_CODE.Trim() == itemCode && list[i].LocCntrRel.CntrItemRels[0].S_BATCH_NO.Trim() == itemBatch.Trim()) || (itemCode == null && list[i].LocCntrRel.CntrItemRels == null)) {
+                                    if (list[i].N_CURRENT_NUM < list[i].N_CAPACITY) {
+                                        //1.31 濡傛灉鎼繍鏁伴噺=1
+                                        //1.32 鎼繍澶氫釜瀹瑰櫒锛屼緥濡�+3妯″紡 锛屽繀椤诲綋鍓嶆暟閲�0鎴�;濡傛灉鏄�+3+锛屽繀椤诲綋鍓嶆暟閲�0鎴�鎴�
+                                        if (list[i].N_CURRENT_NUM % standardCarryQty == 0) {
+                                            result = list[i];
+                                        }
+                                        else {
+                                            //1.33 涓嶆弧瓒冲垯閫夋嫨鍚庝竴鍒楋紝鍚庝竴鍒楄偗瀹氭槸绌鸿揣浣�+                                            result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL).OrderBy(a => a.N_COL).First();
+                                        }
+
+                                    }
+                                    else {
+                                        //褰撳墠璐т綅婊′簡锛屾瘮浠朿ol澶т竴浣嶇殑璐т綅锛屽悗涓�垪鑲畾鏄┖璐т綅
+                                        result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL).OrderBy(a => a.N_COL).First();
+                                    }
+
+                                    if (result != null) {
+                                        break;
+                                    }
+                                }
+                            }
+                            else {
+                                LogHelper.Info("璐т綅瀹瑰櫒鐗╂枡淇℃伅涓虹┖");
+                            }
+
+
+                            #endregion
+
+                        }
+                    }
+                }
+                if (result == null) {
+                    //todo 杩橀渶瑕佸垽鏂攣
+                    #region 鏌ユ壘鎵�湁鏁伴噺鏄┖鐨勬帓
+                    //2.0 绠�寲鏌ヨ鍙煡姣忎竴鎺掔涓�垪
+                    list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
+                    //2.1 閫変竴涓┖鎺�+                    for (int i = 0; i < list.Count; i++) {
+                        if (list[i].N_LOCK_STATE== 0) {
+                            //浜屾鏍¢獙褰撳墠鎺掓墍鏈夎揣浣嶉兘鏄┖鐨勶紝闃叉绯荤粺鏁版嵁閿欎贡
+                            var rowSumInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                            if (rowSumInfo.sum == 0) {
+                                result = list[i];
+                                break;
+                            }
+                        }
+
+                    }
+                    #endregion
+                }
+            }
+            catch (Exception ex) {
+
+                Console.WriteLine("GetTN_Location4In:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetTN_Location4In:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧嚭搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        /// <returns></returns>
+        public static Location GetTN_Location4Out(string area, string itemCode, string itemBatch, int standardCarryQty = 1) {
+            Console.WriteLine($"area={area}");
+            Location result = null;
+            var db = new SqlHelper<Location>().GetInstance();
+
+            //1.0 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�var list = db.Queryable<TN_Location>().Where(a => a.N_CURRENT_NUM>0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRels).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+            //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+            if (list.Count > 0) {
+                //LogHelper.Info("GetTN_Location4Out:" + JsonConvert.SerializeObject(list));
+                #region MyRegion
+                /*
+                      //1.21 鍔犺浇璐т綅鐨勫鍣ㄤ俊鎭�+                      db.ThenMapper(list, loc => {
+                          loc.LocCntrRel = db.Queryable<LocCntrRel>().SetContext(x => x.S_LOC_CODE, () => loc.S_LOC_CODE, loc).FirstOrDefault();
+                      });
+                      //1.22 鍔犺浇瀹瑰櫒鐨勭墿鏂欎俊鎭�+                      db.ThenMapper(list.Select(loc => loc.LocCntrRel), lcr => {
+                          lcr.CntrItemRel = db.Queryable<CntrItemRel>().SetContext(x => x.S_CNTR_CODE, () => lcr.S_CNTR_CODE, lcr).FirstOrDefault();
+                      });
+                      */
+                #endregion
+                //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                for (int i = 0; i < list.Count; i++) {
+
+                    //todo 杩橀渶瑕佸垽鏂攣
+
+                    #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                    if (list[i].N_LOCK_STATE== 0 && list[i].LocCntrRel != null) {
+                        if ((itemCode != null && list[i].LocCntrRel.CntrItemRels != null && list[i].LocCntrRel.CntrItemRels[0].S_ITEM_CODE.Trim() == itemCode && (itemBatch == null || list[i].LocCntrRel.CntrItemRels[0].S_BATCH_NO.Trim() == itemBatch.Trim())) || (itemCode == null && list[i].LocCntrRel.CntrItemRels == null)) {
+                            //鎼繍閫夋嫨璐т綅
+                            //濡傛灉褰撳墠鍑哄簱浣嶅悗闈㈡湁绌轰綅锛屼笉鑳芥槸鍏ュ簱涓�+                            var after = new SqlHelper<Location>().Get(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL == list[i].N_COL + 1);
+                            if (after == null || after.N_LOCK_STATE== 0) {
+                                result = list[i];
+                            }
+                            if (result != null) {
+                                break;
+                            }
+                        }
+                    }
+
+
+                    #endregion
+
+                }
+            }
+
+            return result;
+        }
+
+      
+        private static List<int> GetRowsByArea(string area) {
+            var list = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_AREA_CODE == area).Distinct().Select(a => a.N_ROW).ToList();
+            return list;
+        }
+        internal static void Test() {
+            //UnLockLoc("PGKQ-02-02");
+            //LockLoc("PGKQ-02-02", "鍏ュ簱閿�);
+            //Binding("PGKQ-02-03", "AAA", "", 3);
+            //UnBinding("PGKQ-02-03", 2);
+
+            //var full = GetTN_Location4In("PGKQ", "AAA");
+            //var empty = GetTN_Location4In("PGKQ", null);
+            //var fullOut = GetTN_Location4Out("PGKQ", "AAA");
+            //var emptyOut = GetTN_Location4Out("PGKQ", null);
+            //var TN_Locations = new SqlHelper<TN_Location>().GetList();
+            //var LocCntrRels = new SqlHelper<LocCntrRel>().GetList();
+            //var CntrItemRels = new SqlHelper<CntrItemRel>().GetList();
+
+            //var list = new SqlHelper<TN_Location>().GetInstance().Queryable<TN_Location>().LeftJoin<LocCntrRel>((l, lc) => l.S_LOC_CODE == lc.S_LOC_CODE).ToList();
+            //var results = context.Client.Queryable<Employee>().Mapper(t=>t.Person, p=>p.PersonId).ToList();
+            var db = new SqlHelper<object>().GetInstance();
+
+            //var list = db.Queryable<TN_Location>().Mapper(l => l.LocCntrRel, lcr => lcr.S_LOC_CODE).Where(a=>a.S_LOC_CODE== "PGKQ-01-01").ToList();
+
+            //澶氱骇鏌ヨ浼氬祵濂�闇�鎸囧畾瀵艰埅灞炴�鍜屼富閿紝寰幆宓屽鏌ヨ涓嶅缓璁�+            //[Navigate(NavigateType.OneToOne, nameof(S_LOC_CODE))]銆�[Navigate(NavigateType.OneToOne, nameof(S_CNTR_CODE))]銆乕SugarColumn(IsPrimaryKey = true)]
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel, a => a.CntrItemRels).ToList();
+
+
+
+            #region MyRegion
+            /*
+            // SetContext涓嶄細鐢熸垚寰幆鎿嶄綔锛岄珮鎬ц兘  鍜岀洿鎺here鎬ц兘鏄笉涓�牱鐨�+            var list = db.Queryable<TN_Location>().Where(a => a.N_CURRENT_NUM > 0).ToList();
+            //绗竴灞�+            db.ThenMapper(list, loc => {
+                loc.LocCntrRel = db.Queryable<LocCntrRel>().SetContext(x => x.S_LOC_CODE, () => loc.S_LOC_CODE, loc).FirstOrDefault();
+            });
+            //绗簩灞�+            db.ThenMapper(list.Select(loc => loc.LocCntrRel), lcr => {
+                lcr.CntrItemRel = db.Queryable<CntrItemRel>().SetContext(x => x.S_CNTR_CODE, () => lcr.S_CNTR_CODE, lcr).FirstOrDefault();
+            }); 
+            */
+            #endregion
+        }
+
+    }
+}

--
Gitblit v1.9.1