224 lines
6.5 KiB
Markdown
224 lines
6.5 KiB
Markdown
# 出国申请预算字段删除完成总结
|
||
|
||
**执行时间**: 2025-10-08
|
||
**执行人**: AI Assistant
|
||
**业务需求**: 出国申请不需要预算金额和经费来源字段
|
||
|
||
---
|
||
|
||
## 📋 问题背景
|
||
|
||
### 原始错误
|
||
1. **第一次错误**: `Field 'budget' doesn't have a default value`
|
||
- 原因:前端删除了预算输入框,但数据库字段为 NOT NULL
|
||
|
||
2. **第二次错误**: "预算金额必须大于0"
|
||
- 原因:后端Service层有业务校验逻辑
|
||
|
||
### 业务需求
|
||
- ✅ 出国申请表单不需要预算金额
|
||
- ✅ 出国申请表单不需要经费来源
|
||
- ✅ 这两个字段对业务流程没有实际意义
|
||
|
||
---
|
||
|
||
## 🔧 完整修复方案
|
||
|
||
### 1️⃣ 数据库层修改
|
||
|
||
**文件**: `backend/ruoyi-modules/ruoyi-rs/出国申请预算字段改为可选.sql`
|
||
|
||
```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行
|
||
|
||
**修改前**:
|
||
```java
|
||
if (entity.getBudget() != null && entity.getBudget().doubleValue() <= 0) {
|
||
throw new RuntimeException("预算金额必须大于0");
|
||
}
|
||
```
|
||
|
||
**修改后**:
|
||
```java
|
||
// 预算金额校验已删除(业务不需要预算金额字段)
|
||
```
|
||
|
||
**编译结果**: ✅ BUILD SUCCESS
|
||
|
||
---
|
||
|
||
### 3️⃣ 前端提交逻辑修改
|
||
|
||
**文件**: `web/src/views/rs/overseas/index.vue`
|
||
|
||
**修改位置**: 第1912-1920行
|
||
|
||
**新增代码**:
|
||
```javascript
|
||
// 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层** | **删除校验逻辑** | ✅ **已完成** |
|
||
|
||
---
|
||
|
||
## 🧪 测试步骤
|
||
|
||
### 测试前准备
|
||
1. ✅ 数据库字段已修改为可选
|
||
2. ✅ 后端Service层校验已删除
|
||
3. ✅ 后端模块已重新编译
|
||
4. ⚠️ **需要重启后端服务**(让新编译的代码生效)
|
||
|
||
### 测试流程
|
||
1. **重启后端服务**
|
||
2. **刷新前端页面**(清除浏览器缓存)
|
||
3. **填写出国申请表单**(不填写预算金额)
|
||
4. **点击提交**
|
||
|
||
### 预期结果
|
||
- ✅ 不再提示 "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.java`
|
||
- `backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsOverseasApplicationBo.java`
|
||
|
||
### 前端文件
|
||
- `web/src/views/rs/overseas/index.vue`
|
||
|
||
### 文档文件
|
||
- `出国申请预算字段删除完成总结.md` (本文档)
|
||
|
||
---
|
||
|
||
## ⚠️ 重要提醒
|
||
|
||
### 必须执行的操作
|
||
1. **重启后端服务** - 让新编译的Service类生效
|
||
2. **刷新前端页面** - 清除浏览器缓存
|
||
|
||
### 不需要的操作
|
||
- ❌ 不需要修改实体类(Entity/Bo/Vo)
|
||
- ❌ 不需要修改Controller层
|
||
- ❌ 不需要修改前端API接口
|
||
|
||
---
|
||
|
||
## 🚀 部署建议
|
||
|
||
### 开发环境
|
||
1. 执行SQL脚本修改数据库
|
||
2. 重新编译后端模块
|
||
3. 重启后端服务
|
||
4. 刷新前端页面测试
|
||
|
||
### 生产环境
|
||
1. **提前备份数据库**
|
||
2. 在维护时间窗口执行SQL脚本
|
||
3. 部署新版本后端代码
|
||
4. 通知用户刷新页面
|
||
|
||
---
|
||
|
||
## 📊 技术总结
|
||
|
||
### 问题根源
|
||
1. **数据库约束** - NOT NULL字段缺少默认值
|
||
2. **业务校验** - Service层强制校验预算金额大于0
|
||
3. **前端提交** - 删除输入框后未设置默认值
|
||
|
||
### 解决思路
|
||
1. **数据库层** - 修改字段为可选,设置默认值
|
||
2. **业务层** - 删除不必要的业务校验
|
||
3. **前端层** - 提交时自动设置默认值
|
||
|
||
### 最佳实践
|
||
- ✅ 前后端字段保持一致
|
||
- ✅ 数据库约束与业务需求匹配
|
||
- ✅ 删除字段时同步删除相关校验
|
||
- ✅ 提供清晰的调试日志
|
||
|
||
---
|
||
|
||
**修复完成时间**: 2025-10-08 14:30
|
||
**状态**: ✅ 完全修复,等待重启后端服务测试
|