K3Cloud BOS 设计 Python 与 C# 单据转换插件基础资料赋值
强调:
C#
中使用this
关键字的,在C#语法中,是可以省略的,但是在Python
中,this
一定要加上!!!知识点:
- 根据编码获取基础资料包,并给基础资料赋值
1.场景
二开单据【评审单】,是由其他平台直接推送至数据库中
无基础资料内码
配置单据转换时,无法赋值只存在基础资料编码
有组织Id
有无组织Id无影响,可以在下推时,选择组织下推【推销售订单】
配置单据转换规则
2.案例
- 以自定义单据,销售订单为例
- 在单据转换插件中对【客户】【销售员】【物料编码】基础资料赋值,采用公式的方式,这样在转换插件中,就不需要再去查上游单据的内容了
- 根据【客户编号】【销售员编号】【物料编码】获取基础资料包
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.基础资料赋值
- 必填项基础资料赋值时,
item["MaterialId_Id"]
,item["MaterialId"] = bdObjs[0]
这两个都需要赋值,第一个编写会报必填的错误
3.源单数据取值
e.SourceData
取值,前提是,单据转换规则中,需要映射相应的字段- 再单据转换规则中配置,源单内码
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];
}
}
}
}