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

Flowable并行子流程中如何通过元素变量查询用户任务

正确查询Flowable多实例子流程元素变量对应的用户任务

问题根源

你配置的多实例子流程中,insurerId是子流程实例的本地变量,而非顶级流程实例的全局变量,也不会自动成为用户任务的变量。这就是你用processVariableValueEquals(查询全局流程变量)和taskVariableValueEquals(查询任务自身变量)都无法找到对应任务的原因。

解决方案1:通过子流程实例变量查询(推荐)

Flowable的TaskQuery提供了subProcessInstanceVariableValueEquals方法,可直接关联查询任务所属子流程实例的变量,完美匹配多实例元素变量的作用域:

void completeTask(String processInstanceId, String insurerId){
    List<Task> tasks = taskService.createTaskQuery()
        .processInstanceId(processInstanceId)
        .subProcessInstanceVariableValueEquals(INSURER_ID, insurerId)
        .list();
}

该方法会在数据库层面完成任务与子流程实例的关联查询,筛选出持有目标insurerId变量的子流程下的所有任务,无需修改BPMN配置,性能最优。

解决方案2:将元素变量映射为任务变量(需修改BPMN)

若更倾向于用任务变量查询,可以在BPMN的用户任务节点中添加变量映射,把insurerId从子流程变量复制为任务变量:

<userTask id="insurerTask" name="Insurer Task">
  <extensionElements>
    <!-- 将子流程的insurerId变量复制为任务变量 -->
    <flowable:taskVariable name="insurerId" variableName="insurerId" />
  </extensionElements>
</userTask>

配置完成后,即可用你之前尝试的taskVariableValueEquals方法查询:

void completeTask(String processInstanceId, String insurerId){
    List<Task> tasks = taskService.createTaskQuery()
        .processInstanceId(processInstanceId)
        .taskVariableValueEquals(INSURER_ID, insurerId)
        .list();
}

为什么手动过滤可行?

你手动过滤的方式本质是先拉取所有任务,再逐个查询任务所属子流程的变量,虽然能得到结果,但会产生大量变量查询请求,性能远不如数据库层面的联合查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:37:53