SpringBoot与Flowable实现极简请假审批流程
2026/9/12 6:52:11 网站建设 项目流程

1. 项目概述

"SpringBoot一行代码搞定请假审批流程"这个标题乍看有些夸张,但确实反映了现代Java开发中一个非常实用的场景。作为在OA系统开发中摸爬滚打多年的老手,我见过太多团队在审批流实现上过度设计。实际上,对于中小型企业的标准请假审批,用SpringBoot的自动化配置特性完全可以极简实现。

核心思路是利用SpringBoot Starter的自动装配机制,配合Activiti或Flowable这样的轻量级工作流引擎。通过预定义的审批规则配置,开发者只需要关注业务实体定义,审批流程的流转、通知等繁琐细节都可以交给框架处理。这种方案特别适合5人以下审批层级的场景,实测从零搭建到上线不超过2小时。

2. 技术选型与准备

2.1 基础框架选择

首先需要明确的是,所谓"一行代码"并非字面意思,而是强调通过合理的架构设计将复杂度隐藏在底层。我的技术栈组合是:

  • SpringBoot 2.7.x(自动配置核心)
  • Flowable 6.7.0(比Activiti更轻量)
  • Lombok(减少样板代码)
  • MySQL 8.0(事务支持完善)

选择Flowable而非Activiti的原因主要有三点:

  1. 内存占用减少约40%
  2. REST API开箱即用
  3. 与SpringBoot的集成更"无感知"

2.2 依赖配置

在pom.xml中关键依赖如下:

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

特别注意需要排除SpringSecurity自动配置(除非确实需要):

<exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </exclusion>

3. 核心实现解析

3.1 审批流程定义

在resources/processes目录下创建leave-approval.bpmn20.xml文件:

<process id="leaveApproval" name="Leave Approval Process"> <startEvent id="start"/> <userTask id="leaderApproval" name="直属领导审批" flowable:assignee="${applicant.directLeader}"/> <sequenceFlow sourceRef="start" targetRef="leaderApproval"/> <endEvent id="end"/> </process>

这个最简单的流程定义了:

  1. 开始节点
  2. 领导审批节点(动态指定审批人)
  3. 结束节点

3.2 业务实体设计

请假单实体关键字段:

@Entity @Data public class LeaveApplication { @Id @GeneratedValue private Long id; private String applicant; // 申请人 private String directLeader; // 直属领导 private LocalDate startDate; private LocalDate endDate; private String reason; @Enumerated(EnumType.STRING) private LeaveStatus status; // 审批状态 }

3.3 传说中的"一行代码"

在Service层实现审批触发:

@Transactional public void startApproval(LeaveApplication leave) { runtimeService.startProcessInstanceByKey( "leaveApproval", Map.of("applicant", leave) ); }

这行代码的背后,Flowable自动完成了:

  1. 流程实例创建
  2. 第一个审批任务的生成
  3. 审批人分配
  4. 历史记录初始化

4. 进阶优化技巧

4.1 自动审批人解析

实践中建议实现ApproverResolver接口:

public interface ApproverResolver { String resolveDirectLeader(String applicant); } // 在流程启动时自动注入 runtimeService.startProcessInstanceByKey( "leaveApproval", Map.of( "applicant", leave, "directLeader", approverResolver.resolveDirectLeader(leave.getApplicant()) ) );

4.2 审批状态同步

通过事件监听实现状态自动更新:

@EventListener public void onTaskCompleted(TaskCompletedEvent event) { leaveRepo.updateStatus( event.getProcessInstanceId(), event.getApproved() ? APPROVED : REJECTED ); }

4.3 审批超时处理

在bpmn文件中添加定时边界事件:

<boundaryEvent id="timeout" attachedToRef="leaderApproval"> <timerEventDefinition> <timeDuration>PT24H</timeDuration> </timerEventDefinition> </boundaryEvent>

5. 生产环境注意事项

  1. 事务管理:确保流程引擎操作与业务操作在同一个事务中

    @Transactional // 必须添加 public void approve(String taskId) { taskService.complete(taskId); updateBizStatus(); }
  2. 性能调优

    • 设置asyncExecutorActivate=true启用异步执行
    • 调整history级别为audit(默认是full)
  3. 异常处理:捕获FlowableOptimisticLockingException实现自动重试

  4. 数据库选择:MySQL建议使用InnoDB引擎,PostgreSQL性能更佳

6. 常见问题排查

6.1 流程定义未加载

检查点:

  1. application.yml中是否配置:
    flowable: check-process-definitions: true
  2. bpmn文件是否在resources/processes/目录下

6.2 审批人无法显示

典型原因:

  • 流程变量未正确传递
  • 使用了错误的变量名(区分大小写)

调试方法:

runtimeService.getVariable(executionId, "directLeader");

6.3 历史数据缺失

需要检查:

  1. history配置级别
  2. 是否手动清理了ACT_HI_*表

7. 扩展建议

对于更复杂的场景,可以考虑:

  1. 动态分支审批:

    <exclusiveGateway id="decision"/> <sequenceFlow sourceRef="decision" targetRef="hrApproval"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${days > 3}]]> </conditionExpression> </sequenceFlow>
  2. 会签模式(多人审批):

    <userTask id="groupApproval" flowable:candidateUsers="user1,user2,user3"/>
  3. 与钉钉/企业微信集成:

    // 审批通过后调用第三方API taskService.complete(taskId, Map.of( "callbackUrl", "https://oapi.dingtalk.com/..." ));

这套方案在我参与的多个中小型企业OA系统中稳定运行,最长的一个已经连续工作3年多。关键是要清楚它的边界——适合标准化程度高、审批逻辑简单的场景。对于特别复杂的流程,还是建议采用专业的BPM平台。

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

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

立即咨询