基于jeecg-boot的flowable流程增加部门经理审批功能

简介: 基于jeecg-boot的flowable流程增加部门经理审批功能

     因为之前没有在流程设计器里增加部门经理审批,所以这次增加这个功能

界面如下:

同时可以对于多名部门经理可以进行多实例配置,如下图:

一、前端实现

     主要修改userTask.vue文件。

<template>
  <div style="margin-top: 16px">
    <el-row>
      <h4><b>设置用户类型</b></h4>
      <el-radio-group v-model="defaultTaskForm.dataType" @change="changeDataType">
        <div v-if="bDisplayUser">
          <el-radio label="ASSIGNEE">指定用户</el-radio>
          <el-radio label="INITIATOR">发起人</el-radio>
        </div>
        <el-radio label="MANAGER">部门经理</el-radio>
        <el-radio label="USERS">候选用户</el-radio>
        <el-radio label="ROLES">候选角色</el-radio>
      </el-radio-group>
    </el-row>
    <el-row>
      <div v-if="defaultTaskForm.dataType === 'ASSIGNEE'">
        <el-select v-model="userTaskForm.assignee" filterable allow-create clearable @change="updateElementTask('assignee')">
          <el-option v-for="ak in users" :key="ak.id" :label="ak.name" :value="ak.id" />
        </el-select>
      </div>   
    </el-row>
    <el-row>
      <div v-if="defaultTaskForm.dataType === 'USERS'">
        <el-select v-model="userTaskForm.candidateUsers" filterable allow-create multiple collapse-tags @change="updateElementTask('candidateUsers')">
          <el-option v-for="uk in users" :key="uk.id" :label="uk.name" :value="uk.id" />
        </el-select>
      </div>   
    </el-row>
    <el-row>
      <div v-if="defaultTaskForm.dataType === 'ROLES'">
        <el-select v-model="userTaskForm.candidateGroups" filterable allow-create multiple collapse-tags @change="updateElementTask('candidateGroups')">
          <el-option v-for="gk in groups" :key="gk.id" :label="gk.name" :value="gk.id" />
        </el-select>
      </div>  
    </el-row>
    <el-row v-if="defaultTaskForm.dataType === 'USERS' || defaultTaskForm.dataType === 'ROLES' || defaultTaskForm.dataType === 'MANAGER'">
      <h4><b>多实例</b></h4>
      <div>
        <element-multi-instance :business-object="bpmnElement.businessObject" @multiInsEvent="multiIns"/>
      </div>  
    </el-row>
    <!-- <el-form-item label="到期时间">
      <el-input v-model="userTaskForm.dueDate" clearable @change="updateElementTask('dueDate')" />
    </el-form-item>
    <el-form-item label="跟踪时间">
      <el-input v-model="userTaskForm.followUpDate" clearable @change="updateElementTask('followUpDate')" />
    </el-form-item>
    <el-form-item label="优先级">
      <el-input v-model="userTaskForm.priority" clearable @change="updateElementTask('priority')" />
    </el-form-item> -->
  </div>
