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