基于开源项目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工作流之加签(委派)、转签(转办)- 桐花思雨