From 9e5eb7707c9a42e2515a583b40078d2d7685e2d0 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期三, 19 三月 2025 00:51:42 +0800
Subject: [PATCH] 优化清点上架支持扫箱条码

---
 Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs |  154 ++++++++++++++++++++++----------------
 Tiger.Business.WMS/Transaction/Yada/Count_BIZ_U9_ASN.cs   |   52 ++++++++----
 Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs  |   14 ++-
 Tiger.Business.WMS/Common/Barcode/Barcode.cs              |   20 ++--
 4 files changed, 141 insertions(+), 99 deletions(-)

diff --git a/Tiger.Business.WMS/Common/Barcode/Barcode.cs b/Tiger.Business.WMS/Common/Barcode/Barcode.cs
index 31c4935..1c07325 100644
--- a/Tiger.Business.WMS/Common/Barcode/Barcode.cs
+++ b/Tiger.Business.WMS/Common/Barcode/Barcode.cs
@@ -21,6 +21,16 @@
         }
 
         /// <summary>
+        /// 璁剧疆鏉$爜鍒嗘瀽楠岃瘉瑙勫垯
+        /// </summary>
+        public void SetAnalysisRule()
+        {
+            Analyses.Clear();
+            Analyses.Add(new YadaBarcode());
+            //Analyses.Add(new BarcodeAnalysis());
+        }
+
+        /// <summary>
         /// 鏉$爜锛堣В鏋愬悗鐨勬潯鐮侊級
         /// </summary>
         private List<BarcodeAnalysis> Analyses { get; set; } = new();
@@ -237,16 +247,6 @@
             SubsidiaryMaterial,
             [Description("鍘熸潗鏂�")]
             RawMaterial,
-        }
-
-        /// <summary>
-        /// 璁剧疆鏉$爜鍒嗘瀽楠岃瘉瑙勫垯
-        /// </summary>
-        public void SetAnalysisRule()
-        {
-            Analyses.Clear();
-            Analyses.Add(new YadaBarcode());
-            //Analyses.Add(new BarcodeAnalysis());
         }
 
         /// <summary>
