电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

initVariable事件

来源:金蝶云社区作者:金蝶2024-09-234

initVariable事件

1 事件介绍

插件可以在此事件中,对本地变量进行初始化。


此事件发生时,源单主实体、目标单主实体、转换规则都已经确定,可以基于这些上下文信息,初始化本地变量。

 

一些通用的单据转换业务插件,需要自动适应各种单据,这个事件就显得比较重要:

可以在转换规则执行前,让通用插件了解到当前的上下文,初始化一些变量,决定后续业务逻辑。


2 事件触发时机

开始运行转换规则,创建好了转换规则上绑定的单据转换插件之后,即触发此事件。


插件可以利用如下方法,获取到源单、目标单主实体、反写规则:

    private void getContext(){
         // 源单主实体
         BillEntityType srcMainType = this.getSrcMainType();
         // 目标单主实体
         BillEntityType tgtMainType = this.getTgtMainType();
         // 转换规则
         ConvertRuleElement rule = this.getRule();
         // 转换方式:下推、选单
         ConvertOpType opType = this.getOpType();
    }


3 代码模板

package kd.bos.plugin.sample.bill.billconvert.template;
 
import kd.bos.entity.botp.plugin.AbstractConvertPlugIn;
import kd.bos.entity.botp.plugin.args.InitVariableEventArgs;
 
public class InitVariable extends AbstractConvertPlugIn {
 
    @Override
    public void initVariable(InitVariableEventArgs e) {
         // TODO 在此添加业务逻辑
    }
}


4 参数说明

public class InitVariableEventArgs extends ConvertPluginEventArgs

  • 暂无属性。


5 应用示例

5.1 案例说明

1. 需要开发一个通用单据转换插件,把目标单单据体上的金额字段值,合计到单据头上;

2. 不同的单据上,单据体、单据头上的金额字段标识不同;

3. 暂时只支持采购费用发票、销售费用发票。


5.2 实现方案

1. 捕获 initVariable事件,确认源单、目标单,单据体、单据头各金额字段标识;

2. 在afterCreateLink事件,根据单据体金额字段,合计单据头金额字段,并换算本位币金额。


5.3 实例代码

package kd.bos.plugin.sample.bill.billconvert.bizcase;
 
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Date;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.botp.plugin.AbstractConvertPlugIn;
import kd.bos.entity.botp.plugin.args.AfterCreateLinkEventArgs;
import kd.bos.entity.botp.plugin.args.InitVariableEventArgs;
 
public class InitVariableSample extends AbstractConvertPlugIn {
 
    /** 目标单主实体标识 */
    private String targetEntityNumber;
    /** 目标单单据体标识 */
    private String key_entryentity;
   
    private boolean isOtherBill = false;
   
    /** 字段标识,单据头.价税合计_原币*/
    private String key_AllAmountOri;
    /** 字段标识,单据体.价税合计_原币*/
    private String key_AllAmountOri_D;
    /** 字段标识,单据头.价税合计_本位币*/
    private String key_AllAmount;
   
    /** 字段标识,单据头.不含税金额_原币*/
    private String key_AmountOri;
    /** 字段标识,单据体.不含税金额_原币*/
    private String key_AmountOri_D;
    /** 字段标识,单据头.不含税金额_本位币*/
    private String key_Amount;
   
    /** 字段标识,单据头.税额_原币*/
    private String key_TaxAmountOri;
    /** 字段标识,单据体.税额_原币*/
    private String key_TaxAmountOri_D;
    /** 字段标识,单据头.税额_本位币*/
    private String key_TaxAmount;
 
    /**
     * 初始化事件:根据目标单,确定价税合计金额等字段标识
     */
    @Override
    public void initVariable(InitVariableEventArgs e) {
         this.targetEntityNumber = this.getTgtMainType().getName();
         this.setAmountKey();
    }
 
    /**
     * 关联关系已经记录,并重算了反写控制字段值之后,触发此事件
     *
     * @remark
     * 金额字段,是反写控制字段:
     * 反写控制字段,需要记录从每条源单行携带过来的值,然后自动合计到单据体字段上;
     * 用户手工修改单据体上的反写控制字段时,会根据原始携带量分配、反写到源单
     *
     * 因此,如果要依赖于反写控制字段值进行运算,必须在afterCreateLink事件之后
     *
     */
    @Override
    public void afterCreateLink(AfterCreateLinkEventArgs e) {
     
     if (this.isOtherBill){
         // 其他未知的单据,不合计金额
         return;
     }
     
     ExtendedDataEntity[] billDataEntitys = e.getTargetExtDataEntitySet().FindByEntityKey(this.targetEntityNumber);
     // 逐单合计单据头金额字段值
     for(ExtendedDataEntity billDataEntity : billDataEntitys){
         this.calcAmount(billDataEntity);
     }
    }
 
    /**
     * 根据目标单,设置含税价格等字段标识
     */
    private void setAmountKey() {
       
        if (StringUtils.equals(this.targetEntityNumber, "iv_purexpinv")){
         // 采购费用发票
         
         this.key_entryentity = "entryentity";
         
            //价税合计
         this.key_AllAmountOri = "amountori";
         this.key_AllAmountOri_D = "amountori";
         this.key_AllAmount = "amount";
 
            //不含税金额
         this.key_AmountOri = "headauxpriceori";
         this.key_AmountOri_D = "headauxpriceori";
         this.key_Amount = "headauxprice";
 
            //税额
         this.key_TaxAmountOri = "deductibletaxori";
         this.key_TaxAmountOri_D = "deductibletaxori";
         this.key_TaxAmount = "deductibletax";
        }
        else if (StringUtils.equals(this.targetEntityNumber, "iv_saleexpinv")){
         // 销售费用发票
 
         this.key_entryentity = "entryentity";
         
            //价税合计
         this.key_AllAm

initVariable事件

1 事件介绍插件可以在此事件中,对本地变量进行初始化。此事件发生时,源单主实体、目标单主实体、转换规则都已经确定,可以基于这些上下...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信