</template>
<script>
import ElementMultiInstance from "../../multi-instance/ElementMultiInstance";
export default {
  name: "UserTask",
  components: {
    ElementMultiInstance,
  },  
  props: {
    users: {//兼容老系统add by nbacheng
      type: Array,
      required: true
    },
    groups: {//兼容老系统
      type: Array,
      required: true
    },
    id: String,
    type: String
  },
  data() {
    return {
      defaultTaskForm: {
        assignee: "",
        candidateUsers: [],
        candidateGroups: [],
        dueDate: "",
        followUpDate: "",
        priority: "",
        dataType: "",
      },
      userTaskForm: {},
      bDisplayUser: true,
    };
  },
  watch: {
    id: {
      immediate: true,
      handler() {
        this.bpmnElement = window.bpmnInstances.bpmnElement;
        console.log("watch this.bpmnElement",this.bpmnElement)
        if (this.containsKey(this.bpmnElement.businessObject, 'loopCharacteristics') &&
             this.bpmnElement.businessObject.loopCharacteristics != null) {
          this.bDisplayUser = false;
          if (this.containsKey(this.bpmnElement.businessObject, 'candidateUsers') &&
               this.bpmnElement.businessObject.candidateUsers != null) {
            this.defaultTaskForm.dataType = "USERS";
          }
          if (this.containsKey(this.bpmnElement.businessObject, 'candidateUsers') &&
               this.bpmnElement.businessObject.candidateUsers === '${DepManagerHandler.getUsers(execution)}') {
            this.defaultTaskForm.dataType = "MANAGER";
          }
          if (this.containsKey(this.bpmnElement.businessObject, 'candidateGroups') &&
               this.bpmnElement.businessObject.candidateGroups != null) {
            this.defaultTaskForm.dataType = "ROLES";
          }
        }
        else {
          if (this.containsKey(this.bpmnElement.businessObject, 'assignee') &&
             this.bpmnElement.businessObject.assignee != null) {
             this.defaultTaskForm.dataType = "ASSIGNEE";
          } 
          if (this.containsKey(this.bpmnElement.businessObject, 'candidateUsers') &&
               this.bpmnElement.businessObject.candidateUsers != null) {
            this.defaultTaskForm.dataType = "USERS";
          }
          if (this.containsKey(this.bpmnElement.businessObject, 'candidateGroups') &&
               this.bpmnElement.businessObject.candidateGroups != null) {
            this.defaultTaskForm.dataType = "ROLES";
          }
          if (this.containsKey(this.bpmnElement.businessObject, 'assignee') &&
               this.bpmnElement.businessObject.assignee === '${INITIATOR}') {
            this.defaultTaskForm.dataType = "INITIATOR";
          }
          if (this.containsKey(this.bpmnElement.businessObject, 'candidateUsers') &&
               this.bpmnElement.businessObject.candidateUsers === '${DepManagerHandler.getUsers(execution)}') {
            this.defaultTaskForm.dataType = "MANAGER";
          }
        }
        this.$nextTick(() => this.resetTaskForm());
      }
    }
  },
  methods: {
    multiIns(val) { //子组件传递是否是多实例
      this.bDisplayUser = val;
    },
    containsKey(obj, key ) {
        return Object.keys(obj).includes(key);
    },
    resetTaskForm() {
      for (let key in this.defaultTaskForm) {
        let value;
        if (key === "candidateUsers" || key === "candidateGroups") {
          value = this.bpmnElement?.businessObject[key] ? this.bpmnElement.businessObject[key].split(",") : [];
        } else {
          value = this.bpmnElement?.businessObject[key] || this.defaultTaskForm[key];
        }
        this.$set(this.userTaskForm, key, value);
      }
    },
    changeDataType(val) {
      // 清空 userTaskForm 所有属性值
      //Object.keys(this.userTaskForm).forEach(key => this.userTaskForm[key] = null);
      this.userTaskForm.dataType = val;
      if (val === 'INITIATOR') {
        this.userTaskForm.assignee = "${INITIATOR}";
        this.userTaskForm.text = "流程发起人";
        const taskAttr = Object.create(null);
        taskAttr['candidateUsers'] = null;
        taskAttr['candidateGroups'] = null;
        this.userTaskForm['candidateUsers'] = null;
        this.userTaskForm['candidateGroups'] = null;
        taskAttr['assignee'] = this.userTaskForm['assignee'] || null;
        window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
      }
      if (val === 'MANAGER') {
        this.userTaskForm.candidateUsers = "${DepManagerHandler.getUsers(execution)}";
        this.userTaskForm.text = "部门经理";
        const taskAttr = Object.create(null);
        taskAttr['assignee'] = null;
        taskAttr['candidateGroups'] = null;
        this.userTaskForm['assignee'] = null;
        this.userTaskForm['candidateGroups'] = null;
        taskAttr['candidateUsers'] = this.userTaskForm['candidateUsers'] || null;
        window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
      }
      /*if (val === 'ASSIGNEE' && this.userTaskForm['assignee'] === '${INITIATOR}') {
        this.userTaskForm['assignee'] = null;
        const taskAttr = Object.create(null);
        taskAttr['assignee'] = null;
        window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
      }
      if (val === 'MANAGER' && this.userTaskForm['candidateUsers'] === '${DepManagerHandler.getUsers(execution)}') {
        this.userTaskForm['candidateUsers'] = null;
        const taskAttr = Object.create(null);
        taskAttr['candidateUsers'] = null;
        window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
      }*/
      
    },  
    updateElementTask(key) {
      const taskAttr = Object.create(null);
      if (key === "candidateUsers") {
        taskAttr[key] = this.userTaskForm[key] && this.userTaskForm[key].length ? this.userTaskForm[key].join() : null;
        if(taskAttr[key] !=null) {
          taskAttr['candidateGroups'] = null;
          taskAttr['assignee'] = null;
          this.userTaskForm['candidateGroups'] = null;
          this.userTaskForm['assignee'] = null;
        }  
      } 
      else if (key === "candidateGroups") {
        taskAttr[key] = this.userTaskForm[key] && this.userTaskForm[key].length ? this.userTaskForm[key].join() : null;
        if(taskAttr[key] !=null) {
          taskAttr['candidateUsers'] = null;
          taskAttr['assignee'] = null;
          this.userTaskForm['candidateUsers'] = null;
          this.userTaskForm['assignee'] = null;
        }  
      } 
      else if (key === "assignee") {
        taskAttr[key] = this.userTaskForm[key] && this.userTaskForm[key].length ? this.userTaskForm[key] : null;
        if(taskAttr[key] !=null) {
          taskAttr['candidateUsers'] = null;
          taskAttr['candidateGroups'] = null;
          this.userTaskForm['candidateUsers'] = null;
          this.userTaskForm['candidateGroups'] = null;
        }
      } 
      else {
        taskAttr[key] = this.userTaskForm[key] || null;
      }
      window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
    }
  },
  beforeDestroy() {
    this.bpmnElement = null;
  }
};
</script>

