flowable动态设置办理人

本文介绍了如何在Flowable中动态设置办理人。通过配置全局监听和自定义监听类,实现流程实例中的审批人动态设定。关键代码展示了根据流程配置动态获取并设置办理人的过程,特别处理了会签节点的情况。

        实现动态设置办理人首先要设置全局监听,然后通过监听相关的步骤来进行相应的操作。

废话少说,先看东西!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值