模型扩展可视化工具开发-自定义实体操作原创
金蝶云社区-吴锐雄
吴锐雄
1人赞赏了该文章 423次浏览 未经作者许可,禁止转载编辑于2024年07月07日 16:14:17

关键词:模型扩展,实体操作


一、需求

自定义实体操作。对单据上的数据进行校验,修改保存。


二、思路与方案

自定义操作可以在新版开发平台中添加。

实体操作需要实现2种插件:

表单层插件,需要派生自DefaultEntityOperate类;

操作层插件,需要派生自EntityOperateService类。


三、实现过程

1.进入开发平台

image.png

2.进入新版开发平台

image.png

3.操作列表

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

image.png

4.进入操作列表,并新增操作

image.png

image.png


5.配置操作类

这两个实现类是自定义实体操作的重点

image.png


按我个人理解,简单介绍这两个类的用途:

(1)表单层实现类:

如果要做实体操作,表单层需要继承kd.bos.entity.operate.DefaultEntityOperate。

表单层可以获取到视图view对象,通过view对界面进行一些控制。例如弹出子页面,弹出提示,刷新字段控件等等


(2)操作层实现类:

如果要做实体操作,操作层此项必填继承kd.bos.service.operation.EntityOperateService

实体操作主要作用是,对 单据/基础资料等数据实体 进行增删改,重写executeOperate事件,在事件中对数据做增删改,此过程会开启事务,调用beforeCallOperationTransaction、afterCallOperationTransaction等事件,影响操作插件,感兴趣的开发者可以调试,查看EntityOperateService的相关代码


6.填写其他配置信息

名称设置为“修改计数

image.png


7.编写实体层代码

重写executeOperate事件。

业务逻辑是,遍历全部字段,如果值小于50,将其中的整数类型设置为50

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.entity.property.IntegerProp;
import kd.bos.service.operation.EntityOperateService;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import org.apache.http.util.TextUtils;

import java.util.ArrayList;
import java.util.List;

// 操作层
public class ModifyCountService extends EntityOperateService {
    
    @Override
    protected void executeOperate(DynamicObject[] objs) {
        OperationResult result = getOperationResult();

        String billEntityName = objs[0].getDataEntityType().getName();
        List ids = new ArrayList();
        for (DynamicObject obj : objs) {
            ids.add(obj.get("id"));
        }

        DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load(ids.toArray(), BusinessDataServiceHelper.newDynamicObject(billEntityName).getDynamicObjectType());
        
        DataEntityPropertyCollection dataEntityProperties = dynamicObjects[0].getDataEntityType().getProperties();
        StringBuilder stringBuilder = new StringBuilder();

        // 遍历全部字段
        for (IDataEntityProperty dataEntityProperty : dataEntityProperties) {
            if (dataEntityProperty instanceof IntegerProp) {
                IntegerProp integerProp = (IntegerProp)dataEntityProperty;

                for (DynamicObject dynamicObject : dynamicObjects) {
                    Integer i = (Integer)dynamicObject.get(integerProp.getName());
                    // 判断如果值小于50,将其中的整数类型设置为50
                    if (i < 50) {
                        if (stringBuilder.length() > 0) {
                            stringBuilder.append(",");
                        }
                        stringBuilder.append("“" + integerProp.getDisplayName().getLocaleValue() + "”");
                        dynamicObject.set(integerProp.getName(), 50);
                    }
                }
                System.out.println();
            }
        }


        String notification = stringBuilder.toString();
        if (TextUtils.isEmpty(notification)) {
            result.setMessage("无需修改计数");
            result.setSuccess(false);
        } else {
            // 调用save方法直接保存数据,不用saveOperate,因为ModifyCountService本身就是一个操作,它的外面包裹了事务
            Object[] objects = SaveServiceHelper.save(dynamicObjects, this.getOption());
            if (objects.length > 0) {
                result.setMessage("修改计数成功:" + notification);
                result.setSuccess(true);
            } else {
                result.setMessage("计数失败");
                result.setSuccess(false);
            }

        }

    }

}


8.编写表单层代码

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
import kd.bos.entity.operate.DefaultEntityOperate;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.entity.property.IntegerProp;
import kd.bos.mvc.bill.BillModel;
import kd.bos.servicehelper.BusinessDataServiceHelper;

// 表单层
// 当既有表单层操作也有操作层操作时,表单层需要继承自 DefaultEntityOperate
public class ModifyCountOperate extends DefaultEntityOperate {

    @Override
    protected OperationResult invokeBillOperation() {

        OperationResult result = super.invokeBillOperation();
        if (result.isSuccess()) {

            // 更新model
            if (getView().getModel() instanceof BillModel) {
                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(((BillModel) getView().getModel()).getPKValue(), getView().getModel().getDataEntityType().getName());

                DataEntityPropertyCollection dataEntityProperties = dynamicObject.getDataEntityType().getProperties();
                for (IDataEntityProperty dataEntityProperty : dataEntityProperties) {
                    if (dataEntityProperty instanceof IntegerProp) {
                        IntegerProp integerProp = (IntegerProp)dataEntityProperty;
                        String name = integerProp.getName();
                        getView().getModel().setValue(name,dynamicObject.get(name));
                    }
                }
            }

            // 更新界面
            getView().updateView();
            System.out.println(result.getMessage());
        } else {
            System.out.println("操作失败"+result.getMessage());      
        }
        return result;
    }

}


9.设计器配置刚刚新增好的操作

进入设计器,工具栏的一个按钮绑定“修改计数”操作

image.png

image.png

image.png


四、效果图

保存单据之后,点击修改计数按钮。操作成功。

image.png


五、开发环境版本

苍穹5.0以上


六、注意事项

1.这个案例写得比较简单,因为暂时想不到很好的业务场景,就简单做了修改数值字段的案例。

如果有好的建议,欢迎在评论区留言。我可以根据评论区的建议做更复杂的案例。

2.如果不涉及到实体操作,只涉及到界面化的一些操作,请查看参考资料。


七、参考资料

自定义简单的操作

介绍苍穹的操作






赞 1