二、后端实现

1、增加部门经理的执行类DepManagerHandler 如下:

package com.nbcio.modules.flowable.listener;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.runtime.ProcessInstance;
import org.jeecg.common.util.SpringContextUtils;
import org.springframework.stereotype.Component;
import com.nbcio.modules.flowable.apithird.service.IFlowThirdService;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
/**
 * 部门经理处理类
 *
 * @author nbacheng
 * @date 2023-08-06
 */
@AllArgsConstructor
@Component("DepManagerHandler")
public class DepManagerHandler {
  private IFlowThirdService flowThirdService = SpringContextUtils.getBean(IFlowThirdService.class);
  RuntimeService runtimeService = SpringContextUtils.getBean(RuntimeService.class);
  public List<String> getUsers(DelegateExecution execution) {
    List<String> assignUserName = new ArrayList<String>();
    FlowElement flowElement = execution.getCurrentFlowElement();
        if (ObjectUtil.isNotEmpty(flowElement) && flowElement instanceof UserTask) {
            UserTask userTask = (UserTask) flowElement;
            if ( StringUtils.isNotEmpty(userTask.getAssignee())) {
              if(StringUtils.contains(userTask.getAssignee(),"DepManagerHandler")) {
                 // 获取流程发起人
                ProcessInstance processInstance = runtimeService
                            .createProcessInstanceQuery()
                            .processInstanceId(execution.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);
                  }
                  
                }
                // 部门负责人列表去重
                if(!DepHeadlist.isEmpty() ) {
                    for (String str : DepHeadlist) {
                        if (!assignUserName.contains(str)) {
                          assignUserName.add(str);
                        }
                    }
                }
              }
            }
        }    
        return assignUserName;
    
  }
}

