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;
}
}
}
}