From 5695f1eb41693f799de0c76efd22909df34ff6d0 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期五, 27 十二月 2024 21:27:30 +0800
Subject: [PATCH] 优化标准上下架逻辑

---
 Tiger.Api/Language.db                         |    0 
 Tiger.Business.WMS/Transaction/In_Default.cs  |    9 +
 Tiger.Business.WMS/WMS_ITEM_Biz.cs            |   63 +++++++++++++++
 Tiger.Business.WMS/Transaction/Out_Default.cs |  105 ++++++++++++++++++-------
 Tiger.Business.WMS/Common/Inventory.cs        |    5 +
 Tiger.Model.Net/Entitys/WMS/WMS_ITEM_PKG.cs   |   14 +++
 6 files changed, 164 insertions(+), 32 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 88b1413..6d79cc3 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Business.WMS/Common/Inventory.cs b/Tiger.Business.WMS/Common/Inventory.cs
index 2045de7..7884155 100644
--- a/Tiger.Business.WMS/Common/Inventory.cs
+++ b/Tiger.Business.WMS/Common/Inventory.cs
@@ -34,5 +34,10 @@
         public WMS_ITEM_PKG CurPkg => Packages.FirstOrDefault(q => q.SN == SN);
         public bool isExists => CurPkg != null;
         public bool isMinPackage => Items.Count == 1 && Items.Single().SN == SN;
+
+        public void UpdatePkgQty()
+        {
+            this.Packages = WMS_ITEM_PKG.UpdateQty(this.Packages);
+        }
     }
 }
diff --git a/Tiger.Business.WMS/Transaction/In_Default.cs b/Tiger.Business.WMS/Transaction/In_Default.cs
index 76b9532..677912c 100644
--- a/Tiger.Business.WMS/Transaction/In_Default.cs
+++ b/Tiger.Business.WMS/Transaction/In_Default.cs
@@ -90,7 +90,8 @@
             {
                 if (CurInvItem.IsNullOrEmpty())
                 {
-	                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
+                    //瑙f瀽鏉$爜
+                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
 	                if (!result.IsSuccessed)
 	                {
 	                    action.IsSuccessed = false;
@@ -224,7 +225,11 @@
 	                    {
 	                        var item = CurInvItem.Items.First(q => q.SN == qty.SN);
 	                        item.QTY = qty.QTY;
-	                    }
+                            var pkg = CurInvItem.Packages.First(q => q.SN == qty.SN);
+                            pkg.QTY = qty.QTY;
+                        }
+                        CurInvItem.UpdatePkgQty();
+
                         Command = "Normal";
                     }
                 }
diff --git a/Tiger.Business.WMS/Transaction/Out_Default.cs b/Tiger.Business.WMS/Transaction/Out_Default.cs
index a12de29..bd176e8 100644
--- a/Tiger.Business.WMS/Transaction/Out_Default.cs
+++ b/Tiger.Business.WMS/Transaction/Out_Default.cs
@@ -10,6 +10,7 @@
 using Tiger.Model;
 using Tiger.IBusiness;
 using Org.BouncyCastle.Ocsp;
+using Tiger.Model.MES.Yada;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -77,39 +78,83 @@
             var action = new ApiAction<ScanOutput>(new ScanOutput() { Command = Command });
             try
             {
-                //瑙f瀽鏉$爜
-                Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
-                if (!result.IsSuccessed)
+                if (CurInvItem.IsNullOrEmpty())
                 {
-                    action.IsSuccessed = false;
-                    action.LocaleMsg = result.LocaleMsg;
-                    return action;
-                }
-                CurInvItem = result.Data as Inventory;
+                    //瑙f瀽鏉$爜
+                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
+                    if (!result.IsSuccessed)
+                    {
+                        action.IsSuccessed = false;
+                        action.LocaleMsg = result.LocaleMsg;
+                        return action;
+                    }
+                    var inv = result.Data as Inventory;
 
-                //楠岃瘉鏉$爜鏄惁姝g‘
-                if (!CurInvItem.isNormalStatus || CurInvItem.Status != WMS_ITEM.STATUSs.InStore)
-                {
-                    action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L($"鐘舵�乕{0}]寮傚父锛岃閲嶆柊鎵弿");
-                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', CurInvItem.StatusList.Select(x => x.GetDesc())));
-                    return action;
+                    //楠岃瘉鏉$爜鏄惁姝g‘
+                    if (!inv.isNormalStatus || inv.Status != WMS_ITEM.STATUSs.InStore)
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L($"鐘舵�乕{0}]寮傚父锛岃閲嶆柊鎵弿");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', inv.StatusList.Select(x => x.GetDesc())));
+                        return action;
+                    }
+                    //鍌ㄤ綅楠岃瘉
+                    if (inv.Location.IsNullOrEmpty())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L($"鏉$爜[{0}]搴撳瓨淇℃伅寮傚父: 娌℃湁鍌ㄤ綅淇℃伅锛岃鍏堜笂鏋跺悗鍐嶆壂鎻�(鍌ㄤ綅Id: {1})");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationIsNull", inv.CurPkg.SN, inv.CurPkg.LOCATION_ID);
+                        return action;
+                    }
+                    //鐗╂枡楠岃瘉
+                    if (inv.ItemInfo.IsNullOrEmpty() || inv.ItemInfo.IS_ACTIVE == "N")
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L($"鐗╂枡缂栫爜[{0}]涓嶅瓨鍦ㄦ垨鑰呰鐗╂枡鏈惎鐢�");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemCodeNotExistsOrNotActive", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
+                        return action;
+                    }
+                    CurInvItem = inv;
+
+                    //鎶婄墿鏂欐暟閲忚繑鍥炲墠绔‘璁よ涓嬫灦鐨勬暟閲�
+                    if (CurInvItem.Items.Any(q => q.QTY > 1))
+                    {
+                        action.Data.Data = CurInvItem.Items.Select(q => new { q.SN, q.QTY });
+                        action.Data.Command = Command = "ComfirmQty";
+                        //action.LocaleMsg = Biz.L("璇风‘璁ゆ潯鐮乕{0}]瑕佷笅鏋剁殑鏁伴噺");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ComfirmOutQty", input.SN);
+                        return action;
+                    }
                 }
