From b4c61b31b6b377af1598856da060635bb84333a2 Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期六, 03 五月 2025 18:54:43 +0800 Subject: [PATCH] 优化了一些已知问题 --- Tiger.Business.WMS/Extensions/Yada/OutExtension.cs | 607 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 496 insertions(+), 111 deletions(-) diff --git a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs index eb99666..5b505b3 100644 --- a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs +++ b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs @@ -1,7 +1,9 @@ 锘縰sing MailKit.Search; +using Microsoft.Scripting.Utils; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Ocsp; using Rhea.Common; using SqlSugar; using System; @@ -12,7 +14,6 @@ using Tiger.Model.Base; using Tiger.Model.Entitys.MES.U9C; using Tiger.Model.MES.Yada; -using static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions; namespace Tiger.Business.WMS.Extensions { @@ -36,10 +37,54 @@ return nameof(BIZ_MES_WO); case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: return nameof(BIZ_U9_SCM_OUT); + case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: + return nameof(BIZ_WMS_TRANSFER); case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: default: return ""; } + } + + /// <summary> + /// 鏍规嵁鍙戞枡绫诲瀷锛岃幏鍙栧彂鏂欏崟鎹殑閫夋嫨鍒楄〃锛堝甫鍒嗛〉锛� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static PageAble<BIZ_WMS_PREP_SRC> GetPickList(this BIZ_WMS_PREP.BIZ_TYPEs type, BaseInputWithPage input) + { + // 鏌ヨ鍗曟嵁鏄庣粏 + var pickList = new PageAble<BIZ_WMS_PREP_SRC>(); + switch (type) + { + //case BIZ_WMS_PREP.BIZ_TYPEs.Others: + // { + // var dtls = Biz.Db.Queryable<BIZ_U9_MISC_OUT_DTL>().Where(q => q.ORDER_NO == orderNo).ToList(); + // pickList = dtls.Select(q => q.GetPickItem()).ToList(); + // } + // break; + //case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder: + // { + // var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_MOPickList>().Where(q => q.MoDocNo == orderNo).ToList(); + // pickList = dtls.Select(q => q.GetPickItem()).ToList(); + // } + // break; + //case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: + // { + // var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_SCMPickList>().Where(q => q.PoDocNo == orderNo).ToList(); + // pickList = dtls.Select(q => q.GetPickItem()).ToList(); + // } + // break; + //case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: + // { + // var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList(); + // pickList = dtls.Select(q => q.GetPickItem()).ToList(); + // } + // break; + case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: + default: + break; + } + return pickList; } /// <summary> @@ -72,6 +117,12 @@ pickList = dtls.Select(q => q.GetPickItem()).ToList(); } break; + case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: + { + var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList(); + pickList = dtls.Select(q => q.GetPickItem()).ToList(); + } + break; case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: default: break; @@ -92,6 +143,7 @@ case BIZ_WMS_PREP.BIZ_TYPEs.Others: case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder: case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: + case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: default: return dtl.QTY_REQ; @@ -105,16 +157,18 @@ /// <param name="trans"></param> /// <param name="input"></param> /// <returns></returns> - public static async Task<ApiAction> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BaseInput input) + public static async Task<ApiAction> GenerateDlvyBatch(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) { switch (type) { case BIZ_WMS_PREP.BIZ_TYPEs.Others: - return await MiscShipApprove(trans, input); + return await MiscShipApprove(trans, range); case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder: - return await CreateIssueDoc(trans, input); + return await CreateIssueDoc(trans, range); case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: - return await CreatePMIssueDoc(trans, input); + return await CreatePMIssueDoc(trans, range); + case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: + return await TransferComplete(trans, range); case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: default: throw new NotImplementedException($"鍙戞枡鍗曟嵁绫诲瀷[{type.GetDesc()}]鏈疄鐜癊RP鎺ュ彛璋冪敤"); @@ -125,9 +179,9 @@ /// U9鏉傚彂鍗曞鏍� /// </summary> /// <param name="trans"></param> - /// <param name="input"></param> + /// <param name="range"></param> /// <returns></returns> - private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BaseInput input) + private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) { var action = new ApiAction(); @@ -150,20 +204,67 @@ return action; } - trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); - trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(); - trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode; - trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now; - trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode; - trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now; - var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); - foreach (var item in orders) + var batch = new BIZ_WMS_PREP_BTH() { - item.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue(); - item.PREP_PERSON = trans.UserCode; - item.FINISH_TIME = DateTime.Now; - item.REQ_PERSON = trans.UserCode; - item.DLVY_TIME = DateTime.Now; + AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, + ORDER_NO = trans.CurPREP.Order.ORDER_NO, + DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", + STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), + PREP_PERSON = trans.UserCode, + FINISH_TIME = DateTime.Now, + REQ_PERSON = trans.UserCode, + DLVY_TIME = DateTime.Now, + }; + trans.CurPREP.Order.Batchs.Add(batch); + + foreach (var item in trans.CurPREP.Order.SourceDetails) + { + item.QTY_ACT_DLVY = item.QTY_ACT_REQ; + } + trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); + var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).IncludesAllFirstLayer().ToList(); + foreach (var order in orders) + { + order.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue(); + order.PREP_PERSON = trans.UserCode; + order.FINISH_TIME = DateTime.Now; + order.REQ_PERSON = trans.UserCode; + order.DLVY_TIME = DateTime.Now; + foreach (var dtl in order.Details) + { + dtl.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue(); + } + order.SnList ??= new(); + foreach (var sn in trans.CurPREP.Order.SnList) + { + var dtl = order.Details.Where(q => q.ITEM_CODE == sn.ITEM_CODE).First(); + order.SnList.Add(new() + { + AUTH_ORG = dtl.AUTH_ORG, + ORDER_NO = dtl.ORDER_NO, + LINE_NO = dtl.LINE_NO, + SN = sn.SN, + STATUS = sn.STATUS, + ITEM_CODE = sn.ITEM_CODE, + QTY = sn.QTY, + UNIT = sn.UNIT, + WH_CODE = sn.WH_CODE, + REGION_CODE = sn.REGION_CODE, + SHELF_CODE = sn.SHELF_CODE, + LOCATION_CODE = sn.LOCATION_CODE, + DOWN_TIME = sn.DOWN_TIME, + DLVY_TIME = DateTime.Now, + IS_OUT = "Y", + LOTNO = sn.LOTNO, + }); + } + } + var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList(); + var history = new List<WMS_ITEM_HIS>(); + foreach (var item in items) + { + item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); + history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]")); } //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄 @@ -171,8 +272,15 @@ var dbTran = db.UseTran(() => { db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); - db.Updateable(trans.CurPREP.Order.CurBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); + db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); + db.Insertable(batch, trans.UserCode).ExecuteCommand(); + db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO) + .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand(); + db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Insertable(history, trans.UserCode).ExecuteCommand(); db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); + db.Updateable(orders.SelectMany(q => q.Details).ToList(), trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Storageable(orders.SelectMany(q => q.SnList).ToList(), trans.UserCode).ToStorage().AsInsertable.ExecuteCommand(); }); if (dbTran.IsSuccess) { @@ -187,94 +295,80 @@ } return action; } - /// <summary> - /// U9鍒涘缓濮斿鐢熶骇棰嗘枡鍗� - /// </summary> - /// <param name="trans"></param> - /// <param name="input"></param> - /// <returns></returns> - private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input) - { - var action = new ApiAction(); - var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); - var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); - if (noFinish.Any()) - { - action.IsSuccessed = false; - //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}"); - action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE))); - return action; - } - - var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() }; - var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput); - if (!result.IsSuccessed) - { - action.IsSuccessed = false; - action.LocaleMsg = result.LocaleMsg; - return action; - } - - trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); - trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(); - trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode; - trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now; - trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode; - trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now; - var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); - foreach (var item in orders) - { - item.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue(); - item.PREP_PERSON = trans.UserCode; - item.FINISH_TIME = DateTime.Now; - item.REQ_PERSON = trans.UserCode; - item.DLVY_TIME = DateTime.Now; - } - - //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄 - var db = trans.GetCommitDB(); - var dbTran = db.UseTran(() => - { - db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); - db.Updateable(trans.CurPREP.Order.CurBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); - db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); - }); - if (dbTran.IsSuccess) - { - //action.LocaleMsg = Biz.L($"鏉傚彂鍗曞鏍告垚鍔燂紝鍗曞彿濡備笅锛歿0}"); - action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.Success", string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); - } - else - { - Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); - //鎶涘嚭寮傚父 - throw dbTran.ErrorException; - } - return action; - } /// <summary> /// U9鍒涘缓鐢熶骇棰嗘枡鍗� /// </summary> /// <param name="trans"></param> - /// <param name="input"></param> + /// <param name="range"></param> /// <returns></returns> - private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input) + private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) { var action = new ApiAction(); - var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); - var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); - if (noFinish.Any()) + var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue()) + .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID) + .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID) + .ToList(); + if (!sns.Any()) { action.IsSuccessed = false; - //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}"); - action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE))); + //action.LocaleMsg = Biz.L("鍒涘缓鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鏈壘鍒皗1}宸蹭笅鏋剁殑鐗╂枡鏁版嵁"); + action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc()); return action; } + var wos = Biz.DataSource["YadaU9C"].Client.Queryable<mes_Mo>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.DocNo)).ToList(); + var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE }) + .Select(g => new PickListDTOs + { + Item = new() { Code = g.Key.ITEM_CODE }, + IssueWh = new() { Code = g.Key.WH_CODE }, + IssueBin = new() { code = g.Key.LOCATION_CODE }, + IssueQty = g.Sum(q => q.QTY), + IssuedQty = g.Sum(q => q.QTY), + IssueUOM = new() { Code = g.Key.UNIT.IsNullOrEmpty("PCS") }, + Lot = new() { code = g.Max(q => q.LOTNO) }, + }).ToList(); + var pickList = new List<PickListDTOs>(); + var prepSrcList = new List<BIZ_WMS_PREP_SRC_DTL>(); + foreach (var dtl in temp) + { + var remain = dtl.IssueQty; + var srcDtls = trans.CurPREP.Order.SourceDetails.Where(q => q.ITEM_CODE == dtl.Item.Code).ToList(); + var count = srcDtls.Count; + foreach (var src in srcDtls) + { + var actQty = src.QTY_ACT_REQ - src.QTY_ACT_DLVY; + if (remain > 0 && actQty > 0) + { + //瀹為檯闇�姹傚ぇ浜庡墿浣欏緟鍒嗛厤鏁伴噺锛屾垨鑰呭綋鍓嶆槸鏈�鍚庝竴涓潵婧愭槑缁嗚锛屽垯鍒嗛厤鍓╀綑鏁伴噺 + var dlvy = (actQty > remain || count == 1) ? remain : actQty; + src.QTY_ACT_DLVY += dlvy; + prepSrcList.Add(src); + var pick = new PickListDTOs + { + Item = dtl.Item, + IssueWh = dtl.IssueWh, + IssueBin = dtl.IssueBin, + IssueQty = dlvy, + IssuedQty = dlvy, + IssueUOM = dtl.IssueUOM, + MOPickList = src.SOURCE_ID.ToInt64(), + Lot = dtl.Lot, + }; + pickList.Add(pick); + remain -= pick.IssueQty; + } + count--; + } + } - var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() }; - var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput); + var iInput = new CreateProdMaterialReqInput {CreateProdMaterialReqParam = new() { new() { + MOs = trans.CurPREP.Order.SourceOrders.Select(q => new MOs { Code = q.SOURCE_ORDER }).ToList(), + PickListDTOs = pickList, + BusinessType = wos.First().BusinessType, + }}}; + var result = await DI.Resolve<IWMS_U9C>().CreateProdMaterialReq(iInput); if (!result.IsSuccessed) { action.IsSuccessed = false; @@ -282,20 +376,42 @@ return action; } - trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); - trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(); - trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode; - trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now; - trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode; - trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now; - var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); - foreach (var item in orders) + + var batch = new BIZ_WMS_PREP_BTH() { - item.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue(); - item.PREP_PERSON = trans.UserCode; - item.FINISH_TIME = DateTime.Now; - item.REQ_PERSON = trans.UserCode; - item.DLVY_TIME = DateTime.Now; + AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, + ORDER_NO = trans.CurPREP.Order.ORDER_NO, + DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", + STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), + PREP_PERSON = trans.UserCode, + FINISH_TIME = DateTime.Now, + REQ_PERSON = trans.UserCode, + REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)), + REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)), + DLVY_TIME = DateTime.Now, + }; + trans.CurPREP.Order.Batchs.Add(batch); + foreach (var sn in sns) + { + sn.DLVY_BATCH = batch.DLVY_BATCH; + sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); + sn.REQ_ID = batch.REQ_ID; + sn.REQ_ORDER = batch.REQ_ORDER; + } + + var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList(); + var history = new List<WMS_ITEM_HIS>(); + foreach (var item in items) + { + item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); + history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]")); + } + + var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); + var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); + if (!noFinish.Any()) + { + trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); } //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄 @@ -303,12 +419,280 @@ var dbTran = db.UseTran(() => { db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); - db.Updateable(trans.CurPREP.Order.CurBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); - db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); + db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); + db.Insertable(batch, trans.UserCode).ExecuteCommand(); + db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH, q.REQ_ID, q.REQ_ORDER }).ExecuteCommand(); + db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Insertable(history, trans.UserCode).ExecuteCommand(); }); if (dbTran.IsSuccess) { - //action.LocaleMsg = Biz.L($"鏉傚彂鍗曞鏍告垚鍔燂紝鍗曞彿濡備笅锛歿0}"); + //action.LocaleMsg = Biz.L($"鍒涘缓鐢熶骇棰嗘枡鍗昜{0}]鎴愬姛锛屾潵婧愬崟鍙峰涓嬶細{1}"); + action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", batch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); + } + else + { + Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); + //鎶涘嚭寮傚父 + throw dbTran.ErrorException; + } + return action; + } + + /// <summary> + /// U9鍒涘缓濮斿鐢熶骇棰嗘枡鍗� + /// </summary> + /// <param name="trans"></param> + /// <param name="range"></param> + /// <returns></returns> + private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) + { + var action = new ApiAction(); + + var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue()) + .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID) + .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID) + .ToList(); + if (!sns.Any()) + { + action.IsSuccessed = false; + //action.LocaleMsg = Biz.L("鍒涘缓濮斿鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鏈壘鍒皗1}宸蹭笅鏋剁殑鐗╂枡鏁版嵁"); + action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc()); + return action; + } + var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE }) + .Select(g => new PickListDTOs2 + { + Item = new() { Code = g.Key.ITEM_CODE }, + IssueWh = new() { Code = g.Key.WH_CODE }, + IssueBin = new() { code = g.Key.LOCATION_CODE }, + IssueQty = g.Sum(q => q.QTY), + IssuedQty = g.Sum(q => q.QTY), + IssueUOM = new() { Code = g.Key.UNIT.IsNullOrEmpty("PCS") }, + Lot = new() { code = g.Max(q => q.LOTNO) }, + }).ToList(); + var pickList = new List<PickListDTOs2>(); + var prepSrcList = new List<BIZ_WMS_PREP_SRC_DTL>(); + foreach (var dtl in temp) + { + var remain = dtl.IssueQty; + var srcDtls = trans.CurPREP.Order.SourceDetails.Where(q => q.ITEM_CODE == dtl.Item.Code).ToList(); + var count = srcDtls.Count; + foreach (var src in srcDtls) + { + var actQty = src.QTY_ACT_REQ - src.QTY_ACT_DLVY; + if (remain > 0 && actQty > 0) + { + //瀹為檯闇�姹傚ぇ浜庡墿浣欏緟鍒嗛厤鏁伴噺锛屾垨鑰呭綋鍓嶆槸鏈�鍚庝竴涓潵婧愭槑缁嗚锛屽垯鍒嗛厤鍓╀綑鏁伴噺 + var dlvy = (actQty > remain || count == 1) ? remain : actQty; + src.QTY_ACT_DLVY += dlvy; + prepSrcList.Add(src); + var pick = new PickListDTOs2 + { + Item = dtl.Item, + IssueWh = dtl.IssueWh, + IssueBin = dtl.IssueBin, + IssueQty = dlvy, + IssuedQty = dlvy, + IssueUOM = dtl.IssueUOM, + SCMOPickList = src.SOURCE_ID.ToInt64(), + Lot = dtl.Lot, + }; + pickList.Add(pick); + remain -= pick.IssueQty; + } + count--; + } + } + + var iInput = new CreateOutProdMaterialReqInput { CreateOutProdMaterialReqParam = new() { new() { + POLine = trans.CurPREP.Order.SourceOrders.Select(q => new POLine { Code = q.SOURCE_ORDER }).ToList(), + BusinessDate = DateTime.Now.ToString("yyyy-MM-dd"), + PickListDTOs = pickList, + BusinessCreatedOn = DateTime.Now.ToString("yyyy-MM-dd"), + }}}; + var result = await DI.Resolve<IWMS_U9C>().CreateOutProdMaterialReq(iInput); + if (!result.IsSuccessed) + { + action.IsSuccessed = false; + action.LocaleMsg = result.LocaleMsg; + return action; + } + + var batch = new BIZ_WMS_PREP_BTH() + { + AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, + ORDER_NO = trans.CurPREP.Order.ORDER_NO, + DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", + STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), + PREP_PERSON = trans.UserCode, + FINISH_TIME = DateTime.Now, + REQ_PERSON = trans.UserCode, + REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)), + REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)), + DLVY_TIME = DateTime.Now, + }; + trans.CurPREP.Order.Batchs.Add(batch); + foreach (var sn in sns) + { + sn.DLVY_BATCH = batch.DLVY_BATCH; + sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); + sn.REQ_ID = batch.REQ_ID; + sn.REQ_ORDER = batch.REQ_ORDER; + } + + var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList(); + var history = new List<WMS_ITEM_HIS>(); + foreach (var item in items) + { + item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); + history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]")); + } + + var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); + var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); + var orders = new List<BIZ_U9_SCM_OUT>(); + if (!noFinish.Any()) + { + trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); + orders = trans.MainDB.Queryable<BIZ_U9_SCM_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); + foreach (var item in orders) + { + item.STATUS = BIZ_U9_SCM_OUT.STATUSs.Sended.GetValue(); + item.PREP_PERSON = trans.UserCode; + item.FINISH_TIME = DateTime.Now; + item.REQ_PERSON = trans.UserCode; + item.DLVY_TIME = DateTime.Now; + } + } + + //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄 + var db = trans.GetCommitDB(); + var dbTran = db.UseTran(() => + { + db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); + db.Insertable(batch, trans.UserCode).ExecuteCommand(); + db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH, q.REQ_ID, q.REQ_ORDER }).ExecuteCommand(); + db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Insertable(history, trans.UserCode).ExecuteCommand(); + if (orders.Any()) + { + db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); + } + }); + if (dbTran.IsSuccess) + { + //action.LocaleMsg = Biz.L($"鍒涘缓濮斿鐢熶骇棰嗘枡鍗昜{0}]鎴愬姛锛屾潵婧愬崟鍙峰涓嬶細{1}"); + action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", batch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); + } + else + { + Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); + //鎶涘嚭寮傚父 + throw dbTran.ErrorException; + } + return action; + } + + /// <summary> + /// 璋冩嫧鍗曞畬鎴愬彂鏂� + /// </summary> + /// <param name="trans"></param> + /// <param name="range"></param> + /// <returns></returns> + private static async Task<ApiAction> TransferComplete(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) + { + var action = new ApiAction(); + + var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); + var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Transfer.GetActReqQty(q)); + if (noFinish.Any()) + { + action.IsSuccessed = false; + //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}"); + action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.TransferComplete.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE))); + return action; + } + + var batch = new BIZ_WMS_PREP_BTH() + { + AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, + ORDER_NO = trans.CurPREP.Order.ORDER_NO, + DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", + STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), + PREP_PERSON = trans.UserCode, + FINISH_TIME = DateTime.Now, + REQ_PERSON = trans.UserCode, + DLVY_TIME = DateTime.Now, + }; + trans.CurPREP.Order.Batchs.Add(batch); + + foreach (var item in trans.CurPREP.Order.SourceDetails) + { + item.QTY_ACT_DLVY = item.QTY_ACT_REQ; + } + trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); + var orders = trans.MainDB.Queryable<BIZ_WMS_TRANSFER>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).IncludesAllFirstLayer().ToList(); + foreach (var order in orders) + { + order.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue(); + order.OUT_WH_CODE = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.WH_CODE).Distinct()); + foreach (var dtl in order.Details) + { + dtl.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue(); + dtl.OUT_WH_CODE = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.WH_CODE).Distinct()); + dtl.QTY_OUT = dtl.QTY_REQ; + dtl.OUT_LOTNO = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.LOTNO).Distinct()); + } + order.SnList ??= new(); + foreach (var sn in trans.CurPREP.Order.SnList) + { + var dtl = order.Details.Where(q => q.ITEM_CODE == sn.ITEM_CODE).First(); + order.SnList.Add(new() + { + AUTH_ORG = dtl.AUTH_ORG, + ORDER_NO = dtl.ORDER_NO, + ORDER_LINE = dtl.ORDER_LINE, + SN = sn.SN, + STATUS = sn.STATUS, + ITEM_CODE = sn.ITEM_CODE, + QTY = sn.QTY, + LOTNO = sn.LOTNO, + OUT_WH_CODE = sn.WH_CODE, + OUT_REGION_CODE = sn.REGION_CODE, + OUT_SHELF_CODE = sn.SHELF_CODE, + OUT_LOCATION_CODE = sn.LOCATION_CODE, + OUT_TIME = DateTime.Now, + }); + } + } + var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList(); + var history = new List<WMS_ITEM_HIS>(); + foreach(var item in items) + { + item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); + history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]")); + } + + //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄 + var db = trans.GetCommitDB(); + var dbTran = db.UseTran(() => + { + db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); + db.Insertable(batch, trans.UserCode).ExecuteCommand(); + db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO) + .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand(); + db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); + db.Insertable(history, trans.UserCode).ExecuteCommand(); + db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.OUT_WH_CODE }).ExecuteCommand(); + db.Updateable(orders.SelectMany(q => q.Details).ToList(), trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.OUT_WH_CODE, q.QTY_OUT, q.OUT_LOTNO }).ExecuteCommand(); + db.Storageable(orders.SelectMany(q => q.SnList).ToList(), trans.UserCode).ToStorage().AsInsertable.ExecuteCommand(); + }); + if (dbTran.IsSuccess) + { + //action.LocaleMsg = Biz.L($"璋冩嫧鍗曞彂鏂欏畬鎴愶紝鍗曞彿濡備笅锛歿0}"); action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.Success", string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); } else @@ -319,5 +703,6 @@ } return action; } + }//endClass } \ No newline at end of file -- Gitblit v1.9.3