有些网友希望通过表单的内容来动态决定流程审批人,因为比较个性化,所以需要一个相对通用的方法来实现,想到的是任务监听器,一般都是发起的时候来确定下一个流程审批人,所以可以在第一个发起人这里进行任务监听。
一、SetAssigneeTaskListener 监听器例子如下:
package com.nbcio.modules.flowable.listener; import org.flowable.engine.TaskService; import org.flowable.engine.delegate.TaskListener; import org.flowable.task.service.delegate.DelegateTask; import org.jeecg.common.util.SpringContextUtils; import java.util.Map; import org.apache.commons.lang3.StringUtils; /** * 根据表单内容动态设置审批人 * @author nbacheng * @date 2023-3-02 */ public class SetAssigneeTaskListener implements TaskListener{ private static final long serialVersionUID = 1L; private TaskService taskService = SpringContextUtils.getBean(TaskService.class); @Override public void notify(DelegateTask delegateTask) { String processInstanceId = delegateTask.getProcessInstanceId(); String processDefinitionId = delegateTask.getProcessDefinitionId(); String taskId = delegateTask.getId(); String newAssignee; //表单里面的值,相关逻辑可以根据自己需要进行处理 String formvalue = delegateTask.getVariable("assigneeId").toString().trim(); if (StringUtils.equals(formvalue, "admin")) { newAssignee = "admin"; } else if (StringUtils.equals(formvalue, "zhangsan")) { newAssignee = "zhangsan"; } else { newAssignee = "jeecg"; } Map<String, Object> map = taskService.getVariables(taskId); map.put("SetAssigneeTaskListener", newAssignee); taskService.setVariables(taskId, map); } }
二、设置流程图如下:
三、表单设置如下:
四、在启动流程的setNextAssignee里增加下面的代码,就是判断是否通过动态设置审批人的任务监听器进行流程人员的动态设置
// 获取下一个节点数据及设置数据 FlowNextDto nextFlowNode = flowTaskService.getNextFlowNode(task.getId(), variables); if(Objects.nonNull(nextFlowNode)) { Map<String, Object> nVariablesMap = taskService.getVariables(task.getId()); if (Objects.nonNull(task)) { if(nVariablesMap.containsKey("SetAssigneeTaskListener")) {//是否通过动态设置审批人的任务监听器 taskService.complete(task.getId(), variables); Task nexttask = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult(); taskService.setAssignee(nexttask.getId(), nVariablesMap.get("SetAssigneeTaskListener").toString()); return Result.OK("通过动态设置审批人的任务监听器流程启动成功."); } }
四、效果图