当前位置: 首页 > 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.jsqmd.com/news/946205/

相关文章:

  • OpenCV findCirclesGrid实战:手把手教你搞定相机标定用的圆点棋盘(附参数调优心得)
  • 避坑指南:Windbg双机调试时,你的网卡真的支持KDNET吗?(附Win10支持列表查询)
  • 产学研深度融合:信息技术如何成为科学发现的新引擎
  • 5分钟终极指南:使用applera1n免费绕过iPhone激活锁的完整方案
  • AI财务工具选型全避坑手册,从RPA到LLM财务Agent的6维评估模型
  • 【独家首发】国内首份《AI工具与智能测试整合成熟度评估模型》(含5级能力图谱+自测打分表)
  • MATLAB三维机器人避障导航代码包:含引力/斥力场计算与朝向角平滑控制
  • SCCB vs I2C:时序图对比详解与逻辑分析仪抓包实战(附OV传感器案例)
  • RTKLib 2.4.3版本升级踩坑记:RTCM32转Rinex数据丢失星历的完整解决流程
  • 告别手动修改!利用Unity的Gradle模板文件(如mainTemplate.gradle)管理安卓依赖
  • 大模型长期记忆机制中 LangChain 框架设计面临的工程化挑战与应对方案
  • 保姆级教程:用CMSDK为Cortex-M4芯片快速搭建AHB/APB总线(附避坑指南)
  • Win11声音配置的隐藏入口:除了控制面板,这几种方法更快(含msconfig命令详解)
  • Zephyr RTOS安全特性全解析:从代码审查到威胁建模,如何为你的IoT设备加把锁?
  • 礼 | 物
  • 从协议到代码:手把手实现一个简化的PLMN选网状态机(基于23.122 R9)
  • NCWIT抱负奖与高校奖学金联动:如何系统培养女性计算机人才
  • 别再只用一个答案了!用Self-Consistency让GPT/Claude的推理更靠谱(附代码示例)
  • 【Cursor】调整 Cursor 背景颜色
  • 第29章:AI辅助跨链桥安全审计——常见漏洞模式与防御
  • 2026年可靠的3PE防腐保温管/防腐螺旋钢管/3PE螺旋钢管深度厂家推荐 - 品牌宣传支持者
  • 别只盯着网络图了!深度解读VOSviewer三大视图(网络/覆盖/密度)的隐藏信息与实战选择
  • 从买硬盘到选云服务:普通人也能看懂的MTBF指南(附避坑要点)
  • C语言进阶:用container_of和offsetof玩转结构体,写出更优雅的内嵌式代码
  • 别让细节拖后腿:Nature Communications投稿中图片、表格与补充材料的‘隐形’要求详解
  • 避开这些坑,你的eCognition ESP2插件才算没白装:从LV图平滑曲线到成功出峰的实战复盘
  • 告别系统设置界面:一份给Android App开发者的以太网自动配置指南(含静态IP/动态DHCP)
  • 大语言模型符号推理能力本质与局限分析
  • ai辅助开发:让快马平台为你的ht32项目智能生成pid控制算法代码
  • Moneta Markets亿汇:合规意识与外汇市场服务体验如何影响体验,给出一套框架