苍穹插件开发常见的校验方式原创
金蝶云社区-洛尘
洛尘
4人赞赏了该文章 1834次浏览 未经作者许可,禁止转载编辑于2021年12月10日 15:08:19
  1. beforeClick与beforeItemClick事件
    就是按钮或者工具栏的点击事件触发之前,可以进行一些非法性校验,如果不符合校验规则,可以取消点击事件发生
    如下:点击提交按钮时,如果字段kdps_test的值是“测试”就禁止提交
  2. @Override
    public void beforeItemClick(BeforeItemClickEvent evt) {
        String itemKey = evt.getItemKey();
        if (StringUtils.equals(itemKey,"bar_submit")) {
            String testField = (String) this.getModel().getValue("kdps_test");
            if (StringUtils.equals(testField,"测试")) {
                this.getView().showTipNotification("请勿输入"+testField);
                evt.setCancel(true);
            }
        }
    }




  1. beforeDoOperation事件相对于在beforeClick与beforeItemClick事件之后,具体执行到了某个操作之前,
    可以在此处进行一个操作校验然后取消该操也可以传递自定义操作参数给操作服务插件,如下:在提交操作之前,如果字段
    kdps_test的值是“测试”就禁止提交
  2. @Override
    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
        FormOperate source = (FormOperate) args.getSource();
        if(StringUtils.equals(source.getOperateKey(),"submit")){
            String testField = (String) this.getModel().getValue("kdps_test");
            if (StringUtils.equals(testField,"测试")) {
                this.getView().showTipNotification("请勿输入"+testField);
                args.setCancel(true);
            }
            //传递自定义的参数给操作服务插件
            source.getOption().setVariableValue("variable","测试");
        }




  1. 自定义操作插件,设置自定义检验规则。如下:在操作插件的onAddValidators()方法,
    添加我们自定义的校验器SubmitValidator,判断如果kdps_test字段中的值和我们beforeDoOperation传递过来
    variable参数的值是一样的就禁止操作,同时提示错误信息
  2. public class SubmitOperateServicePlugin extends AbstractOperationServicePlugIn {
    
        /**
         * 操作执行,加载单据数据包之前,触发此事件;
    
         * 在单据列表上执行单据操作,传入的是单据内码;
         * 系统需要先根据传入的单据内码,加载单据数据包,其中只包含操作要用到的字段,然后再执行操作;
         * 在加载单据数据包之前,操作引擎触发此事件;
         *
         * 插件需要在此事件,添加需要用到的字段;
         * 否则,系统加载的单据数据包,可能没有插件要用到的字段值,从而引发中断
         */
        @Override
        public void onPreparePropertys(PreparePropertysEventArgs e) {
            e.getFieldKeys().add("kdps_test");
        }
    
        /**
         * 构建好操作校验器之后,执行校验之前,触发此事件;
         *
         * 插件可以在此事件,增加自定义操作校验器,或者去掉内置的校验器
         */
        @Override
        public void onAddValidators(AddValidatorsEventArgs e) {
            //添加自定义的校验器
            e.addValidator(new SubmitValidator());
        }
    }
  3. /**
     * @classname
     * @description 自定义校验规则,需要注入到操作插件中
     * @date 2021/12/9 18:26
     */
    public class SubmitValidator extends AbstractValidator {
        @Override
        public void validate() {
            String variable = this.getOption().getVariableValue("variable");
            ExtendedDataEntity[] dataEntities = this.getDataEntities();
            Arrays.stream(dataEntities).forEach(o->{
                DynamicObject dataEntity = o.getDataEntity();
                String string = dataEntity.getString("kdps_test");
                if (StringUtils.equals(string,variable)) {
                    this.addErrorMessage(o,"数据与"+variable+"一致");
                }
            });
        }
    }

操作插件注入的位置:

image.png

如上的校验方式都是有层级的,第一层校验会进入beforeClick与beforeItemClick事件,如果在这两个事件中取消了后续操作,就不会进入beforeDoOperation事件,然后如果在beforeDoOperation事件中没有通过校验取消了后续操作就不会进入到我们自定义的操作插件中,我们可以在开发中首先配置苍穹的界面规则类似于必录等,然后不能通过配置的可以在操作服务插件中或者beforeClick,beforeItemClick,beforeDoOperation事件进行校验,但是不要同时使用多种方式对同一个校验需求进行校验。


赞 4