You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Activiti6中调用complete方法后获取后续任务ID及Task1重复指派经办人方案咨询

解决Activiti6流程回退时重置任务经办人问题

先针对你当前的疑问——调用complete方法后如何获取task2的任务ID,给你直接的解决方案,再分享更优的实现思路。

一、获取task2任务ID的直接方法

当你调用taskService.complete(task.getId(), variables)完成task1后,流程会自动流转到task2,这时候你可以通过流程实例ID+经办人来精准查询到刚生成的task2:

@Test
public void testCompleteTask() {
    Task task = taskService.createTaskQuery().taskAssignee("Tom").singleResult();
    if (task == null) {
        System.out.println("no task!!!");
        return;
    }
    String preTaskId = task.getId();
    String processInstanceId = task.getProcessInstanceId(); // 获取当前流程实例ID
    HashMap<String, Object> variables = new HashMap<>();
    variables.put("userId", "Jerry");
    variables.put("oper", "saolu");
    
    // 完成task1,流程流转到task2
    taskService.complete(task.getId(), variables);
    
    // 查询task2:根据流程实例ID+经办人Jerry(和你设置的userId对应)
    Task task2 = taskService.createTaskQuery()
        .processInstanceId(processInstanceId)
        .taskAssignee("Jerry")
        .singleResult();
    
    if (task2 != null) {
        // 设置task2的局部变量pre_task_id
        taskService.setVariableLocal(task2.getId(), "pre_task_id", preTaskId);
        System.out.println("已成功设置task2局部变量,task2ID:" + task2.getId());
    } else {
        System.out.println("未找到task2,请检查流程流转逻辑");
    }
}

这个方法的核心是利用processInstanceId锁定当前流程实例,避免查询到其他流程的同名任务,确保拿到的是刚生成的task2。

二、更优的解决方案:无需局部变量,自动重置task1经办人

你最终的需求是流程回退到task1时,经办人自动设为Tom,其实不需要通过存pre_task_id查历史的方式,有两种更简洁的实现:

方案1:BPMN定义中固定task1的经办人

直接在BPMN文件的task1节点配置assignee="Tom",这样无论流程多少次回退到task1,Activiti都会自动将经办人设置为Tom,完全不需要代码干预:

<userTask id="task1" name="Task1" activiti:assignee="Tom">
    <!-- 其他配置 -->
</userTask>

方案2:任务监听器动态设置经办人

如果后续需要动态调整经办人(比如从数据库获取),可以给task1添加创建事件监听器,每次task1被创建(包括回退触发的创建)时,自动设置经办人:

  1. 编写监听器类:
public class Task1AssigneeListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        // 这里可以写逻辑,比如从配置/数据库获取Tom
        delegateTask.setAssignee("Tom");
    }
}
  1. 在BPMN文件中配置监听器:
<userTask id="task1" name="Task1">
    <extensionElements>
        <activiti:taskListener event="create" class="com.example.Task1AssigneeListener"/>
    </extensionElements>
</userTask>

这两种方案都比你当前的思路更符合Activiti的设计理念,减少了代码中对任务ID的依赖,也避免了查询历史表的额外开销。

内容的提问来源于stack exchange,提问作者coooooong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:17:34