当前位置: 首页 > news >正文

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

(正文结束)

http://www.jsqmd.com/news/767096/

相关文章:

  • 2026年杭州GEO优化服务商综合排名TOP10:方案比较与优势深度解析 - 博客湾
  • FPGA与PC高速通信:基于FT245同步FIFO模式的实战指南
  • 废掉一个人最快的方式,是让他觉得“这辈子就这样了”
  • 3步搞定视频转PPT难题:如何用智能算法自动提取每一页幻灯片
  • iGRPO:大语言模型推理优化的自反馈机制
  • ESP32-S2低功耗PIR运动传感开发板解析与应用
  • 轻量级Web框架CopaWF:模块化设计与RESTful API实践指南
  • VSCode 2026多智能体协同编程避坑清单,第7条99%开发者忽略:本地LLM缓存污染导致的Agent角色错位问题(实测复现+热修复补丁)
  • CoolRunner-II CPLD硬件安全特性与加密算法实现
  • 3分钟破解百度网盘提取码:开源工具的终极使用指南
  • 如何用正则具名捕获组 (-) 提升复杂数据的提取效率
  • 告别原生Socket API:用sockpp 0.8.1在C++中快速构建TCP客户端/服务器(附完整代码)
  • 5分钟终极指南:用AI图像分层工具layerdivider轻松生成多层PSD文件
  • Python快速学习——第11章:模块
  • 工业机器人闭环控制系统的轨迹优化与采样权重分配
  • 【PI_浪涌电流】快速掌握电源浪涌电流(Inrush current)测试方法
  • 别再手动圈地物了!用Python+深度学习5步搞定遥感影像自动分类(附代码)
  • 宏智树AI如何让你的期刊论文从“卡壳“到“丝滑“?
  • 单目视觉乒乓球轨迹与旋转分析系统开发
  • DeepSORT实战:在YOLOv8检测器上集成多目标跟踪,提升安防监控效率
  • 数据库2表设计
  • 电压监控器原理与Microchip选型指南
  • 在 Ubuntu 上对接 Claude Code 编程助手并配置 Taotoken 作为后端
  • 基于MCP协议构建跨平台广告AI管理中枢:策略感知与自动化实战
  • 视频生成模型提升机器人操作泛化能力
  • 掌控散热:7个步骤彻底解决Windows风扇噪音与温度平衡难题
  • 探路者转型数据压缩核心赛道,辅助存储打开全新成长空间
  • 告别MAX6675?聊聊STM32热电偶测温的几种替代方案与选型思考
  • AI编程助手如何突破项目记忆盲区:codebase-intel实战指南
  • 基于视觉语言模型的UI设计稿自动代码生成实践