Flowable流程设计器实战:从零搭建一个报销审批流程(附完整BPMN文件解析)
2026/6/25 5:36:31 网站建设 项目流程

Flowable流程设计器实战:从零搭建一个报销审批流程(附完整BPMN文件解析)

在企业日常运营中,报销审批是最常见的工作流程之一。传统的手工审批方式效率低下,而借助Flowable这样的开源工作流引擎,我们可以快速构建自动化审批系统。本文将带你从零开始,使用Flowable流程设计器创建一个完整的报销审批流程,并深入解析生成的BPMN文件。

1. 环境准备与设计器配置

在开始设计报销流程前,我们需要搭建Flowable流程设计器的开发环境。推荐使用以下技术栈:

  • Java 8+:Flowable的核心运行环境
  • Spring Boot 2.7.x:快速构建应用框架
  • Flowable 6.7.0:当前稳定版本
  • MySQL 5.7+:流程数据存储

安装流程设计器最便捷的方式是使用官方提供的Docker镜像:

docker run -d -p 8080:8080 flowable/all-in-one:latest

启动后访问http://localhost:8080/flowable-ui即可使用Web版设计器。如果需要在本地开发环境中集成,可以添加以下Maven依赖:

<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.7.0</version> </dependency>

提示:生产环境建议配置独立的流程数据库,避免与业务数据混用。

2. 报销流程业务分析

一个典型的报销审批流程通常包含以下业务环节:

  1. 申请提交:员工填写报销单并提交
  2. 金额判断:系统根据报销金额决定审批路径
  3. 多级审批:部门经理、财务、总经理等角色参与
  4. 并行处理:某些环节需要多个部门同时审批
  5. 结果通知:审批完成后通知申请人

基于这些需求,我们设计出流程的关键节点:

节点类型名称业务规则
开始事件报销申请员工提交报销单
排他网关金额判断金额≤1000走快速通道
用户任务部门审批部门经理审核业务真实性
用户任务财务审批财务审核票据合规性
并行网关会签节点大额报销需多部门会签
结束事件流程结束归档报销记录

3. 使用设计器绘制流程图

打开Flowable设计器,新建一个名为"expense_approval"的流程定义。关键设计步骤如下:

3.1 创建基础节点

  1. 从工具栏拖拽开始事件到画布,命名为"报销申请"
  2. 添加用户任务节点,设置名称为"部门经理审批"
  3. 插入排他网关,用于金额路由判断
  4. 配置并行网关实现会签功能
  5. 结束事件完成流程闭环

3.2 配置任务属性

对于每个用户任务,需要指定处理人。在属性面板中:

<userTask id="deptApproval" name="部门经理审批" flowable:assignee="${applicant.deptManager}"> <extensionElements> <flowable:formProperty id="comment" name="审批意见" type="string"/> </extensionElements> </userTask>

注意:实际项目中建议使用监听器动态分配任务,而非硬编码assignee

3.3 设置网关条件

在排他网关的输出流上配置条件表达式:

<sequenceFlow id="flow1" sourceRef="gateway1" targetRef="deptApproval"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${amount <= 1000}]]> </conditionExpression> </sequenceFlow>

对于并行网关,不需要条件判断,它会自动激活所有输出流。

4. BPMN文件深度解析

保存流程图后,设计器会生成标准的BPMN 2.0 XML文件。以下是核心部分的解析:

4.1 流程定义头

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" targetNamespace="http://flowable.org/bpmn"> <process id="expense_approval" name="报销审批流程" isExecutable="true"> <!-- 流程节点定义 --> </process> <!-- 图形布局信息 --> <bpmndi:BPMNDiagram> <!-- 坐标定义 --> </bpmndi:BPMNDiagram> </definitions>

4.2 任务监听器配置

动态分配审批人的典型实现:

<userTask id="financeApproval" name="财务审批"> <extensionElements> <flowable:taskListener event="create" class="com.example.ExpenseTaskListener"/> </extensionElements> </userTask>

对应的Java监听器示例:

public class ExpenseTaskListener implements TaskListener { @Override public void notify(DelegateTask task) { String amount = (String)task.getVariable("amount"); if(amount > 5000) { task.setAssignee("CFO"); } else { task.setAssignee("financeManager"); } } }

4.3 多实例会签配置

当需要多个部门并行审批时:

<userTask id="multiApproval" name="多部门会签"> <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="${deptList}" flowable:elementVariable="dept"> <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6}</completionCondition> </multiInstanceLoopCharacteristics> </userTask>

5. 流程部署与Spring Boot集成

设计完成的流程需要部署到Flowable引擎才能运行。在Spring Boot项目中:

5.1 自动部署配置

flowable: check-process-definitions: true deployment-mode: default process-definition-location-prefix: classpath:/processes/ process-definition-suffixes: .bpmn20.xml

5.2 通过API部署流程

@Autowired private RepositoryService repositoryService; public void deployProcess(File bpmnFile) { Deployment deployment = repositoryService.createDeployment() .addInputStream("expense.bpmn20.xml", new FileInputStream(bpmnFile)) .name("报销审批流程") .deploy(); }

5.3 启动流程实例

@Autowired private RuntimeService runtimeService; public void startProcess(String applicant, BigDecimal amount) { Map<String, Object> variables = new HashMap<>(); variables.put("applicant", applicant); variables.put("amount", amount); ProcessInstance instance = runtimeService .startProcessInstanceByKey("expense_approval", variables); }

6. 流程监控与优化建议

部署后的流程可以通过Flowable Admin控制台进行监控。对于报销流程,有几个优化建议:

  1. 性能优化

    • 对大额报销启用异步处理
    • 设置合理的流程缓存策略
  2. 用户体验改进

    • 添加审批超时自动提醒
    • 支持移动端审批操作
  3. 数据分析

    • 统计各环节平均处理时间
    • 识别经常被驳回的报销类型
-- 示例:查询平均审批时间 SELECT PROC_DEF_ID_, AVG(DURATION_) FROM ACT_HI_PROCINST GROUP BY PROC_DEF_ID_;

在实际项目中,我们遇到过一个典型问题:并行网关后的任务有时会卡住。排查发现是因为没有正确设置流程变量,导致某些分支无法完成。解决方案是添加监控日志:

runtimeService.addEventListener(new FlowableEventListener() { @Override public void onEvent(FlowableEvent event) { if(event instanceof FlowableActivityEvent) { // 记录节点进入/离开时间 } } });

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询