using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.App;
namespace JDSample.ServicePlugIn.Operation
{
[Description("生成BOM")]
public class S160222CreateBOMOpPlug : AbstractOperationServicePlugIn
{
/// <summary>
/// 销售订单【保存】后调用此方法
/// 逻辑:根据销售订单明细分录中的物料以及bom分录中的信息进行对比后 生成BOM
/// </summary>
/// <param name="e"></param>
public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
if (e.DataEntitys != null && e.DataEntitys.Count<DynamicObject>() > 0)
{
foreach (DynamicObject item in e.DataEntitys)
{
CreateBOM(item);//生成BOM清单【私有方法】
}
}
}
private void CreateBOM(DynamicObject xsddInfo)
{
List<DynamicObject> billList = new List<DynamicObject>();
DynamicObjectCollection mxEntryCol = (DynamicObjectCollection)xsddInfo["SaleOrderEntry"]; //销售订单明细分录
DynamicObjectCollection bomEntryCol = (DynamicObjectCollection)xsddInfo["SaleOrderHTBOM"]; //销售订单BOM分录
for (int i = 0; i < mxEntryCol.Count; i++)
{
DynamicObject mxEntryInfo = mxEntryCol[i];
//创建【物料清单】formmetadata
ISetStatusService setBillStatus = Kingdee.BOS.App.ServiceHelper.GetService<ISetStatusService>();
IMetaDataService metaService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>();
FormMetadata zxMeta = metaService.Load(this.Context, "ENG_BOM") as FormMetadata; //物料清单
BusinessInfo info = zxMeta.BusinessInfo;
IViewService ivs = ServiceHelper.GetService<IViewService>();
FormMetadata csbomMetadata = metaService.Load(this.Context, "ENG_BOM") as FormMetadata; //物料
BusinessInfo csbomInfo = csbomMetadata.BusinessInfo;
DynamicObject csbomMaterial = ivs.LoadSingle(this.Context, "100793", csbomInfo.GetDynamicObjectType());
DynamicObject bomObject = new DynamicObject(info.GetDynamicObjectType()); //物料清单BOM
//DynamicObjectCollection zxEntitys = new DynamicObjectCollection(info.GetEntryEntity("FEntity").DynamicObjectType); //分录集合
DynamicObjectCollection bomEntitys = bomObject["TreeEntity"] as DynamicObjectCollection;
bomEntitys.Clear();
//父项物料
DynamicObject mxEntryMaInfo = (DynamicObject)mxEntryInfo["MaterialId"];
BaseDataField wlInfo = info.GetField("FMATERIALID") as BaseDataField;
wlInfo.RefIDDynamicProperty.SetValue(bomObject, mxEntryMaInfo["Id"]); //物料Id
var wlObjs = ivs.LoadFromCache(this.Context, new object[] { mxEntryMaInfo["Id"] }, wlInfo.RefFormDynamicObjectType);
if (wlObjs.Count() > 0)
wlInfo.DynamicProperty.SetValue(bomObject, wlObjs[0]);
//父项物料单位
DynamicObject mxEntryUnitInfo = (DynamicObject)mxEntryInfo["UnitId"];
BaseDataField wldwInfo = info.GetField("FUNITID") as BaseDataField;
wldwInfo.RefIDDynamicProperty.SetValue(bomObject, mxEntryUnitInfo["Id"]); //单位Id
var wldwObjs = ivs.LoadFromCache(this.Context, new object[] { mxEntryUnitInfo["Id"] }, wldwInfo.RefFormDynamicObjectType);
if (wldwObjs.Count() > 0)
wldwInfo.DynamicProperty.SetValue(bomObject, wldwObjs[0]);
//父项物料基本单位
DynamicObject mxUnitInfo = (DynamicObject)mxEntryInfo["BaseUnitId"];
BaseDataField wlUnitInfo = info.GetField("FBaseUnitId") as BaseDataField;
wldwInfo.RefIDDynamicProperty.SetValue(bomObject, mxUnitInfo["Id"]); //单位Id
var wlUnitObjs = ivs.LoadFromCache(this.Context, new object[] { mxUnitInfo["Id"] }, wlUnitInfo.RefFormDynamicObjectType);
if (wlUnitObjs.Count() > 0)
wlUnitInfo.DynamicProperty.SetValue(bomObject, wlUnitObjs[0]);
//成品率需大于零
bomObject["YIELDRATE"] = 100;
//创建组织
BaseDataField cjzzInfo = info.GetField("FCreateOrgId") as BaseDataField;
cjzzInfo.RefIDDynamicProperty.SetValue(bomObject, 100001);
var cjzzObjs = ivs.LoadFromCache(this.Context, new object[] { 100001 }, cjzzInfo.RefFormDynamicObjectType);
if (cjzzObjs.Count() > 0)
cjzzInfo.DynamicProperty.SetValue(bomObject, cjzzObjs[0]);
//使用组织
BaseDataField syzzInfo = info.GetField("FUseOrgId") as BaseDataField;
syzzInfo.RefIDDynamicProperty.SetValue(bomObject, 100001);
var syzzObjs = ivs.LoadFromCache(this.Context, new object[] { 100001 }, syzzInfo.RefFormDynamicObjectType);
if (syzzObjs.Count() > 0)
syzzInfo.DynamicProperty.SetValue(bomObject, syzzObjs[0]);
//单据类型
BaseDataField djlxInfo = info.GetField("FBILLTYPE") as BaseDataField;
djlxInfo.RefIDDynamicProperty.SetValue(bomObject, "683e2791298b4e79974ef3d2adc187ff");
var djlxObjs = ivs.LoadFromCache(this.Context, new object[] { "683e2791298b4e79974ef3d2adc187ff" }, djlxInfo.RefFormDynamicObjectType);
if (djlxObjs.Count() > 0)
djlxInfo.DynamicProperty.SetValue(bomObject, djlxObjs[0]);
//BOM分类
bomObject["BOMCATEGORY"] = 1; //默认值
//BOM用途
bomObject["BOMUSE"] = 99; //默认值
//禁用状态
bomObject["ForbidStatus"] = "A"; //禁用状态
for (int j = 0; j < bomEntryCol.Count; j++)
{
DynamicObject bomEntryInfo = bomEntryCol[j]; //bom明细分录的信息
DynamicObject bomEntryMaterial = (DynamicObject)bomEntryInfo["F_ld_gm"];
if (bomEntryMaterial["ID"].ToString().Equals(mxEntryMaInfo["Id"].ToString()))
{ //当bom清单分录中的柜名 与 明细中的物料相等时 添加物料清单的子项物料
// ---- 分割线 begin ----
DynamicObject entry = new DynamicObject(bomEntitys.DynamicCollectionItemPropertyType);
//序号
entry["Seq"] = j + 1;
//项次
entry["ReplaceGroup"] = j;
//工序
entry["OPERID"] = 10;
//是否发损耗
entry["FISGETSCRAP"] = 1;
//变更类型
entry["ChangeType"] = 1;
//变更时间
entry["ChangeTime"] = DateTime.Now;
//子项明细物料
BaseDataField zxwlInfo = info.GetField("FMATERIALIDCHILD") as BaseDataField;
zxwlInfo.RefIDDynamicProperty.SetValue(entry, ((DynamicObject)bomEntryInfo["F_ld_bjmx"])["Id"]); //物料Id
var zxwlObjs = ivs.LoadFromCache(this.Context, new object[] { ((DynamicObject)bomEntryInfo["F_ld_bjmx"])["Id"] }, zxwlInfo.RefFormDynamicObjectType);
if (zxwlObjs.Count() > 0)
zxwlInfo.DynamicProperty.SetValue(entry, zxwlObjs[0]);
//子项类型 枚举
entry["MATERIALTYPE"] = 1; //默认值
//子项物料单位 BaseUnitId
FormMetadata bomEntryMeta = metaService.Load(this.Context, "BD_MATERIAL") as FormMetadata; //物料
BusinessInfo bomInfo = bomEntryMeta.BusinessInfo;
DynamicObject bomMaterial = ivs.LoadSingle(this.Context, ((DynamicObject)bomEntryInfo["F_ld_bjmx"])["Id"], bomInfo.GetDynamicObjectType());
DynamicObjectCollection baseMaterial = (DynamicObjectCollection)bomMaterial["MaterialBase"];
DynamicObject unitInfo = (DynamicObject)baseMaterial[0]["BaseUnitId"];
BaseDataField zxwldwInfo = info.GetField("FCHILDUNITID") as BaseDataField;
zxwldwInfo.RefIDDynamicProperty.SetValue(entry, unitInfo["Id"]); //Id
var zxwldwObjs = ivs.LoadFromCache(this.Context, new object[] { unitInfo["Id"] }, zxwldwInfo.RefFormDynamicObjectType);
if (zxwldwObjs.Count() > 0)
zxwldwInfo.DynamicProperty.SetValue(entry, zxwldwObjs[0]);
//货主类型
entry["OWNERTYPEID"] = "BD_OwnerOrg";
//用量类型 枚举
entry["DOSAGETYPE"] = 2;
//用量份子、分母
entry["NUMERATOR"] = 1;
entry["DENOMINATOR"] = 1;
//基本单位分子、分母
entry["BaseNumerator"] = 1;
entry["BaseDenominator"] = 1;
//生效日期、失效日期
entry["EFFECTDATE"] = DateTime.Now; //生效日期
entry["EXPIREDATE"] = DateTime.Parse("9999-12-31"); //失效日期
//发料方式
entry["ISSUETYPE"] = 1;
//时间单位
entry["FTIMEUNIT"] = 1;
bomEntitys.Add(entry);
// ---- 分割线 end ----
} // if mxEntryMaterial == bomEntryMaterial end
} // for bomEntry end
ISaveService iSaveService = ServiceHelper.GetService<ISaveService>();
DynamicObject[] objResults = new DynamicObject[] { bomObject };
IOperationResult result = iSaveService.Save(this.Context, info, objResults);
if ((result.ValidationErrors != null && result.ValidationErrors.Count > 0)
|| (result.OperateResult != null && result.OperateResult.Count > 0))
{
result.IsSuccess = false;
}
//获取单据状态转换服务
ISetStatusService setStatusService = Kingdee.BOS.App.ServiceHelper.GetService<ISetStatusService>();
List<KeyValuePair<object, object>> lstKeyValuePairs = new List<KeyValuePair<object, object>>();
KeyValuePair<object, object> keyValuePair = new KeyValuePair<object, object>(bomObject[0], "FID");
//获取提交服务
ISubmitService submitService = Kingdee.BOS.App.ServiceHelper.GetService<ISubmitService>();
submitService.Submit(this.Context, info, new object[] { bomObject[0] }, "Submit");
//IOperationResult auditResult = setStatusService.SetBillStatus(this.Context, info, lstKeyValuePairs, null, "Audit");
} //for mxEntry end
} //create bomEntry end
}
}
推荐阅读