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

Spring Boot 2.x 整合 Activiti 7 工作流引擎:从零搭建一个请假审批系统

Spring Boot 2.x 整合 Activiti 7 工作流引擎:从零搭建一个请假审批系统

在企业级应用开发中,工作流引擎是处理复杂业务流程的核心组件。Activiti 作为轻量级的开源工作流引擎,与 Spring Boot 的整合能够显著提升开发效率。本文将带你从零开始,构建一个完整的请假审批系统,涵盖从环境搭建到 API 设计的全流程。

1. 环境准备与项目初始化

1.1 创建 Spring Boot 项目

使用 Spring Initializr 快速生成项目骨架,选择以下关键依赖:

curl https://start.spring.io/starter.zip \ -d dependencies=web,activiti,lombok \ -d type=maven-project \ -d language=java \ -d bootVersion=2.7.3 \ -d groupId=com.example \ -d artifactId=leave-approval \ -o leave-approval.zip

关键依赖说明:

  • Spring Web: 提供 RESTful API 支持
  • Activiti Spring Boot Starter: 工作流引擎核心
  • Lombok: 简化实体类编写

1.2 数据库配置

application.yml中配置数据源和 Activiti 参数:

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

注意:database-schema-update设置为 true 时,启动时会自动创建 Activiti 所需的 28 张表

2. 流程设计与部署

2.1 绘制 BPMN 流程图

使用 Activiti Modeler 或 Eclipse BPMN2 插件设计请假流程:

<!-- leave_process.bpmn --> <bpmn2:process id="leaveProcess" name="请假流程"> <bpmn2:startEvent id="startEvent"/> <bpmn2:userTask id="applyTask" name="提交申请" activiti:assignee="${applicant}"/> <bpmn2:userTask id="approveTask" name="经理审批" activiti:assignee="${approver}"/> <bpmn2:endEvent id="endEvent"/> <!-- 省略序列流定义 --> </bpmn2:process>

2.2 程序化部署流程

创建ProcessDeployer服务类实现自动部署:

@Service public class ProcessDeployer { @Autowired private RepositoryService repositoryService; public String deployProcess(String bpmnPath) { Deployment deployment = repositoryService.createDeployment() .addClasspathResource(bpmnPath) .name("请假流程部署") .deploy(); return deployment.getId(); } }

3. 业务集成与 API 设计

3.1 请假单实体设计

@Entity @Data public class LeaveRequest { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String applicant; private String approver; private LocalDate startDate; private LocalDate endDate; private String reason; private String status; private String processInstanceId; }

3.2 核心 REST API 实现

启动流程实例
@RestController @RequestMapping("/api/leave") public class LeaveController { @Autowired private RuntimeService runtimeService; @PostMapping("/start") public String startProcess(@RequestBody LeaveRequest request) { Map<String, Object> variables = new HashMap<>(); variables.put("applicant", request.getApplicant()); variables.put("approver", request.getApprover()); ProcessInstance instance = runtimeService.startProcessInstanceByKey( "leaveProcess", variables); return instance.getId(); } }
任务查询与处理
@GetMapping("/tasks") public List<TaskDTO> getTasks(@RequestParam String assignee) { return taskService.createTaskQuery() .taskAssignee(assignee) .list() .stream() .map(task -> { TaskDTO dto = new TaskDTO(); dto.setTaskId(task.getId()); dto.setName(task.getName()); dto.setCreateTime(task.getCreateTime()); return dto; }).collect(Collectors.toList()); } @PostMapping("/complete/{taskId}") public void completeTask(@PathVariable String taskId, @RequestBody Map<String, Object> variables) { taskService.complete(taskId, variables); }

4. 高级功能实现

4.1 流程变量管理

// 设置流程变量 runtimeService.setVariable(processInstanceId, "days", 3); // 获取流程变量 Integer days = (Integer) runtimeService.getVariable( processInstanceId, "days");

4.2 历史数据查询

@GetMapping("/history") public List<HistoricActivityInstance> getHistory( @RequestParam String processInstanceId) { return historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceStartTime().asc() .list(); }

4.3 邮件通知集成

application.yml中添加邮件配置:

spring: mail: host: smtp.example.com username: admin@example.com password: yourpassword

创建任务监听器:

@Component public class TaskAssignmentListener implements TaskListener { @Autowired private JavaMailSender mailSender; @Override public void notify(DelegateTask task) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(task.getAssignee()); message.setSubject("您有新的待办任务"); message.setText("任务名称: " + task.getName()); mailSender.send(message); } }

