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

如何通过ProcessInstanceId获取Camunda中所有已完成用户任务?

获取Camunda流程实例的所有已完成用户任务

哦,这个问题我之前也碰到过!你用TaskQuery查不到所有已完成任务的原因很简单——TaskService.createTaskQuery()只能查询当前处于活跃状态的任务,已经完成的用户任务会被移到Camunda的历史数据表中,所以自然拿不到全部已完成的记录。要搞定这个需求,你得用Camunda的历史任务查询API才行。

具体解决方案

1. 获取HistoryService实例

和TaskService一样,HistoryService是Camunda提供的专门用于查询历史数据的服务,从ProcessEngine中获取即可:

HistoryService historyService = processEngine.getHistoryService();

2. 构建历史任务查询

通过HistoricTaskInstanceQuery来过滤指定流程实例的已完成用户任务,关键是要加上.finished()条件来筛选已完成的任务:

String targetProcessId = historicProcessInstances.get(i).getId();
List<HistoricTaskInstance> completedTasks = historyService.createHistoricTaskInstanceQuery()
    .processInstanceId(targetProcessId) // 指定要查询的流程实例ID
    .taskType("userTask") // 可选:仅过滤用户任务,排除服务任务等其他类型
    .finished() // 核心条件:只查询已完成的任务
    .orderByHistoricTaskInstanceEndTime() // 可选:按任务完成时间排序,方便查看执行顺序
    .asc()
    .list();

3. 提取任务详情

HistoricTaskInstance包含了任务的所有历史信息,你可以通过它的getter方法拿到需要的字段:

for (HistoricTaskInstance task : completedTasks) {
    System.out.println("任务名称:" + task.getName());
    System.out.println("办理人:" + task.getAssignee());
    System.out.println("完成时间:" + task.getEndTime());
    System.out.println("任务定义Key:" + task.getTaskDefinitionKey());
}

额外小提示

  • 如果需要查询某个特定用户完成的任务,可以追加.taskAssignee("你的用户ID")条件
  • 要是只想查询特定的几个用户任务,用.taskDefinitionKeyIn("userTask_1", "userTask_2")来过滤任务定义Key

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:01