diff --git a/Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs b/Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs
index 37979fa..d15c8d2 100644
--- a/Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs
+++ b/Tiger.Business.WMS/Common/Barcode/BarcodeAnalysis.Yada.cs
@@ -30,74 +30,96 @@
             if (!string.IsNullOrEmpty(Barcode.MetaSn))
             {
                 string[] parts = (Barcode.MetaSn ?? "").Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
-                //鏀惰揣鏉$爜锛歒DASN241200964/10/12010102.0011.00/ASN241200964/1
-                //鏉傛敹鏉$爜锛歒DZS241200607/10/10150102.2226.00/ASN24120012750/0001
-                //瑙勫垯锛氬崟鍙�/琛屽彿/鏂欏彿/鎵瑰彿/娴佹按鍙�
-                if (parts.Length == 5)// && (Barcode.MetaSn.StartsWith("ASN") || Barcode.MetaSn.StartsWith("YDZS") || Barcode.MetaSn.StartsWith("YDASN")))
+                //绠辨潯鐮�
+                if (Barcode.MetaSn.StartsWith("Carton/"))
                 {
-                    Barcode.OrderNo = parts[0];
-                    Barcode.OrderLine = parts[1];
-                    Barcode.ItemCode = parts[2];
-                    Barcode.LotNo = parts[3];
-                    Barcode.SerialNoStr = parts[4];
-                    Barcode.Type = Types.MiniPackage;
-                    Barcode.ItemType = ItemTypes.RawMaterial;
-
-                    result.Flag = Result.Flags.Success;
-                }
-                //璋冨叆鏉$爜锛�101/YDDR241200924/10/13060306.0008.00/ASN24090127310/0001
-                //褰㈡�佽浆鎹㈡潯鐮侊細101/YDZH231000028/10/32020101.0005.00/23001034/0001
-                //瑙勫垯锛氱粍缁�/鍗曞彿/琛屽彿/鏂欏彿/鎵瑰彿/娴佹按鍙�
-                if (parts.Length == 6)// && (Barcode.MetaSn.StartsWith("YDDR") || Barcode.MetaSn.StartsWith("YDZH")))
+                    //鏀惰揣绠辨潯鐮侊細Carton/YDASN241000433/10/17010505.0064.00/ASN241000433/13957
+                    //瑙勫垯锛欳arton/鍗曞彿/琛屽彿/鏂欏彿/鎵瑰彿/娴佹按鍙�
+                    if (parts.Length == 6)
+                    {
+                        Barcode.OrderNo = parts[1];
+                        Barcode.OrderLine = parts[2];
+                        Barcode.ItemCode = parts[3];
+                        Barcode.LotNo = parts[4];
+                        Barcode.SerialNoStr = parts[5];
+                        Barcode.Type = Types.OuterPackage;
+                        Barcode.ItemType = ItemTypes.RawMaterial;
+    
+                        result.Flag = Result.Flags.Success;
+                    }
+                } 
+                //鍏朵粬鏉$爜
+                else
                 {
-                    Barcode.Organization = parts[0];
-                    Barcode.OrderNo = parts[1];
-                    Barcode.OrderLine = parts[2];
-                    Barcode.ItemCode = parts[3];
-                    Barcode.LotNo = parts[4];
-                    Barcode.SerialNoStr = parts[5];
-                    Barcode.Type = Types.MiniPackage;
-                    Barcode.ItemType = ItemTypes.RawMaterial;
-
-                    result.Flag = Result.Flags.Success;
-                }
-                //鏀惰揣鍗曪細YDRC240801351/10/10030202.0013.02/7/
-                //瑙勫垯锛氬崟鍙�/琛屽彿/鏂欏彿/娴佹按鍙�/
-                if (parts.Length == 4 && parts[2].Contains("."))
-                {
-                    Barcode.OrderNo = parts[0];
-                    Barcode.OrderLine = parts[1];
-                    Barcode.ItemCode = parts[2];
-                    Barcode.SerialNoStr = parts[3];
-                    Barcode.Type = Types.MiniPackage;
-                    Barcode.ItemType = ItemTypes.RawMaterial;
-
-                    result.Flag = Result.Flags.Success;
-                }
-                //鏈熷垵搴撳瓨鏉$爜琛ユ墦锛�10150102.0655.00/108444-1-230/168A05/10101/
-                //瑙勫垯锛氭枡鍙�/鎵瑰彿/搴撲綅/瀛樺偍鍦扮偣/
-                if (parts.Length == 4 && parts[0].Contains("."))
-                {
-                    Barcode.ItemCode = parts[0];
-                    Barcode.LotNo = parts[1];
-                    Barcode.Location = parts[2];
-                    Barcode.Warehouse = parts[3];
-                    Barcode.Type = Types.MiniPackage;
-                    Barcode.ItemType = ItemTypes.RawMaterial;
-
-                    result.Flag = Result.Flags.Success;
-                }
-                //鏈熷垵鏉$爜锛�10150102.0655.00/108444-1-230207/000001
-                //瑙勫垯锛氭枡鍙�/鎵瑰彿/娴佹按鍙�
-                if (parts.Length == 3)
-                {
-                    Barcode.ItemCode = parts[0];
-                    Barcode.LotNo = parts[1];
-                    Barcode.SerialNoStr = parts[2];
-                    Barcode.Type = Types.MiniPackage;
-                    Barcode.ItemType = ItemTypes.RawMaterial;
-
-                    result.Flag = Result.Flags.Success;
+	                //鏀惰揣鏉$爜锛歒DASN241200964/10/12010102.0011.00/ASN241200964/1
+	                //鏉傛敹鏉$爜锛歒DZS241200607/10/10150102.2226.00/ASN24120012750/0001
+	                //瑙勫垯锛氬崟鍙�/琛屽彿/鏂欏彿/鎵瑰彿/娴佹按鍙�
+	                if (parts.Length == 5)// && (Barcode.MetaSn.StartsWith("ASN") || Barcode.MetaSn.StartsWith("YDZS") || Barcode.MetaSn.StartsWith("YDASN")))
+	                {
+	                    Barcode.OrderNo = parts[0];
+	                    Barcode.OrderLine = parts[1];
+	                    Barcode.ItemCode = parts[2];
+	                    Barcode.LotNo = parts[3];
+	                    Barcode.SerialNoStr = parts[4];
+	                    Barcode.Type = Types.MiniPackage;
+	                    Barcode.ItemType = ItemTypes.RawMaterial;
+	
+	                    result.Flag = Result.Flags.Success;
+	                }
+	                //璋冨叆鏉$爜锛�101/YDDR241200924/10/13060306.0008.00/ASN24090127310/0001
+	                //褰㈡�佽浆鎹㈡潯鐮侊細101/YDZH231000028/10/32020101.0005.00/23001034/0001
+	                //瑙勫垯锛氱粍缁�/鍗曞彿/琛屽彿/鏂欏彿/鎵瑰彿/娴佹按鍙�
+	                if (parts.Length == 6)// && (Barcode.MetaSn.StartsWith("YDDR") || Barcode.MetaSn.StartsWith("YDZH")))
+	                {
+	                    Barcode.Organization = parts[0];
+	                    Barcode.OrderNo = parts[1];
+	                    Barcode.OrderLine = parts[2];
+	                    Barcode.ItemCode = parts[3];
+	                    Barcode.LotNo = parts[4];
+	                    Barcode.SerialNoStr = parts[5];
+	                    Barcode.Type = Types.MiniPackage;
+	                    Barcode.ItemType = ItemTypes.RawMaterial;
+	
+	                    result.Flag = Result.Flags.Success;
+	                }
+	                //鏀惰揣鍗曪細YDRC240801351/10/10030202.0013.02/7/
+	                //瑙勫垯锛氬崟鍙�/琛屽彿/鏂欏彿/娴佹按鍙�/
+	                if (parts.Length == 4 && parts[2].Contains("."))
+	                {
+	                    Barcode.OrderNo = parts[0];
+	                    Barcode.OrderLine = parts[1];
+	                    Barcode.ItemCode = parts[2];
+	                    Barcode.SerialNoStr = parts[3];
+	                    Barcode.Type = Types.MiniPackage;
+	                    Barcode.ItemType = ItemTypes.RawMaterial;
+	
+	                    result.Flag = Result.Flags.Success;
+	                }
+	                //鏈熷垵搴撳瓨鏉$爜琛ユ墦锛�10150102.0655.00/108444-1-230/168A05/10101/
+	                //瑙勫垯锛氭枡鍙�/鎵瑰彿/搴撲綅/瀛樺偍鍦扮偣/
+	                if (parts.Length == 4 && parts[0].Contains("."))
+	                {
+	                    Barcode.ItemCode = parts[0];
+	                    Barcode.LotNo = parts[1];
+	                    Barcode.Location = parts[2];
+	                    Barcode.Warehouse = parts[3];
+	                    Barcode.Type = Types.MiniPackage;
+	                    Barcode.ItemType = ItemTypes.RawMaterial;
+	
+	                    result.Flag = Result.Flags.Success;
+	                }
+	                //鏈熷垵鏉$爜锛�10150102.0655.00/108444-1-230207/000001
+	                //瑙勫垯锛氭枡鍙�/鎵瑰彿/娴佹按鍙�
+	                if (parts.Length == 3)
+	                {
+	                    Barcode.ItemCode = parts[0];
+	                    Barcode.LotNo = parts[1];
+	                    Barcode.SerialNoStr = parts[2];
+	                    Barcode.Type = Types.MiniPackage;
+	                    Barcode.ItemType = ItemTypes.RawMaterial;
+	
+	                    result.Flag = Result.Flags.Success;
+	                }
                 }
             }
 