2、考虑到复杂性,设置下一审批人,这里不做什么处理,让发起热进行complete进行提交处理。

if(Objects.nonNull(nextFlowNode.getUserList())) {
          if( nextFlowNode.getUserList().size() == 1 ) {
            if (nextFlowNode.getUserList().get(0) != null) {
              if(StringUtils.equalsAnyIgnoreCase(nextFlowNode.getUserList().get(0).getUsername(), "${INITIATOR}")) {//对发起人做特殊处理
                taskService.complete(task.getId(), variables);
                return Result.OK("流程启动成功给发起人.");
              }
              else if(nextFlowNode.getUserTask().getCandidateUsers().size()>0 && StringUtils.equalsAnyIgnoreCase(nextFlowNode.getUserTask().getCandidateUsers().get(0), "${DepManagerHandler.getUsers(execution)}")) {//对部门经理做特殊处理                
                //taskService.complete(task.getId(), variables);
                return Result.OK("流程启动成功给部门经理,请到我的待办里进行流程的提交流转.");
              }
              else {
                taskService.complete(task.getId(), variables);
                  return Result.OK("流程启动成功.");
              }
            }
            else {
              return Result.error("审批人不存在,流程启动失败!");
            }
            
          }
          else if(nextFlowNode.getType() == ProcessConstants.PROCESS_MULTI_INSTANCE ) {//对多实例会签做特殊处理或者以后在流程设计进行修改也可以
                    Map<String, Object> approvalmap = new HashMap<>();
                    List<String> sysuserlist = nextFlowNode.getUserList().stream().map(obj-> (String) obj.getUsername()).collect(Collectors.toList());
            approvalmap.put("approval", sysuserlist);
            taskService.complete(task.getId(), approvalmap);
            if(!nextFlowNode.isBisSequential()){//对并发会签进行assignee单独赋值
                List<Task> nexttasklist = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().list();
                int i=0;
                for (Task nexttask : nexttasklist) {
                   String assignee = sysuserlist.get(i).toString(); 
                       taskService.setAssignee(nexttask.getId(), assignee);
                       i++;
                }
               
              }
            return Result.OK("多实例会签流程启动成功.");
          }

3、getNextFlowNode增加相关部门经理的特殊处理

/**  modify by nbacheng
     * 获取下一个节点信息,流程定义上的节点信息
     * @param taskId 当前节点id
     * @param values 流程变量
     * @return 如果返回null,表示没有下一个节点,流程结束
     */
    public FlowNextDto getNextFlowNode(String taskId, Map<String, Object> values) {
      //当前节点
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        FlowNextDto flowNextDto = new FlowNextDto();
      if (Objects.nonNull(task)) {
          // 下个任务节点
        if (DelegationState.PENDING.equals(task.getDelegationState())) { //对于委派的处理
            List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values);
              if (CollectionUtils.isNotEmpty(nextUserTask)) {
                flowNextDto.setType(ProcessConstants.FIXED);//委派是按原来流程执行,所以直接赋值返回
                return flowNextDto;
              }
              else {
                return null;
              }
             }
            List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values);
            if (CollectionUtils.isNotEmpty(nextUserTask)) {
                for (UserTask userTask : nextUserTask) {
                    MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
                    // 会签节点
                    if (Objects.nonNull(multiInstance)) {
                      List<String> rolelist = new ArrayList<>();
                        rolelist = userTask.getCandidateGroups();
                      List<String> userlist = new ArrayList<>();
                        userlist = userTask.getCandidateUsers();
                        UserTask newUserTask = userTask;
                        if(rolelist.size() != 0 && StringUtils.contains(rolelist.get(0), "${flowExp.getDynamic")) {//对表达式多个动态角色做特殊处理
                          String methodname = StringUtils.substringBetween(rolelist.get(0), ".", "(");
                          Object[] argsPara=new Object[]{};
                          setMultiFlowExp(flowNextDto,newUserTask,multiInstance,methodname,argsPara);
                        }
                        else if(userlist.size() != 0 && StringUtils.contains(userlist.get(0), "${flowExp.getDynamic")) {//对表达式多个动态用户做特殊处理
                          String methodname = StringUtils.substringBetween(userlist.get(0), ".", "(");
                          Object[] argsPara=new Object[]{};
                          setMultiFlowExp(flowNextDto,newUserTask,multiInstance,methodname,argsPara);
                        }
                        else if(userlist.size() != 0 && StringUtils.contains(userlist.get(0), "DepManagerHandler")) {//对部门经理做特殊处理
                          String methodname = "getInitiatorDepManagers";
                          // 获取流程发起人
                        ProcessInstance processInstance = runtimeService
                                     .createProcessInstanceQuery()
                                     .processInstanceId(task.getProcessInstanceId())
                                     .singleResult();
                          String startUserId = processInstance.getStartUserId();
                          Object[] argsPara=new Object[]{};
                          argsPara=new Object[]{startUserId};
                          setMultiFlowExp(flowNextDto,newUserTask,multiInstance,methodname,argsPara);
                        }
                        else if(rolelist.size() > 0) {
                          List<SysUser> list = new ArrayList<SysUser>();
              for(String roleId : rolelist ){
                            List<SysUser> templist = iFlowThirdService.getUsersByRoleId(roleId);
                            for(SysUser sysuser : templist) {
                              SysUser sysUserTemp = iFlowThirdService.getUserByUsername(sysuser.getUsername());
                              List<String> listdepname = iFlowThirdService.getDepartNamesByUsername(sysuser.getUsername());
                              if(listdepname.size()>0){
                                sysUserTemp.setOrgCodeTxt(listdepname.get(0).toString());
                              }
                              list.add(sysUserTemp);
                              }
                          }
              setMultiFlowNetDto(flowNextDto,list,userTask,multiInstance);
                        }
                        /*else if(userlist.size()>0 && StringUtils.equalsAnyIgnoreCase(userlist.get(0), "${DepManagerHandler.getUsers(execution)}")) {//对部门经理做特殊处理
                          List<SysUser> list = new ArrayList<SysUser>();
                        // 获取流程发起人
                        ProcessInstance processInstance = runtimeService
                                     .createProcessInstanceQuery()
                                     .processInstanceId(task.getProcessInstanceId())
                                     .singleResult();
                          String startUserId = processInstance.getStartUserId();
                          //获取部门经理
                        list = getInitiatorDepManagers(startUserId);    
                        List<String> listCandidateUsers = new ArrayList<String>();
                        for(SysUser sysUser: list) {
                          String username = sysUser.getUsername();
                          listCandidateUsers.add(username);
                        }
                        userTask.setCandidateUsers(listCandidateUsers);//对于多实例要覆盖原先的值
                        setMultiFlowNetDto(flowNextDto,list,userTask,multiInstance);
                        }*/
                        else if(userlist.size() > 0) {
                          List<SysUser> list = new ArrayList<SysUser>();
                          for(String username : userlist) {
                            SysUser sysUser =  iFlowThirdService.getUserByUsername(username);
                            List<String> listdepname = iFlowThirdService.getDepartNamesByUsername(username);
                            if(listdepname.size()>0){
                              sysUser.setOrgCodeTxt(listdepname.get(0).toString());
                            }
                            list.add(sysUser);
                          }
                          setMultiFlowNetDto(flowNextDto,list,userTask,multiInstance);
                        }
                        else {
                          flowNextDto.setType(ProcessConstants.FIXED);
                        }
                  
                    } else {
                        // 读取自定义节点属性 判断是否是否需要动态指定任务接收人员、组,目前只支持用户角色或多用户,还不支持子流程和变量
                        //String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE);
                        //String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE);
                        List<String> rolelist = new ArrayList<>();
                        rolelist = userTask.getCandidateGroups();
                        List<String> userlist = new ArrayList<>();
                        userlist = userTask.getCandidateUsers();
                        String assignee = userTask.getAssignee();
                        // 处理加载动态指定下一节点接收人员信息
                        if(assignee !=null) {
                          if(StringUtils.equalsAnyIgnoreCase(assignee, "${INITIATOR}")) {//对发起人做特殊处理
                            List<SysUser> list = new ArrayList<SysUser>();
                            SysUser sysUser = new SysUser();
                            sysUser.setUsername("${INITIATOR}");
                            list.add(sysUser);
                            setAssigneeFlowNetDto(flowNextDto,list,userTask);
                          }          
                          else if(StringUtils.contains(assignee, "${flowExp.getDynamicAssignee")) {//对表达式单个动态用户做特殊处理
                            String methodname = StringUtils.substringBetween(assignee, ".", "(");
                            List<SysUser> list = new ArrayList<SysUser>();
                            SysUser sysUser = new SysUser();
                            flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
                            Object[] argsPara=new Object[]{};
                            String username = null;
                            try {
                  username = (String) flowexp.invokeMethod(flowexp, methodname,argsPara);
                } catch (Exception e) {
                  e.printStackTrace();
                }
                            sysUser.setUsername(username);
                            list.add(sysUser);
                            setAssigneeFlowNetDto(flowNextDto,list,userTask);
                          }
                          else if(StringUtils.contains(assignee, "${flowExp.getDynamicList")) {//对表达式多个动态用户做特殊处理
                            String methodname = StringUtils.substringBetween(assignee, ".", "(");
                            List<SysUser> list = new ArrayList<SysUser>();
                            flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
                            Object[] argsPara=new Object[]{};
                            try {
                              list = (List<SysUser>) flowexp.invokeMethod(flowexp, methodname,argsPara);
                } catch (Exception e) {
                  e.printStackTrace();
                }
                            setUsersFlowNetDto(flowNextDto,list,userTask);
                             
                          }
                          else if(StringUtils.contains(assignee, "${DepManagerHandler")) {//对部门经理多用户做特殊处理
                            String methodname = "getInitiatorDepManagers";
                            List<SysUser> list = new ArrayList<SysUser>();
                            // 获取流程发起人
                            ProcessInstance processInstance = runtimeService
                                         .createProcessInstanceQuery()
                                         .processInstanceId(task.getProcessInstanceId())
                                         .singleResult();
                              String startUserId = processInstance.getStartUserId();
                            flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
                            Object[] argsPara=new Object[]{};
                            argsPara[0] = startUserId;
                            try {
                              list = (List<SysUser>) flowexp.invokeMethod(flowexp, methodname,argsPara);
                } catch (Exception e) {
                  e.printStackTrace();
                }
                            setUsersFlowNetDto(flowNextDto,list,userTask);
                             
                          }
                          else {
                              List<SysUser> list = new ArrayList<SysUser>();
                              SysUser sysUser =  iFlowThirdService.getUserByUsername(assignee);
                            List<String> listdepname = iFlowThirdService.getDepartNamesByUsername(assignee);
                            if(listdepname.size()>0){
                               sysUser.setOrgCodeTxt(listdepname.get(0).toString());
                            }
                            list.add(sysUser);
                            setAssigneeFlowNetDto(flowNextDto,list,userTask);
                          }
                          
                        }
                        else if(userlist.size()>0 && StringUtils.equalsAnyIgnoreCase(userlist.get(0), "${DepManagerHandler.getUsers(execution)}")) {//对部门经理做特殊处理
                          List<SysUser> list = new ArrayList<SysUser>();
                        // 获取流程发起人
                        ProcessInstance processInstance = runtimeService
                                     .createProcessInstanceQuery()
                                     .processInstanceId(task.getProcessInstanceId())
                                     .singleResult();
                             String startUserId = processInstance.getStartUserId();
                        list = getInitiatorDepManagers(startUserId);
                        if(list.size()> 1) {
                          setUsersFlowNetDto(flowNextDto,list,userTask);
                            setMultiFinishFlag(task,flowNextDto,list);
                        }
                        else {
                          setUsersFlowNetDto(flowNextDto,list,userTask);
                        }
                        }
                        else if(userlist.size() > 0) {
                          List<SysUser> list = new ArrayList<SysUser>();
                          for(String username : userlist) {
                            SysUser sysUser =  iFlowThirdService.getUserByUsername(username);
                            List<String> listdepname = iFlowThirdService.getDepartNamesByUsername(username);
                            if(listdepname.size()>0){
                              sysUser.setOrgCodeTxt(listdepname.get(0).toString());
                            }
                            list.add(sysUser);
                          }
                          setUsersFlowNetDto(flowNextDto,list,userTask);
                          setMultiFinishFlag(task,flowNextDto,list);
                          
                        }
                        else if(rolelist.size() > 0) {
                          List<SysUser> list = new ArrayList<SysUser>();
              for(String roleId : rolelist ){
                            List<SysUser> templist = iFlowThirdService.getUsersByRoleId(roleId);
                            for(SysUser sysuser : templist) {
                              SysUser sysUserTemp = iFlowThirdService.getUserByUsername(sysuser.getUsername());
                              List<String> listdepname = iFlowThirdService.getDepartNamesByUsername(sysuser.getUsername());
                              if(listdepname.size()>0){
                                sysUserTemp.setOrgCodeTxt(listdepname.get(0).toString());
                              }
                              list.add(sysUserTemp);
                              }
                          }
              setUsersFlowNetDto(flowNextDto,list,userTask);
              setMultiFinishFlag(task,flowNextDto,list);
                        }
                        else {
                          flowNextDto.setType(ProcessConstants.FIXED);
                        }
                    }
                }
                return flowNextDto;
            } else {
                return null;
          }
       }
       return null;
    }

