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

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

一、需求

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

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