如何使用插件设计模式实现自定义逻辑原创
金蝶云社区-wbshcy
wbshcy
4人赞赏了该文章 911次浏览 未经作者许可,禁止转载编辑于2022年11月02日 17:15:17
summary-icon摘要由AI智能服务提供

本文描述了一种通过插件机制来动态计算工单负责人的实现方案。原需求中,模块和负责人关系是固定的,但随业务变化需动态计算。方案通过在模块负责人字段增加插件名称字段,并设计接口让各产品线自定义插件计算负责人。实现中,通过条件字段显示插件或固定人员,封装接口类并自定义插件实现计算逻辑,最后在选择模块时触发事件执行插件方法以动态设置负责人。开发环境版本为V5.0.0.2,并提供了参考资料。

关键字:插件机制,插件取数

一、需求

工单有个模块和负责人字段,选择模块可以带出负责人,之前是设计单据来维护模块和负责人的关系,如图:

image.png

固定负责人是人员字段,随着业务的发展,可能不是固定的人作为负责人,需要留出扩展接口让各个产品线去写自己的插件取动态计算负责人。

二、思路与方案

在模块负责人增加文本字段维护插件名称,然后在工单选择产品模块时去加载插件来计算负责人。

三、实现过程

1.首先在模块负责人增加文本字段(名字为插件)用来维护插件类名,再增加一个下拉列表,名字为人员类型,值分别为固定人员和插件,当选择固定人员,则显示【固定人员】字段,隐藏【插件】字段;当选择插件,则隐藏【固定人员】字段,显示【插件】字段。

image.png

image.png


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自定义插件的全路径。

image.png


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);
            
         }
          
      }
   }
}

四、效果图

维护工单产品模块选择开发平台模块,处理人自动带出张三;

image.png

产品模块选择工作流,则带出的是工作流模块的创建人黄春媛。

image.png

image.png


五、开发环境版本

V5.0.0.2

、参考资料

【开发平台】指导手册

学习成长中心


图标赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!