diff --git a/Tiger.Business.WMS/Transaction/Yada/Count_BIZ_U9_ASN.cs b/Tiger.Business.WMS/Transaction/Yada/Count_BIZ_U9_ASN.cs
index f41ef28..bf58099 100644
--- a/Tiger.Business.WMS/Transaction/Yada/Count_BIZ_U9_ASN.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/Count_BIZ_U9_ASN.cs
@@ -33,7 +33,7 @@
         #region Propertys & Variables
         //private List<WmsOrder<BIZ_U9_ASN>> _OrderList { get; set; } = new();
         private List<string> OrderList = new();
-        private BIZ_U9_ASN_SN CurSn = new();
+        private List<BIZ_U9_ASN_SN> CurSn = new();
 		private List<BIZ_U9_ASN_SN> ScanList = new();
 		#endregion
 
@@ -100,8 +100,20 @@
                         action.LocaleMsg = Biz.L("WMS.WmsItem.Barcode.IllegalFailure", input.SN);
                         return action;
                     }
-                    CurSn = MainDB.Queryable<BIZ_U9_ASN_SN>().Where(q => q.SN == barcode.SN).First();
 
+                    if (barcode.Type == Barcode.Types.OuterPackage)
+                    {
+                        CurSn = MainDB.Queryable<BIZ_U9_ASN_SN>().Where(q => q.CARTON_NO == barcode.SN).ToList();
+                    }
+                    else
+                    {
+                        CurSn = MainDB.Queryable<BIZ_U9_ASN_SN>().Where(q => q.SN == barcode.SN).ToList();
+                        foreach (var sn in CurSn)
+                        {
+                            sn.META_SN = input.SN;
+                        }
+                    }
+                    
                     if (CurSn.IsNullOrEmpty())
 	                {
                         action.IsSuccessed = false;
@@ -109,22 +121,22 @@
                         action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.SnNotExists", input.SN);
                         return action;
                     }
