一文搞懂Warm-Flow表单提交及业务、流程关系
一、Warm-Flow是什么?从“痛点”到“解决方案”
在企业日常办公中,你是否遇到过这些场景:请假申请需要手动找领导签字、报销单在多个部门间来回传递、审批进度无法实时查看……这些**“流程混乱、效率低下”**的问题,本质上是缺乏一套标准化的工作流管理工具。
Warm-Flow正是为解决这些问题而生的国产轻量级工作流引擎。作为Dromara开源组织成员项目,它以“简洁轻量、五脏俱全”为特点:仅需7张表即可运行,支持常见审批功能(通过/退回/跳转/会签等),自带可视化流程设计器,且能与Spring Boot、Solon等主流框架无缝集成。与传统工作流引擎(如Flowable)相比,Warm-Flow学习曲线更低,尤其适合中小项目快速落地。
二、核心概念:表单、业务、流程的“三角关系”
在开始使用前,我们需要先理清三个核心概念及其关系:
1. 表单(Form)
你可以理解为**“数据收集的载体”**,比如请假申请单(包含请假人、天数、理由等字段)、报销单(金额、事由、附件等)。表单是业务数据的入口,用户通过填写表单发起流程。
2. 流程(Flow)
“任务流转的规则”,即数据按什么顺序、经过哪些人处理。例如请假流程可能是:员工提交→部门经理审批→HR归档;报销流程可能是:员工提交→财务审核→总经理审批→出纳打款。流程由“节点”(如审批人)和“连线”(如从部门经理到HR)组成。
3. 业务(Business)
“实际业务场景”,是表单和流程的结合体。比如“请假业务”=“请假表单”+“请假流程”,“报销业务”=“报销表单”+“报销流程”。业务决定了需要收集哪些数据(表单),以及这些数据如何流转(流程)。
三者关系:
表单收集业务数据 → 流程定义数据流转规则 → 业务通过流程引擎驱动表单数据流转,最终完成业务目标。
三、设计器:可视化定义流程(核心工具)
Warm-Flow最强大的特性之一是自带流程设计器,无需编写复杂配置文件(替代传统YAML/JSON配置),通过拖拽即可完成流程定义。以下是设计器的完整使用指南:
1. 第一步:集成设计器到项目
(1)引入依赖
根据项目框架选择对应依赖(以Spring Boot为例):
org.dromara.warm warm-flow-plugin-ui-sb-web 最新版本
(2)后端路径放行
设计器的静态资源需要公开访问,在权限框架(如Spring Security)中放行路径:
@Beanprotected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .authorizeHttpRequests(auth -> auth .antMatchers(\"/warm-flow-ui/**\", \"/warm-flow/**\").permitAll() // 放行设计器资源 .anyRequest().authenticated() ) .build();}
(3)前端嵌入设计器
通过iframe嵌入设计器页面(以Vue3为例):
import { ref } from \'vue\';const baseUrl = ref(\'http://localhost:8080\'); // 后端服务地址const definitionId = ref(\'\'); // 流程定义ID(新增流程时为空,编辑时传入)const token = ref(localStorage.getItem(\'token\')); // 业务系统token(权限共享)
设计器URL参数说明:
id
123456789
disabled
true
只读,false
可编辑)false
Authorization
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
2. 第二步:用设计器绘制流程
访问设计器页面后,通过以下步骤定义流程:
(1)拖拽节点搭建流程框架
设计器左侧提供常用节点:
- 开始节点:流程的起点(每个流程必须有且仅有一个)。
- 审批节点:需要人工处理的任务(如“部门经理审批”)。
- 网关:控制流程分支(互斥网关:二选一;并行网关:同时执行)。
- 结束节点:流程的终点(每个流程至少有一个)。
例如,请假流程框架可拖拽为:开始节点 → 员工填写表单 → 部门经理审批 → HR归档 → 结束节点。
(2)配置节点属性(以“部门经理审批”节点为例)
点击节点打开配置面板,重点设置:
- 节点名称:如“部门经理审批”(显示在流程图上)。
- 办理人:点击“选择办理人”,从业务系统中选择角色/用户(需提前实现
HandlerSelectService
接口,后文详解)。 - 条件表达式(仅网关节点需要):如“请假天数>3天则需总经理审批”(支持SPeL表达式,如
${days > 3}
)。
(3)保存并发布流程
点击设计器顶部“保存”按钮,流程定义会以JSON格式存储到数据库;点击“发布”按钮,流程状态变为“已发布”,即可被业务系统调用。
四、表单提交:从“用户填写”到“流程启动”
表单提交是业务发起的第一步,核心是将表单数据传递给流程引擎,启动流程实例。以下是详细步骤:
1. 表单数据与流程变量绑定
用户填写的表单数据(如请假天数、理由)需要通过流程变量(Variable) 传递给流程引擎。流程变量是一个Map
对象,键为字段名,值为数据。
示例:前端提交表单数据
// 前端通过API提交的表单数据(以请假为例){ \"businessId\": \"LEAVE_20250711_001\", // 业务唯一ID(如请假单号) \"flowCode\": \"leave_process\", // 流程编码(设计器中定义的唯一标识) \"handler\": \"user_001\", // 当前办理人ID(提交表单的员工ID) \"variable\": { // 流程变量(表单字段) \"leaveType\": \"annual\", // 请假类型:年假 \"days\": 3, // 请假天数:3天 \"reason\": \"旅游\" // 请假理由 }}
2. 调用API启动流程实例
后端通过InsService.start()
方法启动流程,传入业务ID和流程参数:
@Servicepublic class LeaveService { @Autowired private InsService insService; // Warm-Flow提供的流程实例服务 public String submitLeave(LeaveForm form) { // 1. 构建流程参数 FlowParams flowParams = FlowParams.build() .flowCode(\"leave_process\") // 流程编码(与设计器中定义一致) .handler(form.getUserId()) // 当前办理人(提交表单的员工) .variable(form.toVariableMap()); // 表单数据转流程变量 // 2. 启动流程实例(businessId为业务唯一标识,如请假单号) Instance instance = insService.start(form.getBusinessId(), flowParams); // 3. 返回流程实例ID(用于后续查询进度) return instance.getId().toString(); }}
关键说明:
flowCode
:必须与设计器中定义的流程编码一致,否则引擎无法找到流程模板。variable
:表单数据通过此参数传递,后续节点可通过表达式(如${days}
)获取该数据。Instance
:返回的流程实例对象包含流程ID、当前节点、状态等信息,可用于前端展示进度。
五、业务与流程的“深度绑定”:如何让流程“懂业务”?
流程不是孤立的,它需要根据业务数据动态调整行为(如不同请假天数走不同审批链)。Warm-Flow通过监听器和条件表达式实现业务与流程的深度绑定。
1. 条件表达式:控制流程走向
场景:请假天数≤3天由部门经理审批,>3天需总经理审批。
(1)在设计器中配置互斥网关条件
拖拽“互斥网关”到流程中,连接两个分支:
- 分支1:条件表达式
${days <= 3}
→ 部门经理审批。 - 分支2:条件表达式
${days > 3}
→ 总经理审批。
(2)流程变量动态驱动分支
当用户提交3天请假单时,variable
中的days=3
,引擎会匹配分支1,流程走向“部门经理审批”;若days=5
,则匹配分支2,走向“总经理审批”。
2. 监听器:注入业务逻辑
监听器是“钩子函数”,可在流程节点的不同生命周期(如任务创建、办理人分配、任务完成)执行自定义业务逻辑。
场景:审批通过后自动发送邮件通知申请人。
(1)定义监听器类
实现FlowListener
接口,重写finish
方法(任务完成时执行):
@Componentpublic class LeaveNotifyListener implements FlowListener { @Autowired private EmailService emailService; @Override public void finish(ListenerVariable variable) { // 1. 从流程变量中获取申请人邮箱 Map vars = variable.getInstance().getVariable(); String applicantEmail = (String) vars.get(\"applicantEmail\"); // 2. 发送审批结果邮件 emailService.send(applicantEmail, \"请假审批通知\", \"您的请假已通过!\"); }}
(2)在设计器中绑定监听器
编辑“HR归档”节点,在“结束监听器”中选择上述LeaveNotifyListener
,流程走到该节点并完成后,会自动触发邮件发送。
3. 办理人动态分配
流程中的“审批人”可能不是固定的(如“部门经理”需根据申请人所在部门动态确定),可通过办理人表达式实现。
示例:设置“部门经理审批”节点的办理人为 ${deptManager}
,其中deptManager
是流程变量(由监听器动态填充):
// 在“创建监听器”中根据申请人部门查询经理ID@Componentpublic class DeptManagerListener implements FlowListener { @Autowired private DeptService deptService; @Override public void create(ListenerVariable variable) { // 1. 获取申请人部门ID(从流程变量中) String deptId = (String) variable.getFlowParams().getVariable().get(\"deptId\"); // 2. 查询部门经理ID String managerId = deptService.getManagerIdByDeptId(deptId); // 3. 设置办理人变量 variable.getFlowParams().getVariable().put(\"deptManager\", managerId); }}
在设计器中,将“部门经理审批”节点的办理人设置为 ${deptManager}
,引擎会自动从流程变量中获取经理ID,分配任务。
六、实战案例:完整请假流程走一遍
以“员工请假”为例,串联表单提交、流程启动、审批流转的全流程:
1. 流程设计(设计器中完成)
流程节点:开始 → 员工填写表单 → 互斥网关 → 部门经理审批/总经理审批 → HR归档 → 结束
- 网关条件:
${days <= 3}
→ 部门经理;${days > 3}
→ 总经理。
2. 表单提交(前端)
员工填写请假单并提交,数据格式:
{ \"businessId\": \"LEAVE_20250711_001\", \"userId\": \"user_001\", \"deptId\": \"dept_01\", \"leaveType\": \"annual\", \"days\": 3, \"reason\": \"旅游\", \"applicantEmail\": \"zhangsan@example.com\"}
3. 启动流程(后端)
调用insService.start()
启动流程,引擎自动:
- 创建流程实例,状态为“运行中”。
- 根据
flowCode
找到“leave_process”流程模板。 - 执行“员工填写表单”节点的创建监听器(如有)。
4. 流程流转
- 第一步:流程到达互斥网关,判断
days=3
,走“部门经理审批”分支。 - 第二步:部门经理登录系统,在“我的任务”中看到待办,点击“通过”。
- 第三步:流程到达“HR归档”节点,执行结束监听器,发送邮件通知申请人。
- 第四步:流程到达“结束节点”,状态变为“已完成”。
七、常见问题与解决方案
1. 设计器访问404?
- 检查依赖是否正确引入,版本是否匹配。
- 确认后端路径放行配置(
/warm-flow-ui/**
和/warm-flow/**
必须permitAll)。
2. 流程启动后没有生成待办任务?
- 检查
flowCode
是否与设计器中定义的一致。 - 查看办理人表达式是否正确,是否存在
Null
值(如部门经理ID未查询到)。
3. 条件表达式不生效?
- 确保表达式语法正确(如
${days > 3}
,注意变量名与流程变量一致)。 - 在设计器中测试表达式:点击“表达式测试”,输入变量值验证结果。
八、总结:Warm-Flow让流程管理“化繁为简”
Warm-Flow通过可视化设计器降低了流程定义门槛,通过流程变量+监听器+条件表达式实现了业务与流程的灵活绑定,让小白也能快速搭建企业级工作流。核心优势总结:
- 简单易用:拖拽设计流程,无需编写复杂配置。
- 灵活扩展:监听器支持自定义业务逻辑,适配各种场景。
- 轻量高效:仅7张表,性能优异,适合中小项目。
如果你正在寻找一款“容易上手、功能够用”的工作流引擎,Warm-Flow值得一试!官方文档(https://warm-flow.dromara.org/)和演示地址(http://www.hhzai.top,账号admin/admin123)提供了更多细节,快去体验吧~