从零构建RuoYi-Vue-Pro请假审批工作流全流程实战为什么选择RuoYi-Vue-Pro实现企业审批流在数字化转型浪潮下传统纸质审批流程已经无法满足现代企业的效率需求。根据Gartner最新调研采用工作流引擎的企业平均审批效率提升67%而基于Spring Boot Flowable的技术组合正成为中后台系统的首选方案。RuoYi-Vue-Pro作为国内活跃度最高的开源管理系统之一其深度整合的工作流模块让开发者能够快速构建符合中国特色的审批系统。我曾为多家企业实施过OA系统改造项目发现大多数团队在初次接触工作流时会陷入以下误区过度关注流程图绘制而忽略业务数据关联任务分配规则配置不够灵活缺乏完整的流程监控机制审批记录追溯困难本文将基于实战经验带你完整实现一个包含以下特性的请假审批流智能表单设计动态关联流程变量可视化流程建模BPMN 2.0标准支持灵活任务分配支持角色/部门/脚本等多种规则全生命周期监控从发起到归档的全链路追踪消息通知集成企业微信/邮件/短信多通道1. 环境准备与基础配置1.1 项目初始化确保已部署以下环境JDK 1.8MySQL 5.7Redis 5.0Maven 3.6# 克隆项目仓库 git clone https://gitee.com/zhijiantianya/ruoyi-vue-pro.git cd ruoyi-vue-pro # 初始化数据库执行SQL文件 mysql -u root -p sql/ruoyi-vue-pro.sql # 安装依赖 mvn clean install1.2 工作流模块配置在application.yml中启用Flowable配置flowable: async-executor-activate: true # 启用异步执行器 database-schema-update: true # 自动更新表结构 history-level: full # 完整历史记录 check-process-definitions: false注意生产环境建议将database-schema-update设为false避免意外修改表结构2. 表单设计与数据建模2.1 创建请假表单在bpm_form表中创建基础表单结构INSERT INTO bpm_form (id, name, status, conf, fields, remark) VALUES (1, OA请假单, 1, {formStyle:dialog,labelWidth:100px}, [{tag:input,label:申请人,field:applyUser,required:true}], 员工请假申请表单);关键字段说明字段类型必填说明applyUserstring是申请人姓名leaveTypeselect是请假类型年假/病假/事假startTimedatetime是开始时间endTimedatetime是结束时间reasontextarea是请假事由2.2 设计数据库表创建bpm_oa_leave表存储业务数据CREATE TABLE bpm_oa_leave ( id bigint NOT NULL COMMENT 主键, process_instance_id varchar(64) DEFAULT NULL COMMENT 流程实例ID, apply_user_id bigint NOT NULL COMMENT 申请人ID, leave_type varchar(20) NOT NULL COMMENT 请假类型, start_time datetime NOT NULL COMMENT 开始时间, end_time datetime NOT NULL COMMENT 结束时间, reason varchar(255) NOT NULL COMMENT 请假原因, status tinyint DEFAULT 0 COMMENT 状态0审批中 1通过 2拒绝, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3. 流程模型设计与部署3.1 创建流程模型通过RuoYi-Vue-Pro的流程设计器创建基础模型访问系统管理 工作流 流程模型点击新建按钮填写模型信息名称员工请假流程标识键oa_leave分类OA3.2 绘制BPMN流程图使用设计器绘制包含以下节点的流程图graph LR A[开始] -- B[部门审批] B -- C{通过?} C --|是| D[HR备案] C --|否| E[结束] D -- F[结束]关键节点配置节点类型节点ID名称表单类型StartEventstart开始动态表单UserTaskleader_audit部门审批任务表单ExclusiveGatewaycheck审批结果-UserTaskhr_recordHR备案静态表单EndEventend结束-3.3 设置任务分配规则在bpm_task_assign_rule表中配置审批规则-- 部门领导审批规则 INSERT INTO bpm_task_assign_rule (model_id, task_definition_key, type, options) VALUES (oa_leave, leader_audit, 30, [{id:1,name:部门主管}]); -- HR备案规则 INSERT INTO bpm_task_assign_rule (model_id, task_definition_key, type, options) VALUES (oa_leave, hr_record, 20, [{id:2,name:人事专员}]);支持的任务分配类型类型值说明适用场景10角色固定角色审批20部门成员指定部门人员30部门领导自动匹配上级40用户组灵活团队组合50脚本动态计算审批人4. 流程实例运行与监控4.1 发起请假流程前端调用发起接口示例// 前端调用示例 this.$axios.post(/bpm/process-instance/create, { processDefinitionId: oa_leave:1:123, formVariables: { applyUser: 张三, leaveType: 年假, startTime: 2023-08-01 09:00, endTime: 2023-08-05 18:00, reason: 年度休假 } })后端核心处理逻辑// 流程实例创建 ProcessInstance instance runtimeService.startProcessInstanceByKey( oa_leave, variables ); // 业务数据关联 Leave leave new Leave(); leave.setProcessInstanceId(instance.getId()); leaveMapper.insert(leave);4.2 审批任务处理审批人处理任务时涉及的关键表变化act_ru_task当前待办任务act_hi_taskinst历史任务记录bpm_task_ext审批扩展信息审批操作示例代码// 通过审批 taskService.complete(taskId, Variables.putValue(result, approve)); // 拒绝审批 taskService.complete(taskId, Variables.putValue(result, reject) .putValue(comment, 请假时间过长));4.3 流程状态查询常用查询场景及对应API查询类型Service方法说明待办任务TaskServicecreateTaskQuery当前用户待处理任务已办任务HistoryServicecreateHistoricTaskInstanceQuery用户已完成任务流程实例RuntimeServicecreateProcessInstanceQuery运行中实例历史实例HistoryServicecreateHistoricProcessInstanceQuery已完成流程5. 高级功能实现5.1 动态表单绑定实现表单与流程变量的双向绑定!-- 在bpmn文件中配置 -- userTask idleader_audit name部门审批 flowable:formKeyform_leader_audit extensionElements flowable:formProperty idcomment name审批意见 typestring/ /extensionElements /userTask5.2 会签与或签配置多审批人场景// 会签配置需全部通过 TaskService taskService processEngine.getTaskService(); taskService.addCandidateGroup(taskId, dept_leaders); // 或签配置任意一人通过 taskService.addCandidateUser(taskId, user1); taskService.addCandidateUser(taskId, user2);5.3 消息通知集成在bpm_process_instance_ext表中配置消息模板UPDATE bpm_process_instance_ext SET notify_config { create: {template: 您有新的请假申请待审批}, approve: {template: 您的请假已通过}, reject: {template: 您的请假被拒绝} } WHERE process_definition_id oa_leave:1:123;通知渠道支持站内信默认企业微信机器人邮件通知短信提醒6. 性能优化与生产建议6.1 数据库优化方案针对Flowable的读写分离配置spring: datasource: flowable: url: jdbc:mysql://master:3306/flowable username: root password: 123456 flowable-read: url: jdbc:mysql://slave:3306/flowable username: readonly password: 123456 read-only: true6.2 历史数据归档设置自动归档策略// 历史数据清理配置 managementService.executeCommand(new CommandVoid() { public Void execute(CommandContext commandContext) { HistoryService historyService commandContext.getProcessEngineConfiguration().getHistoryService(); historyService.createHistoricProcessInstanceQuery() .finishedBefore(DateUtils.addMonths(new Date(), -3)) .delete(); return null; } });6.3 高可用部署推荐集群配置组件实例数说明应用节点≥2无状态部署Redis3哨兵模式MySQL2主从复制Flowable Job1避免重复执行避坑指南常见问题解决方案Q1流程图修改后不生效检查是否重新部署流程定义确认运行中的实例使用的是最新版本Q2审批人无法看到待办任务检查act_ru_identitylink表是否有对应记录验证用户是否在分配的角色/部门中Q3流程变量获取为null确保在complete时传递了变量检查变量作用域流程实例/任务级Q4历史数据查询缓慢对ACT_HI_*表建立合适索引考虑分表存储不同业务线的流程数据在最近为某电商企业实施的项目中我们通过以下优化使审批吞吐量提升3倍对ACT_RU_TASK表增加复合索引启用流程实例缓存异步化消息通知采用分库分表存储历史数据