苍穹插件开发常见的校验方式原创
金蝶云社区-洛尘
洛尘
4人赞赏了该文章 2,453次浏览 未经作者许可,禁止转载编辑于2021年12月10日 15:08:19
summary-icon摘要由AI智能服务提供

本文介绍了在软件开发中,尤其是在涉及按钮或工具栏点击事件时,如何进行非法性校验以决定是否执行点击事件。文中详细说明了`beforeClick`、`beforeItemClick`及`beforeDoOperation`三个事件的作用及其使用场景。这些事件分别在点击事件发生前和操作执行前进行校验,通过条件判断来决定是否取消操作。同时,还展示了如何通过自定义操作插件和校验器来实现更复杂的校验逻辑,并指出了各层校验之间的层级关系和注意事项。

  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
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!