RuoYi-Vue-Pro 项目流程审批中手机号校验问题分析与解决方案
问题背景
在 RuoYi-Vue-Pro 2.1.0-jdk8-snapshot 版本中,当用户发起流程审批时,如果审批人的联系方式为空,系统会抛出"联系方式不存在"的异常错误,但流程仍然能够正常启动。这种情况在实际业务场景中可能会影响用户体验,特别是当联系方式并非必填项时。
问题现象分析
从错误堆栈中可以清晰地看到,异常发生在 NotificationSendServiceImpl 类的 validateContact 方法中。当系统尝试发送通知时,会强制校验审批人的联系方式是否存在,如果没有设置联系方式,就会抛出 ServiceException 异常。
值得注意的是,虽然前端显示了错误信息,但后台流程实例仍然成功创建并启动了。这表明:
- 流程引擎本身的处理逻辑是正常的
- 问题出在流程启动后的通知环节
- 通知的发送与流程引擎的运行是解耦的
技术原理
在 RuoYi-Vue-Pro 的工作流实现中,流程审批涉及几个关键环节:
- 流程实例创建:系统首先创建流程实例,这是工作流的核心部分
- 任务分配:将任务分配给指定的审批人
- 通知发送:系统会尝试通过多种渠道通知审批人
通知功能是通过 NotificationSendServiceImpl 实现的,它会在以下情况下被调用:
- 流程启动时通知发起人
- 任务分配时通知审批人
- 任务完成时通知相关人员
解决方案
针对这个问题,可以考虑以下几种解决方案:
方案一:修改联系方式校验逻辑
在 NotificationSendServiceImpl 中修改 validateContact 方法,使其在联系方式为空时跳过发送而不是抛出异常:
public void validateContact(String contact) {
if (StrUtil.isEmpty(contact)) {
log.warn("联系方式为空,跳过通知发送");
return; // 修改为返回而不是抛出异常
}
// 原有校验逻辑...
}
方案二:增加通知功能开关
在发送通知前,先检查系统是否启用了通知功能:
@Resource
private NotificationEnableApi notificationEnableApi;
public void sendSingleNotificationToAdmin(Long userId, String templateCode, Map<String, Object> templateParams) {
if (!notificationEnableApi.isEnabled()) {
return;
}
// 原有发送逻辑...
}
方案三:前端增加联系方式校验
如果业务上要求审批人必须填写联系方式,可以在用户管理界面增加联系方式的必填校验:
- 修改用户表的联系方式字段为 NOT NULL
- 在前端表单中添加必填验证
- 在后端接口中添加参数校验
最佳实践建议
根据不同的业务场景,推荐以下实践:
- 非关键通知场景:采用方案一,允许联系方式为空时静默跳过
- 关键业务场景:采用方案三,强制要求填写联系方式
- 系统集成场景:采用方案二,提供灵活的功能开关
对于大多数企业应用,建议组合使用方案一和方案二,既保证系统的健壮性,又提供足够的灵活性。
总结
RuoYi-Vue-Pro 作为一款优秀的企业级开发框架,其工作流模块的设计考虑了大多数业务场景。在实际应用中,开发者需要根据具体业务需求对通知机制进行适当调整。本文分析的联系方式校验问题展示了框架的可扩展性,通过简单的修改就能适应不同的业务需求。理解这些机制有助于开发者更好地利用 RuoYi-Vue-Pro 构建稳定、灵活的业务系统。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0155- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112