更多功能看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://122.227.135.243:9888
这里给大家提供一种动态设置下个节点为发起人部门负责人的方式,当然也可以通过其它方式来完成这种功能。
注意这里需要那个节点要设置为部门负责人,那就在这个节点的前面一个节点进行设置。
目前设置任务监听器如下:
类型为创建
监听器类型为java类
名称为:com.nbcio.modules.flowable.listener.SetDeptHeadTaskListener
SetDeptHeadTaskListener 具体代码如下:
package com.nbcio.modules.flowable.listener;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.service.delegate.DelegateTask;
import org.jeecg.common.util.SpringContextUtils;
import org.springframework.stereotype.Component;
import com.nbcio.modules.flowable.apithird.service.IFlowThirdService;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
/**
* 根据发起人动态设置发起人的部门领导
* @author nbacheng
* @date 2023-3-02
*/
public class SetDeptHeadTaskListener implements TaskListener{
private static final long serialVersionUID = 1L;
private TaskService taskService = SpringContextUtils.getBean(TaskService.class);
private IFlowThirdService flowThirdService = SpringContextUtils.getBean(IFlowThirdService.class);
RuntimeService runtimeService = SpringContextUtils.getBean(RuntimeService.class);
@Override
public void notify(DelegateTask delegateTask) {
String taskId = delegateTask.getId();
// 获取流程发起人
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(delegateTask.getProcessInstanceId())
.singleResult();
String startUserId = processInstance.getStartUserId();
// 获取部门负责人列表
List<String> depIds = flowThirdService.getDepartIdsByUsername(startUserId);
List<String> DepHeadlist = new ArrayList<String>();
for(String depId: depIds) {
List<String> depList = flowThirdService.getDeptHeadByDepId(depId);
if(depList != null) {
DepHeadlist.addAll(depList);
}
}
// 部门负责人列表去重
List<String> listDistinctResult = new ArrayList<String>();
if(!DepHeadlist.isEmpty() ) {
for (String str : DepHeadlist) {
if (!listDistinctResult.contains(str)) {
listDistinctResult.add(str);
}
}
}
Map<String, Object> map = taskService.getVariables(taskId);
map.put("SetDeptHeadTaskListener", listDistinctResult);
taskService.setVariables(taskId, map);
}
}
在流程定义发起地方增加下面代码
if(nVariablesMap.containsKey("SetDeptHeadTaskListener")) {//是否通过动态设置发起人部门负责人的任务监听器
taskService.complete(task.getId(), variables);
Task nexttask = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult();
if(Objects.nonNull(nexttask)) {
if(Objects.nonNull((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
if(((List<String>) nVariablesMap.get("SetDeptHeadTaskListener")).size() == 1) {//是否就一个人
taskService.setAssignee(nexttask.getId(), ((List<String>)nVariablesMap.get("SetDeptHeadTaskListener")).get(0).toString());
return Result.OK("设置发起人部门负责人的任务监听器流程启动成功.");
}
else {
for (String username : ((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
taskService.addCandidateUser(nexttask.getId(), username);
}
return Result.OK("设置多个发起人部门负责人的任务监听器流程启动成功,目前用户可通过签收方式完成审批.");
}
}
}
}
在流程任务完成里增加如下代码
if (Objects.nonNull(taskVo)) {
if(nVariablesMap.containsKey("SetDeptHeadTaskListener")) {//是否通过动态设置下一个节点是发起人部门负责人审批的任务监听器
if(taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).taskDefinitionKey(nextFlowNode.getUserTask().getId()).active().count() == 1) {//一个目标用户任务节点只能设置一次
Task nexttask = taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).taskDefinitionKey(nextFlowNode.getUserTask().getId()).active().singleResult();
if(Objects.nonNull(nexttask)) {
if(Objects.nonNull((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
if(((List<String>) nVariablesMap.get("SetDeptHeadTaskListener")).size() == 1) {//是否就一个人
taskService.setAssignee(nexttask.getId(), ((List<String>)nVariablesMap.get("SetDeptHeadTaskListener")).get(0).toString());
return;
}
else {
for (String username : ((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
taskService.addCandidateUser(nexttask.getId(), username);
}
return;
}
}
}
}
}
}
具体流程图设置如下:
效果图如下: