前面三篇我们完成了 规范开发、数据权限、第三方集成解决了 RuoYi 基础业务开发与外部能力对接问题。而真实企业系统中大量业务并非即时执行而是需要定时调度、异步执行、流程审批例如订单超时关闭、月度数据统计、自动对账、请假审批、报销流程、多级会审等。RuoYi 原生自带 Quartz 定时任务模块同时完美兼容 Flowable 工作流引擎。本篇为系列第四篇重点讲解 原生定时任务高阶用法、动态任务开发、Flowable 工作流整合、自定义审批流落地、节点会签/驳回/抄送 全套生产级方案是复杂业务系统开发的核心必修内容。一、RuoYi 原生定时任务核心认知RuoYi 基于 Quartz 实现定时任务内置可视化任务管理页面支持动态新增、修改、暂停、删除任务无需重启服务彻底告别传统静态代码定时任务。1.1 核心优势全后台可视化配置支持 Cron 表达式动态调整支持任务暂停、恢复、立即执行、单次执行自带任务执行日志可查看成功、失败、耗时支持并发控制、超时策略、错误重试完全融入框架体系自带权限控制、操作日志1.2 基础任务开发规范固定模板所有自定义定时任务统一存放于 com.ruoyi.job.task 包下必须遵循无参公共 run 方法规范框架通过反射调用任务。标准任务类模板Component public class OrderTask{Autowired private BizOrderService orderService;/** * 定时关闭超时未支付订单 */ public voidcloseUnPayOrder(){// 业务逻辑查询超时订单、关闭订单、释放库存 orderService.autoCloseUnPayOrder();}}无需继承父类、无需实现接口只需保证 public 无参方法后台配置任务即可调度执行。二、Cron 表达式实战与常用业务模板定时任务的核心是 Cron 表达式新手无需记忆复杂规则直接套用企业高频模板即可。业务场景Cron 表达式说明每1分钟执行一次0 */1 * * * ?高频巡检、超时检测每5分钟执行一次0 */5 * * * ?数据同步、状态刷新每天凌晨1点执行0 0 1 * * ?数据统计、报表生成、日志归档每日凌晨2点30分0 30 2 * * ?对账、备份任务每周一凌晨3点0 0 3 * MON周度统计、周结算每月1号凌晨4点0 0 4 1 * ?月度结算、月度报表三、定时任务高阶核心功能生产必备3.1 任务并发控制禁止重复执行默认情况下Quartz 允许任务并发执行。若上一次任务未执行完毕、下一次调度触发会出现任务并发、数据重复处理问题如重复对账、重复关闭订单。解决方案后台任务配置勾选 禁止并发执行底层通过数据库锁机制保证同一任务串行执行。3.2 任务超时策略大数据量统计、批量处理任务可能卡死阻塞后续调度RuoYi 支持配置任务超时时间超时自动终止任务、记录异常日志避免线程死锁。3.3 任务异常容错与重试网络波动、第三方接口超时会导致任务执行失败可配置失败重试次数、重试间隔大幅提升任务稳定性。3.4 动态传参任务开发很多业务需要任务支持动态参数而非固定逻辑。RuoYi 支持后台配置自定义参数任务方法通过字符串参数接收public void batchHandle(String params){// params 为后台传入的自定义参数可传JSON、普通字符串 JSONObject jsonJSON.parseObject(params);Stringtypejson.getString(type);// 执行业务逻辑}3.5 定时任务业务实战场景汇总电商系统自动关闭超时订单、自动确认收货、超时退款数据系统每日凌晨统计昨日数据、生成报表、清理冗余日志运维系统定时巡检服务、定时备份数据、定时清理文件财务系统每日自动对账、月度自动结算、发票状态同步四、定时任务高频坑点与避坑方案并发重复执行长耗时任务必须开启「禁止并发」防止数据重复处理任务执行成功但无数据变化未加事务、未捕获异常外层显示成功内层业务异常需手动添加 try-catch 打印详细日志集群部署任务重复执行多节点部署会多机同时调度需开启 Quartz 数据库集群锁Cron 配置错误导致任务不执行秒分日月周位置错乱优先使用标准模板调试任务卡死阻塞批量任务必须加超时时间、分批处理避免一次性加载海量数据五、Flowable 工作流集成原理与环境搭建简单的审核可以用状态机实现但多级审批、会签、或签、驳回、撤回、抄送、流程跳转等复杂场景必须使用专业工作流引擎。RuoYi 完美适配 Flowable6.x 版本是企业后台审批系统的最优方案。5.1 引入 Flowable 依赖!-- Flowable 工作流引擎 --dependencygroupIdorg.flowable/groupIdartifactIdflowable-spring-boot-starter/artifactIdversion6.11.0/version/dependency5.2 初始化数据库表Flowable 首次启动自动生成 60 张流程基础表负责流程定义、实例、任务、审批记录、历史流转等数据无需手动建表。5.3 核心流程概念必懂流程定义BPMN 流程图文件定义审批节点、流转规则流程实例每一次发起的审批单对应一条流程实例待办任务当前节点待审批任务历史任务已审批、已驳回、已跳过的历史节点六、BPMN 流程图绘制与部署6.1 常用节点说明开始事件、结束事件流程起止用户任务人工审批节点员工、主管、经理排他网关或签满足任一条件即可流转并行网关会签所有节点全部通过才流转顺序流节点流转条件6.2 流程部署方式将绘制好的 .bpmn20.xml 流程文件放入项目资源目录项目启动自动部署也可通过代码动态部署、后台可视化部署。七、完整审批流业务落地请假流程实战以最常用的请假审批为例实现员工发起 → 部门主管审批 → 经理审批 → 流程结束支持驳回、撤回、查看进度。7.1 业务表设计业务主表必须关联流程实例ID实现业务与流程绑定process_instance_id流程实例IDapply_user_id申请人IDapply_time申请时间status流程状态审批中、通过、驳回、撤回7.2 发起流程核心代码//1. 构建流程变量 MapString, Objectvariablesnew HashMap();variables.put(applyUserId, SecurityUtils.getUserId());//2. 启动流程实例 ProcessInstance instanceruntimeService.startProcessInstanceByKey(leave_process, variables);//3. 绑定业务数据与流程ID leaveEntity.setProcessInstanceId(instance.getId());leaveMapper.insert(leaveEntity);7.3 审批通过/驳回核心逻辑// 完成当前待办任务 taskService.complete(taskId, variables);// 更新业务单据状态 leaveService.updateStatus(leaveId, status);八、高阶审批场景会签、或签、驳回、抄送8.1 会签多人全部通过适用于多人会审场景配置并行网关所有审批人全部同意后流程继续任意一人驳回则流程终止。8.2 或签一人通过即可适用于多级任选审批多个审批人任意一人操作即可完成当前节点流转。8.3 驳回指定节点Flowable 默认仅支持驳回至上一节点生产项目需自定义驳回至任意历史节点适配复杂审批回溯场景。8.4 流程抄送实现通过自定义抄送表记录抄送用户流程流转后推送消息用户可查看流程进度但无操作权限。九、工作流生产级避坑指南业务表与流程必须强绑定所有审批单据必须关联流程实例ID防止流程与业务脱节流程变量统一管理节点判断、权限控制依赖流程变量避免动态参数混乱必须处理历史数据禁止直接删除流程定义否则历史审批记录无法查询驳回逻辑单独封装原生不支持任意节点驳回需自定义工具类实现待办消息推送流程节点流转后主动推送站内信、短信提醒提升审批效率流程幂等性防止重复提交、重复审批导致流程错乱十、本篇总结定时任务解决了系统自动化、异步化业务工作流解决了系统流程化、审批化业务二者是 RuoYi 从简单CRUD系统进阶为企业级复杂业务系统的核心能力。掌握本篇内容可独立开发OA办公、进销存、财务审批、项目管理、工单系统等全品类后台项目。十一、下篇预告下一篇为系列第五篇RuoYi性能优化、缓存实战、分布式部署、接口限流与安全加固聚焦生产环境优化解决系统卡顿、并发不足、安全漏洞、集群部署问题让项目稳定支撑高并发访问。