委派

740 阅读2分钟

本文介绍使用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;
}
  1. 将任务的delegationState置为PENDING状态;
  2. 检查owner值,如果owner为空,使用assingee的值。在委派结束回到原来节点时,通过owner决定回到哪个用户审批。为空一直是被委派人审批。
  3. 改变处理人

委派人审核后

@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()));
    }
}
  1. 在委派过程中,被委派者审批后不能调用taskService.complete方法。否则会报A delegated task cannot be completed, but should be resolved instead错误。所以应该先判断此任务是否处于委派状态,并调用resolveTask方法。
  2. 被委派的任务在已办任务是不显示的。业务想委派任务也出现在被委派人的已办任务列表中,可以增加一个子任务解决