在上一篇文章中,我们通过 XML 文件定义了一个简单的请假流程。但在实际项目中,直接手写 XML 显然不现实 —— 复杂流程可能包含几十个节点和网关,靠代码维护简直是灾难。这时候,Flowable Modeler 这款可视化流程设计工具就派上用场了。
今天就带大家从零开始,用 Flowable Modeler 设计出能直接运行的业务流程,包括分支审批、并行任务、动态表单这些实战中必备的功能。
一、Flowable Modeler 是什么?
Flowable Modeler 是 Flowable 官方提供的 Web 版流程设计工具,它就像 "流程界的 PowerPoint"—— 通过拖拽节点、连线的方式就能画出符合 BPMN 2.0 规范的流程图,设计完成后可以直接导出为 XML 部署到系统中,完美解决了手写流程定义的痛点。
它的核心优势在于:
- 可视化操作,非技术人员也能参与流程设计
- 自动生成标准 BPMN 2.0 XML,避免手动编写的语法错误
- 支持流程校验,提前发现设计缺陷
- 可直接与 Flowable 引擎集成,设计完就能测试运行
二、搭建 Flowable Modeler 环境
2.1 快速启动(推荐新手)
最简单的方式是使用 Flowable 提供的 Docker 镜像,一行命令即可启动:
docker run -d -p 8080:8080 flowable/flowable-ui
等待镜像下载完成后,访问http://localhost:8080/flowable-ui,默认用户名密码都是admin,登录后就能看到 Modeler 的主界面。
2.2 手动部署(适合需要定制的场景)
如果需要本地化部署或定制配置,可以下载 Flowable UI 的 WAR 包:
- 从Flowable 官网下载flowable-ui.war
- 将 WAR 包放入 Tomcat 的 webapps 目录
- 启动 Tomcat,访问http://localhost:8080/flowable-ui
- 首次登录后建议修改密码(在右上角个人中心设置)
三、Modeler 界面快速入门
登录后点击左侧菜单的 "模型"→"流程模型",进入流程设计工作台,主要区域分为三部分:
- 左侧工具栏:包含各种 BPMN 节点(事件、活动、网关等),可以直接拖拽到画布
- 中间画布:流程设计的主区域,用于放置节点和连线
- 右侧属性面板:选中节点或连线后,可配置其属性(如名称、负责人、条件等)
必知的核心节点类型
节点类型 | 图标 | 作用 |
开始事件 | ⭐️ | 流程的起点,每个流程有且仅有一个 |
结束事件 | ⚪️ | 流程的终点,一个流程可以有多个 |
用户任务 | 👤 | 需要人处理的任务(如审批、填写表单) |
服务任务 | 🔧 | 自动执行的任务(如调用接口、执行代码) |
排他网关 | ❓ | 按条件分支(类似 if-else) |
并行网关 | ➕ | 并行执行多个分支(同时进行) |
包含网关 | ➕❓ | 结合排他和并行的特性,按条件并行 |
事件网关 | ⚡️ | 基于事件触发分支(如超时、消息) |
四、实战:设计带分支的请假流程
我们来设计一个更贴近实际的请假流程:
- 员工提交请假申请
- 3 天以内由部门经理审批
- 3 天以上需部门经理审批后再经 HR 审批
- 审批通过 / 驳回后流程结束
步骤 1:创建新流程模型
点击 "创建流程模型" 按钮,填写:
- 名称:员工请假流程
- 键:leave-process(这个键会作为流程定义的唯一标识)
- 描述:支持 3 天以内 / 以上的分级审批流程
点击 "创建" 进入设计界面。
步骤 2:添加基础节点
- 从左侧拖拽 "开始事件" 到画布
- 拖拽 "用户任务" 到画布,在右侧属性面板设置:名称:员工提交申请分配方式:发起人(Assignee 为${initiator})
- 再添加一个 "用户任务",设置为 "部门经理审批",Assignee 设为${manager}
- 最后添加 "结束事件"
步骤 3:添加分支逻辑(排他网关)
- 拖拽 "排他网关" 到 "部门经理审批" 之后
- 从 "部门经理审批" 画连线到排他网关
- 从排他网关画两条连线到两个新的 "用户任务":
- 第一条连线:
-
- 名称:3 天以上
-
- 条件表达式:${days > 3}(注意用 EL 表达式)
-
- 目标节点:新建 "HR 审批" 任务(Assignee 设为hr)
- 第二条连线:
-
- 名称:3 天以内
-
- 条件表达式:${days <= 3}
-
- 目标节点:直接连到结束事件
步骤 4:完善流程走向
- 从 "HR 审批" 画连线到结束事件
- 检查所有节点是否都有正确的入线和出线(没有出线的节点会导致流程卡住)
- 点击顶部的 "保存" 按钮,再点击 "验证" 检查是否有设计错误
步骤 5:导出流程定义 XML
设计完成后,点击右上角 "操作"→"导出为 BPMN 2.0 XML",就能得到可部署的流程定义文件。这个 XML 和我们上一篇手写的本质相同,但格式更标准,包含了所有节点属性和连线条件。
五、给流程添加表单:收集与展示数据
流程光有节点还不够,还需要收集数据(如请假天数、原因)。Modeler 支持两种表单:
5.1 内置表单设计器
- 选中 "员工提交申请" 任务,在右侧属性面板找到 "表单"→"引用表单"
- 点击 "创建新表单",进入表单设计界面
- 拖拽 "文本框" 组件,设置:标签:请假人绑定字段:applicant(后续会作为流程变量)默认值:${currentUser}(动态获取当前登录用户)
- 再添加 "数字框"(标签:请假天数,绑定字段:days)和 "文本域"(标签:请假原因,绑定字段:reason)
- 保存表单后,返回流程设计界面,此时该任务会显示 "已关联表单"
5.2 关联外部表单(适合复杂场景)
如果表单包含复杂校验或业务逻辑,可以关联外部 URL:
- 在任务属性的 "表单" 设置中选择 "外部表单"
- 填写表单 URL:/leave/form?taskId=${taskId}(通过 taskId 传递任务 ID)
- 这样流程运行到该任务时,会自动跳转到外部表单页面
六、设计并行流程:多任务同时处理
假设我们需要一个 "新员工入职流程",要求 IT 部门配置电脑和行政部门办理工牌同时进行,这种场景就需要并行网关:
- 从开始事件→"填写入职信息" 用户任务
- 添加 "并行网关",从填写任务连到该网关
- 从并行网关画出两条线:第一条到 "IT 配置设备" 任务 第二条到 "行政办理工牌" 任务
- 再添加一个并行网关,作为两个任务的汇聚点
- 最后连到结束事件
并行网关的特点是:
- 进入并行网关后,所有出线会同时激活(两个任务同时创建)
- 必须等所有入线的任务都完成,才会通过汇聚网关继续流程
- 不需要设置条件,纯粹按并行逻辑执行
七、流程设计实战技巧
技巧 1:使用流程变量传递数据
所有表单字段和手动设置的变量都会作为流程变量存在,可在任意节点使用:
- 在任务负责人中使用:${manager}(动态指定审批人)
- 在网关条件中使用:${days > 3 && type == 'annual'}(多条件判断)
- 在服务任务中使用:调用接口时传递${applicant}参数
技巧 2:添加事件监听
在节点属性的 "事件" 标签中,可以配置:
- 任务创建时触发:发送通知给负责人
- 任务完成时触发:更新业务系统状态
- 流程结束时触发:归档流程数据
例如给 "部门经理审批" 任务添加创建事件,自动发送邮件提醒:
// 事件监听器代码示例(需实现ExecutionListener接口)
public class TaskCreateListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String assignee = delegateTask.getAssignee();
String applicant = (String) delegateTask.getVariable("applicant");
emailService.send(assignee, "新审批任务", applicant + "申请请假,请处理");
}
}
技巧 3:版本管理与流程迁移
流程设计不可能一蹴而就,Modeler 支持版本控制:
- 每次修改保存后,点击 "新建版本" 创建新版本
- 旧版本流程实例可以继续运行,新实例自动使用最新版本
- 如需将旧实例迁移到新版本,可在 Flowable Admin 中操作
八、将设计好的流程部署到引擎
- 在 Modeler 中点击 "操作"→"部署",填写部署名称
- 部署成功后,流程定义会被存入数据库
- 此时可以通过我们上一篇写的 RuntimeService 启动流程实例:
// 启动带变量的流程实例
Map<String, Object> variables = new HashMap<>();
variables.put("initiator", "zhangsan");
variables.put("manager", "lisi");
variables.put("days", 5); // 超过3天会触发HR审批
runtimeService.startProcessInstanceByKey("leave-process", variables);
九、常见设计错误与避坑指南
- 连线条件格式错误:EL 表达式必须用${}包裹,如${days>3}不能写成days>3
- 排他网关缺少默认分支:所有条件都不满足时会报错,建议留一个无条件的默认分支
- 并行网关未成对使用:每个并行网关必须有对应的汇聚网关,否则流程会异常结束
- 任务未设置负责人:用户任务必须指定 assignee 或 candidateUsers,否则会变成 "无人认领" 的孤儿任务
- 表单字段与变量名不匹配:表单绑定的字段名必须和后续流程中使用的变量名一致(如表单用了leaveDays,网关条件就不能用days)
十、小结与下一篇预告
今天我们掌握了:
- 用 Flowable Modeler 可视化设计流程的完整流程
- 核心节点(网关、任务、事件)的使用场景
- 分支流程、并行流程的设计方法
- 表单与流程变量的关联方式
这些技能足以应对 80% 的业务场景。但实际开发中,我们还需要处理更复杂的需求:比如审批人需要动态从数据库查询、流程中途需要修改节点、超时未处理自动提醒等。
下一篇文章,我们将深入 Flowable 的 API,学习如何用代码控制流程运行,包括动态分配任务负责人、监听流程事件、处理异常流程等实战技巧。
如果在设计过程中遇到奇怪的报错,可以在评论区留言,我会优先解答大家的问题~
附:本文设计的请假流程 BPMN 文件已上传至 GitHub,需要的同学可以私信我获取链接。