因为之前没有在流程设计器里增加部门经理审批,所以这次增加这个功能
界面如下:
同时可以对于多名部门经理可以进行多实例配置,如下图:
一、前端实现
主要修改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); }