首页
学习
活动
专区
圈层
工具
发布

工作流引擎之activiti委托功能实现

委托场景

在业务的一些需求中,比如有些属于自己的任务无法完成,就可以把自己的任务委托给其他人,让其他人来帮你完成

如何利用activiti实现委托功能

利用activiti自带的api:taskservice中的delegateTask方法实现委托

核心代码功能实现

1、指定委托人

代码语言:javascript
复制
public static void delegate(String curTaskId, String userId) {
        taskService.delegateTask(curTaskId, userId);
    }

这段代码执行后,查看 act_ru_task表

受理人委托其他人操作该TASK的时候,受理人就成了委托人OWNER,其他人就成了受理人ASSIGNEE,同时DELEGATION_的状态变为PENDING(委托状态)

2.完成任务

完成任务不能直接调用taskservice的complete方法,否则会抛出

代码语言:javascript
复制
org.activiti.engine.ActivitiException: A delegated task cannot be completed, but should be resolved instead.

异常的意思就是完成任务是要先解决委托,委托任务必须有解决委托这一步骤,当解决委托后,流程并不是进行到下一个节点,而是需要被委托人有完成任务操作时方可进行到下一步,而中国式需求中大多都是解决委托就是完成任务,需要解决这个问题的话可以在调用解决委托后执行一个完成任务代码操作。因此在完成任务时,要判断是否是委托任务。

完成任务核心代码功能

代码语言:javascript
复制
public static void completeTask(String curTaskId, Map<String, Object> variables) {
        Task task = taskService.createTaskQuery().taskId(curTaskId).singleResult();
        // owner不为空说明可能存在委托任务
        if (StringUtils.isNotBlank(task.getOwner())) {
            DelegationState delegationState = task.getDelegationState();
            switch (delegationState) {
            case PENDING:
                taskService.resolveTask(curTaskId);
                taskService.complete(curTaskId, variables);
                break;

            case RESOLVED:
                System.out.println("委托任务已经完成");
                break;

            default:
                System.out.println("不是委托任务");
                taskService.complete(curTaskId, variables);
                break;
            }
        } else {
            taskService.complete(curTaskId, variables);
        }

    }

demo地址

https://github.com/lyb-geek/demo-activiti-delegated

下一篇
举报
领券