[分享]金蝶云星空-树形单据体控件原创
金蝶云社区-OYoung
OYoung
33人赞赏了该文章 3587次浏览 未经作者许可,禁止转载编辑于2020年10月22日 10:27:09

1、效果展示

image.png


2、关键代码,根据BOM版本获取该BOM版本下BOM的结构


private List<List<DynamicObject>> GetBomTrees(List<DynamicObject> expandResult)

        {

            List<List<DynamicObject>> dynamicObjectListList = new List<List<DynamicObject>>();

            List<DynamicObject> list1 = expandResult.Where(x => Convert.ToInt32(x["BOMLevel"]) == 0).ToList();

            Dictionary<int, IGrouping<int, DynamicObject>> dictionary = expandResult.GroupBy(x => Convert.ToInt32(x["BOMLevel"])).ToDictionary(x => x.Key);

            int num1 = expandResult.Max<DynamicObject>((Func<DynamicObject, int>)(x => Convert.ToInt32(x["BOMLevel"])));

            foreach (DynamicObject dynamicObject1 in list1)

            {

                List<DynamicObject> dynamicObjectList = new List<DynamicObject>();

                HashSet<string> parentRowIds = new HashSet<string>();

                parentRowIds.Add(Convert.ToString(dynamicObject1["RowId"]));

                dynamicObjectList.Add(dynamicObject1);

                for (int key = 1; key <= num1; ++key)

                {

                    IGrouping<int, DynamicObject> source = (IGrouping<int, DynamicObject>)null;

                    if (dictionary.TryGetValue(key, out source))

                    {

                        List<DynamicObject> list2 = source.Where(x => parentRowIds.Contains(Convert.ToString(x["ParentEntryId"]))).ToList();

                        if (list2 == null)

                        {

                            int num2 = num1 + 1;

                            break;

                        }

                        parentRowIds.Clear();

                        foreach (DynamicObject dynamicObject2 in list2)

                        {

                            dynamicObjectList.Add(dynamicObject2);

                            parentRowIds.Add(Convert.ToString(dynamicObject2["RowId"]));

                        }

                    }

                }

                dynamicObjectListList.Add(dynamicObjectList);

            }

            return dynamicObjectListList;

        }


3、树形单据体的所有参数设置

private MemBomExpandOption_ForPSV GetBomQueryOption()

        {

            MetaDataServiceHelper.GetFormMetaData(this.Context, "SAL_SaleOrder");

            MemBomExpandOption_ForPSV expandOptionForPsv = new MemBomExpandOption_ForPSV();

            expandOptionForPsv.ExpandLevelTo = 0;

            expandOptionForPsv.ExpandVirtualMaterial = false;

            expandOptionForPsv.DeleteVirtualMaterial = false;

            expandOptionForPsv.DeleteSkipRow = false;

            expandOptionForPsv.ExpandSkipRow = false;

            expandOptionForPsv.IsShowOutSource = false;

            expandOptionForPsv.BomExpandId = SequentialGuid.NewGuid().ToString();

            expandOptionForPsv.ParentCsdYieldRate = false;

            expandOptionForPsv.ChildCsdYieldRate = false;

            expandOptionForPsv.CsdSubstitution = true;

            expandOptionForPsv.Option.SetVariableValue("IsSimpleExpand", (object)true);

            return expandOptionForPsv;

        }

4、根据返回的BOM物料信息对树形单据体进行遍历赋值


private void DoBomExpand()

        {

            DynamicObjectCollection objectCollection1 = this.Model.DataObject["SaleOrderEntry"] as DynamicObjectCollection; //明细单据体

            DynamicObjectCollection objectCollection2 = this.Model.DataObject["FBottomEntity"] as DynamicObjectCollection; //树形单据体

            if (!string.IsNullOrEmpty(Convert.ToString(objectCollection1[0]["MaterialId"])))

            {


                List<DynamicObject> lstBomOpenSource = new List<DynamicObject>();

                foreach (DynamicObject dynamicObject in objectCollection1)

                {

                    BomForwardSourceDynamicRow instance = (BomForwardSourceDynamicRow)BomForwardSourceDynamicRow.CreateInstance();

                    instance.MaterialId_Id = Convert.ToInt32(dynamicObject["MaterialId_Id"]);

                    instance.BomId_Id = Convert.ToInt32(dynamicObject["BomId_Id"]);

                    instance.NeedQty = new Decimal(100);

                    instance.NeedDate = new DateTime?(DateTime.Today);

                    instance.WorkCalId_Id = 0L;

                    instance.TimeUnit = 1.ToString();

                    lstBomOpenSource.Add(instance.DataEntity);

                }

                MemBomExpandOption_ForPSV bomQueryOption = this.GetBomQueryOption();

                //返回结果集

                List<List<DynamicObject>> bomTrees = this.GetBomTrees((BomExpandServiceHelper.ExpandBomForwardMen(this.View.Context, lstBomOpenSource, (MemBomExpandOption)bomQueryOption)["BomExpandResult"] as DynamicObjectCollection).ToList());


                Entity entity2 = this.View.BusinessInfo.GetEntity("FBZBottomEntity");

                this.Model.DeleteEntryData("FBZBottomEntity");

                Entity entity = this.View.BusinessInfo.GetEntity("FBottomEntity");

                this.Model.DeleteEntryData("FBottomEntity");

                this.Model.ClearNoDataRow();

                foreach (IEnumerable<DynamicObject> source in bomTrees)

                {

                    List<IGrouping<int, DynamicObject>> list = source.GroupBy(x => Convert.ToInt32(x["BOMLevel"])).OrderBy(x => x.Key).ToList();

                    foreach (IEnumerable<DynamicObject> dynamicObjects in list)

                    {

                        foreach (DynamicObject dynamicObject2 in dynamicObjects)

                        {


                            int newRowIndex = 0;

                            string key1 = dynamicObject2["RowId"].ToString();

                            string key2 = dynamicObject2["ParentEntryId"].ToString();

                            long num1 = (long)dynamicObject2["BOMID_Id"];


                            #region 标准BOM

                            DynamicObject newEntryRow2 = this.Model.CreateNewEntryRow(entity2, -1, out newRowIndex);

                            this.Model.SetValue("FROWID2", key1, newRowIndex);

                            this.Model.SetValue("FPARENTROWID2", key2, newRowIndex);

                            this.Model.SetValue("FBomLevel2", dynamicObject2["BomLevel"], newRowIndex);

                            this.Model.SetValue("F_MaterialBom2", dynamicObject2["MaterialId_Id"], newRowIndex);

                            this.Model.SetValue("F_DHQty", dynamicObject2["Numerator"], newRowIndex);

                            #endregion

                        }

                    }

                }

                this.View.UpdateView("FBottomEntity");

                this.View.UpdateView("FBZBottomEntity");

            }

        }


5、最终在物料值更新时调用DoBomExpand这个方法就可以了。案例中继承的是表单插件AbstractBillPlugIn







赞 33