5. 系统优化与监控

5.1 性能调优建议

配置项推荐值说明
spring.activiti.async-executor-activatetrue启用异步执行器
spring.activiti.async-executor-core-pool-size4核心线程数
spring.activiti.job-executor-acquire-wait-time5000任务获取等待时间(ms)

5.2 Actuator 监控端点

启用以下端点监控工作流状态:

management: endpoints: web: exposure: include: health,info,activiti

访问/actuator/activiti可获取流程引擎状态信息。

6. 前端集成示例

提供简单的 Vue.js 前端代码片段:

// 获取待办任务 fetch('/api/leave/tasks?assignee=user1') .then(response => response.json()) .then(tasks => { this.taskList = tasks; }); // 提交审批 completeTask(taskId, { approved: true }) { fetch(`/api/leave/complete/${taskId}`, { method: 'POST', body: JSON.stringify({ approved: true }) }); }
http://www.rkmt.cn/news/1457695.html

相关文章:

  • 避坑指南:Windbg双机调试时,你的网卡真的支持KDNET吗?(附Win10支持列表查询)
  • AI财务工具选型全避坑手册,从RPA到LLM财务Agent的6维评估模型
  • 5分钟终极指南:使用applera1n免费绕过iPhone激活锁的完整方案
  • SCCB vs I2C:时序图对比详解与逻辑分析仪抓包实战(附OV传感器案例)
  • RTKLib 2.4.3版本升级踩坑记:RTCM32转Rinex数据丢失星历的完整解决流程
  • 大模型长期记忆机制中 LangChain 框架设计面临的工程化挑战与应对方案
  • Zephyr RTOS安全特性全解析:从代码审查到威胁建模,如何为你的IoT设备加把锁?
  • Win11声音配置的隐藏入口:除了控制面板,这几种方法更快(含msconfig命令详解)
  • 别再只用一个答案了!用Self-Consistency让GPT/Claude的推理更靠谱(附代码示例)
  • 第29章:AI辅助跨链桥安全审计——常见漏洞模式与防御
  • ai辅助开发:让快马平台为你的ht32项目智能生成pid控制算法代码
  • Moneta Markets亿汇:合规意识与外汇市场服务体验如何影响体验,给出一套框架
  • 5分钟快速上手CodeFormer:AI人脸修复终极指南,让老照片重获新生![特殊字符]
  • VisionPro标定深度解析:CogCalibCheckerboardTool如何“扭曲”图像来获得精确测量?
  • 从扫地机到自动驾驶:聊聊SLAM技术是如何一步步走进我们生活的
  • 2026年比较好的河南图文打印纸/河南标书打印纸长期合作厂家推荐 - 行业平台推荐
  • Silicon Labs CP210x芯片Windows全版本驱动包(含32/64位安装程序与串口调试工具)
  • 从零到一:DC NXT TOPO模式下的SPG物理综合实战指南(含compile_ultra优化技巧)
  • 告别手动填坑!用Matlab一键生成Vivado ROM的.coe文件(附完整代码)
  • GL3224读卡器DIY避坑指南:手把手教你搞定W25Q16固件升级(附电路图)
  • 【HarmonyOS 6.1 全场景实战】《灵犀厨房》实战(二十五):【深色模式】一键切换暗色主题——让 App 在深夜也温柔
  • 不止于HSV:探索Halcon中trans_from_rgb支持的10+种颜色空间(CIELab、YUV等)及应用场景
  • 深入解读VMware日志:从‘disk error while paging’错误码看虚拟机内存管理机制
  • CAPL数据处理避坑指南:当心byte数组转Hex字符串时这些隐藏的字节序和内存问题
  • 2026年更新:河北螺旋钢管知名企业弘冠管道综合实力深度解析 - 2026年企业资讯
  • 【稀缺首发】Gartner未公开的AI治理成熟度评估矩阵(含17项工具集成得分卡)
  • 微针人机界面:无创生物传感与智能给药的前沿技术解析
  • FreeRTOS 手动移植教程(二):任务管理——多任务创建、优先级抢占与删除
  • 从‘暴力破解’到‘算法还原’:深度解析super_mega_protection.exe的密钥校验逻辑
  • Cadence 16.6老用户的福音:Library Builder汉化版详细菜单解读与配置实战