关键词:模型扩展,实体操作
一、需求
自定义实体操作。对单据上的数据进行校验,修改保存。
二、思路与方案
自定义操作可以在新版开发平台中添加。
实体操作需要实现2种插件:
表单层插件,需要派生自DefaultEntityOperate类;
操作层插件,需要派生自EntityOperateService类。
三、实现过程
1.进入开发平台
2.进入新版开发平台
3.操作列表
左侧菜单栏,【模型扩展】【操作定义】
4.进入操作列表,并新增操作
5.配置操作类
这两个实现类是自定义实体操作的重点。
按我个人理解,简单介绍这两个类的用途:
(1)表单层实现类:
如果要做实体操作,表单层需要继承kd.bos.entity.operate.DefaultEntityOperate。
表单层可以获取到视图view对象,通过view对界面进行一些控制。例如弹出子页面,弹出提示,刷新字段控件等等
(2)操作层实现类:
如果要做实体操作,操作层此项必填,继承kd.bos.service.operation.EntityOperateService。
实体操作主要作用是,对 单据/基础资料等数据实体 进行增删改,重写executeOperate事件,在事件中对数据做增删改,此过程会开启事务,调用beforeCallOperationTransaction、afterCallOperationTransaction等事件,影响操作插件,感兴趣的开发者可以调试,查看EntityOperateService的相关代码。
6.填写其他配置信息
名称设置为“修改计数”
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.设计器配置刚刚新增好的操作
进入设计器,工具栏的一个按钮绑定“修改计数”操作
四、效果图
保存单据之后,点击修改计数按钮。操作成功。
五、开发环境版本
苍穹5.0以上
六、注意事项
1.这个案例写得比较简单,因为暂时想不到很好的业务场景,就简单做了修改数值字段的案例。
如果有好的建议,欢迎在评论区留言。我可以根据评论区的建议做更复杂的案例。
2.如果不涉及到实体操作,只涉及到界面化的一些操作,请查看参考资料。
七、参考资料
CustomEntityOpera.zip(24.68KB)
推荐阅读