using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using Kingdee.BOS.Core.Bill;
|
using Kingdee.BOS.Core.Bill.PlugIn;
|
using Kingdee.BOS.Core.DynamicForm;
|
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
|
using Kingdee.BOS.Core.Metadata;
|
using Kingdee.BOS.Core.Metadata.EntityElement;
|
using Kingdee.BOS.Orm.DataEntity;
|
using Kingdee.BOS.ServiceHelper;
|
using Newtonsoft.Json.Linq;
|
using ZD.Cloud.Logger;
|
using ZD.Cloud.WebApi;
|
using Demo.Model.Model;
|
using System.Diagnostics;
|
using System.Linq;
|
using Kingdee.BOS.Core.Bill.PlugIn.Args;
|
|
namespace Demo.BillView.PRD
|
{
|
/// <summary>
|
/// 生产用料清单保存 刷新日计划用料清单数据
|
/// </summary>
|
[Description("生产用料清单保存表单插件")]
|
[Kingdee.BOS.Util.HotUpdate]
|
public class Pro_PPBomSave : AbstractBillPlugIn
|
{
|
CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/");
|
public override void AfterSave(AfterSaveEventArgs e)
|
{
|
base.AfterSave(e);
|
try
|
{
|
string a;
|
string sql = "";
|
|
//var FID = this.View.Model.GetPKValue();
|
var fBillNo = this.View.Model.GetValue("FBILLNO");
|
Stopwatch sw = new Stopwatch();
|
sw.Start();//开始计时
|
//锁定的日计划不生成
|
try
|
{
|
//变更 先去删除调整过的数据
|
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.FNumerator/t4.FDenominator) *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> DayPlanMaterial = new List<DayPlanMaterial>();
|
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(),
|
|
});
|
}
|
LogHelper.Info($"日计划用料清单,数据准备完成,保存到Model实体,总行数:{DayPlanMaterial.Count},耗时:" + sw.Elapsed);
|
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))
|
{
|
LogHelper.Info("日计划用料清单批量执行,记录循环的当前条数" + i);
|
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<List<Dictionary<string, string>>>(Success);
|
List<string> ls = new List<string>();
|
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);
|
//JArray array = JArray.Parse(m);
|
//for (int mm = 0; mm < array.Count; mm++)
|
//{
|
// JObject b = JObject.Parse(array[mm].ToString());
|
// var id = b["ID"].ToString();
|
//}
|
|
}
|
if (saveIsSuc != "TRUE")
|
{
|
LogHelper.Error("日计划用料清单列表生成失败:" + jsonRoot.ToString());
|
this.View.ShowMessage(saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString());
|
}
|
Fentity = new JArray();
|
}
|
i++;
|
}
|
}
|
sw.Stop();//结束计时
|
LogHelper.Info("生成日计划用料清单运行总时长:" + sw.Elapsed);
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error("日计划用料清单+" + ex.Message.ToString());
|
}
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
}
|
|
public override void BeforeSave(BeforeSaveEventArgs e)
|
{
|
base.BeforeSave(e);
|
var fBillNo = this.View.Model.GetValue("FBILLNO");
|
string 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];
|
string result = "保存失败,修改后将要更新的日计划用料清单数据低于领料或调拨数量";
|
if (dt.Rows.Count > 0)
|
{
|
foreach (DataRow dr in dt.Rows)
|
{
|
result += $"日计划用料清单单号:{dr["FBILLNO"].ToString()},分录行号:{dr["FSEQ"]}对应的物料编码{dr["FNUMBER"]}";
|
}
|
this.View.ShowErrMessage(result);
|
}
|
|
}
|
}
|
}
|