Spring Boot 2.5 + Activiti 7.1 实战:手把手教你从零搭建一个请假审批流程(附完整源码)

📅 2026/7/5 5:59:08 👁️ 阅读次数 📝 编程学习
Spring Boot 2.5 + Activiti 7.1 实战:手把手教你从零搭建一个请假审批流程(附完整源码)

Spring Boot 2.5 + Activiti 7.1 实战:从零构建企业级请假审批系统

在数字化转型浪潮中,业务流程自动化已成为企业提升运营效率的关键。想象这样一个场景:当员工提交请假申请后,系统自动触发审批流程,主管手机即时收到待办提醒,审批通过后自动同步至考勤系统——这种丝滑体验的背后,正是工作流引擎在发挥作用。本文将带您使用Spring Boot 2.5和Activiti 7.1构建一个完整的请假审批系统,涵盖从流程设计到API开发的每个技术细节。

1. 环境搭建与基础配置

1.1 项目初始化与依赖管理

新建Spring Boot项目时,建议使用Spring Initializr选择以下核心依赖:

  • Web:Spring Web MVC支持
  • Security:基础权限控制(可选)
  • Lombok:简化实体类编写
  • MySQL Driver:数据库连接

在pom.xml中添加Activiti 7.1专属依赖:

<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-image-generator</artifactId> <version>7.1.0.M6</version> </dependency>

关键配置项(application.yml):

spring: datasource: url: jdbc:mysql://localhost:3306/activiti_demo?useSSL=false username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver activiti: database-schema-update: true history-level: full async-executor-activate: false

注意:database-schema-update: true会在启动时自动创建28张Activiti表,生产环境建议改为false后手动执行SQL脚本

1.2 数据库表结构解析

Activiti 7.1主要生成五类表:

表前缀说明示例表名
ACT_RE流程定义与部署资源ACT_RE_DEPLOYMENT
ACT_RU运行时流程实例与任务ACT_RU_TASK
ACT_HI历史流程实例与变量ACT_HI_PROCINST
ACT_GE通用数据(如二进制资源)ACT_GE_BYTEARRAY
ACT_ID身份信息(用户/组)ACT_ID_USER

通过spring.activiti.db-history-level可控制历史数据存储粒度:

  • none:不记录历史
  • activity:仅记录节点事件
  • audit:记录节点与变量(默认)
  • full:完整历史(含细节)

2. 流程设计与模型部署

2.1 使用BPMN 2.0设计请假流程

典型请假审批包含以下节点:

  1. 开始事件:员工提交申请
  2. 用户任务:直属主管审批
  3. 排他网关:根据天数判断路径
  4. 用户任务:HR备案(>3天假期)
  5. 结束事件:流程终止

使用Eclipse插件或在线工具(如bpmn.io)绘制流程图时,需注意:

<bpmn2:sequenceFlow id="Flow_1" sourceRef="Gateway_1" targetRef="Task_HR" name="大于3天"> <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"> ${days > 3} </bpmn2:conditionExpression> </bpmn2:sequenceFlow>

2.2 程序化部署流程定义

通过RepositoryService实现动态部署:

public String deployProcess(MultipartFile file) throws IOException { Deployment deployment = repositoryService.createDeployment() .addInputStream(file.getOriginalFilename(), file.getInputStream()) .name("请假流程V1") .deploy(); return deployment.getId(); }

检查部署结果:

SELECT * FROM ACT_RE_PROCDEF WHERE KEY_ = 'leaveProcess';

3. 核心API开发实战

3.1 流程实例启动与任务查询

启动流程实例需关联业务Key:

public String startProcess(Long leaveId, String userId) { Map<String, Object> variables = new HashMap<>(); variables.put("applicant", userId); variables.put("days", 5); // 从数据库读取实际天数 ProcessInstance instance = runtimeService.startProcessInstanceByKey( "leaveProcess", "LEAVE_" + leaveId, variables ); return instance.getId(); }

任务查询支持多条件过滤:

public List<Task> getTasksByUser(String userId) { return taskService.createTaskQuery() .taskCandidateOrAssigned(userId) .orderByTaskCreateTime().desc() .list(); }

3.2 任务审批与流程变量

完成任务时更新审批意见:

public void completeTask(String taskId, boolean approved, String comment) { Map<String, Object> variables = new HashMap<>(); variables.put("approved", approved); taskService.addComment(taskId, null, comment); taskService.complete(taskId, variables); }

重要:流程变量会持久化到ACT_RU_VARIABLE表,复杂对象需实现Serializable接口

4. 高级功能实现

4.1 动态任务分配

通过监听器实现灵活指派:

@EventListener public void onTaskCreated(ActivitiEvent event) { if (event.getType() == ActivitiEventType.TASK_CREATED) { Task task = ((ActivitiEntityEvent)event).getEntity(); if ("leaderAudit".equals(task.getTaskDefinitionKey())) { String deptLeader = userService.getDeptLeader( runtimeService.getVariable(task.getExecutionId(), "applicant") ); taskService.setAssignee(task.getId(), deptLeader); } } }

4.2 流程版本控制

当需要修改已部署的流程时:

  1. 修改BPMN文件后重新部署,生成新版本
  2. 默认新实例使用最新版本
  3. 旧实例继续按原定义执行

查询所有版本:

List<ProcessDefinition> definitions = repositoryService .createProcessDefinitionQuery() .processDefinitionKey("leaveProcess") .list();

5. 系统集成与优化

5.1 与Spring Security集成

实现用户-任务关联:

@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(username -> { User user = userRepository.findByUsername(username); return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), AuthorityUtils.createAuthorityList(user.getRoles()) ); }); }

5.2 性能优化建议

  • 异步执行:配置spring.activiti.async-executor-activate: true
  • 历史数据清理:定时任务删除ACT_HI_*表旧数据
  • 缓存配置:启用流程定义缓存
# 在application.properties中添加 spring.activiti.process-definition-cache-limit=100

开发过程中遇到最多的问题往往是网关条件表达式书写错误,建议在测试环境开启DEBUG日志:

logging.level.org.activiti=DEBUG

(正文结束)