这个功能是将某一个单据中的数据下推到另一个单据中。
如果是正常下推是没有问题的,但是在下推过程中会遇到原单据有子单据体,子单据体还要满足某些条件才能下推,下退后,还要获取子单据中基础数据里面的值,有时候基础数据还会有子单据。
这样就会出现很多各种各样的问题,我下面将我遇到的问题记录下来 ,欢迎各位友友,一起补充,毕竟在金蝶云社区确实查不到对应的问题。
问题如下:
一、原单据中子单据体要满足某些条件
只下推采纳的数据。
有两种方法:
第一种是自己在转换流程中配置。
1.在关联实体的源单关联实体中选择对应的子单据体
2.然后在数据范围中新增一个条件,把自己的条件写上就行了。
这个的意思就源单据只有满足这个条件的数据才会下推,前提是只能配置关联实体(步骤一)中的条件。
第二种方法就是自己硬写插件,获取数据然后推送了。
先说优点,就是很容易理解,毕竟对于开发者来说,写后台逻辑还是比较简单的,而且可以避开关联实体,以为如果源单据中有多个子单据体,这样在下推其他子单据体的时候就可能出现实体冲突(这个冲突问题,目前我只知道使用插件解决)。
再说缺点,很显而易见,这样写会很费时间,而且不知道怎么获取源单数据的新手来说根本就没法写。
新建一个java文件,然后写代码就好了,我下面会附上我写的代码并加上详细注解,希望可以有所理解吧。如果实在是理解不了,可以评论和私信我一起谈论哦。
//再插件的时候必须继承AbstractConvertPlugIn
public class ContractPush extends AbstractConvertPlugIn {
//在这个方法中写上获取数据的路径
@Override
public void afterBuildQueryParemeter(AfterBuildQueryParemeterEventArgs e) {
e.addSrcField("yfgt_customer_name.entry_linkman");
e.addSrcField("yfgt_customer_name.entry_linkman.contactperson");
e.addSrcField("yfgt_customer_name.entry_bank.bank");
e.addSrcField("yfgt_customer_name.entry_bank.bankaccount");
e.addSrcField("yfgt_adopt_not");
e.addSrcField("yfgt_customer_name");
e.addSrcField("yfgt_customer_name.name");
e.addSrcField("yfgt_customer_name.tx_register_no");
e.addSrcField("yfgt_customer_name.artificialperson");
e.addSrcField("yfgt_customer_name.yfgt_contact");
//e.addSrcField("yfgt_customer_name.entry_address.addfulladdress");
}
//这里就是详细的取值逻辑了
@Override
public void afterCreateTarget(AfterCreateTargetEventArgs e) {
// 取目标单
String targetEntityNumber = this.getTgtMainType().getName();
//取源单数据
ExtendedDataEntity[] billDataEntitys = e.getTargetExtDataEntitySet().FindByEntityKey(targetEntityNumber);
for (ExtendedDataEntity billDataEntity : billDataEntitys) {
// 获取到具体的单据的值
List<DynamicObject> srcRows = (List<DynamicObject>) billDataEntity
.getValue((ConvertConst.ConvExtDataKey_SourceRows));
//定义需要获取的值
long yfgt_customer_name = 0;
String contactperson = "";
long bank = 0;
String bankaccount = "";
String yiname = "";
String yfgt_legal_people = "";
String yfgt_register_no = "";
String yfgt_contact = "";
long reclinkman = 0;
String yfgt_address = "";
//循环获取子单据中的数据
for(DynamicObject dynamicObject : srcRows) {
//判断是否是自己需要的数据
Boolean bool = e.getFldProperties().get("yfgt_adopt_not")
.getDTValue(dynamicObject);
if (bool) {
// 取单数据
reclinkman = e.getFldProperties().get("yfgt_customer_name.entry_linkman")
.getDTValue(dynamicObject);
yfgt_contact = e.getFldProperties().get("yfgt_customer_name.yfgt_contact")
.getDTValue(dynamicObject);
yfgt_register_no = e.getFldProperties().get("yfgt_customer_name.tx_register_no")
.getDTValue(dynamicObject);
yfgt_legal_people = e.getFldProperties().get("yfgt_customer_name.artificialperson")
.getDTValue(dynamicObject);
yfgt_customer_name = e.getFldProperties().get("yfgt_customer_name")
.getDTValue(dynamicObject);
yiname = e.getFldProperties().get("yfgt_customer_name.name")
.getDTValue(dynamicObject);
contactperson = (String) e.getFldProperties().get("yfgt_customer_name.entry_linkman.contactperson")
.getDTValue(dynamicObject);
bank = e.getFldProperties().get("yfgt_customer_name.entry_bank.bank").getDTValue(dynamicObject);
bankaccount = (String) e.getFldProperties().get("yfgt_customer_name.entry_bank.bankaccount")
.getDTValue(dynamicObject);
}
}
// 赋值
billDataEntity.setValue("reclinkman_id", reclinkman);
billDataEntity.setValue("phone1st", yfgt_contact);
billDataEntity.setValue("yfgt_contact", yfgt_contact);
billDataEntity.setValue("yfgt_register_no", yfgt_register_no);
billDataEntity.setValue("yfgt_legal_people", yfgt_legal_people);
billDataEntity.setValue("customer_id", yfgt_customer_name);
//billDataEntity.setValue("reclinkman", contactperson);
billDataEntity.setValue("party1st", yiname);
billDataEntity.setValue("yfgt_bank_id", bank);
billDataEntity.setValue("yfgt_bankaccount", bankaccount);
billDataEntity.setValue("contactperson1st", contactperson);
}
}
}
将写好的插件配置到此处就好。
二、需要获取原单据中的基础数据中的数据
第一种方法就是自己在转化规则中配置。
1.在源单据中配置,在引用属性中配置上自己需要的属性。
2.转换规则----字段映射----源单字段中就能找到了
第二种方法就是自己写插件
方法给上面的插件写法一样;
例如:要是使用基础资料用户(user)下面的性别(age),获取数据的路径就是(user.age)
注意:要是需要获取子单据体的话,就是(user.子单据体标识.属性)。。。。这个子单据体只能是表单形式的,并且要存在表名。以为是通过数据库进行查询的。如果子单据体是列表的话,好像是只能获取第一行,具体的没整明白。