在 Flowable 工作流引擎中,获取表单数据信息的方法取决于表单类型(动态表单、外置表单)和流程节点(启动节点、任务节点、历史节点)。以下是核心方法及代码示例:
📋 一、获取启动节点表单数据
适用于流程发起时定义的动态表单或外置表单。
-
通过流程定义获取表单属性
使用FormService.getStartFormData()
获取表单字段定义(如字段名称、类型、是否必填):ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("leaveProcess") // 流程定义Key .latestVersion() .singleResult(); StartFormData startFormData = formService.getStartFormData(pd.getId()); List<FormProperty> formProperties = startFormData.getFormProperties(); // 表单字段列表
输出示例:
id=days, name=请假天数, type=long
来源: -
获取已填写的表单数据
表单数据实际存储在流程变量中,通过RuntimeService
获取:Map<String, Object> variables = runtimeService.getVariables(processInstanceId); Object leaveDays = variables.get("days"); // 直接读取流程变量
来源:
📝 二、获取任务节点表单数据
适用于处理用户任务时的表单。
-
查询任务表单字段定义
使用FormService.getTaskFormData()
:Task task = taskService.createTaskQuery().taskId("taskId").singleResult(); TaskFormData taskFormData = formService.getTaskFormData(task.getId()); List<FormProperty> formProperties = taskFormData.getFormProperties(); // 任务表单字段
来源:
-
获取已提交的表单值
通过流程变量或历史服务查询:// 方式1:从运行时变量获取 Map<String, Object> taskVariables = runtimeService.getVariables(task.getExecutionId()); // 方式2:从历史记录获取(任务完成后) HistoricVariableInstance historicVar = historyService.createHistoricVariableInstanceQuery() .taskId(task.getId()) .variableName("reason") .singleResult();
来源:
⏳ 三、获取历史表单数据
流程结束后,通过历史服务查询持久化的表单数据:
List<HistoricDetail> historicDetails = historyService.createHistoricDetailQuery()
.processInstanceId(processInstanceId)
.formProperties() // 筛选表单数据
.list();
for (HistoricDetail detail : historicDetails) {
HistoricFormPropertyEntity formEntity = (HistoricFormPropertyEntity) detail;
String fieldId = formEntity.getPropertyId(); // 字段ID(如"days")
String fieldValue = formEntity.getPropertyValue(); // 字段值
}
适用场景:
- 审计日志
- 已完成流程的数据回溯
来源:
🔧 四、外置表单的特殊处理
外置表单(JSON/HTML 定义)的数据获取方式与内置表单一致,但需注意:
- 表单部署
外置表单文件(如leave.form
)需放在resources/forms
目录下自动部署。 - 数据提交
使用submitStartFormData()
或submitTaskFormData()
提交数据,引擎自动映射到流程变量。
💎 五、核心原理
- 表单数据存储:所有表单字段值均以流程变量(
act_ru_variable
)形式存储,运行时表随流程结束删除,历史表(act_hi_varinst
)永久保留。 - 动态 vs 外置表单
- 动态表单:字段定义嵌入 BPMN XML,需在每个任务节点重复配置。
- 外置表单:独立 JSON 文件定义,通过
formKey
引用,更易复用。
🔍 六、对比总结
场景 | API/表 | 数据是否持久化 | 来源 |
---|---|---|---|
启动节点表单字段定义 | getStartFormData() | 否(仅元数据) | |
任务节点表单字段定义 | getTaskFormData() | 否(仅元数据) | |
运行时表单数据 | RuntimeService.getVariables() | 流程结束即删除 | |
历史表单数据 | HistoricDetailQuery | 永久保存 |
通过上述方法,可覆盖 Flowable 中所有表单数据获取场景。建议优先使用流程变量(RuntimeService
/HistoryService
)直接操作数据,避免频繁访问表单定义元数据以提升性能。