本文介绍使用flowable的委派功能,基于芋道后台系统实现
什么是委派
在工作流程中,节点本来是由A进行处理,A认为应该先问问B的意见,就将此节点的审核委派给了B,B审核通过,回到A继续审核;B驳回,工作流结束。在bpmn xml流程图中,是看不到委派人审核节点的,在流程记录中有委派人审核记录
具体实现
设置委派人
@PutMapping("/delegate-task")
@ApiOperation(value = "委派负责人",notes = "用于【流程详情】的【委派】按钮")
@PreAuthorize("@ss.hasPermission('bpm:task:update')")
public CommonResult<Boolean> delegateTask(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO){
taskService.delegateTask(getLoginUserId(),reqVO);
return success(true);
}
@Override
public void delegateTask(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) {
// 校验任务存在
Task task = checkTask(userId, reqVO.getId());
//疑惑 设置任务的owner,在委派结束回到原来节点时,通过owner决定回到哪个用户审批。为空一直是被委派人审批
taskService.setOwner(task.getId(),userId.toString());
taskService.delegateTask(task.getId(),reqVO.getAssigneeUserId().toString());
}
注意要保证当前任务的owner字段是有值的。owner字段代表当前节点属于哪个人进行审批。assignee字段代表当前节点代理给谁审批。
delegateTask做了什么
@Override
protected Object execute(CommandContext commandContext, TaskEntity task) {
task.setDelegationState(DelegationState.PENDING);
if (task.getOwner() == null) {
task.setOwner(task.getAssignee());
}
TaskHelper.changeTaskAssignee(task, userId);
return null;
}
- 将任务的delegationState置为PENDING状态;
- 检查owner值,如果owner为空,使用assingee的值。在委派结束回到原来节点时,通过owner决定回到哪个用户审批。为空一直是被委派人审批。
- 改变处理人
委派人审核后
@Override
@Transactional(rollbackFor = Exception.class)
public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) {
// 校验任务存在
Task task = checkTask(userId, reqVO.getId());
// 校验流程实例存在
ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
if (instance == null) {
throw exception(PROCESS_INSTANCE_NOT_EXISTS);
}
if (task.getDelegationState() != null && task.getDelegationState() == DelegationState.PENDING){
Task subTask = this.createSubTask(task, userId);
taskService.complete(subTask.getId(),instance.getProcessVariables());
taskService.resolveTask(reqVO.getId(),instance.getProcessVariables());
}else {
// 完成任务,审批通过
taskService.complete(task.getId(), instance.getProcessVariables());
// 更新任务拓展表为通过
taskExtMapper.updateByTaskId(
new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult())
.setReason(reqVO.getReason()));
}
}
- 在委派过程中,被委派者审批后不能调用
taskService.complete方法。否则会报A delegated task cannot be completed, but should be resolved instead错误。所以应该先判断此任务是否处于委派状态,并调用resolveTask方法。 - 被委派的任务在已办任务是不显示的。业务想委派任务也出现在被委派人的已办任务列表中,可以增加一个子任务解决