现有如下需求,审批人在退回申请时,想退回至申请人节点,但目前芋道并不支持退回至申请人节点,现做如下修改,实现该需求:
步骤一:设计流程模型
首先,我们在设计流程模型时,添加申请人节点,如图所示:
因为在退回的时候,我们可以看到,后台是根据UserTask判断的,如果说类型为用户节点,它才会将其放到退回的流程里面,如果我们只有一个开始节点的话,它是不会进行退回的,所以这里我们将申请人单独设置为一个用户节点。
步骤二:修改任务分配规则
将分配规则中的申请人,改成自定义脚本,流程发起人
接下来只需要在后台代码中进行自动完成任务即可。
步骤三:后台添加逻辑
正常来说,每到一个节点都需要进行审核才能继续走下去,但由于我们该节点为申请人,所以我们需要在这个节点做一些处理,也就是当申请人提交申请的同时,自动完成了申请人节点这个任务。
思路:首先我们找到对应的启动流程的方法,然后将当前流程的userId放到流程变量当中,然后遍历任务,然后获取任务的候选人,判断如果候选人和流程变量中存放的userid相等,则完成该任务。 为了排除当其他节点中候选人中也是这个userId,如果不做限制,它也会自动完成,接下来我们把它单独封装成一个方法,仅在启动流程中调用。
实现:
BpmProcessInstanceServiceImpl:添加如下两行代码,位置如图:
variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userId);
taskService.startFirstTask(instance, variables);
接下来,我们在对应的 taskService 中,添加完成第一个任务的方法startFirstTask:
BpmTaskService:
void startFirstTask(ProcessInstance processInstance, Map<String, Object> variables);
BpmTaskServiceImpl:
/*** 启动第一个任务* @param processInstance 流程实例* @param variables 流程参数*/@Overridepublic void startFirstTask(ProcessInstance processInstance, Map<String, Object> variables) {// 若第一个用户任务为发起人,则自动完成任务List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();if (CollUtil.isNotEmpty(tasks)) {String userIdStr = variables.get(DictTypeConstants.PROCESS_INITIATOR).toString();for (Task task : tasks) {if (StrUtil.equals(task.getAssignee(), userIdStr)) {taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), BpmCommentTypeEnum.APPROVE.getType().toString(), getLoginUserId() + "发起流程申请");taskService.complete(task.getId(), variables);}}}}
}