gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
github源代码地址
后端代码:https://github.com/nbacheng/nbcio-boot.git
前端代码:https://github.com/nbacheng/nbcio-vue.git
1、流程启动修改
因为在排它网关后面直接接会签功能的话,启动不带流程设计器的approval就会报错,具体修改如下:
if(targetFlowElement instanceof ExclusiveGateway){// 下个出口是排它网关的话,后一个用户任务又是会签的情况下需要approval的赋值处理,否则报错
usermap = GetExclusiveGatewayUser(targetFlowElement,variables);//还是需要返回用户与是否并发,因为并发要做特殊处理
userlist = (ArrayList<String>) usermap.get("approval");
variablesnew.put("approval", userlist);
break;
}
}
ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variablesnew);
// 给第一步申请人节点设置任务执行人和意见
if((usermap.containsKey("isSequential")) && !(boolean)usermap.get("isSequential")) {//并发会签会出现2个以上需要特殊处理
List<Task> nexttasklist = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().list();
int i=0;
for (Task nexttask : nexttasklist) {
String assignee = userlist.get(i).toString();
taskService.addComment(nexttask.getId(), processInstance.getProcessInstanceId(),
FlowComment.NORMAL.getType(), sysUser.getRealname() + "发起流程申请");
taskService.setAssignee(nexttask.getId(), assignee);
i++;
}
return Result.OK("多实例会签流程启动成功.");
}
else {// 给第一步申请人节点设置任务执行人和意见
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active()
.singleResult();
if (Objects.nonNull(task)) {
taskService.addComment(task.getId(), processInstance.getProcessInstanceId(),
FlowComment.NORMAL.getType(), sysUser.getRealname() + "发起流程申请");
taskService.setAssignee(task.getId(), sysUser.getUsername());
//taskService.complete(task.getId(), variables);
}
// 获取下一个节点数据及设置数据
FlowNextDto nextFlowNode = flowTaskService.getNextFlowNode(task.getId(), variables);
if(Objects.nonNull(nextFlowNode)) {
if( nextFlowNode.getUserList().size() == 1 ) {
taskService.complete(task.getId(), variables);
return Result.OK("流程启动成功.");
}
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("多实例会签流程启动成功.");
}
else if(nextFlowNode.getUserList().size() > 1) {
return Result.OK("流程启动成功,请到我的待办里进行流程的提交流转.");
}
else {
return Result.OK("流程启动失败,请检查流程设置人员!");
}
}
else {
taskService.complete(task.getId(), variables);
return Result.OK("流程启动成功.");
}
}
}
相应的调用函数如下:
效果图如下: