K3Cloud BOS 设计 Python 与 C# 单据转换插件基础资料赋值 对比

强调: C#中使用this关键字的,在C#语法中,是可以省略的,但是在 Python中,this一定要加上!!!

知识点:

  1. 根据编码获取基础资料包,并给基础资料赋值

1.场景

二开单据【评审单】,是由其他平台直接推送至数据库中

  • 无基础资料内码 配置单据转换时,无法赋值
  • 只存在基础资料编码
  • 有组织Id 有无组织Id无影响,可以在下推时,选择组织
  • 下推【推销售订单】
  • 配置单据转换规则

2.案例

  1. 以自定义单据,销售订单为例
  2. 在单据转换插件中对【客户】【销售员】【物料编码】基础资料赋值,采用公式的方式,这样在转换插件中,就不需要再去查上游单据的内容了
  3. 根据【客户编号】【销售员编号】【物料编码】获取基础资料包

在这里插入图片描述

3.先上 python 代码

# 定义全局变量
global _sourceData
_sourceData = None


def OnGetSourceData(e):
    global _sourceData
    _sourceData = e.SourceData #赋值
    

def AfterConvert(e):
	global _sourceData
    model = _sourceData[0] # 取第一行,获取原单据头内容
    dataObjs = e.Result.FindByEntityKey("FBillHead")
    for obj in dataObjs:
        entrys = obj.DataEntity["SaleOrderEntry"]
        orgId = obj.DataEntity["SaleOrgId_Id"]
        user_code = model["user_code"]  # 取源单的客户编码
        bdField = e.TargetBusinessInfo.GetField("FCustId") # 获取客户对象 基础资料类型
        queryParam = QueryBuilderParemeter() # 构建查询对象
        queryParam.FormId = bdField.LookUpObject.FormId
        queryParam.FilterClauseWihtKey = " {0} = '{1}' and FUSEORGID = {2} ".format(bdField.NumberProperty.Key,user_code, orgId) # 根据客户编号和组织id 查询客户资料                                                                                
        obj_cust = BusinessDataServiceHelper.Load(this.Context, bdField.RefFormDynamicObjectType, queryParam) # 返回的是集合,所以要用 obj_cust[0] 取第一条数据
        if len(obj_cust) > 0:
            obj.DataEntity["CustId_Id"] = obj_cust[0]["Id"] # 客户赋值,如果不赋值,则会报必填项
            obj.DataEntity["CustId"] = obj_cust[0] # 客户赋值
            obj.DataEntity["ReceiveId"] = obj_cust[0]
            obj.DataEntity["ChargeId"] = obj_cust[0]
            obj.DataEntity["SettleId"] = obj_cust[0]
        # 销售员 根据编码查询基础资料包        
        bdField = e.TargetBusinessInfo.GetField("FSalerId")
        queryParam = QueryBuilderParemeter() # 定义查询对象
        queryParam.FormId = bdField.LookUpObject.FormId
        queryParam.FilterClauseWihtKey = " FEMPNUMBER = '{0}' and FBIZORGID={1} ".format(model ["FPERSON_Code"], orgId) # 使用组织和员工编号,查询出销售员集合
        obj_saler = BusinessDataServiceHelper.Load(this.Context, bdField.RefFormDynamicObjectType, queryParam)
        if len(obj_saler) > 0:
            obj.DataEntity["SalerId_Id"] = obj_saler[0]["Id"]
            obj.DataEntity["SalerId"] = obj_saler[0] # 赋值,取第一条数据作为基础资料包,
        for item in entrys:
	        # 临时用 Note 在单据转换中配置存储物料编码
	        # 可以根据源单分录内码,查询 全局变量 _sourceData  ,取出物料编码 list(filter(lambda x:x["源单分录内码"] == item["源单分录内码"] , _sourceData))
            matCode = item["Note"]  # 这里 临时用明细备注作为物料编码存放
            bdField = e.TargetBusinessInfo.GetField("FMaterialId")
            queryParam = QueryBuilderParemeter()
            queryParam.FormId = bdField.LookUpObject.FormId
            queryParam.FilterClauseWihtKey = " {0} = '{1}' and FUSEORGID = {2} ".format(bdField.NumberProperty.Key,matCode, orgId)
            bdObjs = BusinessDataServiceHelper.Load(this.Context, bdField.RefFormDynamicObjectType, queryParam)
            if len(bdObjs) > 0:
                item["MaterialId_Id"] = bdObjs[0]["Id"]
                item["MaterialId"] = bdObjs[0]

关键点

1.全局变量

_sourceData 使用前,要用global 标记来声明,一般采用封装函数的方式来使用

_sourceData = None 


def getSourceData():
	global _sourceData 
	retrun _sourceData 


# 金蝶单据转换插件函数,对全局变量赋值
def OnGetSourceData(e):
	global _sourceData
    _sourceData = e.SourceData #赋值
    

def AfterConvert(e):
	sourceData = getSoutceData() # 使用时调用
	......
2.基础资料赋值
  1. 必填项基础资料赋值时,item["MaterialId_Id"] item["MaterialId"] = bdObjs[0]这两个都需要赋值,第一个编写会报必填的错误
3.源单数据取值
  1. e.SourceData 取值,前提是,单据转换规则中,需要映射相应的字段
  2. 再单据转换规则中配置,源单内码

Python 代码下载

4.C# 代码

 DynamicObjectCollection _sourceData;
 public override void OnGetSourceData(GetSourceDataEventArgs e)
 {
        base.OnGetSourceData(e);
        _sourceData = e.SourceData;
 }
public override void AfterConvert(AfterConvertEventArgs e)
    {
        base.AfterConvert(e);
        var dataObjs = e.Result.FindByEntityKey("FBillHead");
        var model = _sourceData[0];// 取第一行,获取原单据头内容
        foreach (var obj in dataObjs)
        {
            var entrys = obj.DataEntity["SaleOrderEntry"] as DynamicObjectCollection;
            var orgId = obj.DataEntity["SaleOrgId_Id"];
            int i = 0;
            var user_code = model["user_code"];
            // 客户
            BaseDataField bdField = e.TargetBusinessInfo.GetField("FCustId") as BaseDataField;
            QueryBuilderParemeter queryParam = new QueryBuilderParemeter();
            queryParam.FormId = bdField.LookUpObject.FormId;
            queryParam.FilterClauseWihtKey = string.Format(" {0} = '{1}' and FUSEORGID = {2} ", bdField.NumberProperty.Key, user_code, orgId);
            var obj_cust = BusinessDataServiceHelper.Load(this.Context, bdField.RefFormDynamicObjectType, queryParam);
            if (!obj_cust.IsNullOrEmpty() && obj_cust.Count() > 0)
            {
                obj.DataEntity["CustId_Id"] = obj_cust[0]["Id"];// 如果不填写,保存时会提示 必填
                obj.DataEntity["CustId"] = obj_cust[0];
                obj.DataEntity["ReceiveId"] = obj_cust[0];
                obj.DataEntity["ChargeId"] = obj_cust[0];
                obj.DataEntity["SettleId"] = obj_cust[0];
                obj.DataEntity["Note"] = "";
            }
            // 销售员
            bdField = e.TargetBusinessInfo.GetField("FSalerId") as BaseDataField;
            queryParam = new QueryBuilderParemeter();
            queryParam.FormId = bdField.LookUpObject.FormId;
            queryParam.FilterClauseWihtKey = string.Format(" FEMPNUMBER = '{0}' and FBIZORGID={1} ", model["FPERSON_Code"], orgId);
            var obj_saler = BusinessDataServiceHelper.Load(this.Context, bdField.RefFormDynamicObjectType, queryParam);
            if (!obj_saler.IsNullOrEmpty() && obj_saler.Count() > 0)
            {
                obj.DataEntity["SalerId_Id"] = obj_saler[0]["Id"];// 如果不填写,保存时会提示 必填
                obj.DataEntity["SalerId"] = obj_saler[0];
            }

            foreach (var item in entrys)
            {
                var matCode = item["Note"];// 临时用明细备注作为物料编码存放
                bdField = e.TargetBusinessInfo.GetField("FMaterialId") as BaseDataField;
                queryParam = new QueryBuilderParemeter();
                queryParam.FormId = bdField.LookUpObject.FormId;
                queryParam.FilterClauseWihtKey = string.Format(" {0} = '{1}' and FUSEORGID = {2}  ", bdField.NumberProperty.Key, matCode, orgId);
                var bdObjs = BusinessDataServiceHelper.Load(this.Context, bdField.RefFormDynamicObjectType, queryParam);
                if (!bdObjs.IsNullOrEmpty() && bdObjs.Count() > 0)
                {
                    item["MaterialId_Id"] = bdObjs[0]["Id"];// 如果不填写,保存时会提示 必填
                    item["MaterialId"] = bdObjs[0];
                }
            }
        }
    }

C# 代码下载

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫伊

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值