基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式

简介: 基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式

更多功能看演示系统

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

具体流程图设置如下:

效果图如下:

 

相关文章
|
6月前
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(三)
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(三)
317 1
|
6月前
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(一)
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(一)
322 1
|
6月前
|
SQL Java 数据库
springboot用户创建的业务数据只能是同一组织能看的见
springboot用户创建的业务数据只能是同一组织能看的见
|
6月前
|
前端开发
基于jeecg-boot的flowable流程增加部门经理审批功能
基于jeecg-boot的flowable流程增加部门经理审批功能
77 0
|
6月前
|
前端开发
基于jeecg-boot的flowable流程自定义业务驳回到发起人的一种处理方式
基于jeecg-boot的flowable流程自定义业务驳回到发起人的一种处理方式
289 0
|
6月前
|
移动开发 前端开发
基于jeecg-boot的flowable流程审批时增加下一个审批人设置
基于jeecg-boot的flowable流程审批时增加下一个审批人设置
580 0
|
6月前
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(二)
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(二)
166 0
|
6月前
|
移动开发 前端开发
基于Jeecg-boot的flowable流程支持拒绝同意流程操作(二)
基于Jeecg-boot的flowable流程支持拒绝同意流程操作(二)
140 0
|
6月前
|
移动开发 前端开发
基于Jeecg-boot的flowable流程支持拒绝同意流程操作
基于Jeecg-boot的flowable流程支持拒绝同意流程操作
190 0
|
6月前
|
移动开发 前端开发
基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交
基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交
220 0