如何使用插件设计模式实现自定义逻辑原创
4人赞赏了该文章
786次浏览
编辑于2022年11月02日 17:15:17
关键字:插件机制,插件取数
一、需求
工单有个模块和负责人字段,选择模块可以带出负责人,之前是设计单据来维护模块和负责人的关系,如图:
固定负责人是人员字段,随着业务的发展,可能不是固定的人作为负责人,需要留出扩展接口让各个产品线去写自己的插件取动态计算负责人。
二、思路与方案
在模块负责人增加文本字段维护插件名称,然后在工单选择产品模块时去加载插件来计算负责人。
三、实现过程
1.首先在模块负责人增加文本字段(名字为插件)用来维护插件类名,再增加一个下拉列表,名字为人员类型,值分别为固定人员和插件,当选择固定人员,则显示【固定人员】字段,隐藏【插件】字段;当选择插件,则隐藏【固定人员】字段,显示【插件】字段。
2.封装一个接口类和calManager方法,方法参数为模块名称
public interface IModuleManagerCal { long calManager(String module); }
3.自定义插件实现calManager方法
public class MyCalManagerPlugin implements IModuleManagerCal { @Override public long calManager(String module) { // TODO Auto-generated method stub //实现自定义的逻辑,比如取模块的创建人作为产品模块的负责人 DynamicObject queryOne = QueryServiceHelper.queryOne("tgco_module", "id,name,creator", QFilter.of("name = ?", module).toArray()); return queryOne == null ? 0L: queryOne.getLong("creator"); } }
4.模块负责人里,配置开发平台模块的负责人是固定人员张三,流程平台模块的负责人是插件,插件配置步骤3自定义插件的全路径。
5.在运维工单选择模块后触发的propertyChanged事件去执行插件的calManager方法来计算负责人。
public void propertyChanged(PropertyChangedArgs e) { // TODO Auto-generated method stub super.propertyChanged(e); if("tgco_module".equals(e.getProperty().getName())) { if(e.getChangeSet()[0].getNewValue()!=null) { DynamicObject module=(DynamicObject) e.getChangeSet()[0].getNewValue(); DynamicObject moduleManger = BusinessDataServiceHelper.loadSingle("tgco_modulemanger", "id,tgco_module,tgco_combofield,tgco_manager,tgco_chajian", new QFilter[] {new QFilter("tgco_module.id",QCP.equals,module.get("id"))}); if(moduleManger.get("tgco_combofield").toString().equals("person")) { //如果类型是固定人员,则直接取模块负责人里维护的人员 this.getModel().setValue("tgco_manager", moduleManger.get("tgco_manager")); }else { //否则需要取插件计算产品负责人 String pluginName = moduleManger.getString("tgco_chajian"); IModuleManagerCal plugin = TypesContainer.createInstance(pluginName); long person = plugin.calManager(module.getString("name")); this.getModel().setValue("tgco_manager", person); } } } }
四、效果图
维护工单产品模块选择开发平台模块,处理人自动带出张三;
产品模块选择工作流,则带出的是工作流模块的创建人黄春媛。
五、开发环境版本
V5.0.0.2
六、参考资料
插件.zip(1.85KB)
kded_anliyun-kded_simpleapp-20 …(8.08KB)
推荐阅读