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/Transaction/Yada/Out_BIZ_WMS_PREP.cs | 134 +++++++++++++++++++++++++------------------- 1 files changed, 75 insertions(+), 59 deletions(-) diff --git a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs index 4847c35..9abb932 100644 --- a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs +++ b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs @@ -12,6 +12,9 @@ using Tiger.Business.WMS.Common; using Org.BouncyCastle.Ocsp; using Tiger.Model.Sharetronic.Shelf; +using MailKit.Search; +using Tiger.Business.WMS.Extensions; +using static Tiger.Model.BIZ_WMS_PREP_BTH; namespace Tiger.Business.WMS.Transaction { @@ -29,7 +32,7 @@ } #region Propertys & Variables - private Preparation CurPREP; + public Preparation CurPREP { get; set; } private List<BIZ_WMS_PREP_SN> CurSn = new(); private BIZ_WMS_PREP_DTL CurPrepDtl = new(); public List<SuggestItem> Suggests { get; set; } = new(); @@ -95,7 +98,7 @@ catch (Exception ex) { //鍙栨秷褰撳墠鎿嶄綔 - ResetScan(); + ResetTrans(); //action.CatchExceptionWithLog(ex, $"鎵弿[{input.SN}]寮傚父"); action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.Scan.ScanException", input.SN)); } @@ -141,7 +144,7 @@ catch (Exception ex) { //鍙栨秷褰撳墠鎿嶄綔 - ResetScan(); + ResetTrans(); //action.CatchExceptionWithLog(ex, $"澶囨枡浠诲姟鎵弿鍗曟嵁寮傚父(Data: {0})"); action.CatchExceptionWithLog(ex, Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrderException", input?.Data)); } @@ -156,6 +159,7 @@ { var action = new ApiAction<BIZ_WMS_PREP>(); CurPREP.Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ID == CurPREP.Order.ID).IncludesAllFirstLayer().First(); + action.Data = CurPREP.Order; return action; } @@ -168,8 +172,8 @@ var action = new ApiAction<ScanOutput>(new ScanOutput()); try { - var inputDtl = input?.Data?.JsonToObject<BIZ_WMS_PREP_DTL>(); - var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == inputDtl.ID).First(); + var option = CurPREP.Option = new BaseInput<SuggestOption>(input).Data; + var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == option.LineID).First(); if (prepDtl.IsNullOrEmpty()) { action.IsSuccessed = false; @@ -177,11 +181,11 @@ action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NotSelectItem"); return action; } - if (prepDtl.QTY_PREP > GetActReqQty(prepDtl)) + if (prepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(prepDtl)) { action.IsSuccessed = false; //action.LocaleMsg = Biz.L("褰撳墠閫夋嫨鐗╂枡琛孾{0}]宸插鏂欐暟閲廩{1}]锛屼互婊¤冻瀹為檯闇�姹傛暟閲廩{2}]锛屾棤闇�缁х画澶囨枡"); - action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItem.PrepFinish", prepDtl.ITEM_CODE, prepDtl.QTY_PREP, GetActReqQty(prepDtl)); + action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItem.PrepFinish", prepDtl.ITEM_CODE, prepDtl.QTY_PREP, CurPREP.BizType.GetActReqQty(prepDtl)); return action; } //鍒犻櫎鐗╂枡姹犱腑涓婁竴娆″垎閰嶇殑鐗╂枡 @@ -199,10 +203,10 @@ } //濡傛灉鏄濂楀彂鏂欙紝鍒欏彧鎺ㄨ崘褰撳墠鐗╂枡琛岀殑涓�鐩樼墿鏂� - if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue()) + if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First) { //鎺ㄨ崘鐗╂枡 - Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, 1); + Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, 1); action.LocaleMsg = result.LocaleMsg; if (result.IsException) { @@ -215,7 +219,7 @@ if (Suggests.Count > 0) { var inv = Suggests.First(); - var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); + var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); if (inv != null && actQty > 0) { inv.poolItem = inv.Item.GetPoolItem(OrgCode, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, actQty, true); @@ -229,11 +233,11 @@ } //濡傛灉鏄甯稿彂鏂欙紝鍒欐寜瀹為檯闇�姹傛暟閲忔帹鑽愬綋鍓嶇墿鏂欒鐨勬墍鏈夌墿鏂� - if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue()) + if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.Supply) { //鎺ㄨ崘鐗╂枡 - var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); - Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, actQty); + var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); + Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, actQty); action.LocaleMsg = result.LocaleMsg; if (result.IsException) { @@ -272,7 +276,7 @@ catch (Exception ex) { //鍙栨秷褰撳墠鎿嶄綔 - ResetScan(); + ResetTrans(); //action.CatchExceptionWithLog(ex, $"澶囨枡浠诲姟閫夋嫨瑕佺墿鏂欒寮傚父(Data: {0})"); action.CatchExceptionWithLog(ex, Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItemException", input?.Data)); } @@ -287,10 +291,6 @@ { var action = new ApiAction<BIZ_WMS_PREP_DTL>(); var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == CurPrepDtl.ID).First(); - prepDtl.ERP_WH = CurPrepDtl.ERP_WH; - prepDtl.WH_ID = CurPrepDtl.WH_ID; - prepDtl.REGION_ID = CurPrepDtl.REGION_ID; - prepDtl.SHELF_ID = CurPrepDtl.SHELF_ID; prepDtl.Suggests = Suggests; CurPrepDtl = prepDtl; CurPREP.Order.Details.RemoveAll(q => q.ID == CurPrepDtl.ID); @@ -412,6 +412,14 @@ action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN); return SetOutPutMqttMsg(action, input.Locale); } + //楠岃瘉鏉$爜鏄惁琚叾浠栫敤鎴峰拰鍗曟嵁閿佸畾 + if (inv.Items.Any(q => q.IS_LOCKED == "Y")) + { + action.IsSuccessed = false; + //action.LocaleMsg = Biz.L("鏉$爜[{0}]宸茶閿佸畾锛岃閲嶆柊鎵弿"); + action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN); + return SetOutPutMqttMsg(action, input.Locale); + } //鍌ㄤ綅楠岃瘉 if (inv.Location.IsNullOrEmpty()) { @@ -429,13 +437,22 @@ return SetOutPutMqttMsg(action, input.Locale); } //鍒ゆ柇鏄惁鍦ㄥ鏂欎腑鐨勭墿鏂� - if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE)) + if (inv.ItemInfo.ITEM_CODE != CurPrepDtl.ITEM_CODE) { action.IsSuccessed = false; - //action.LocaleMsg = Biz.L($"褰撳墠澶囨枡浠诲姟[{0}]涓嶅寘鍚潯鐮乕{1}]鐨勭墿鏂欑紪鐮乕{2}]锛岃鏀惧洖鍘熷偍浣�"); - action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode)); + //action.LocaleMsg = Biz.L($"鏉$爜[{0}]涓嶆槸褰撳墠閫変腑鐨勭墿鏂欒[{1}]锛岃鏀惧洖鍘熷偍浣嶆垨鑰呴噸鏂伴�夋嫨涓嬫灦鐗╂枡琛�"); + action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.CurPkg.SN, CurPrepDtl.ITEM_CODE); return action; } + //鍒ゆ柇鏄惁鍦ㄥ鏂欎腑鐨勭墿鏂� + //if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE)) + //{ + // action.IsSuccessed = false; + // //action.LocaleMsg = Biz.L($"褰撳墠澶囨枡浠诲姟[{0}]涓嶅寘鍚潯鐮乕{1}]鐨勭墿鏂欑紪鐮乕{2}]锛岃鏀惧洖鍘熷偍浣�"); + // action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode)); + // return action; + //} + //ProcessingOrderDetail = input.SN; //if (WMSContext.TransactionDic.Where(q => !string.IsNullOrWhiteSpace(q.Value.ProcessingSn)).Any(q => q.Value.ProcessingSn == ProcessingSn && q.Value.TransID != this.TransID)) //{ @@ -447,35 +464,35 @@ CurSn = CurInvItem.Items.Select(q => new BIZ_WMS_PREP_SN() { ORDER_NO = CurPREP.Order.ORDER_NO, ORDER_LINE = CurPrepDtl.ORDER_LINE, - ORDER_BATCH = CurPREP.Order.CurBatch.BATCH.ToString(), SN = q.SN, ITEM_CODE = q.ITEM_CODE, + UNIT = q.UNIT, QTY = q.QTY, QTY_DLVY = q.QTY, STATUS = q.STATUS, + LOTNO = q.LOTNO, + WH_ID = CurInvItem.Warehouse.ID, WH_CODE = CurInvItem.Warehouse.WH_CODE, + REGION_ID = CurInvItem.Region.ID, REGION_CODE = CurInvItem.Region.REGION_CODE, + SHELF_ID = CurInvItem.Shelf.ID, SHELF_CODE = CurInvItem.Shelf.SHELF_CODE, + LOCATION_ID = CurInvItem.Location.ID, LOCATION_CODE = CurInvItem.Location.LOCATION_CODE, - FTY_CODE = CurPREP.Order.CurBatch.FTY_CODE, - WS_CODE = CurPREP.Order.CurBatch.WS_CODE, - LINE_CODE = CurPREP.Order.CurBatch.LINE_CODE, - POST_CODE = CurPREP.Order.CurBatch.POST_CODE, - OPER_CODE = CurPREP.Order.CurBatch.OPER_CODE, - SEGMENT = CurPREP.Order.CurBatch.SEGMENT, SMT_NO = CurPrepDtl.SMT_NO, STATION_NO = CurPrepDtl.STATION_NO, FEEDER_NO = CurPrepDtl.FEEDER_NO, FEEDER_TYPE = CurPrepDtl.FEEDER_TYPE, - IS_FIRST = CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue() ? "Y" : "N", + IS_FIRST = CurPREP.Option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First ? "Y" : "N", NEED_CUTTING = "N", + TRACE_ID = TransID, }).ToList(); //鍒ゆ柇鏄惁瓒呭彂 isExceed = false; //璁$畻鍓╀綑闇�姹傛暟閲忓拰鏉$爜涓殑鍙戝嚭鏁伴噺 - var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); + var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); if (actQty < CurInvItem.CurPkg.QTY) { isExceed = true; @@ -496,7 +513,7 @@ { //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛屾潯鐮侀渶瑕佹埅鏂欙紝鍙戝嚭鏁伴噺[{4}]"); //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛岃閫夋嫨瑕佽秴鍙戣繕鏄埅鏂欙紵"); - action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, GetActReqQty(CurPrepDtl), actQty); + action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, CurPREP.BizType.GetActReqQty(CurPrepDtl), actQty); action.Data.Command = "ConfirmExceed"; action.Data.Data = new { @@ -531,11 +548,11 @@ var sns = (input.Data ?? "").JsonToObject<List<BIZ_WMS_PREP_SN>>() ?? new List<BIZ_WMS_PREP_SN>(); if (!sns.Any()) { - var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); + var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP); action.IsSuccessed = false; //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛屾潯鐮侀渶瑕佹埅鏂欙紝鍙戝嚭鏁伴噺[{4}]"); //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛岃閫夋嫨瑕佽秴鍙戣繕鏄埅鏂欙紵"); - action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, GetActReqQty(CurPrepDtl), actQty); + action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, CurPREP.BizType.GetActReqQty(CurPrepDtl), actQty); action.Data.Command = "ConfirmExceed"; action.Data.Data = new { @@ -581,7 +598,7 @@ { action.IsSuccessed = false; action.LocaleMsg = downResult.LocaleMsg; - ResetScanInfo(); + ResetScan(); return SetOutPutMqttMsg(action, input.Locale); } else//澶勭悊澶囨枡浠诲姟鏁版嵁 @@ -599,14 +616,11 @@ } CurPrepDtl.QTY_PREP += CurSn.Sum(q => q.QTY_DLVY); CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Picking.GetValue(); - CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Picking.GetValue(); - CurPREP.Order.CurBatch.PICK_TIME = DateTime.Now; //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊� var _CurSn = CurSn.Clone(); var _CurPrepDtl = CurPrepDtl.Clone(); var _CurPREPOrder = CurPREP.Order.Clone(); - var _CurPREPCurBatch = CurPREP.Order.CurBatch.Clone(); AddCommitAction("UpdatePrep", () => { //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄 @@ -616,7 +630,6 @@ _CurPrepDtl.QTY_PREP = db.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == _CurPrepDtl.ORDER_NO && q.ORDER_LINE == _CurPrepDtl.ORDER_LINE).Sum(q => q.QTY_DLVY); db.Updateable(_CurPrepDtl, UserCode).UpdateColumns(q => new { q.QTY_PREP, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand(); db.Updateable(_CurPREPOrder, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand(); - db.Updateable(_CurPREPCurBatch, UserCode).UpdateColumns(q => new { q.STATUS, q.PICK_TIME, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand(); }); //鐏伅 @@ -632,23 +645,11 @@ catch (Exception ex) { //鍙栨秷褰撳墠鎿嶄綔 - ResetScan(); - //娓呯悊鏆傚瓨鏁版嵁鎻愪氦鎿嶄綔 - DBCommitList.Clear(); + ResetTrans(); //action.CatchExceptionWithLog(ex, $"鎵弿鏉$爜[{input.SN}]澶嶆牳寮傚父"); action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN)); } return SetOutPutMqttMsg(action, input.Locale); - } - - /// <summary> - /// 瀹為檯闇�姹傛暟閲忚绠楁柟娉� - /// </summary> - /// <param name="dtl"></param> - /// <returns></returns> - private double GetActReqQty(BIZ_WMS_PREP_DTL dtl) - { - return dtl.QTY_REQ; } /// <summary> @@ -735,7 +736,7 @@ catch (Exception ex) { //鍙栨秷褰撳墠鎿嶄綔 - ResetScan(); + ResetTrans(); //action.CatchExceptionWithLog(ex, $"鎵弿璐ф灦/鍌ㄤ綅[{0}]寮傚父"); action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanShelf.ScanException", Code)); } @@ -775,30 +776,45 @@ action.LocaleMsg = Biz.L("WMS.Default.ScanItem.TakeDownSucceeded", CurInvItem.SN, CurInvItem.Location?.LOCATION_CODE); //閲嶇疆宸ュ簭 - ResetScanInfo(); + ResetScan(); return SetOutPutMqttMsg(action, locale); + } + + /// <summary> + /// 鍒涘缓鍙戞枡鎵规浠ュ畬鎴愭湰娆″彂鏂欙紝璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ApiAction> GenerateDlvyBatch(BaseInput input) + { + var range = input.Data.ToInt32().GetEnum<BATCH_RANGEs>(); + var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .GenerateDlvyBatch(this, range); + return action; } #endregion /// <summary> - /// 閲嶇疆褰撳墠鎿嶄綔锛屾湁闇�瑕佸垯閲嶅啓姝ゆ柟娉� + /// 閲嶇疆浜嬪姟鏁版嵁锛屾湁闇�瑕佸垯閲嶅啓姝ゆ柟娉� /// </summary> - public override void ResetScan() + public override void ResetTrans() { - base.ResetScan(); - ResetScanInfo(); + ResetScan(); CurPREP = new(MainDB, UserCode, OrgCode); + CurPrepDtl = new(); CurScanShelf = null; + base.ResetTrans(); } /// <summary> - /// 閲嶇疆鎵爜淇℃伅 + /// 閲嶇疆鏈鎵爜淇℃伅 /// </summary> - public void ResetScanInfo() + public override void ResetScan() { Command = "Normal"; CurInvItem = null; + CurSn = new(); + base.ResetScan(); } public override bool Close(bool needSaveHistoryLog = false) -- Gitblit v1.9.3