4、多实例处理类增加部门经理的处理

package com.nbcio.modules.flowable.listener;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.nbcio.modules.flowable.apithird.entity.SysUser;
import com.nbcio.modules.flowable.apithird.service.IFlowThirdService;
import com.nbcio.modules.flowable.utils.flowExp;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution;
import org.jeecg.common.util.SpringContextUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
 * 多实例collect用户处理类
 *
 * @author nbacheng
 * @date 2022-10-16
 */
@AllArgsConstructor
@Component("multiInstanceHandler")
public class MultiInstanceHandler {
  public Set<String> getUserName(DelegateExecution execution) {
        Set<String> candidateUserName = new LinkedHashSet<>();
        FlowElement flowElement = execution.getCurrentFlowElement();
        if (ObjectUtil.isNotEmpty(flowElement) && flowElement instanceof UserTask) {
            UserTask userTask = (UserTask) flowElement;
            if (CollUtil.isNotEmpty(userTask.getCandidateUsers())) {
              List<String> groups = userTask.getCandidateUsers();
              if (groups.size()!= 0 && StringUtils.contains(groups.get(0), "${flowExp.getDynamic")) {
                getDynamicUsers(groups,candidateUserName);
                
        }
              else if (groups.size()!= 0 && StringUtils.contains(groups.get(0), "DepManagerHandler")) {
                getInitiatorDepManagers(candidateUserName);
                
        }
              else {
                candidateUserName.addAll(userTask.getCandidateUsers());
              }
              
            } else if (CollUtil.isNotEmpty(userTask.getCandidateGroups())) {
              List<String> groups = userTask.getCandidateGroups();
              if (groups.size()!= 0 && StringUtils.contains(groups.get(0), "${flowExp.getDynamic")) {
                getDynamicUsers(groups,candidateUserName);
                
        }
              else {
                  IFlowThirdService iFlowThirdService = SpringContextUtils.getBean(IFlowThirdService.class);
                  groups.forEach(item -> {
                       List<SysUser> listuserName = iFlowThirdService.getUsersByRoleId(item);
                       for(SysUser sysuser : listuserName) {
                          candidateUserName.add(sysuser.getUsername());
                       }
                  });
              } 
            }
        }
        return candidateUserName;
    }
  
