From 3e51df239ddacd03fd8160cf8d0ee262c4cf32c0 Mon Sep 17 00:00:00 2001 From: 王 垚 <1402714037@qq.com> Date: 星期二, 23 三月 2021 15:14:27 +0800 Subject: [PATCH] 日计划用料清单下推后,建立直接调拨单与生产用料清单关联关系 --- src/BLL/Demo.BillView/Demo.BillView.csproj | 1 src/BLL/Demo.BillView/PRD/Pro_DayPlanPushZJDB.cs | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 239 insertions(+), 0 deletions(-) diff --git a/src/BLL/Demo.BillView/Demo.BillView.csproj b/src/BLL/Demo.BillView/Demo.BillView.csproj index f9b3cb4..5196cd6 100644 --- a/src/BLL/Demo.BillView/Demo.BillView.csproj +++ b/src/BLL/Demo.BillView/Demo.BillView.csproj @@ -221,6 +221,7 @@ <Compile Include="PRD\ProCompleteAnalysisDetails.cs" /> <Compile Include="PRD\Pro_DayPlanCheckSelectMenu.cs" /> <Compile Include="PRD\Pro_DayPlanSelectMenu.cs" /> + <Compile Include="PRD\Pro_DayPlanPushZJDB.cs" /> <Compile Include="PRD\Pro_MaterialRequisitionAuditDayPlan.cs" /> <Compile Include="PRD\Pro_TlPushAudit.cs" /> <Compile Include="PRD\Pro_ScDayImport.cs" /> diff --git a/src/BLL/Demo.BillView/PRD/Pro_DayPlanPushZJDB.cs b/src/BLL/Demo.BillView/PRD/Pro_DayPlanPushZJDB.cs new file mode 100644 index 0000000..8306c7d --- /dev/null +++ b/src/BLL/Demo.BillView/PRD/Pro_DayPlanPushZJDB.cs @@ -0,0 +1,238 @@ +锘縰sing System; +using System.Collections.Generic; +using Kingdee.BOS.Util; +using Kingdee.BOS.Core.Metadata; +using Kingdee.BOS.Core.Metadata.EntityElement; +using Kingdee.BOS.Core.DynamicForm.PlugIn; +using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; +using Kingdee.BOS.Orm.DataEntity; +using Kingdee.BOS.Contracts; +using Kingdee.BOS.App; +using Kingdee.BOS.Core.Metadata.FieldElement; +using System.ComponentModel; +using Kingdee.BOS.ServiceHelper; +using Kingdee.K3.SCM.App; + +namespace Demo.DynamicForm.PRD +{ + /// <summary> + /// 鎻掍欢绀轰緥锛氬紩鍏ラ攢鍞嚭搴撳崟锛屽缓绔嬩笌閿�鍞鍗曠殑鍏宠仈 + /// </summary> + /// <remarks> + /// 瑕佹眰锛� + /// 1. 闇�瑕佸紩鍏ュ崟鎹綋鐨勬簮鍗曠被鍨嬨�佹簮鍗曠紪鍙峰瓧娈� + /// 2. 鏈彃浠舵寕鍦ㄩ攢鍞嚭搴撳崟鐨勪繚瀛樻搷浣滀笂 + /// 鍑哄簱鍏宠仈閿�鍞鍗� + /// </remarks> + [Description("鏃ヨ鍒掔敤鏂欐竻鍗曚笅鎺ㄥ悗锛屽缓绔嬬洿鎺ヨ皟鎷ㄥ崟涓庣敓浜х敤鏂欐竻鍗曞叧鑱斿叧绯�")] + [HotUpdate] + public class Pro_DayPlanPushZJDB : AbstractOperationServicePlugIn + { + public override void OnPreparePropertys(PreparePropertysEventArgs e) + { + base.OnPreparePropertys(e); + e.FieldKeys.Add("FSrcBillType"); + e.FieldKeys.Add("FSrcBillNo"); + e.FieldKeys.Add("FID"); + e.FieldKeys.Add("FTreeEntity_FEntryID"); + e.FieldKeys.Add("FBillNo"); + e.FieldKeys.Add("FBFLowId"); + e.FieldKeys.Add("FMaterialId"); + e.FieldKeys.Add("FBaseUnitQty"); + e.FieldKeys.Add("FBaseJoinQty"); + } + private const string POFormId = "PRD_PPBOM"; + public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) + { + base.BeforeExecuteOperationTransaction(e); + HashSet<string> poBillNos = new HashSet<string>(); + Entity entity = this.BusinessInfo.GetEntity("FBillEntry");//鑾峰彇鏄庣粏淇℃伅 + Entity linkEntry = this.BusinessInfo.GetEntity("FBillEntry_Link"); + Field fldSrcFormId = this.BusinessInfo.GetField("FSrcBillType"); + Field fldSrcBillNo = this.BusinessInfo.GetField("FSrcBillNo"); + // 瀵瑰崟鎹綋杩涜寰幆锛屽彇鍏宠仈鐨勬簮鍗曠紪鍙� + foreach (var billObj in e.SelectedRows) + { + DynamicObjectCollection entryRows = entity.DynamicProperty.GetValue(billObj.DataEntity) + as DynamicObjectCollection; + foreach (var entryRow in entryRows) + { + string srcFormId = ""; + string srcSrcBillNo = ""; + string FPPBOMFENTRYID = ""; + try + { + srcFormId = "PRD_PPBOM"; + srcSrcBillNo = entryRow["FPPBOMBILLNO"].ToString(); + string FPPBOMFID = entryRow["FPPOMFID"].ToString(); + FPPBOMFENTRYID = entryRow["FPPBOMFENTRYID"].ToString(); + } + catch (Exception) + { + } + if (string.IsNullOrWhiteSpace(srcFormId) + || string.IsNullOrWhiteSpace(srcSrcBillNo) + ) + {// 婧愬崟涓嶆槸閲囪喘璁㈠崟锛岀暐杩� + continue; + } + // 婧愬崟缂栧彿宸茬粡鐧昏锛屼笉鍐嶉噸澶嶈褰曪紝鐣ヨ繃 + if (poBillNos.Contains(srcSrcBillNo)) continue; + // Link宸茬粡璁板綍浜嗘簮鍗曚俊鎭紝鐣ヨ繃 + //DynamicObjectCollection linkRows = linkEntry.DynamicProperty.GetValue(entryRow) + // as DynamicObjectCollection; + //if (linkRows.Count > 0) continue; + bool Ret = SourceVerification(Convert.ToString(entryRow["Id"])); + if (!Ret) continue; + + poBillNos.Add(srcSrcBillNo); + } + } + if (poBillNos.Count == 0) return; + DynamicObject[] poObjs = this.LoadPurchaseOrder(poBillNos); + if (poObjs == null || poObjs.Length == 0) return; + Dictionary<string, Dictionary<string, DynamicObject>> dctAllBills = this.BuildDictionary(poObjs); + string srcTableNumber = this.GetPOEntryTableNumber(); + List<DynamicObject> allNewLinkRows = new List<DynamicObject>(); + // 寰幆鍗曟嵁浣擄紝涓哄崟鎹綋锛屽缓绔嬭捣婧愬崟鍏宠仈淇℃伅锛� + foreach (var billObj in e.SelectedRows) + { + DynamicObjectCollection entryRows = entity.DynamicProperty.GetValue(billObj.DataEntity) + as DynamicObjectCollection; + foreach (var entryRow in entryRows) + { + string srcFormId = "PRD_PPBOM"; + string srcSrcBillNo = entryRow["FPPBOMBILLNO"].ToString(); + string FPPBOMFID = entryRow["FPPOMFID"].ToString(); + string FPPBOMFENTRYID = entryRow["FPPBOMFENTRYID"].ToString(); + + if (string.IsNullOrWhiteSpace(srcFormId) + || string.IsNullOrWhiteSpace(srcSrcBillNo) + ) + {// 婧愬崟涓嶆槸閿�鍞鍗曪紝鐣ヨ繃 + continue; + } + Dictionary<string, DynamicObject> dctOneBill = null; + if (dctAllBills.TryGetValue(srcSrcBillNo, out dctOneBill) == false) continue; + DynamicObject materialObj = entryRow["MaterialId"] as DynamicObject; + if (materialObj == null) continue; + string materialNumber = Convert.ToString(materialObj["number"]); + DynamicObject srcRow = null; + if (dctOneBill.TryGetValue(materialNumber, out srcRow) == false) continue; + // Link宸茬粡璁板綍浜嗘簮鍗曚俊鎭紝鐣ヨ繃 + bool Ret = SourceVerification(Convert.ToString(entryRow["Id"])); + if (!Ret) continue; + + DynamicObjectCollection linkRows = linkEntry.DynamicProperty.GetValue(entryRow) + as DynamicObjectCollection; + DynamicObject linkRow = new DynamicObject(linkEntry.DynamicObjectType); + linkRow["STableName"] = srcTableNumber; + this.FillLinkRow(srcRow, entryRow, linkRow); + linkRows.Add(linkRow); + allNewLinkRows.Add(linkRow); + } + } + // 涓烘柊寤虹殑婧愬崟鍏宠仈淇℃伅锛岃缃唴鐮� + IDBService dbService = ServiceHelper.GetService<IDBService>(); + dbService.AutoSetPrimaryKey(this.Context, allNewLinkRows.ToArray(), linkEntry.DynamicObjectType); + } + + /// <summary> + /// 鍔犺浇鐩稿叧鐨勯攢鍞鍗曟暟鎹� + /// </summary> + /// <param name="poBillNos"></param> + /// <returns></returns> + private DynamicObject[] LoadPurchaseOrder(HashSet<string> poBillNos) + { + IViewService viewService = ServiceHelper.GetService<IViewService>(); + string formId = "PRD_PPBOM"; + + // 鎸囧畾闇�瑕佸姞杞界殑閿�鍞鍗曞瓧娈� + List<SelectorItemInfo> fields = new List<SelectorItemInfo>(); + fields.Add(new SelectorItemInfo("FID")); // 鍗曟嵁涓婚敭 + fields.Add(new SelectorItemInfo("FTreeEntity_FEntryID")); // 鍗曟嵁浣撲富閿� + fields.Add(new SelectorItemInfo("FBillNo")); // 鍗曟嵁缂栧彿 + fields.Add(new SelectorItemInfo("FBFLowId")); // 涓氬姟娴佺▼ + fields.Add(new SelectorItemInfo("FMaterialId")); // 鐗╂枡 + fields.Add(new SelectorItemInfo("FMaterialID2")); // 鐗╂枡 + fields.Add(new SelectorItemInfo("FBASENEEDQTY")); // 鍩烘湰鍗曚綅鏁伴噺 + fields.Add(new SelectorItemInfo("FBASEPICKEDQTY")); // 鍩烘湰鍗曚綅鍏宠仈鏁伴噺 + fields.Add(new SelectorItemInfo("FBFLOWID")); // + + // 鎸囧畾杩囨护鏉′欢 + string filter = string.Format(" FBillNo IN ('{0}') ", string.Join("','", poBillNos)); + OQLFilter ofilter = OQLFilter.CreateHeadEntityFilter(filter); + var objs = viewService.Load(this.Context, formId, fields, ofilter); + return objs; + } + /// <summary> + /// 鎶婇攢鍞鍗曞崟鎹綋琛屾瀯寤轰负瀛楀吀锛欴ictionary(鍗曟嵁缂栧彿, Dictionary(鐗╂枡缂栫爜, 婧愬崟琛�)); + /// </summary> + /// <param name="poObjs"></param> + /// <returns></returns> + private Dictionary<string, Dictionary<string, DynamicObject>> BuildDictionary(DynamicObject[] poObjs) + { + Dictionary<string, Dictionary<string, DynamicObject>> dctAllBills = + new Dictionary<string, Dictionary<string, DynamicObject>>(); + foreach (var poObj in poObjs) + { + string billNo = Convert.ToString(poObj["BillNo"]); + Dictionary<string, DynamicObject> dctOneBill = new Dictionary<string, DynamicObject>(); + DynamicObjectCollection entryRows = poObj["PPBomEntry"] as DynamicObjectCollection; + foreach (var entryRow in entryRows) + { + DynamicObject materialObj = entryRow["MaterialId"] as DynamicObject; + if (materialObj == null) continue; + string materialNumber = Convert.ToString(materialObj["number"]); + dctOneBill[materialNumber] = entryRow; + } + dctAllBills.Add(billNo, dctOneBill); + } + return dctAllBills; + } + /// <summary> + /// 鑾峰彇閿�鍞鍗曞叧鑱斾富瀹炰綋琛ㄦ牸缂栫爜 + /// </summary> + /// <returns></returns> + private string GetPOEntryTableNumber() + { + IBusinessFlowService bfMetaService = ServiceHelper.GetService<IBusinessFlowService>(); + var tableDefine = bfMetaService.LoadTableDefine(this.Context, POFormId, "FEntity"); + return tableDefine.TableNumber; + } + /// <summary> + /// 濉啓婧愬崟淇℃伅 + /// </summary> + /// <param name="srcRow">婧愬崟琛�</param> + /// <param name="toRow">鐩爣鍗曡</param> + /// <param name="linkRow">鍏宠仈琛�</param> + private void FillLinkRow(DynamicObject srcRow, DynamicObject toRow, DynamicObject linkRow) + { + //鍓╀綑璋冩嫧鏁伴噺 + decimal remainQty = DBServiceHelper.ExecuteScalar<decimal>(Context, $"select FMustQty -isnull(FSELTRANSLATEQTY,0) from T_PRD_PPBOMENTRY t1 left join T_PRD_PPBOMENTRY_Q t2 on t1.FENTRYID = t2.FENTRYID where t1.FENTRYID={toRow["FPPBOMFENTRYID"]?.ToString()}",0); + linkRow["FlowId"] = srcRow["BFLowId_Id"]; + linkRow["FlowLineId"] = 0; + linkRow["RuleId"] = "PRD_PPBOM-STK_TransferDirect"; + linkRow["SBillId"] = ((DynamicObject)srcRow.Parent)[0]; + linkRow["SId"] = srcRow[0]; + // 鍘熷鎼哄甫閲� + linkRow["BaseQtyOld"] = remainQty;//鍓╀綑璋冩嫧鏁伴噺 + linkRow["BaseQty"] = remainQty-Convert.ToDecimal(toRow["QTY"]); //鏈闇�瑕佽皟鎷ㄦ暟閲� + } + + /// <summary> + /// 楠岃瘉鏄惁鐢熸垚杩囩敓浜х敤鏂欐竻鍗曞搴旂殑婧愬崟 + /// </summary> + /// <returns></returns> + public bool SourceVerification(string FTID) + { + string sql = $" select count(*) from T_BF_INSTANCEENTRY where FSTABLENAME= 'T_PRD_PPBOMENTRY' and FTID = '{FTID}'"; + int count = DBServiceHelper.ExecuteScalar<int>(Context, sql, 0); + if (count == 0) + return true; + else + return false; + } + + } +} -- Gitblit v1.9.1