> 技术文档 > 一文搞懂Warm-Flow表单提交及业务、流程关系

一文搞懂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 流程定义ID(新增时为空,编辑时必填) 123456789 disabled 是否禁用编辑(true只读,false可编辑) false Authorization 业务系统token(用于权限共享) 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)提供了更多细节,快去体验吧~