From c049523656adcbab2d16df48faa94c672063c0dc Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期日, 30 三月 2025 18:44:59 +0800
Subject: [PATCH] 备料任务初版

---
 Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs |  135 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 96 insertions(+), 39 deletions(-)

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 e16ca89..e27b735 100644
--- a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
@@ -11,7 +11,8 @@
 using Tiger.IBusiness;
 using Tiger.Model.Sharetronic.Shelf;
 using Tiger.Business.WMS.Sharetronic.Shelf;
-using static IronPython.Modules._ast;
+using Tiger.Model.Entitys.MES.U9C;
+using Tiger.Model.MES.Yada;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -22,7 +23,7 @@
     {
         public IIn_BIZ_U9_RECEIPT Init(string id, string userCode, string apiHost, string orgCode)
         {
-            base.Init(id, apiHost, userCode, orgCode);
+            base.Init(id, userCode, apiHost, orgCode);
             Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
             return this;
         }
@@ -81,13 +82,13 @@
                 {
                     //瑙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;
+                    if (!result.IsSuccessed)
+                    {
+                        action.IsSuccessed = false;
+                        action.LocaleMsg = result.LocaleMsg;
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+                    var inv = result.Data as Inventory;
 
                     //楠岃瘉鏉$爜鏄惁姝g‘
                     if (!inv.isNormalStatus || inv.Status != WMS_ITEM.STATUSs.WaitIn)
@@ -95,7 +96,7 @@
                         action.IsSuccessed = false;
                         //action.LocaleMsg = Biz.L("鐘舵�乕{0}]寮傚父锛岃閲嶆柊鎵弿");
                         action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', inv.StatusList.Select(q => q.GetDesc())));
-                        return action;
+                        return SetOutPutMqttMsg(action, input.Locale);
                     }
                     //鐗╂枡楠岃瘉
                     if (inv.ItemInfo.IsNullOrEmpty() || inv.ItemInfo.IS_ACTIVE == "N")
@@ -103,18 +104,18 @@
                         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;
+                        return SetOutPutMqttMsg(action, input.Locale);
                     }
                     CurInvItem = inv;
                 }
 
-                var receipt = await Biz.Db.Queryable<BIZ_U9_RECEIPT>().Where(q => q.ORDER_NO == CurInvItem.Items.First().TRANS_NO).IncludesAllFirstLayer().FirstAsync();
+                var receipt = await MainDB.Queryable<BIZ_U9_RECEIPT>().Where(q => q.ORDER_NO == CurInvItem.Items.First().TRANS_NO).IncludesAllFirstLayer().FirstAsync();
                 if (receipt.IsNullOrEmpty())
                 {
                     action.IsSuccessed = false;
                     //action.LocaleMsg = Biz.L("鏀惰揣鍗曚腑鎵句笉鍒版潯鐮佹墍灞炵殑鍗曟嵁[{0}]淇℃伅锛岃閲嶆柊鎵弿鏀惰揣鍗曠殑鏉$爜鎴栭�夋嫨姝g‘鐨勫姛鑳戒笂鏋�");
                     action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RECEIPT.ScanItem.ReceiptNotExists", CurInvItem.Items.First().TRANS_NO);
-                    return action;
+                    return SetOutPutMqttMsg(action, input.Locale);
                 }
                 var receiptDtl = receipt.Details.First(q => q.LINE_NO == CurInvItem.Items.First().TRANS_LINE);
                 if (receiptDtl.STATUS > BIZ_U9_RECEIPT.STATUSs.Storing.GetValue())
@@ -122,15 +123,23 @@
                     action.IsSuccessed = false;
                     //action.LocaleMsg = Biz.L("鏀惰揣鍗曚腑琛孾{0}]鐘舵�乕{1}]寮傚父锛岃鎵弿姝g‘鐨勬潯鐮�");
                     action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RECEIPT.ScanItem.ReceiptDtlStatusException", receiptDtl.LINE_NO, receiptDtl.STATUS.GetEnumDesc<BIZ_U9_RECEIPT.STATUSs>());
-                    return action;
+                    return SetOutPutMqttMsg(action, input.Locale);
                 }
-                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>());
-                    return action;
+                    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 SetOutPutMqttMsg(action, input.Locale);
+                }
+                //浠嶶9鑾峰彇鏀惰揣鍗曡淇℃伅
+                var u9Dtl = Biz.DataSource["YadaU9C"].Client.Queryable<mes_ReturnedDocInfo>().Where(x => x.RcvId == receipt.ID.ToDouble() && x.DocLineNo == receiptDtl.LINE_NO.ToDouble() && x.SplitFlag != 1).First();
+                if (!u9Dtl.IsNullOrEmpty() && u9Dtl.RcvQtyTU != receiptDtl.QTY_OK)
+                {
+                    receiptDtl.ID = u9Dtl.RcvLineId.ToString();
+                    receiptDtl.QTY_OK = u9Dtl.RcvQtyTU;
+                    receiptDtl.QTY_NG = receiptDtl.QTY - receiptDtl.QTY_OK;
                 }
 
                 var nLocation = new WMS_LOCATION();