  @SuppressWarnings("unchecked")
    private void getDynamicUsers(List<String> groups,Set<String> candidateUserName) {
      String methodname = StringUtils.substringBetween(groups.get(0), ".", "(");
    List<String> list = new ArrayList<String>();
    flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    Object[] argsPara=new Object[]{};
    try {
      list = (List<String>) flowexp.invokeMethod(flowexp, methodname,argsPara);
            candidateUserName.addAll(list);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    }
  
    @SuppressWarnings("unchecked")
  private void getInitiatorDepManagers(Set<String> candidateUserName) {
      String methodname = "getInitiatorDepManagers";
    List<String> list = new ArrayList<String>();
    flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    Object[] argsP

5、表达式里增加部门经理的获取

//获取发起人部门经理
    public  List<String> getInitiatorDepManagers(String startUserId) {
      // 获取部门负责人列表
      List<String> depIds = iFlowThirdService.getDepartIdsByUsername(startUserId);
      List<String> DepHeadlist = new ArrayList<String>();
      for(String depId: depIds) {
        List<String> depList = iFlowThirdService.getDeptHeadByDepId(depId);
        if(depList != null) {
          DepHeadlist.addAll(depList);
        }
        
      }
      // 部门负责人列表去重
      List<String> listUserName = new ArrayList<String>();
      if(!DepHeadlist.isEmpty() ) {
          for (String str : DepHeadlist) {
              if (!listUserName.contains(str)) {
                listUserName.add(str);
              }
          }
      }
      return listUserName;
      
    }
  
  /**
  * 反射调用方法
  * @param newObj 实例化的一个对象
  * @param methodName 对象的方法名
  * @param args 参数数组
  * @return 返回值
  * @throws Exception
  */
  public  Object invokeMethod(Object newObj, String methodName, Object[] args)throws Exception {
    Class ownerClass = newObj.getClass();
    Class[] argsClass = new Class[args.length];
    for (int i = 0, j = args.length; i < j; i++) {
      argsClass[i] = args[i].getClass();
    }
    Method method = ownerClass.getMethod(methodName, argsClass);
    return method.invoke(newObj, args);
  }


相关文章
|
10月前
|
前端开发
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)
396 1
|
10月前
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(一)
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(一)
392 1
|
10月前
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(三)
基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(三)
364 1
|
10月前
|
SQL JavaScript 前端开发
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(一)
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(一)
637 2
|
10月前
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(三)
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(三)
381 1
|
10月前
|
移动开发 前端开发
基于jeecg-boot的flowable流程审批时增加下一个审批人设置
基于jeecg-boot的flowable流程审批时增加下一个审批人设置
732 0
|
10月前
|
移动开发 前端开发 Java
基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式
基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式
189 0
|
10月前
|
前端开发
基于jeecg-boot的flowable流程自定义业务驳回到发起人的一种处理方式
基于jeecg-boot的flowable流程自定义业务驳回到发起人的一种处理方式
371 0
|
10月前
|
移动开发 前端开发
基于Jeecg-boot的flowable流程支持拒绝同意流程操作
基于Jeecg-boot的flowable流程支持拒绝同意流程操作
256 0
|
10月前
|
移动开发 前端开发
基于Jeecg-boot的flowable流程支持拒绝同意流程操作(二)
基于Jeecg-boot的flowable流程支持拒绝同意流程操作(二)
188 0