-                    if (CurSn.AUTH_ORG != input.AuthOption.CurOrg)
+                    if (CurSn.First().AUTH_ORG != input.AuthOption.CurOrg)
                     {
                         action.IsSuccessed = false;
                         //action.LocaleMsg = Biz.L($"鏉$爜鎵�灞炵粍缁嘯{0}]涓庡綋鍓嶇櫥褰曠粍缁嘯{1}]涓嶄竴鑷达紝璇烽噸鏂伴�夋嫨缁勭粐");
-                        action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.OrgNotCorrect", CurSn.AUTH_ORG, input.AuthOption.CurOrg);
+                        action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.OrgNotCorrect", CurSn.First().AUTH_ORG, input.AuthOption.CurOrg);
                         return action;
                     }
                     //楠岃瘉鏉$爜鏄惁姝g‘
-                    if (CurSn.STATUS > WMS_ITEM.STATUSs.Incoming.GetValue())
+                    if (CurSn.First().STATUS > WMS_ITEM.STATUSs.Incoming.GetValue())
                     {
                         action.IsSuccessed = false;
                         //action.LocaleMsg = Biz.L("鐘舵�乕{0}]寮傚父锛岃閲嶆柊鎵弿");
-                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", CurSn.STATUS.GetEnumDesc<WMS_ITEM.STATUSs>());
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", CurSn.First().STATUS.GetEnumDesc<WMS_ITEM.STATUSs>());
                         return action;
                     }
-                    CurSn.META_SN = input.SN;
+                    
 
                     Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(barcode.SN, input.AuthOption, true);
                     if (!result.IsSuccessed)
@@ -258,20 +270,24 @@
                 }
 
                 //鎵ц娓呯偣鏁版嵁澶勭悊
-                CurSn.STATUS = WMS_ITEM.STATUSs.Counted.GetValue();
-                CurSn.QTY = CurInvItem.Items.Sum(q => q.QTY);
-                CurSn.RECEIVER = UserCode;
-                CurSn.RECEIVE_DATE = DateTime.Now;
+                foreach (var sn in CurSn)
+                {
+                    sn.STATUS = WMS_ITEM.STATUSs.Counted.GetValue();
+                    sn.QTY = CurInvItem.Items.Where(q => q.SN == sn.SN).Sum(q => q.QTY);
+                    sn.RECEIVER = UserCode;
+                    sn.RECEIVE_DATE = DateTime.Now;
+                }
                 foreach (var item in CurInvItem.Items)
 				{
-					item.AUTH_ORG = CurSn.AUTH_ORG;
+                    var sn = CurSn.First(q => q.SN == item.SN);
+                    item.AUTH_ORG = sn.AUTH_ORG;
 					item.STATUS = WMS_ITEM.STATUSs.Counted.GetValue();
 					item.SOURCE_CODE = item.TRANS_CODE;
 					item.SOURCE_ORDER = item.TRANS_NO;
 					item.SOURCE_LINE = item.TRANS_LINE;
 					item.TRANS_CODE = nameof(BIZ_U9_ASN);
-					item.TRANS_NO = CurSn.ORDER_NO;
-					item.TRANS_LINE = CurSn.LINE_NO;
+					item.TRANS_NO = sn.ORDER_NO;
+					item.TRANS_LINE = sn.LINE_NO;
 					CurInvItem.History.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{CurInvItem.SN}]娓呯偣瀹屾垚锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
 				}
 