@@ -142,7 +151,7 @@
                     {
                         action.IsSuccessed = false;
                         action.LocaleMsg = Biz.L(shelfApiResult.GetData<string>());
-                        return action;
+                        return SetOutPutMqttMsg(action, input.Locale);
                     }
                     var reaultShelf = shelfApiResult.GetData<ShelfChangeModel>();
 
@@ -152,7 +161,7 @@
                         action.IsSuccessed = false;
                         //action.LocaleMsg = Biz.L($"璐ф灦[{0}]涓笉瀛樺湪id涓篬{1}]鐨勫偍浣嶏紝璇峰厛缁存姢璐ф灦淇℃伅");
                         action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationNotExistsInShelf", CurScanShelf.Shelf.SHELF_CODE, reaultShelf.ledAddr);
-                        return action;
+                        return SetOutPutMqttMsg(action, input.Locale);
                     }
                     var locationData = MainDB.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.ID).First();
                     if (!locationData.IsNullOrEmpty())
@@ -160,7 +169,7 @@
                         action.IsSuccessed = false;
                         //action.LocaleMsg = Biz.L("鍌ㄤ綅[{0}]宸插瓨鏈夌墿鏂橻{1}]锛岃妫�鏌ョ郴缁熷簱瀛樹俊鎭�");
                         action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", nLocation.LOCATION_CODE, locationData.SN);
-                        return action;
+                        return SetOutPutMqttMsg(action, input.Locale);
                     }
                     CurScanShelf.LocationCode = nLocation.LOCATION_CODE;
                 }
@@ -171,7 +180,7 @@
                         action.IsSuccessed = false;
                         //action.LocaleMsg = Biz.L("璇疯緭鍏ユ垨鎵弿鏈夋晥鐨勮揣鏋�/鍌ㄤ綅鐮�");
                         action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
-                        return action;
+                        return SetOutPutMqttMsg(action, input.Locale);
                     }
 
                     nLocation = await MainDB.Queryable<WMS_LOCATION>().Where(t => t.LOCATION_CODE == CurScanShelf.LocationCode && t.AUTH_ORG == OrgCode).FirstAsync();
@@ -184,18 +193,21 @@
                     //action.LocaleMsg = Biz.L("鍌ㄤ綅[{0}]鍙兘瀛樻斁涓�涓墿鏂�");
                     action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationSingleFailure", nLocation.LOCATION_CODE);
                     ResetScan();
-                    return action;
+                    return SetOutPutMqttMsg(action, input.Locale);
                 }
 
                 //鎵ц涓婃灦鏁版嵁澶勭悊
                 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;
                     item.TRANS_CODE = nameof(BIZ_U9_RECEIPT);
                     item.TRANS_NO = receipt.ORDER_NO;
                     item.TRANS_LINE = receiptDtl.LINE_NO;
+                    item.PROD_DATE = item.PROD_DATE < new DateTime(2000, 1, 1) ? DateTime.Now : item.PROD_DATE;
+                    item.FIRST_IN_DATE = item.FIRST_IN_DATE < new DateTime(2000, 1, 1) ? DateTime.Now : item.FIRST_IN_DATE;
                 }
                 Result putonResult = PutOn(input.AuthOption, nLocation.LOCATION_CODE);
                 if (!putonResult.IsSuccessed)
@@ -203,31 +215,63 @@
                     action.IsSuccessed = false;
                     action.LocaleMsg = putonResult.LocaleMsg;
                     ResetScan();
-                    return action;
+                    return SetOutPutMqttMsg(action, input.Locale);
                 }
 
                 //鏇存柊鍗曟嵁淇℃伅
