一、任务表单是什么?------流程的"体检表"
1. 表单的核心作用
- 数据采集:在任务处理时收集业务数据(如请假天数、报销金额)。
- 动态渲染:根据流程变量或用户角色展示不同字段。
- 数据绑定:将表单输入自动映射到流程变量。
2. 表单类型对比
类型 | 存储方式 | 适用场景 |
---|---|---|
动态表单 | 嵌入BPMN文件 | 简单字段,快速开发 |
外部表单 | 独立HTML/JSP文件 | 复杂UI,需要自定义样式 |
二、动态表单设计------BPMN中的"隐形问卷"
1. 在BPMN中定义表单属性
在用户任务节点中添加activiti:formProperty
:
xml
<userTask id="leaveApply" name="请假申请">
<extensionElements>
<activiti:formProperty id="days" name="请假天数" type="long" required="true"/>
<activiti:formProperty id="reason" name="请假理由" type="string"/>
</extensionElements>
</userTask>
参数解析:
type
:支持string
,long
,date
,boolean
等类型。required
:是否必填。
2. 代码中获取表单数据
java
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
List<FormProperty> formProperties = formService.getTaskFormData(task.getId()).getFormProperties();
// 渲染到前端
formProperties.forEach(prop -> {
System.out.println("字段名:" + prop.getName() + ", 类型:" + prop.getType());
});
三、外部表单开发------HTML的"自由舞台"
1. 创建独立HTML表单
html
<form action="/complete-task" method="post">
<input type="hidden" name="taskId" value="${taskId}">
请假天数:<input type="number" name="days" required>
请假理由:<textarea name="reason"></textarea>
<button type="submit">提交</button>
</form>
2. 提交表单数据到引擎
java
@PostMapping("/complete-task")
public String completeTask(@RequestParam String taskId, @RequestParam Map<String, String> formData) {
formService.submitTaskFormData(taskId, formData);
return "redirect:/tasks";
}
关键点 :表单参数的name
必须与流程变量名一致!
四、表单数据与流程变量的"量子纠缠"
1. 自动绑定规则
- 表单字段名与流程变量名同名时自动绑定。
- 例如:表单中的
days
字段 → 自动存入流程变量days
。
2. 手动绑定数据
java
Map<String, Object> variables = new HashMap<>();
variables.put("days", formData.get("days"));
variables.put("reason", formData.get("reason"));
taskService.complete(taskId, variables);
五、表单渲染与验证------让输入"守规矩"
1. 动态渲染字段
根据用户角色隐藏/显示字段:
html
<% if (user.isManager()) { %>
审批意见:<input type="text" name="comment">
<% } %>
2. 后端验证逻辑
java
if (formData.get("days") == null || Integer.parseInt(formData.get("days")) <= 0) {
throw new ActivitiException("请假天数必须大于0!");
}
六、避坑指南------表单的"隐藏陷阱"
1. 表单未绑定变量
症状 :提交后流程变量为空。
检查项:
- 表单字段名是否与流程变量名一致。
- 是否调用
formService.submitTaskFormData
或taskService.complete
。
2. 外部表单路径错误
症状 :访问表单404报错。
解法 :确保HTML文件放在src/main/resources/static
目录下。
七、课后挑战------巩固你的"表单魔法"
-
选择题 :动态表单的字段类型
date
对应的Java类型是?A.
java.util.Date
B.
String
C.
Long
-
实战题:设计一个报销表单,包含"金额(double)、发票附件(file)"字段,并实现后端提交验证。