模型扩展可视化工具开发-自定义操作原创
金蝶云社区-吴锐雄
吴锐雄
6人赞赏了该文章 1,043次浏览 未经作者许可,禁止转载编辑于2023年09月06日 11:28:42
summary-icon摘要由AI智能服务提供

本文介绍了在开发平台中新增表单自定义操作的过程,包括进入模型扩展、定义操作、填写配置信息、设置元模型类型及编写表单层实现类代码。文章详细说明了操作定义中三个操作类的用途及编写注意事项,并展示了表单层实现类的代码示例,该代码遍历整数字段控件,根据字段值是否大于50返回相应提示。最后,文章提及了效果展示和源码学习建议。


最近尝试了利用 模型扩展可视化,新增了一个自定义操作。

对单据实体的自定义操作插件还有一些疑惑。

先写一篇文章做个总结。


注意:当前文章介绍如何新增一个表单操作,不涉及实体操作。

后续会补充自定义实体操作文章。


一、模型扩展

1.进入开发平台

image.png

2.进入新版开发平台

image.png

3.操作列表

左侧菜单栏,【模型扩展】【操作定义】

image.png

4.进入操作列表

image.png


二、定义操作

1.新增操作

image.png


2.操作类

这三个操作类是自定义操作的重点

image.png


按我个人理解,

(1)表单层实现类:

MService Form 层执行类名,这个是必填的。

继承抽象类 FormOperate。


(2)操作层实现类:

MService OperationType 层执行类。

如果操作是一个实体操作,此项必填。

因为实体操作需要对 单据或者基础资料 进行增删改,所以需要给当前操作设置一个Operation层的实现类

操作层实现类,需要继承抽象类 EntityOperateService。


注意如果操作是一个实体操作,上面讲到的“表单层实现类”也需要换一个父类,不继承FormOperate,而是继承DefaultEntityOperate。


(3)WebAPI层实现类:

Web API 层运行时类名,如果业务设计到 WebApi,这一项必填。

继承抽象类 OperationApi。


4.填写其他配置信息

填写编码、名称、描述、生效范围

image.png


5.设置元模型类型

这个配置项的意思是,配置当前操作在哪些页面类型上可以被选中。

例如我配置了 动态表单模型、单据模型、基础资料模型。

那么在对应页面的设计器的操作列表中,点击新增,就可以新增到该操作,否则在新增列表中就没有该操作可以新增。

image.png


6.表单层实现类的代码

代码业务逻辑是,遍历当前全部整数字段控件,取字段值进行判断。

如果全部字段大于50,返回成功,并给出提示;否则返回失败,并提示。

当前不涉及实体操作,因此实现类派生自FormOperate。

package kd.ecos.custom;

import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.entity.property.IntegerProp;
import kd.bos.form.operate.FormOperate;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import org.apache.http.util.TextUtils;

import java.util.Map;

public class CheckCountOperate extends FormOperate {


    @Override
    protected OperationResult invokeOperation() {
        IDataModel model = this.getView().getModel();
        Map<String, IDataEntityProperty> dataEntityPropertyMap = model.getDataEntityType().getAllFields();
        StringBuilder stringBuilder = new StringBuilder();

        for (String key : dataEntityPropertyMap.keySet()) {
            if (dataEntityPropertyMap.get(key) instanceof IntegerProp) {
                IntegerProp integerProp = (IntegerProp)dataEntityPropertyMap.get(key);
                Integer i = (Integer) model.getValue(integerProp.getName());
                if (i < 50) {
                    if (stringBuilder.length() > 0) {
                        stringBuilder.append(",");
                    }
                    stringBuilder.append("“" + integerProp.getDisplayName().getLocaleValue() + "”");
                }
                System.out.println();
            }
        }

        OperationResult result = new OperationResult();
        String notification = stringBuilder.toString();
        if (TextUtils.isEmpty(notification)) {
            getView().showSuccessNotification("计数成功,全部整数字段的值都大于50");
            result.setMessage("计数成功");
            result.setSuccess(true);
        } else {
            getView().showErrorNotification("计数失败,字段:" + notification + "的量小于50,不合格");
            result.setMessage("计数失败");
            result.setSuccess(false);
        }
        return result;
    }

}



关于“操作”源码的学习和解析,大家感兴趣,可以去看一下copy操作,kd.bos.form.operate.Copy,有助于我们学习 表单层实现类 在苍穹的代码中是如何运行的。


三、效果展示


工具栏绑定自定义操作:“检查计数操作”

image.png


image.png


在2个整数字段中填值,点击按钮。

image.png

image.png


赞 6