Activiti委托与解决委托

       我们常常在业务场景中会有这样的需求,我需要将自己的任务委托给另外一个人,同时需要获取委托人和被委托人的信息,也需要知道此任务是正在被委托,还是委托人已完成此时,我们就需要用到Activiti中的委托功能:

这是一条普通的任务,现在我们看数据库act_ru_task表,对比任务的id我们看到第一条是当前我们需要观测的数据:

1、接下来我们开始委托功能

Activiti委托与解决委托_第1张图片

/**
 * 将指定任务进行委托处理
 *
 * @param taskId
 * @param assignee
 */
public static void delegateTask(String taskId, String assignee) {
    taskService.delegateTask(taskId, assignee);
}

此时,再查看数据库表:

Activiti委托与解决委托_第2张图片

对比委托之前的数据我们发现发生了一些变化:

  • DELEGATION_字段的值变化为PENDING,表示此任务为正在执行的委托任务;
  • OWNER_字段表示委托人;
  • ASSIGNEE_表示当前任务处理人;

2、接下来解决委托

/**
 * 根据taskId解决被委托的任务并进行到下一个节点,动态传值设置变量
 */
public static void resolveTask(String taskId, Map variables) {
    //根据taskId提取任务
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    if (task.getOwner() != null && !task.getOwner().equals("null")) {
        DelegationState delegationState = task.getDelegationState();
        if (delegationState.toString().equals("RESOLVED")) {
            System.out.println("此委托任务已是完结状态");
        } else if (delegationState.toString().equals("PENDING")) {
            //如果是委托任务需要做处理
            taskService.resolveTask(taskId);
            taskService.complete(taskId, variables);
        } else {
            System.out.println("此任务不是委托任务");
        }
    }
}

对比之前的数据库:

此时的DELEGATION_字段的值变化为RESOLVED,表示此任务为被解决的委托任务;

3、Activiti是外国人写的,外国人与我们想法不太一样,他们认为委托任务必须有解决委托这一步骤,当解决委托后,流程并不是进行到下一个节点,而是需要被委托人有完成任务操作时方可进行到下一步,而中国式需求中大多都是解决委托就是完成任务,需要解决这个问题的话可以在调用解决委托后执行一个完成任务代码操作。

/**
 * 根据taskId解决被委托的任务并进行到下一个节点,动态传值设置变量
 */
public static void resolveTask(String taskId, Map variables) {
    //根据taskId提取任务
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    if (task.getOwner() != null && !task.getOwner().equals("null")) {
        DelegationState delegationState = task.getDelegationState();
        if (delegationState.toString().equals("RESOLVED")) {
            System.out.println("此委托任务已是完结状态");
        } else if (delegationState.toString().equals("PENDING")) {
            //如果是委托任务需要做处理
            taskService.resolveTask(taskId);
            taskService.complete(taskId, variables);
        } else {
            System.out.println("此任务不是委托任务");
        }
    }
}

委托任务如果不解决委托将无法进行到下一个节点,完成任务时将直接抛出异常:

Activiti委托与解决委托_第3张图片

 

你可能感兴趣的:(activiti,activity,委托)