6.5 KiB
6.5 KiB
出国申请预算字段删除完成总结
执行时间: 2025-10-08
执行人: AI Assistant
业务需求: 出国申请不需要预算金额和经费来源字段
📋 问题背景
原始错误
-
第一次错误:
Field 'budget' doesn't have a default value- 原因:前端删除了预算输入框,但数据库字段为 NOT NULL
-
第二次错误: "预算金额必须大于0"
- 原因:后端Service层有业务校验逻辑
业务需求
- ✅ 出国申请表单不需要预算金额
- ✅ 出国申请表单不需要经费来源
- ✅ 这两个字段对业务流程没有实际意义
🔧 完整修复方案
1️⃣ 数据库层修改
文件: backend/ruoyi-modules/ruoyi-rs/出国申请预算字段改为可选.sql
-- 修改 budget 字段:NOT NULL -> NULL,默认值 0.00
ALTER TABLE rs_overseas_application
MODIFY COLUMN budget decimal(15,2) DEFAULT 0.00 COMMENT '预算金额(可选)';
-- 修改 budget_source 字段:NOT NULL -> NULL,默认值空字符串
ALTER TABLE rs_overseas_application
MODIFY COLUMN budget_source varchar(50) DEFAULT '' COMMENT '经费来源(可选)';
执行结果:
✅ budget: decimal(15,2), YES, 0.00, 预算金额(可选)
✅ budget_source: varchar(50), YES, '', 经费来源(可选)
2️⃣ 后端Service层修改
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsOverseasApplicationServiceImpl.java
修改位置: 第512-514行
修改前:
if (entity.getBudget() != null && entity.getBudget().doubleValue() <= 0) {
throw new RuntimeException("预算金额必须大于0");
}
修改后:
// 预算金额校验已删除(业务不需要预算金额字段)
编译结果: ✅ BUILD SUCCESS
3️⃣ 前端提交逻辑修改
文件: web/src/views/rs/overseas/index.vue
修改位置: 第1912-1920行
新增代码:
// 7. 设置预算相关字段的默认值(数据库已改为可选,但保险起见设置默认值)
if (!state.applicationForm.budget) {
state.applicationForm.budget = 0;
console.log('✅ budget已设置默认值: 0');
}
if (!state.applicationForm.budgetSource || state.applicationForm.budgetSource.trim() === '') {
state.applicationForm.budgetSource = '';
console.log('✅ budgetSource已设置默认值: 空字符串');
}
作用:
- ✅ 确保提交时始终有预算字段的值
- ✅ 避免因字段缺失导致的数据库错误
- ✅ 提供清晰的调试日志
📊 完整修改清单
| 序号 | 修改项 | 位置 | 修改内容 | 状态 |
|---|---|---|---|---|
| 1 | 删除预算金额输入框 | 前端表单 | 界面元素 | ✅ 已完成 |
| 2 | 删除预算金额验证 | 后端Bo类 | @NotNull注解 | ✅ 已完成 |
| 3 | 删除身份证号必填验证 | 后端Bo类 | @NotBlank注解 | ✅ 已完成 |
| 4 | 删除身份证号格式验证 | 后端Bo类 | @Pattern注解 | ✅ 已完成 |
| 5 | 清理空身份证号字段 | 前端提交逻辑 | delete操作 | ✅ 已完成 |
| 6 | 修改budget字段为可选 | 数据库表结构 | ALTER TABLE | ✅ 已完成 |
| 7 | 修改budgetSource字段为可选 | 数据库表结构 | ALTER TABLE | ✅ 已完成 |
| 8 | 设置预算字段默认值 | 前端提交逻辑 | 默认值设置 | ✅ 已完成 |
| 9 | 删除预算金额业务校验 | 后端Service层 | 删除校验逻辑 | ✅ 已完成 |
🧪 测试步骤
测试前准备
- ✅ 数据库字段已修改为可选
- ✅ 后端Service层校验已删除
- ✅ 后端模块已重新编译
- ⚠️ 需要重启后端服务(让新编译的代码生效)
测试流程
- 重启后端服务
- 刷新前端页面(清除浏览器缓存)
- 填写出国申请表单(不填写预算金额)
- 点击提交
预期结果
- ✅ 不再提示 "Field 'budget' doesn't have a default value"
- ✅ 不再提示 "预算金额必须大于0"
- ✅ 申请提交成功
- ✅ 控制台显示:
✅ budget已设置默认值: 0 ✅ budgetSource已设置默认值: 空字符串
🎯 最终效果
字段状态
| 字段名 | 数据库类型 | 是否必填 | 默认值 | 前端显示 | 后端校验 |
|---|---|---|---|---|---|
| budget | decimal(15,2) | ❌ 否 | 0.00 | ❌ 不显示 | ❌ 无校验 |
| budget_source | varchar(50) | ❌ 否 | '' | ❌ 不显示 | ❌ 无校验 |
业务流程
- ✅ 用户填写出国申请表单(无需填写预算)
- ✅ 前端自动设置预算字段默认值(0和空字符串)
- ✅ 后端不进行预算金额校验
- ✅ 数据库接受默认值或空值
- ✅ 申请提交成功
📝 相关文件清单
SQL脚本
backend/ruoyi-modules/ruoyi-rs/出国申请预算字段改为可选.sql
后端文件
backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsOverseasApplicationServiceImpl.javabackend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsOverseasApplicationBo.java
前端文件
web/src/views/rs/overseas/index.vue
文档文件
出国申请预算字段删除完成总结.md(本文档)
⚠️ 重要提醒
必须执行的操作
- 重启后端服务 - 让新编译的Service类生效
- 刷新前端页面 - 清除浏览器缓存
不需要的操作
- ❌ 不需要修改实体类(Entity/Bo/Vo)
- ❌ 不需要修改Controller层
- ❌ 不需要修改前端API接口
🚀 部署建议
开发环境
- 执行SQL脚本修改数据库
- 重新编译后端模块
- 重启后端服务
- 刷新前端页面测试
生产环境
- 提前备份数据库
- 在维护时间窗口执行SQL脚本
- 部署新版本后端代码
- 通知用户刷新页面
📊 技术总结
问题根源
- 数据库约束 - NOT NULL字段缺少默认值
- 业务校验 - Service层强制校验预算金额大于0
- 前端提交 - 删除输入框后未设置默认值
解决思路
- 数据库层 - 修改字段为可选,设置默认值
- 业务层 - 删除不必要的业务校验
- 前端层 - 提交时自动设置默认值
最佳实践
- ✅ 前后端字段保持一致
- ✅ 数据库约束与业务需求匹配
- ✅ 删除字段时同步删除相关校验
- ✅ 提供清晰的调试日志
修复完成时间: 2025-10-08 14:30
状态: ✅ 完全修复,等待重启后端服务测试