组装拆卸单BOM展开携带子件货主类型的二开处理(Python实现)原创
9人赞赏了该文章
684次浏览
编辑于2022年04月28日 21:02:22
一、【需求问题】
组装拆卸时,按BOM展开后,物料清单中货主类型为客户的子项物料没有携带到组装拆卸单上,当前携带的是成品表的货主类型。
二、【功能分析】
组装拆卸单的表单插件,对BOM展开的触发操作,将当前BOM展开后子件的货主类型和货主默认赋值为成品表的货主类型和货主,并没有采用清单上设置的子项物料货主类型和货主
当前标准插件无法禁用,只能是二开插件在BOM操作触发后,再获取到BOM子项的信息,将展开后的子件物料数据中货主类型和货主重新做赋值。
之前对于组装拆卸单的二开帖子参考:
1、组装拆卸单BOM展开,成品表仓库仓位赋值到子件表仓库仓位
2、Python继承AbstractValidator实现校验器案例
核心代码Py:
import clr clr.AddReference("System") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Kingdee.BOS.App") clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference('Kingdee.BOS.DataEntity') clr.AddReference("Kingdee.BOS.App.Core") clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference("Kingdee.BOS.Contracts") from System import * from System import StringComparison from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.Metadata.FieldElement import * from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import * from System.Collections.Generic import * from Kingdee.BOS.ServiceHelper import * from Kingdee.BOS.Contracts import * from Kingdee.BOS.App.Core import * def AfterEntryBarItemClick(e): if e.BarItemKey.Equals("TBBOMEXPAND", StringComparison.OrdinalIgnoreCase): viewService = ViewService() metaService = MetaDataService() formMetaData = metaService.Load(this.Context, "ENG_BOM") products = this.View.Model.DataObject["ProductEntity"] for i in range (0, products.Count): refBomID = Convert.ToInt64(products[i]["RefBomID_Id"]) if refBomID == 0: continue bomObj = viewService.LoadSingle(this.Context, refBomID, formMetaData.BusinessInfo.GetDynamicObjectType()) if bomObj == None: continue subItems = products[0]["STK_ASSEMBLYSUBITEM"] bomTreeEntity = bomObj["TreeEntity"] for j in range (0, subItems.Count): materialId = Convert.ToInt64(subItems[j]["MaterialIDSETY_Id"]) dySubResult = filter(lambda x: x["MATERIALIDCHILD_Id"] == materialId, bomTreeEntity) dySub = List[object](dySubResult) if dySub.Count > 0: if dySub[0]["OWNERTYPEID"] == "BD_Customer": subItems[j]["OwnerTypeIDSETY"] = Convert.ToString(dySub[0]["OWNERTYPEID"]) #subItems[j]["FOwnerIDSETY_Id"] = 0 #Convert.ToInt64(dySub[0]["OWNERID_Id"]) this.Model.SetValue("FOwnerIDSETY", Convert.ToInt64(dySub[0]["OWNERID_Id"]), j);
C#:
public override void AfterEntryBarItemClick(AfterBarItemClickEventArgs e) { switch (e.BarItemKey.ToUpperInvariant()) { case "TBBOMEXPAND": this.BomExpand(); break; } } private void BomExpand() { IViewService viewService = SCM.Contracts.ServiceFactory.GetService<IViewService>(this.Context); IMetaDataService metaService = Kingdee.BOS.Contracts.ServiceFactory.GetService<IMetaDataService>(this.Context); FormMetadata formMetaData = (FormMetadata)metaService.Load(this.Context, "ENG_BOM"); List<object> list = new List<object>(); DynamicObjectCollection dataCollection = this.View.Model.DataObject["ProductEntity"] as DynamicObjectCollection; foreach(DynamicObject product in dataCollection) { long refBomID = Convert.ToInt64(product["RefBomID_Id"]); if (refBomID == 0) continue; DynamicObject bomObj = viewService.LoadSingle(this.Context, refBomID, formMetaData.BusinessInfo.GetDynamicObjectType()); if (bomObj == null) continue; DynamicObjectCollection subItems = product["STK_ASSEMBLYSUBITEM"] as DynamicObjectCollection; DynamicObjectCollection bomTreeEntity = bomObj["TreeEntity"] as DynamicObjectCollection; foreach (var subItem in subItems) { long materialId = Convert.ToInt64(subItem["MaterialIDSETY_Id"]); DynamicObject dySub = bomTreeEntity.FirstOrDefault(p => Convert.ToInt64(p["MATERIALIDCHILD_Id"]) == materialId); if (dySub != null) { if(Convert.ToString(dySub["OWNERTYPEID"]) == "BD_Customer") { subItem["OwnerTypeIDSETY"] = dySub["OWNERTYPEID"]; subItem["FOwnerIDSETY"] = dySub["OWNERID_Id"]; } } } } }
实现效果:
BOM展开子件货主类型携带自物料清单上子项物料的货主类型设置 …(1.33KB)
推荐阅读