实现动态设置办理人首先要设置全局监听,然后通过监听相关的步骤来进行相应的操作。
废话少说,先看东西!
1:配置全局监听配置类:
@Configuration
public class FlowableGlobalListenerConfig implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private SpringProcessEngineConfiguration configuration;
@Autowired
private GlobalTaskListener globalTaskListener;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();
//任务创建全局监听
dispatcher.addEventListener(globalTaskListener, FlowableEngineEventType.TASK_CREATED);
//流程创建监听
dispatcher.addEventListener(globalTaskListener, FlowableEngineEventType.PROCESS_CREATED);
//流程启动监听
dispatcher.addEventListener(globalTaskListener, FlowableEngineEventType.PROCESS_STARTED);
}
}
其中globalTaskListener是自定义的具体监听类;FlowableEngineEventType是监听的具体类型;
package org.flowable.common.engine.api.delegate.event;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.api.FlowableIllegalArgumentException;
/**
* Enumeration containing all possible types of {@link FlowableEvent}s.
*
* @author Frederik Heremans
*
*/
public enum FlowableEngineEventType implements FlowableEventType {
/**
* New entity is created.
*/
ENTITY_CREATED,
/**
* New entity has been created and all properties have been set.
*/
ENTITY_INITIALIZED,
/**
* Existing entity us updated.
*/
ENTITY_UPDATED,
/**
* Existing entity is deleted.
*/
ENTITY_DELETED,
/**
* Existing entity has been suspended.
*/
ENTITY_SUSPENDED,
已上只是FlowableEngineEventType一部分,有兴趣的同学可以打开这个枚举类详细查看;
2:具体的监听类
@Component
public class GlobalTaskListener extends AbstractFlowableEngineEventListener {
@Autowired
private RuntimeService runtimeService;
@Autowired
private RepositoryService repositoryService;
@Override
protected void taskCreated(FlowableEngineEntityEvent event) {
super.taskCreated(event);
}
@Override
protected void processCreated(FlowableEngineEntityEvent event) {
super.processCreated(event);
}
@Override
protected void processStarted(FlowableProcessStartedEvent event) {
super.processStarted(event);
FlowableProcessEventImpl eventImpl = (FlowableProcessEventImpl) event;
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(eventImpl.getProcessDefinitionId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
List<Process> processList = bpmnModel.getProcesses();
Process process = processList.get(0);
List list = (List) process.getFlowElements();
HashMap<String, Object> variables = new HashMap<>();
for(Object o : list){
if(o instanceof UserTask){
String inputDataItem;
UserTask userTask = (UserTask) o;
//判断是不是会签节点
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = userTask.getLoopCharacteristics();
if(multiInstanceLoopCharacteristics != null){
//会签节点
//获取设置参数名称
inputDataItem = multiInstanceLoopCharacteristics.getInputDataItem().replace("${","").replace("}","");
//获取前端设置的用户或者组
if(userTask.getCandidateGroups().size() >= 0){
List candidateGroups = userTask.getCandidateGroups();
//如果是用户组查询组里的用户
List<String> userList= new ArrayList<String>();
userList.add("卡卡罗特");
userList.add("贝吉塔");
userList.add("弗利萨");
userList.add("吉连");
//设置参数
variables.put(inputDataItem,userList);
}
}else{
//获取设置参数名称
inputDataItem = userTask.getAssignee().replace("${","").replace("}","");
//非会签节点
if(userTask.getCandidateUsers().size() >= 0){
//设置参数
// variables.put(inputDataItem,userTask.getCandidateUsers());
variables.put(inputDataItem,"zmc");
}
}
}
}
//将variables设置进去
runtimeService.setVariables(eventImpl.getExecutionId(),variables);
}
具体的监听类要继承AbstractFlowableEngineEventListener;
在第一步配置类中配置的监听事件要在自定义的监听类中实现抽象方法;
动态设置办理人主要是以下代码:
@Override
protected void processStarted(FlowableProcessStartedEvent event) {
super.processStarted(event);
FlowableProcessEventImpl eventImpl = (FlowableProcessEventImpl) event;
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(eventImpl.getProcessDefinitionId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
List<Process> processList = bpmnModel.getProcesses();
Process process = processList.get(0);
List list = (List) process.getFlowElements();
HashMap<String, Object> variables = new HashMap<>();
for(Object o : list){
if(o instanceof UserTask){
String inputDataItem;
UserTask userTask = (UserTask) o;
//判断是不是会签节点
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = userTask.getLoopCharacteristics();
if(multiInstanceLoopCharacteristics != null){
//会签节点
//获取设置参数名称
inputDataItem = multiInstanceLoopCharacteristics.getInputDataItem().replace("${","").replace("}","");
//获取前端设置的用户或者组
if(userTask.getCandidateGroups().size() >= 0){
List candidateGroups = userTask.getCandidateGroups();
//如果是用户组查询组里的用户
List<String> userList= new ArrayList<String>();
userList.add("卡卡罗特");
userList.add("贝吉塔");
userList.add("弗利萨");
userList.add("吉连");
//设置参数
variables.put(inputDataItem,userList);
}
}else{
//获取设置参数名称
inputDataItem = userTask.getAssignee().replace("${","").replace("}","");
//非会签节点
if(userTask.getCandidateUsers().size() >= 0){
//设置参数
// variables.put(inputDataItem,userTask.getCandidateUsers());
variables.put(inputDataItem,"zmc");
}
}
}
}
//将variables设置进去
runtimeService.setVariables(eventImpl.getExecutionId(),variables);
}
由于是创建了个demo project所以查询根据读取出来的办理人组或者用户没有去数据库中查询;
通过BpmnModel对象我们可以获取到流程配置中相关的设置,比如我们现在关心的办理人


通过判断LoopCharacteristics来区分该节点是否是会签节点;不能等于null为会签节点;
将获取到的具体办理人设置到variables中,最后将参数设置进去就完成了;
if(multiInstanceLoopCharacteristics != null){
//会签节点
//获取设置参数名称
inputDataItem = multiInstanceLoopCharacteristics.getInputDataItem().replace("${","").replace("}","");
//获取前端设置的用户或者组
if(userTask.getCandidateGroups().size() >= 0){
List candidateGroups = userTask.getCandidateGroups();
//如果是用户组查询组里的用户
List<String> userList= new ArrayList<String>();
userList.add("卡卡罗特");
userList.add("贝吉塔");
userList.add("弗利萨");
userList.add("吉连");
//设置参数
variables.put(inputDataItem,userList);
}
}else{
//获取设置参数名称
inputDataItem = userTask.getAssignee().replace("${","").replace("}","");
//非会签节点
if(userTask.getCandidateUsers().size() >= 0){
//设置参数
// variables.put(inputDataItem,userTask.getCandidateUsers());
variables.put(inputDataItem,"zmc");
}
}
//将variables设置进去
runtimeService.setVariables(eventImpl.getExecutionId(),variables);
本文介绍了如何在Flowable中动态设置办理人。通过配置全局监听和自定义监听类,实现流程实例中的审批人动态设定。关键代码展示了根据流程配置动态获取并设置办理人的过程,特别处理了会签节点的情况。
3649

被折叠的 条评论
为什么被折叠?



