销售订单【保存】后调用此方法生成BOM原创
金蝶云社区-疯狂的石头
疯狂的石头
10人赞赏了该文章 536次浏览 未经作者许可,禁止转载编辑于2022年04月05日 10:35:42


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

    }

}


赞 10