flowable 子表单数据保存
时间: 2025-05-21 21:40:43 浏览: 26
### 如何在 Flowable 中保存子表单数据
在 Flowable 框架中,处理子表单的数据保存通常涉及以下几个方面:
#### 1. **子表单的定义**
Flowable 支持通过 `.form` 文件来定义表单及其字段。对于子表单,可以通过嵌套的方式定义其结构。以下是子表单的一个基本 JSON 定义示例[^3]:
```json
{
"id": "parentForm",
"name": "Parent Form",
"fields": [
{
"fieldType": "subForm",
"id": "childForms",
"name": "Child Forms",
"type": "array",
"value": [],
"required": false,
"readOnly": false,
"overrideId": true,
"properties": {
"subFormFields": [
{
"fieldType": "FormField",
"id": "childField1",
"name": "Child Field 1",
"type": "string",
"value": "",
"required": true,
"readOnly": false,
"overrideId": true
},
{
"fieldType": "FormField",
"id": "childField2",
"name": "Child Field 2",
"type": "integer",
"value": null,
"required": false,
"readOnly": false,
"overrideId": true
}
]
}
}
]
}
```
在这个例子中,父表单 `parentForm` 包含一个名为 `childForms` 的子表单数组。每个子表单包含多个字段(如 `childField1` 和 `childField2`),这些字段可以被动态添加或删除。
---
#### 2. **子表单数据的提交与存储**
当用户填写并提交带有子表单的表单时,Flowable 将整个表单数据作为键值对的形式存储到数据库中的 `ACT_RU_VARIABLE` 或 `ACT_HI_VARINST` 表中。具体实现方式如下:
##### (1) 使用 API 提交带子表单的表单
可以通过 `RuntimeService` 来启动流程实例,并传递表单属性和结果。以下是一个 Java 示例代码[^2]:
```java
import org.flowable.engine.RuntimeService;
import java.util.HashMap;
import java.util.Map;
public class FlowableSubFormExample {
public static void main(String[] args) {
RuntimeService runtimeService = ...; // 初始化 RuntimeService 实例
String processDefinitionId = "process_1:1:4"; // 替换为实际的流程定义 ID
Map<String, Object> formProperties = new HashMap<>();
// 设置父表单字段
formProperties.put("parentField", "Parent Value");
// 设置子表单字段
Map<String, Object>[] childForms = new Map[]{new HashMap<>()};
childForms[0].put("childField1", "Child Value 1");
childForms[0].put("childField2", 123);
formProperties.put("childForms", childForms);
// 启动流程实例并绑定表单数据
runtimeService.startProcessInstanceWithForm(
processDefinitionId,
"Submit Outcome",
formProperties,
"Process Instance Name"
);
}
}
```
在此代码片段中,`childForms` 是一个数组对象,表示多个子表单项。每个子项都包含了具体的字段值。
---
#### 3. **查询已保存的子表单数据**
保存后的子表单数据可以通过变量名访问。例如,在上面的例子中,`childForms` 被存储为一个复杂类型的变量。可以通过以下方法检索它:
```java
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
TaskService taskService = ...; // 初始化 TaskService 实例
String taskId = "..."; // 替换为实际的任务 ID
// 获取任务关联的变量
Map<String, Object> variables = taskService.getVariables(taskId);
// 输出子表单数据
if (variables.containsKey("childForms")) {
System.out.println(variables.get("childForms"));
}
```
---
#### 4. **注意事项**
- 如果需要扩展默认字段类型,则可以在 `.form` 文件中新增自定义字段类型,并确保对应的后端逻辑能够解析该字段。
- 子表单的字段名称应具有唯一性,以免与其他字段冲突。
- 当前版本的 Flowable 对于复杂的嵌套表单可能有一定的局限性,建议测试不同场景下的兼容性和性能表现。
---
### 总结
在 Flowable 中保存子表单数据的关键在于合理设计 `.form` 文件结构,并利用框架提供的 API 进行数据提交和存储。通过这种方式,不仅可以灵活管理父子表单的关系,还能高效地完成业务需求。
阅读全文
相关推荐

















