基于开源项目KonBAI / RuoYi-Flowable-Plus使用的部分功能调整。原代码存在连续委派时,任务无法回到最初委派人的情况。

1.概念:

(1)委派:将任务临时转给其他人处理,待其他人处理结束后,任务回到原处理人处。

eg:A -> B -> C:C确认通过后,该任务回到A处,待A确认通过才流转到下一节点。

(2)转办:将任务永久转给其他人处理,其他人处理处理结束后,不再回到原处理人处。

eg:A -> B -> C:C确认通过后,流转到下一节点。

2.代码分析

问题:在进行连续委派时,例如A -> B -> C,在C处理通过后,任务回到B处。B处理通过后任务没有回到A处,而是流转至下一节点,不符合委派的概念。
解决:这是因为在进行委派操作时,每一次委托都会重置这条用户任务的owner(委托人)和assignee(处理人),导致连续委派时原委派人丢失。此处做了一个判空,如果委派人owner已经存在则不再重置。

 /**
     * 委派任务
     *
     * @param bo 请求实体参数
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delegateTask(WfTaskBo bo) {
        // 当前任务 task
        Task task = taskService.createTaskQuery().taskId(bo.getTaskId()).singleResult();
        if (ObjectUtil.isEmpty(task)) {
            throw new ServiceException("获取任务失败!");
        }
        StringBuilder commentBuilder = new StringBuilder(LoginHelper.getNickName())
            .append("->");
        SysUser user = sysUserService.selectUserById(Long.parseLong(bo.getUserId()));
        if (ObjectUtil.isNotNull(user)) {
            commentBuilder.append(user.getNickName());
        } else {
            commentBuilder.append(bo.getUserId());
        }
        if (StringUtils.isNotBlank(bo.getComment())) {
            commentBuilder.append(": ").append(bo.getComment());
        }

        // 设置审批表userId
        Authentication.setAuthenticatedUserId(TaskUtils.getUserId());
        // 添加审批意见
        taskService.addComment(bo.getTaskId(), task.getProcessInstanceId(), FlowComment.DELEGATE.getType(), commentBuilder.toString());

		// old >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		// 设置办理人为当前登录人
         //   taskService.setOwner(bo.getTaskId(), TaskUtils.getUserId());
         
         // new >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        // 判断任务当前是否存在委托人owner,存在则不处理,不存在则设置当前登录人
        if (StringUtils.isBlank(task.getOwner())) {
            // 设置办理人为当前登录人
            taskService.setOwner(bo.getTaskId(), TaskUtils.getUserId());
        }

        // 执行委派
        taskService.delegateTask(bo.getTaskId(), bo.getUserId());
        // 设置任务节点名称
        bo.setTaskName(task.getName());
        // 处理抄送用户
        if (!copyService.makeCopy(bo)) {
            throw new RuntimeException("抄送任务失败");
        }
}

当委派任务时,task表中的DELEGATION_字段更新为PENDING(委托中)。当委派人完成任务(complete)时,task表中的DELEGATION_字段更新为RESOLVED,并将owner的值覆盖assingee值,实现无论委派多少次,任务处理人都能回到最初的委派人处。

思考

Q:为什么在被委托人C处理通过后,在其已办列表中无法看到这条工作流信息?
A:由于委托人和处理人的转换,是基于一条任务数据上变化的。所以在被委派人C处理通过后,这条工作流信息并不会存在于被委派人C的已办列表中。C的审批记录只会保存在act_hi_comment历史审批表中。

参考资料

KonBAI / RuoYi-Flowable-Plus - 基于 RuoYi-Vue-Plus 进行二次开发扩展Flowable工作流功能的开源项目
Flowable工作流之加签(委派)、转签(转办)- 桐花思雨

Logo

快速构建 Web 应用程序

更多推荐