using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.ServiceHelper; using Newtonsoft.Json.Linq; using ZD.Cloud.WebApi; using Demo.Model.Model; using System.Linq; using Kingdee.BOS.Core.DynamicForm.PlugIn; namespace Demo.BillView.PRD { /// /// 生产用料清单提交 刷新日计划用料清单数据 /// [Description("生产用料清单提交服务插件")] [Kingdee.BOS.Util.HotUpdate] public class Pro_PPBomSubmit : AbstractOperationServicePlugIn { CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/"); Dictionary dictionary = new Dictionary(); public override void OnPrepareOperationServiceOption(OnPrepareOperationServiceEventArgs e) { base.OnPrepareOperationServiceOption(e); //为了在BeginOperationTransaction里检查数据抛出异常时 //只回滚当前单据的事务,这里设置为不支持批量事务,这样BOS会 //循环为每一张单据创建事务调用操作 e.SupportTransaction = true; e.SurportBatchTransaction = false; } public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); e.FieldKeys.Add("FID"); e.FieldKeys.Add("FBillNo"); } public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e) { base.AfterExecuteOperationTransaction(e); try { string sql = ""; var fBillNo = ""; foreach (var select in e.SelectedRows) { fBillNo = select["Billno"].ToString(); if (dictionary.ContainsKey(fBillNo)) continue; //变更 先去删除调整过的数据 sql = $"/*dialect*/ exec deleteDayPlanPpbomBillSub '{fBillNo}'"; DBServiceHelper.Execute(Context, sql); sql = string.Format(@" /*dialect*/ select t1.FID,t1.FSEQ FDayPlanFSEQ,t1.FEntryID,T2.FBILLNO AS FDayPlanFBILLNO,t3.FMATERIALID,T5.FNUMBER,t1.FHMASTERDATE,t1.FHQTY,t4.FMATERIALID FMATERIALID2,T6.FNUMBER FNUMBER2,T7.FNUMBER FUNITNUMBER,t4.FNumerator,t4.FDenominator,convert(decimal(18,2),(t4.FMustQty/T3.FQTY) *t1.FHQTY) FHQtyMust,T4.FUnitID,t8.FNUMBER FUNITNUMBER2,T3.FID FPPBOM,T4.FENTRYID FPPBOMENTRYID,isnull(T9.FBillNo,'')FBillNo,t10.FNUMBER FORGNUMBER,t11.FNUMBER FHSOURCENUMBER,FSCRAPRATE,t4.FFIXSCRAPQTY,T9.FID AS DayPlanFID,t2.FSCORDERNO, t3.FMOENTRYID,t3.FBILLNO FPPBOMBILLNO,T4.FSEQ,tc.FOWNERTYPEID,tc.FOWNERID,tc.FEntrustPickOrgId,torg.FNUMBER as FORGNUMBER,t3.FMOID,Tc.FIssueType,t4.FMaterialType,t12.FEntryID as FDayPlanPpbomFEntryId FROM Sc_WorkBillSortBillSub t1 JOIN Sc_WorkBillSortBillMAIN t2 on t1.FID = t2.FID JOIN T_PRD_PPBOM T3 on T2.FPRDMOMAINID=t3.FMOID AND T2.FPRDMOENTYID=T3.FMOENTRYID JOIN T_PRD_PPBOMENTRY T4 ON T3.FID=T4.FID JOIN T_PRD_PPBOMENTRY_C Tc ON T4.FENTRYID=Tc.FENTRYID join T_ORG_Organizations torg ON tc.FOWNERID = torg.FORGID JOIN T_BD_MATERIAL T5 ON T3.FMATERIALID=T5.FMATERIALID JOIN T_BD_MATERIAL T6 ON T4.FMATERIALID=T6.FMATERIALID LEFT JOIN T_BD_UNIT T7 ON T3.FUNITID = T7.FUNITID LEFT JOIN T_BD_UNIT T8 ON T4.FUNITID = T8.FUNITID LEFT JOIN Sc_DayPlanPPBomBillMain T9 ON T1.FEntryID=T9.FDayPlanFID LEFT join Sc_DayPlanPPBomBillSub t12 on t9.FID=t12.FID and T4.FENTRYID=t12.FHPPBomEntryID LEFT join T_ORG_Organizations t10 on t2.FHPRDORGID = t10.FORGID LEFT join T_ENG_WORKCENTER t11 on t2.FHSOURCEID = t11.FID WHERE T4.FMustQty>0 and T3.FBILLNO='{0}' ", fBillNo); //LogHelper.Info("生成日计划用料清单准备数据sql:" + sql); DataSet ds = DBServiceHelper.ExecuteDataSet(Context, sql); DataTable dt = ds.Tables[0]; List DayPlanMaterial = new List(); if (dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { DayPlanMaterial.Add(new Demo.Model.Model.DayPlanMaterial { FID = dr["DayPlanFID"].ToString(), FEntryID = dr["FEntryID"].ToString(), FHDate = DateTime.Now.ToString(), FOrgId = dr["FORGNUMBER"].ToString(), FHMaterID = dr["FNUMBER"].ToString(), FHWorkDate = dr["FHMASTERDATE"].ToString(), FHQty = dr["FHQTY"].ToString(), FHUnitID = dr["FUNITNUMBER"].ToString(), FDayPlanFID = dr["FEntryID"].ToString(), FHMaterSubID = dr["FNUMBER2"].ToString(), FHUnitSubID = dr["FUNITNUMBER2"].ToString(), FHQtyMust = dr["FHQtyMust"].ToString(), FHQtySub = dr["FHQtyMust"].ToString(), FHPPBomInterID = dr["FPPBOM"].ToString(), FHPPBomEntryID = dr["FPPBOMENTRYID"].ToString(), FHSourceID = dr["FHSOURCENUMBER"].ToString(), FNumerator = dr["FNumerator"].ToString(), FDenominator = dr["FDenominator"].ToString(), FFIXSCRAPQTY = dr["FFIXSCRAPQTY"].ToString(), FHQtyScrap = dr["FSCRAPRATE"].ToString(), FMOBILLNO = dr["FSCORDERNO"].ToString(), FMOENTRYID = dr["FMOENTRYID"].ToString(), FPPBOMBILLNO = dr["FPPBOMBILLNO"].ToString(), FPPBOMFSEQ = dr["FSEQ"].ToString(), FOwnerTypeId = dr["FOWNERTYPEID"].ToString(), FOwnerID = dr["FORGNUMBER"].ToString(), FEntrustPickOrgId = dr["FORGNUMBER"].ToString(), FMOID = dr["FMOID"].ToString(), FIssueType = dr["FIssueType"].ToString(), FMaterialType = dr["FMaterialType"].ToString(), FDayPlanFSEQ = dr["FDayPlanFSEQ"].ToString(), FDayPlanFBILLNO = dr["FDayPlanFBILLNO"].ToString(), FDayPlanPpbomFEntryId = dr["FDayPlanPpbomFEntryId"].ToString(), }); } var fidList = DayPlanMaterial.Select(x => x.FEntryID).Distinct().ToList(); int i = 1; JArray Fentity = new JArray(); foreach (var item in fidList) { var _DayPlanMaterial = DayPlanMaterial.Where(x => x.FEntryID == item).ToList(); JObject model = new JObject(); if (!string.IsNullOrEmpty(_DayPlanMaterial[0].FID)) model.Add("FID", _DayPlanMaterial[0].FID); model.Add("FHDate", DateTime.Now); model.Add("FOrgId", new JObject() { ["Fnumber"] = _DayPlanMaterial[0].FOrgId });//发料组织 model.Add("FHMaterID", new JObject() { ["Fnumber"] = _DayPlanMaterial[0].FHMaterID });//物料 model.Add("FHWorkDate", _DayPlanMaterial[0].FHWorkDate);//日工单日期 FHWorkDate model.Add("FHQty", _DayPlanMaterial[0].FHQty);//主产品数量:FHQty model.Add("FHUnitID", new JObject() { ["Fnumber"] = _DayPlanMaterial[0].FHUnitID });//单位:FHUnitID model.Add("FDayPlanFID", _DayPlanMaterial[0].FDayPlanFID);//日计划工单内码 model.Add("FDayPlanFSEQ", _DayPlanMaterial[0].FDayPlanFSEQ);//日计划工单明细行号 model.Add("FDayPlanFBillNo", _DayPlanMaterial[0].FDayPlanFBILLNO);//日计划工单单据编号 JArray Entry = new JArray(); foreach (var _item in _DayPlanMaterial) { JObject ModelEnty = new JObject(); ModelEnty.Add("FHMaterSubID", new JObject() { ["Fnumber"] = _item.FHMaterSubID });//子物料FHMaterSubID ModelEnty.Add("FHUnitSubID", new JObject() { ["Fnumber"] = _item.FHUnitSubID });//单位FHUnitSubID ModelEnty.Add("FHQtyMust", _item.FHQtyMust);//应发数量FHQtyMust ModelEnty.Add("FHQtySub", _item.FHQtySub);//数量FHQtySub ModelEnty.Add("FHPPBomInterID", _item.FHPPBomInterID);//用料清单主内码FHPPBomInterID ModelEnty.Add("FHPPBomEntryID", _item.FHPPBomEntryID);//用料清单子内码FHPPBomEntryID ModelEnty.Add("FHSourceID", new JObject() { ["Fnumber"] = _item.FHSourceID });//生产资源FHSourceID ModelEnty.Add("FNumerator", _item.FNumerator);//分母 ModelEnty.Add("FDenominator", _item.FDenominator);//分子 ModelEnty.Add("FDwyl", Convert.ToDecimal(_item.FNumerator) / Convert.ToDecimal(_item.FDenominator));//单位用料 ModelEnty.Add("FFIXSCRAPQTY", _item.FFIXSCRAPQTY);//固定损耗 ModelEnty.Add("FHQtyScrap", _item.FHQtyScrap);//变动损耗率% ModelEnty.Add("FMOBILLNO", _item.FMOBILLNO);// ModelEnty.Add("FMOENTRYIDINT", _item.FMOENTRYID);// ModelEnty.Add("FPPBOMBILLNO", _item.FPPBOMBILLNO);// ModelEnty.Add("FPPBOMFSEQINT", _item.FPPBOMFSEQ);// ModelEnty.Add("FOwnerTypeId", _item.FOwnerTypeId);// ModelEnty.Add("FOwnerID", new JObject() { ["Fnumber"] = _item.FOwnerID });// ModelEnty.Add("FEntrustPickOrgId", new JObject() { ["Fnumber"] = _item.FEntrustPickOrgId });// ModelEnty.Add("FMOID", _item.FMOID);// ModelEnty.Add("FISSUETYPE", _item.FIssueType);// ModelEnty.Add("FMaterialType", _item.FMaterialType);// if (!string.IsNullOrEmpty(_item.FDayPlanPpbomFEntryId)) ModelEnty.Add("FEntryId", _item.FDayPlanPpbomFEntryId);// Entry.Add(ModelEnty); } model.Add("FEntity", Entry); Fentity.Add(model); if ((i >= 20 || i == fidList.Count) && (i % 20 == 0 || i == fidList.Count)) { JObject jsonRoot = new JObject() { ["Creator"] = "", ["NeedUpDateFields"] = new JArray(), ["NeedReturnFields"] = new JArray(), ["SubSystemId"] = "", ["IsVerifyBaseDataField"] = "false", ["IsDeleteEntry"] = "false", ["Model"] = Fentity }; CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/"); var result = cloudClient.BatchSave("Paez_Sc_DayPlanPPBomBill", jsonRoot.ToString()); JObject saveObj = JObject.Parse(result); string saveIsSuc = saveObj["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToUpper(); if (saveIsSuc == "TRUE") { var Success = saveObj["Result"]["ResponseStatus"]["SuccessEntitys"].ToString().TrimStart('{').TrimEnd('}'); var allList = Newtonsoft.Json.JsonConvert.DeserializeObject>>(Success); List ls = new List(); foreach (var it in allList) { it.TryGetValue("Id", out string value); ls.Add(value); } var resultAA = String.Join(",", ls.ToArray()); string resSql = string.Format(@"/*dialect*/ update Sc_WorkBillSortBillSub set Sc_WorkBillSortBillSub.FDAYPLANPPBOMBILLNO = Sc_DayPlanPPBomBillMain.FBILLNO from Sc_WorkBillSortBillSub join Sc_DayPlanPPBomBillMain on Sc_WorkBillSortBillSub.FEntryID = Sc_DayPlanPPBomBillMain.FDayPlanFID where Sc_DayPlanPPBomBillMain.FID in ({0})", resultAA); DBServiceHelper.Execute(Context, resSql); } if (saveIsSuc != "TRUE") { //LogHelper.Error("日计划用料清单列表生成失败:" + jsonRoot.ToString()); //this.View.ShowMessage(saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString()); } Fentity = new JArray(); } i++; } } } foreach (var item in dictionary) { ResultMessage.dataError(this.OperationResult.OperateResult, item.Key, item.Value); } } catch (Exception ex) { //LogHelper.Error("日计划用料清单列表生成失败:" + ex.Message.ToString()); } } public override void BeginOperationTransaction(BeginOperationTransactionArgs e) { base.BeginOperationTransaction(e); try { var fBillNo = ""; var sql = ""; string result = "保存失败,提交后将要更新的日计划用料清单数量少于领料或调拨数量,"; foreach (var select in e.DataEntitys) { fBillNo = select["Billno"].ToString(); sql = string.Format(@" /*dialect*/ select T9.FBILLNO,t12.FSEQ,t4.FMATERIALID,t6.FNUMBER ,convert(decimal(18,2),(t4.FNumerator/t4.FDenominator) *t1.FHQTY) FQty ,FPickedQty from Sc_WorkBillSortBillSub t1 JOIN Sc_WorkBillSortBillMAIN t2 on t1.FID = t2.FID JOIN T_PRD_PPBOM T3 on T2.FPRDMOMAINID=t3.FMOID AND T2.FPRDMOENTYID=T3.FMOENTRYID JOIN T_PRD_PPBOMENTRY T4 ON T3.FID=T4.FID JOIN T_BD_MATERIAL T6 ON T4.FMATERIALID=T6.FMATERIALID LEFT JOIN Sc_DayPlanPPBomBillMain T9 ON T1.FEntryID=T9.FDayPlanFID LEFT join Sc_DayPlanPPBomBillSub t12 on t9.FID=t12.FID and T4.FENTRYID=t12.FHPPBomEntryID WHERE T4.FMustQty>0 and T3.FBILLNO='{0}' and convert(decimal(18,2),(t4.FNumerator/t4.FDenominator) *t1.FHQTY)< t12.FPickedQty", fBillNo); DataTable dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0]; if (dt.Rows.Count > 0) { e.CancelOperation = true; foreach (DataRow dr in dt.Rows) { result += $"日计划用料清单单号:{dr["FBILLNO"].ToString()},分录行号:{dr["FSEQ"]},物料编码{dr["FNUMBER"]}"; } dictionary.Add(fBillNo, result); } } } catch (Exception ex) { //LogHelper.Error("日计划用料清单列表生成失败:" + ex.Message.ToString()); } } public static class ResultMessage {/// /// 修改提示信息 /// /// /// public static void dataError(OperateResultCollection operateResult, string billno, string message) { OperateResult operate = operateResult.Where(n => n.Number == billno).First(); operate.Message = message; operate.SuccessStatus = false; operate.MessageType = MessageType.FatalError; } } } }