-                //鍌ㄤ綅楠岃瘉
-                if (CurInvItem.Location.IsNullOrEmpty())
+
+                Dictionary<string, decimal> downDic = null;
+                //鏇存柊涓嬫灦鍚庣殑鐗╂枡鏁伴噺
+                if (Command == "ComfirmQty")
                 {
-                    action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L($"鏉$爜[{0}]搴撳瓨淇℃伅寮傚父: 娌℃湁鍌ㄤ綅淇℃伅锛岃鍏堜笂鏋跺悗鍐嶆壂鎻�(鍌ㄤ綅Id: {1})");
-                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationIsNull", CurInvItem.CurPkg.SN, CurInvItem.CurPkg.LOCATION_ID);
-                    return action;
-                }
-                //鐗╂枡楠岃瘉
-                if (CurInvItem.ItemInfo.IsNullOrEmpty() || CurInvItem.ItemInfo.IS_ACTIVE == "N")
-                {
-                    action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L($"鐗╂枡缂栫爜[{0}]涓嶅瓨鍦ㄦ垨鑰呰鐗╂枡鏈惎鐢�");
-                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemCodeNotExistsOrNotActive", CurInvItem.ItemInfo.ITEM_CODE.IsNullOrEmpty(CurInvItem.Barcode.ItemCode));
-                    return action;
+                    var qtyList = (input.Data ?? "").JsonToObject<List<WMS_ITEM>>() ?? new List<WMS_ITEM>();
+                    if (!qtyList.Any() || qtyList.Sum(q => q.QTY) <= 0)
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.Data = CurInvItem.Items.Select(q => new { q.SN, q.QTY });
+                        action.Data.Command = Command = "ComfirmQty";
+                        //action.LocaleMsg = Biz.L("涓嬫灦鏁伴噺涓嶈兘灏忎簬绛変簬闆讹紝璇烽噸鏂扮‘璁ゆ潯鐮乕{0}]鐨勪笅鏋舵暟閲�");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ReComfirmOutQty", input.SN);
+                        return action;
+                    }
+                    else if (qtyList.Any(q => q.QTY > CurInvItem.Items.First(i => i.SN == q.SN).QTY))
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.Data = CurInvItem.Items.Select(q => new { q.SN, q.QTY });
+                        action.Data.Command = Command = "ComfirmQty";
+                        //action.LocaleMsg = Biz.L("涓嬫灦鏁伴噺涓嶈兘瓒呰繃鍘熸潯鐮佹暟閲忥紝璇烽噸鏂扮‘璁ゆ潯鐮乕{0}]鐨勪笅鏋舵暟閲�");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ReComfirmExceedOutQty", input.SN);
+                        return action;
+                    }
+                    else
+                    {
+                        downDic = qtyList.ToDictionary(k => k.SN, v => v.QTY);
+                        Command = "Normal";
+                    }
                 }
 
                 //鍑哄簱涓嬫灦
@@ -118,7 +163,7 @@
                     item.TRANS_CODE = "Out_Default";
                     item.TRANS_NO = $"Out_Default_{DateTime.Now:yyyyMMdd}";
                 }
