1、效果展示
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
推荐阅读