@@ -295,7 +311,7 @@
 					db.Storageable(_Packages, UserCode).ToStorage().AsInsertable.ExecuteCommand();
                     db.Insertable(_History, UserCode).ExecuteCommand();
 					var e = db.Storageable(_ItemsExt, UserCode).ToStorage().AsInsertable.ExecuteCommand();//涓嶅瓨鍦ㄦ彃鍏�
-					db.Updateable<BIZ_U9_ASN>(UserCode).SetColumns(q => q.STATUS == BIZ_U9_ASN.STATUSs.Counting.GetValue()).Where(q => q.ORDER_NO == _CurSn.ORDER_NO).ExecuteCommand();
+					db.Updateable<BIZ_U9_ASN>(UserCode).SetColumns(q => q.STATUS == BIZ_U9_ASN.STATUSs.Counting.GetValue()).Where(q => q.ORDER_NO == _CurSn.First().ORDER_NO).ExecuteCommand();
 					db.Storageable(_CurSn, UserCode).ExecuteCommand();
                 });
 
@@ -322,11 +338,11 @@
             //淇濆瓨鏁版嵁搴�
             SaveCommitListToDB();
 
-			if (!OrderList.Contains(CurSn.ORDER_NO))
+			if (!OrderList.Contains(CurSn.First().ORDER_NO))
 			{
-				OrderList.Add(CurSn.ORDER_NO);
+				OrderList.Add(CurSn.First().ORDER_NO);
 			}
-			ScanList.Add(CurSn);
+			ScanList.AddRange(CurSn);
 
 			// 杩斿洖鏁版嵁
 			action.Data.Data = ScanList;
diff --git a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
index 135ed8c..b2f19b1 100644
--- a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
@@ -123,12 +123,12 @@
                     action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RECEIPT.ScanItem.ReceiptDtlStatusException", receiptDtl.LINE_NO, receiptDtl.STATUS.GetEnumDesc<BIZ_U9_RECEIPT.STATUSs>());
                     return action;
                 }
-                var receiptSn = receipt.SnList.First(q => q.SN == CurInvItem.SN);
-                if (receiptSn.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue())
+                var receiptSn = receipt.SnList.Where(q => CurInvItem.Items.Any(i => i.SN == q.SN)).ToList();
+                if (receiptSn.Any(q => q.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue()))
                 {
                     action.IsSuccessed = false;
                     //action.LocaleMsg = Biz.L("鏀惰揣鍗曚腑鏉$爜[{0}]鐘舵�乕{1}]寮傚父锛岃鎵弿姝g‘鐨勬潯鐮�");
-                    action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RECEIPT.ScanItem.ReceiptSnStatusException", receiptSn.SN, receiptSn.STATUS.GetEnumDesc<WMS_ITEM.STATUSs>());
+                    action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RECEIPT.ScanItem.ReceiptSnStatusException", CurInvItem.SN, receiptSn.First(q => q.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue()).STATUS.GetEnumDesc<WMS_ITEM.STATUSs>());
                     return action;
                 }
 
@@ -189,6 +189,7 @@
                 //鎵ц涓婃灦鏁版嵁澶勭悊
                 foreach (var item in CurInvItem.Items)
                 {
+                    item.IS_LOCKED = "Y";
                     item.SOURCE_CODE = item.TRANS_CODE;
                     item.SOURCE_ORDER = item.TRANS_NO;
                     item.SOURCE_LINE = item.TRANS_LINE;
@@ -206,8 +207,11 @@
                 }
 
                 //鏇存柊鍗曟嵁淇℃伅
-                receiptSn.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
-                receiptSn.IS_IN = "Y";
+                foreach(var sn in receiptSn)
+                {
+                    sn.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
+                    sn.IS_IN = "Y";
+                }
                 //濡傛灉褰撳墠琛屼笂鏋跺畬鎴愭爣璁颁负寰呭鏍�
                 receiptDtl.QTY_IN = receipt.SnList.Where(q => q.LINE_NO == receiptDtl.LINE_NO).Sum(q => q.QTY);
                 if (receiptDtl.QTY_IN == receiptDtl.QTY)

--
Gitblit v1.9.3