更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
接上面文章。
1、获取排他网关分支名称、分支表达式、下一级任务节点
-
- /**
- * 获取排他网关分支名称、分支表达式、下一级任务节点
- * @param flowElement
- * @param data
- * add by nbacheng
- */
- private Map
GetExclusiveGatewayUser(FlowElement flowElement,Map variables) { - // 获取所有网关分支
- List
targetFlows=((ExclusiveGateway)flowElement).getOutgoingFlows(); - // 循环每个网关分支
- for(SequenceFlow sequenceFlow : targetFlows){
- // 获取下一个网关和节点数据
- FlowElement targetFlowElement=sequenceFlow.getTargetFlowElement();
- // 网关数据不为空
- if (StringUtils.isNotBlank(sequenceFlow.getConditionExpression())) {
- // 获取网关判断条件
- String expression = sequenceFlow.getConditionExpression();
- if (expression == null ||Boolean.parseBoolean(
- String.valueOf(
- FindNextNodeUtil.result(variables, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) {
- // 网关出线的下个节点是用户节点
- if(targetFlowElement instanceof UserTask){
- // 判断是否是会签
- UserTask userTask = (UserTask) targetFlowElement;
- MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
- if (Objects.nonNull(multiInstance)) {//下个节点是会签节点
- Map
approvalmap = new HashMap<>(); - List
getuserlist = getmultiInstanceUsers(multiInstance,userTask); - approvalmap.put("approval", getuserlist);
- if(multiInstance.isSequential()) {
- approvalmap.put("isSequential", true);
- }
- else {
- approvalmap.put("isSequential", false);
- }
- return approvalmap;
- }
- }
- }
- }
- }
- return null;
- }
2、获取多实例会签用户信息
- /**
- * 获取多实例会签用户信息
- * @param userTask
- * @param multiInstance
- *
- **/
- List
getmultiInstanceUsers(MultiInstanceLoopCharacteristics multiInstance,UserTask userTask) { - List
sysuserlist = new ArrayList<>(); - List
rolelist = new ArrayList<>(); - rolelist = userTask.getCandidateGroups();
- List
userlist = new ArrayList<>(); - userlist = userTask.getCandidateUsers();
- if(rolelist.size() > 0) {
- List
list = new ArrayList(); - for(String roleId : rolelist ){
- List
templist = commonService.getUserListByRoleId(roleId); - for(SysUser sysuser : templist) {
- SysUser sysUserTemp = sysUserService.selectUserById(sysuser.getUserId());
- list.add(sysUserTemp);
- }
- }
- sysuserlist = list.stream().map(obj-> (String) obj.getUserName()).collect(Collectors.toList());
-
- }
- else if(userlist.size() > 0) {
- List
list = new ArrayList(); - for(String username : userlist) {
- SysUser sysUser = sysUserService.selectUserByUserName(username);
- list.add(sysUser);
- }
- sysuserlist = list.stream().map(obj-> (String) obj.getUserName()).collect(Collectors.toList());
- }
- return sysuserlist;
- }
3、获取下一个节点信息
- /**
- * 获取下一节点
- *
- * @param flowTaskVo 任务
- * @return
- */
- @Override
- public R getNextFlowNode(WfTaskBo flowTaskVo) {
- // todo 目前只支持部分功能
- FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getVariables());
- if (flowNextDto==null) {
- return R.ok(null);
- }
- return R.ok(flowNextDto);
-
- }
-
- /** modify by nbacheng
- * 获取下一个节点信息,流程定义上的节点信息
- * @param taskId 当前节点id
- * @param values 流程变量
- * @return 如果返回null,表示没有下一个节点,流程结束
- */
-
- public FlowNextDto getNextFlowNode(String taskId, Map
values) { - //当前节点
- Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
- FlowNextDto flowNextDto = new FlowNextDto();
-
- if (Objects.nonNull(task)) {
- // 下个任务节点
- if (DelegationState.PENDING.equals(task.getDelegationState())) { //对于委派的处理
- List
nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values); - if (CollectionUtils.isNotEmpty(nextUserTask)) {
- flowNextDto.setType(ProcessConstants.FIXED);//委派是按原来流程执行,所以直接赋值返回
- return flowNextDto;
- }
- else {
- return null;
- }
-
- }
- List
nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values); - List
list = new ArrayList(); - if (CollectionUtils.isNotEmpty(nextUserTask)) {
- for (UserTask userTask : nextUserTask) {
- MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
- // 会签节点
- if (Objects.nonNull(multiInstance)) {
- List
rolelist = new ArrayList<>(); - rolelist = userTask.getCandidateGroups();
- List
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) {
- for(String roleId : rolelist ){
- List
templist = commonService.getUserListByRoleId(roleId); - for(SysUser sysuser : templist) {
- SysUser sysUserTemp = sysUserService.selectUserById(sysuser.getUserId());
- list.add(sysUserTemp);
- }
- }
- setMultiFlowNetDto(flowNextDto,list,userTask,multiInstance);
- }
- else if(userlist.size() > 0) {
- for(String username : userlist) {
- SysUser sysUser = sysUserService.selectUserByUserName(username);
- 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
rolelist = new ArrayList<>(); - rolelist = userTask.getCandidateGroups();
- List
userlist = new ArrayList<>(); - userlist = userTask.getCandidateUsers();
- String assignee = userTask.getAssignee();
- // 处理加载动态指定下一节点接收人员信息
- if(assignee !=null) {
- if(StringUtils.equalsAnyIgnoreCase(assignee, "${INITIATOR}")) {//对发起人做特殊处理
- 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, ".", "(");
- 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, ".", "(");
- flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
- Object[] argsPara=new Object[]{};
- try {
- list = (List
) flowexp.invokeMethod(flowexp, methodname,argsPara); - } catch (Exception e) {
- e.printStackTrace();
- }
- setUsersFlowNetDto(flowNextDto,list,userTask);
-
- }
- else if(StringUtils.contains(assignee, "${DepManagerHandler")) {//对部门经理多用户做特殊处理
- String methodname = "getInitiatorDepManagers";
- // 获取流程发起人
- 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
) flowexp.invokeMethod(flowexp, methodname,argsPara); - } catch (Exception e) {
- e.printStackTrace();
- }
- setUsersFlowNetDto(flowNextDto,list,userTask);
-
- }
- else {
- SysUser sysUser = sysUserService.selectUserByUserName(assignee);
-
- list.add(sysUser);
- setAssigneeFlowNetDto(flowNextDto,list,userTask);
- }
-
- }
- else if(userlist.size()>0 && StringUtils.equalsAnyIgnoreCase(userlist.get(0), "${DepManagerHandler.getUsers(execution)}")) {//对部门经理做特殊处理
- // 获取流程发起人
- ProcessInstance processInstance = runtimeService
- .createProcessInstanceQuery()
- .processInstanceId(task.getProcessInstanceId())
- .singleResult();
- String startUserId = processInstance.getStartUserId();
- flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
- String manager = flowexp.getDynamicManager(startUserId);
- SysUser sysUser = sysUserService.selectUserByUserName(manager);
- list.add(sysUser);
- setUsersFlowNetDto(flowNextDto,list,userTask);
- }
- else if(userlist.size() > 0) {
- for(String username : userlist) {
- SysUser sysUser = sysUserService.selectUserByUserName(username);
-
- list.add(sysUser);
- }
- setUsersFlowNetDto(flowNextDto,list,userTask);
- setMultiFinishFlag(task,flowNextDto,list);
-
- }
- else if(rolelist.size() > 0) {
- for(String roleId : rolelist ){
- List
templist = commonService.getUserListByRoleId(roleId); - for(SysUser sysuser : templist) {
- SysUser sysUserTemp = sysUserService.selectUserByUserName(sysuser.getUserName());
- list.add(sysUserTemp);
- }
- }
- setUsersFlowNetDto(flowNextDto,list,userTask);
- setMultiFinishFlag(task,flowNextDto,list);
- }
- else {
- flowNextDto.setType(ProcessConstants.FIXED);
- }
- }
- }
- return flowNextDto;
- } else {
- return null;
- }
- }
- return null;
-
- }