From beca28ecb3a730ffb33c21e0c55c729774725faf Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期五, 25 四月 2025 16:51:28 +0800 Subject: [PATCH] 优化备料单发料逻辑 --- Tiger.Business.WMS/Common/WmsTask.cs | 137 ++++++++++++++++++--------------------------- 1 files changed, 54 insertions(+), 83 deletions(-) diff --git a/Tiger.Business.WMS/Common/WmsTask.cs b/Tiger.Business.WMS/Common/WmsTask.cs index ea0da0c..518fb91 100644 --- a/Tiger.Business.WMS/Common/WmsTask.cs +++ b/Tiger.Business.WMS/Common/WmsTask.cs @@ -1,4 +1,5 @@ -锘縰sing Rhea.Common; +锘縰sing Microsoft.Extensions.Options; +using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; @@ -323,28 +324,25 @@ /// </summary> /// <param name="order">棰嗘枡鍗曞彿</param> /// <param name="itemCode">鐗╂枡缂栫爜</param> - /// <param name="erpWH">鐗╂枡鐨凟RP搴撲綅</param> - /// <param name="whID">鐗╂枡鎵�鍦ㄧ殑浠撳簱缂栫爜</param> - /// <param name="regionID">鐗╂枡鎵�鍦ㄧ殑鍌ㄥ尯缂栫爜</param> - /// <param name="shelfID">鐗╂枡鎵�鍦ㄧ殑璐ф灦缂栫爜</param> - /// <param name="option">鎺堟潈鏌ヨ閫夐」</param> + /// <param name="option">澶囨枡鐗╂枡鎺ㄨ崘閫夐」</param> + /// <param name="auth">鎺堟潈鏌ヨ閫夐」</param> /// <param name="returnCount">杩斿洖鐨勬渶灏忓寘瑁呯墿鏂欎釜鏁帮紝榛樿杩斿洖1涓�</param> /// <returns></returns> - public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, int returnCount = 1) + public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, int returnCount = 1) { var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") }; try { - var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos( + var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos( JoinType.Left, q.SN == p.SN, JoinType.Left, q.WH_ID == w.ID, JoinType.Left, q.REGION_ID == r.ID, JoinType.Left, q.SHELF_ID == s.ID, JoinType.Left, q.LOCATION_ID == l.ID)) //妫�鏌ョ敤鎴锋潈闄� - .ByAuth(option) - //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡 - .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order)) + .ByAuth(auth) + //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓悓涓�涓崟鎹殑鐗╂枡 + .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N") //鍙厑璁告湭閿佸畾鐨� .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N") //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨� @@ -352,30 +350,32 @@ //濡傛灉鏈変紶鍏ユ枡鍙凤紝鍒欏彧鍏佽鏂欏彿鐨勭墿鏂� .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode) //濡傛灉鏈変紶鍏ュ簱浣嶏紝鍒欏彧鍏佽搴撲綅涓殑鐗╂枡 - .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg) //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂� - .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg) //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂� - .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg) //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂� - .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg) //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂� .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID)) //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡) - .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T")) - //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛屾渶鍚庢寜鏉$爜鎺掑簭 - .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN) - .Select((q, p, w, r, s, l) => new SuggestItem - { - Item = q, - poolItem = null, - Warehouse = w, - Region = r, - Shelf = s, - Location = l, - }) - //妫�鏌ョ敤鎴锋潈闄� - .Take(returnCount).ToList(); + //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T")) + //澶囨枡绛栫暐锛氭寜鐢熶骇鏃ユ湡鍏堣繘鍏堝嚭 + .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE) + //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛� + .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY) + //鏈�鍚庢寜鏉$爜鎺掑簭 + .OrderBy(q => q.SN); + var items = query.Select((q, p, w, r, s, l) => new SuggestItem + { + Item = q, + poolItem = null, + Warehouse = w, + Region = r, + Shelf = s, + Location = l, + }).Take(returnCount).ToList(); //foreach (var item in items) //{ // var inv = Get(item.SN, option, false); @@ -410,34 +410,25 @@ /// </summary> /// <param name="order">棰嗘枡鍗曞彿</param> /// <param name="itemCode">鐗╂枡缂栫爜</param> - /// <param name="erpWH">鐗╂枡鐨凟RP搴撲綅</param> - /// <param name="whID">鐗╂枡鎵�鍦ㄧ殑浠撳簱缂栫爜</param> - /// <param name="regionID">鐗╂枡鎵�鍦ㄧ殑鍌ㄥ尯缂栫爜</param> - /// <param name="shelfID">鐗╂枡鎵�鍦ㄧ殑璐ф灦缂栫爜</param> - /// <param name="option">鎺堟潈鏌ヨ閫夐」</param> + /// <param name="option">澶囨枡鐗╂枡鎺ㄨ崘閫夐」</param> + /// <param name="auth">鎺堟潈鏌ヨ閫夐」</param> /// <param name="reqQty">闇�姹傛暟閲忥紝浼氳繑鍥炴弧瓒抽渶姹傜殑鐗╂枡涓暟</param> /// <returns></returns> - public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, double reqQty) + public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, double reqQty) { var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") }; try { - var takeCount = 0; - var checkSum = 0.0; - var checkCount = 0; - do - { - takeCount += 50; - var check = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos( + var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos( JoinType.Left, q.SN == p.SN, JoinType.Left, q.WH_ID == w.ID, JoinType.Left, q.REGION_ID == r.ID, JoinType.Left, q.SHELF_ID == s.ID, JoinType.Left, q.LOCATION_ID == l.ID)) //妫�鏌ョ敤鎴锋潈闄� - .ByAuth(option) + .ByAuth(auth) //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡 - .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order)) + .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N") //鍙厑璁告湭閿佸畾鐨� .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N") //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨� @@ -445,20 +436,30 @@ //濡傛灉鏈変紶鍏ユ枡鍙凤紝鍒欏彧鍏佽鏂欏彿鐨勭墿鏂� .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode) //濡傛灉鏈変紶鍏ュ簱浣嶏紝鍒欏彧鍏佽搴撲綅涓殑鐗╂枡 - .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg) //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂� - .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg) //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂� - .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg) //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂� - .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg) + .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg) //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂� .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID)) //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡) - .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T")) - //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛屾渶鍚庢寜鏉$爜鎺掑簭 - .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN) - .Select((q, p, w, r, s, l) => new + //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T")) + //澶囨枡绛栫暐锛氭寜鐢熶骇鏃ユ湡鍏堣繘鍏堝嚭 + .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE) + //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛� + .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY) + //鏈�鍚庢寜鏉$爜鎺掑簭 + .OrderBy(q => q.SN); + var takeCount = 0; + var checkSum = 0.0; + var checkCount = 0; + do + { + takeCount += 50; + var check = query.Select((q, p, w, r, s, l) => new { ItemCode = q.ITEM_CODE, Sn = q.SN, @@ -484,37 +485,7 @@ } } while (checkSum < reqQty && checkCount >= takeCount); - var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos( - JoinType.Left, q.SN == p.SN, - JoinType.Left, q.WH_ID == w.ID, - JoinType.Left, q.REGION_ID == r.ID, - JoinType.Left, q.SHELF_ID == s.ID, - JoinType.Left, q.LOCATION_ID == l.ID)) - //妫�鏌ョ敤鎴锋潈闄� - .ByAuth(option) - //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡 - .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order)) - //鍙厑璁告湭閿佸畾鐨� - .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N") - //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨� - .Where((q, p, w, r, s, l) => q.STATUS == WMS_ITEM.STATUSs.InStore.GetValue()) - //濡傛灉鏈変紶鍏ユ枡鍙凤紝鍒欏彧鍏佽鏂欏彿鐨勭墿鏂� - .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode) - //濡傛灉鏈変紶鍏ュ簱浣嶏紝鍒欏彧鍏佽搴撲綅涓殑鐗╂枡 - .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg) - //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂� - .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg) - //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂� - .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg) - //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂� - .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg) - //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂� - .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID)) - //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡) - .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T")) - //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛屾渶鍚庢寜鏉$爜鎺掑簭 - .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN) - .Select((q, p, w, r, s, l) => new SuggestItem + var items = query.Select((q, p, w, r, s, l) => new SuggestItem { Item = q, poolItem = null, -- Gitblit v1.9.3