-                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)
+                Action approveAction = null;
+                receiptDtl.QTY_IN = receipt.SnList.Where(q => q.LINE_NO == receiptDtl.LINE_NO && q.STATUS == WMS_ITEM.STATUSs.InStore.GetValue()).Sum(q => q.QTY);
+                if (receiptDtl.QTY_IN == receiptDtl.QTY_OK)
                 {
                     receiptDtl.STATUS = BIZ_U9_RECEIPT.STATUSs.Review.GetValue();
                     //褰撳墠鍗曟嵁鏄庣粏宸茬粡鍏ㄩ儴涓婃灦瀹屾垚锛屽彲浠ヨ皟鐢║9琛屽鎺ュ彛
+                    approveAction = () =>
+                    {
+                        var iInput = new SubmitLineInput
+                        {
+                            userId = UserCode,
+                            IsLogin = true,
+                            param = new()
+                            {
+                                RcvLineID = receiptDtl.ID,
+                                RcvDocNo = receiptDtl.ORDER_NO,
+                                DocLineNo = receiptDtl.LINE_NO,
+                                OrgCode = receiptDtl.AUTH_ORG,
+                            }
+                        };
+                        var result = DI.Resolve<IWMS_U9C>().ReceivementApproveLine(iInput).Result;
+                        if (!result.IsSuccessed)
+                        {
+                            throw new Exception(Biz.T(result.LocaleMsg, input.Locale));
+                        }
+                        else
+                        {
+                            //鏇存柊鍗曟嵁淇℃伅
+                            MainDB.Updateable<BIZ_U9_RECEIPT_DTL>().SetColumns(q => q.STATUS == BIZ_U9_RECEIPT.STATUSs.Finished.GetValue()).Where(q => q.ID == receiptDtl.ID).ExecuteCommand();
+                            if (!MainDB.Queryable<BIZ_U9_RECEIPT_DTL>().Any(q => q.STATUS < BIZ_U9_RECEIPT.STATUSs.Finished.GetValue() && q.ORDER_NO == receipt.ORDER_NO))
+                            {
+                                MainDB.Updateable<BIZ_U9_RECEIPT>().SetColumns(q => q.STATUS == BIZ_U9_RECEIPT.STATUSs.Finished.GetValue()).Where(q => q.ID == receipt.ID).ExecuteCommand();
+                            }
+                        }
+                    };
                 }
                 else
                 {
                     receiptDtl.STATUS = BIZ_U9_RECEIPT.STATUSs.Storing.GetValue();
                 }
-                var dtlStatus = receipt.Details.Select(q => q.STATUS).Distinct();
-                if (dtlStatus.Count() == 1 && dtlStatus.First() == BIZ_U9_RECEIPT.STATUSs.Review.GetValue())
+                if (receipt.Details.Any(q => q.STATUS < BIZ_U9_RECEIPT.STATUSs.Review.GetValue()))
                 {
-                    receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.Review.GetValue();
+                    receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.Storing.GetValue();
                 }
                 else
                 {
-                    receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.Storing.GetValue();
+                    receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.Review.GetValue();
                 }
 
                 //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
@@ -238,12 +282,12 @@
                     var db = GetCommitDB();
                     //鏁版嵁淇濆瓨閫昏緫
                     db.Updateable(receipt, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                    db.Updateable(receiptDtl, UserCode).UpdateColumns(q => new { q.STATUS, q.QTY_IN, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
+                    db.Updateable(receiptDtl, UserCode).UpdateColumns(q => new { q.ID, q.STATUS, q.QTY_IN, q.QTY_OK, q.QTY_NG, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                     db.Updateable(receiptSn, UserCode).UpdateColumns(q => new { q.STATUS, q.IS_IN, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                 });
 
                 //瀹屾垚鎵�鏈夊鐞嗗悗浣跨敤浜嬪姟淇濆瓨鏁版嵁
-                action = DoIfFinish(action, input.Locale);
+                action = DoIfFinish(action, input.Locale, approveAction);
             }
             catch (Exception ex)
             {
@@ -252,7 +296,7 @@
                 //action.CatchExceptionWithLog(ex, $"鎵弿鏉$爜[{input.SN}]澶嶆牳寮傚父");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
             }
-            return action;
+            return SetOutPutMqttMsg(action, input.Locale);
         }
 
         /// <summary>
@@ -350,11 +394,16 @@
         /// 瀹屾垚鎵�鏈夊鐞嗗悗浣跨敤浜嬪姟淇濆瓨鏁版嵁
         /// </summary>
         /// <param name="action"></param>
+        /// <param name="locale"></param>
+        /// <param name="doAfterSave"></param>
         /// <returns></returns>
-        public ApiAction<ScanOutput> DoIfFinish(ApiAction<ScanOutput> action, string locale)
+        public ApiAction<ScanOutput> DoIfFinish(ApiAction<ScanOutput> action, string locale, Action doAfterSave = null)
         {
             //淇濆瓨鏁版嵁搴�
             SaveCommitListToDB();
+
+            //淇濆瓨鏁版嵁鎴愬姛鍚庢墽琛�
+            doAfterSave?.Invoke();
 
             // 杩斿洖鏁版嵁
             action.Data.Data = new DefaultInStoreOutput
@@ -375,8 +424,8 @@
             action.LocaleMsg = Biz.L("WMS.Default.ScanItem.PutOnSucceeded", CurInvItem.SN, CurInvItem.Location.LOCATION_CODE);
 
             //閲嶇疆宸ュ簭
-            ResetScan();
-            return action;
+            ResetScanInfo();
+            return SetOutPutMqttMsg(action, locale);
         }
 
         #endregion
@@ -387,9 +436,17 @@
         public override void ResetScan()
         {
             base.ResetScan();
+            ResetScanInfo();
+            CurScanShelf = null;
+        }
+
+        /// <summary>
+        /// 閲嶇疆鎵爜淇℃伅
+        /// </summary>
+        public void ResetScanInfo()
+        {
             Command = null;
             CurInvItem = null;
-            CurScanShelf = null;
         }
 
         public override bool Close(bool needSaveHistoryLog = false)

--
Gitblit v1.9.3