单据转换插件实现基础资料赋值(python)原创
金蝶云社区-邱育华
邱育华
22人赞赏了该文章 3014次浏览 未经作者许可,禁止转载编辑于2022年04月26日 08:38:38

【业务背景】

单据转换 A -> B -> C,其中B -> C 转换路线中需要用到分组功能,设置根据明细分录中的"采购供应商"(基础资料属性,取物料档案中采购的默认供应商)合并分录下推,B中的物料供应商由A下推物料时,默认自动携带。


【需求分析】

由于在转换中分组合并无法选择"基础资料属性"的字段,只能在B中在扩展一个基础资料属性,由B -> C时,根据物料供应商进行生成下游多张单据C,这涉及一个问题,从A -> B时,需要对"物料供应商"(础资料字段)进行赋值,在单据转换中赋值有3种方式:

1、字段映射自定义公式:基础资料 = 物料.采购.默认供应商,跨级的引用,BOS不支持,类型报错

2、表单策略无法实现

3、单据转换插件


【插件实现】


image.png


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.Metadata.ConvertElement.PlugIn.Args import *
from Kingdee.BOS.App.Data import *
from System.Collections.Generic import *
from Kingdee.BOS.ServiceHelper import * 
from Kingdee.BOS.Core.Metadata import SelectorItemInfo 
from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter 
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.App.Core import *

def AfterConvert(e):
    dataObjs = e.Result.FindByEntityKey("FBillHead")
    viewService = ViewService()
    field = e.TargetBusinessInfo.GetField("F_KCY_Base")
    for obj in dataObjs:     
        entrys = obj.DataEntity["FEntity"]
        for entry in entrys:
            material = entry["MaterialId"]
            if material is not None:
                p = QueryBuilderParemeter()
                p.FormId = "BD_MATERIAL" #业务对象标识
                p.SelectItems = SelectorItemInfo.CreateItems("FMaterialId","FDefaultVendor") #设置要查询的字段,用业务对象的字段标识来表示
                p.FilterClauseWihtKey = '''FMaterialId = {0}'''.format(material["Id"]) #过滤条件
                dyObjs = QueryServiceHelper.GetDynamicObjectCollection(this.Context, p)
                if dyObjs.Count > 0:
                    if dyObjs[0]["FDefaultVendor"]) != 0:  # 存在默认供应商
                        vendor = viewService.LoadSingle(this.Context, dyObjs[0]["FDefaultVendor"], field.RefFormDynamicObjectType)
                        entry["F_KCY_Base_Id"] = dyObjs[0]["FDefaultVendor"]
                        entry["F_KCY_Base"] = vendor
                        
                         # 或者
                        # field.RefIDDynamicProperty.SetValue(entry, dyObjs[0]["FDefaultVendor"]);
                        # field.DynamicProperty.SetValue(entry, vendor);


image.png


image.png



说明:脚本采用了循环的方式依次获取数据,应该有批量的处理方式,对大数据量性能会更好一点,后续研究再优化修改。

赞 22