news 2026/6/4 3:19:57

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 }) }); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 3:15:11

海德汉PWM21实战:手把手教你用它搞定伺服电机相位角校准(附西门子/力士乐案例)

海德汉PWM21实战&#xff1a;伺服电机相位角校准全流程解析在工业自动化领域&#xff0c;伺服电机的精准控制离不开编码器的精确反馈。当一台使用海德汉编码器的西门子伺服电机因更换编码器后出现位置偏差时&#xff0c;相位角校准就成为恢复设备精度的关键步骤。本文将深入解析…

作者头像 李华
网站建设 2026/6/4 3:14:10

从PostGIS到网页地图:用GeoServer 2.17.2发布PostgreSQL空间数据的避坑实战

从PostGIS到网页地图&#xff1a;用GeoServer 2.17.2发布PostgreSQL空间数据的避坑实战在开源GIS技术栈中&#xff0c;PostgreSQLPostGIS与GeoServer的组合堪称黄金搭档。这套方案不仅能实现专业商业软件90%以上的功能&#xff0c;还能避免昂贵的许可费用。但在实际部署过程中&…

作者头像 李华
网站建设 2026/6/4 3:13:32

CVD工艺中逆向不确定性量化与XGBoost应用

1. 工业CVD工艺中的不确定性挑战在刀具涂层制造车间里&#xff0c;工程师们每天都要面对这样的困境&#xff1a;同样的化学气相沉积&#xff08;CVD&#xff09;工艺参数&#xff0c;用在不同的刀片几何形状上&#xff0c;涂层厚度总会产生令人头疼的波动。这种不确定性不仅影响…

作者头像 李华
网站建设 2026/6/4 3:10:21

计算机大数据毕设实战-django基于神经网络的学生学习情况分析可视化系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华