-                Result<TakeDownInfo> downResult = WMS_ITEM_Biz.WmsItem.TakeDown(CurInvItem, input.AuthOption, WMS_ITEM.STATUSs.Sended);
+                Result<TakeDownInfo> downResult = WMS_ITEM_Biz.WmsItem.TakeDown(CurInvItem, downDic, input.AuthOption, WMS_ITEM.STATUSs.OffShelf);
                 if (!downResult.IsSuccessed)
                 {
                     action.IsSuccessed = false;
diff --git a/Tiger.Business.WMS/WMS_ITEM_Biz.cs b/Tiger.Business.WMS/WMS_ITEM_Biz.cs
index 3f5ae9e..db4265f 100644
--- a/Tiger.Business.WMS/WMS_ITEM_Biz.cs
+++ b/Tiger.Business.WMS/WMS_ITEM_Biz.cs
@@ -321,6 +321,7 @@
             /// <returns></returns>
             public Result<TakeDownInfo> TakeDown(IInventory inventory, AuthOption option, WMS_ITEM.STATUSs status, bool clearLocation = true)
             {
+                return TakeDown(inventory, inventory.Items.ToDictionary(k => k.SN, v => v.QTY), option, status, clearLocation);
                 var result = new Result<TakeDownInfo>(Result.Flags.Success, new TakeDownInfo());
                 try
                 {
@@ -358,6 +359,68 @@
             }
 
             /// <summary>
+            /// 涓嬫灦
+            /// </summary>
+            /// <param name="inventory">瑕佷笅鏋剁殑搴撳瓨瀵硅薄</param>
+            /// <param name="qtyList">瑕佷笅鏋剁殑鏈�灏忓寘瑁呮暟閲忓瓧鍏革紝key锛歴n锛寁alue锛歲ty</param>
+            /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
+            /// <param name="status">涓嬫灦鍚庣姸鎬�</param>
+            /// <param name="clearLocation">鏄惁娓呯悊鍌ㄥ尯璐ф灦鍌ㄤ綅淇℃伅</param>
+            /// <returns></returns>
+            public Result<TakeDownInfo> TakeDown(IInventory inventory, Dictionary<string, decimal> qtyList, AuthOption option, WMS_ITEM.STATUSs status, bool clearLocation = true)
+            {
+                var result = new Result<TakeDownInfo>(Result.Flags.Success, new TakeDownInfo());
+                try
+                {
+                    //濡傛灉瑕佷笅鏋剁殑鏁伴噺瀛楀吀涓虹┖鍒欒涓烘槸鍏ㄩ儴涓嬫灦
+                    qtyList = qtyList.IsNullOrEmpty(inventory.Items.ToDictionary(k => k.SN, v => v.QTY));
+
+                    foreach (var item in inventory.Items)
+                    {
+                        if (qtyList.ContainsKey(item.SN) && qtyList[item.SN] > 0)
+                        {
+                            var downQty = qtyList[item.SN];
+                            if (item.QTY > downQty)
+                            {
+                                item.QTY -= downQty;
+                                var pkg = inventory.Packages.First(q => q.SN == item.SN);
+                                pkg.QTY = item.QTY;
+                            }
+                            else
+                            {
+                                item.STATUS = status.GetValue();
+                                var pkg = inventory.Packages.First(q => q.SN == item.SN);
+                                pkg.PARENT_SN = null;
+                                pkg.Parent = null;
+                                if (clearLocation)
+                                {
+                                    //item.WH_ID = null;
+                                    item.REGION_ID = null;
+                                    item.SHELF_ID = null;
+                                    item.LOCATION_ID = null;
+                                    //pkg.WH_ID = null;
+                                    pkg.REGION_ID = null;
+                                    pkg.SHELF_ID = null;
+                                    pkg.LOCATION_ID = null;
+                                }
+                            }
+                            inventory.History.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{inventory.SN}]浠庡偍浣峓{inventory?.Location?.LOCATION_CODE}]涓嬫灦鏁伴噺[{downQty}]鎴愬姛锛岀姸鎬乕{item.STATUS.GetEnumDesc<WMS_ITEM.STATUSs>()}]锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+                        }
+                    }
+                    inventory.Packages = WMS_ITEM_PKG.UpdateQty(inventory.Packages);
+
+                    result.Data.Items = inventory.Items;
+                    result.Data.History = inventory.History;
+                    result.Data.Packages = inventory.Packages;
+                }
+                catch (Exception ex)
+                {
+                    result.CatchExceptionWithLog(ex, Biz.L("WMS.WmsItem.TakeDown.Exception", inventory.SN, inventory?.Location?.LOCATION_CODE));
+                }
+                return result;
+            }
+
+            /// <summary>
             /// 涓嬫灦鐗╂枡鎺ㄨ崘锛岃繑鍥炲浐瀹氫釜鏁扮殑鏈�灏忓寘瑁呯墿鏂欏簱瀛樺垪琛�
             /// </summary>
             /// <param name="order">棰嗘枡鍗曞彿</param>
diff --git a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_PKG.cs b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_PKG.cs
index 1d60d32..c68a20b 100644
--- a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_PKG.cs
+++ b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_PKG.cs
@@ -205,7 +205,21 @@
         #endregion
 
         #region 鍏叡鏂规硶
+        public static List<WMS_ITEM_PKG> UpdateQty(List<WMS_ITEM_PKG> list)
+        {
+            var minPkgs = list.Where(q => !list.Any(p => p.PARENT_SN == q.SN));
+            var parent = list.Where(q => minPkgs.Any(p => p.PARENT_SN == q.SN));
+            while (parent.Any())
+            {
+                foreach (var item in parent)
+                {
+                    item.QTY = list.Where(q => q.PARENT_SN == item.SN).Sum(q => q.QTY);
+                }
+                parent = list.Where(q => parent.Any(p => p.PARENT_SN == q.SN));
+            }
 
+            return list;
+        }
         #endregion
 
     }//endClass

--
Gitblit v1.9.3