金蝶云苍穹单据操作插件onAddValidators事件案例

2020-08-23  本文已影响0人  涎涎
  1. 新建模板单据

  2. 设置单据表名 t_bill_test1

  1. 新建高级面板,添加单据体,并设置分录操作代码,添加日期控件
  1. 再交新建高级面板,添加子单据体,设置子分录操作代码,添加日期控件
  1. 保存后管理员用户登录后授权后进行编码
package kd.bos.billoperation.plugin;

import java.text.SimpleDateFormat;
import java.util.Date;

import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.formula.RowDataModel;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.validate.AbstractValidator;

/**
 * <p>Title: </p>
 * <p>
 *    Description:
 *    试验成功
 * </p>
 * <p>Copyright: Copyright (c) 2020</p>
 * @author xx
 * @date 2020年3月16日
 * @version 1.0
 */
public class OnAddValidatorsSample extends AbstractOperationServicePlugIn {
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     * 操作执行前,准备加载单据数据之前,触发此事件
     * @remark
     * 插件可以在此事件中,指定需要加载的字段
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月16日
     * @param param the bare_field_name
     * @param e
     * @see kd.bos.entity.plugin.IOperationServicePlugIn#onPreparePropertys(kd.bos.entity.plugin.PreparePropertysEventArgs)
     * @version 1.0
     */
    @Override
    public void onPreparePropertys(PreparePropertysEventArgs e) {
        // 要求加载预计送货日期、最迟送货日期字段
        e.getFieldKeys().add(DelivaryDateValidator.KEY_DELIVERYDATE);
        e.getFieldKeys().add(DelivaryDateValidator.KEY_LASTDATE);
    }

    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     * 执行操作校验前,触发此事件
     * @remark
     * 插件可以在此事件,调整预置的操作校验器;或者增加自定义操作校验器
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月16日
     * @param param the bare_field_name
     * @param e
     * @see kd.bos.entity.plugin.IOperationServicePlugIn#onAddValidators(kd.bos.entity.plugin.AddValidatorsEventArgs)
     * @version 1.0
     */
    @Override
    public void onAddValidators(AddValidatorsEventArgs e) {
        // 添加自定义的校验器:送货日期校验器
        e.addValidator(new DelivaryDateValidator());
    }
}

/**
 * 
 * <p>Title: </p>
 * <p>
 *    Description:
 * 自定义操作校验器:校验送货日期
 * </p>
 * <p>Copyright: Copyright (c) 2020</p>
 * @author xx
 * @date 2020年3月16日
 * see_to_overridden
 * @version 1.0
 */
class DelivaryDateValidator extends AbstractValidator {

    /** 预计送货日期字段标识 */
    public final static String KEY_DELIVERYDATE = "deliverydate";
    /** 最迟送货日期字段标识 */
    public final static String KEY_LASTDATE = "lastdate";
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     * 返回校验器的主实体:系统将自动对此实体数据,逐行进行校验
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月16日
     * @param param the bare_field_name
     * @return
     * @see kd.bos.entity.validate.AbstractValidator#getEntityKey()
     * @version 1.0
     */
    @Override
    public String getEntityKey() {
        return this.entityKey;
    }
    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     * 给校验器传入上下文环境及单据数据包之后,调用此方法;
     * @remark
     * 自定义校验器,可以在此事件进行本地变量初始化:如确认需要校验的主实体
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月16日
     * @param param the bare_field_name
     * @see kd.bos.entity.validate.AbstractValidator#initializeConfiguration()
     * @version 1.0
     */
    @Override
    public void initializeConfiguration() {
        super.initializeConfiguration();
        // 在此方法中,确认校验器检验的主实体:送货子单据体
        // 需要对送货子单据体行,逐行判断预计送货日期
        this.entityKey = "subentryentity";      
    }

    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     * 校验器初始化完毕,从单据数据包中,提取出了主实体数据行,开始校验前,调用此方法;
     * @remark
     * 此方法,比initializeConfiguration更晚调用;
     * 在此方法调用this.getDataEntities(),可以获取到需校验的主实体数据行
     * 不能在本方法中,确认需要校验的主实体
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月16日
     * @param param the bare_field_name
     * @see kd.bos.entity.validate.AbstractValidator#initialize()
     * @version 1.0
     */
    @Override
    public void initialize() {
        super.initialize();
    }

    /**
     * <p>Title: </p>
     * <p>
     *    Description:
     * 执行自定义校验
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月16日
     * @param param the bare_field_name
     * @see kd.bos.entity.validate.AbstractValidator#validate()
     * @version 1.0
     */
    @Override
    public void validate() {
        
        // 定义一个行数据存取模型:用于方便的读取本实体、及父实体、单据头上的字段
        RowDataModel rowDataModel = new RowDataModel(this.entityKey, this.getValidateContext().getSubEntityType());
        SimpleDateFormat timesdf = new SimpleDateFormat("yyyy-MM-dd");
        
        // 逐行校验预计送货
        for(ExtendedDataEntity rowDataEntity : this.getDataEntities()){
            rowDataModel.setRowContext(rowDataEntity.getDataEntity());
            Date deliveryDate = (Date)rowDataModel.getValue(KEY_DELIVERYDATE);
            Date lastDate = (Date)rowDataModel.getValue(KEY_LASTDATE);
            
            if (deliveryDate.compareTo(lastDate) > 0 ){
                // 校验不通过,输出一条错误提示
                this.addErrorMessage(rowDataEntity, 
                        String.format("预计送货日期(%s),不能晚于最迟送货日期(%s)!", 
                                timesdf.format(deliveryDate), timesdf.format(lastDate)));
            }
        }
    }
}
  1. 重启服务后在保存按钮注册插件
  1. 预览测试

以上就是我关于 金蝶云苍穹左树右表单据列表插件onAddValidators事件案例 知识点整理与总结的全部内容,希望对你有帮助。。。。。。。


分割线

上一篇下一篇

猜你喜欢

热点阅读