3.3 KiB
3.3 KiB
代码调整记录 - 2025-08-08 - wuzhen
🚨 重要修复:奖学金申请字段映射问题
时间: 2025-08-08 23:07:00
修复人员: wuzhen
问题类型: 字段映射不一致导致的业务异常
🔍 问题描述
奖学金审核功能中,管理员点击"批准"或"拒绝"按钮时出现异常:
学生学号不能为空
🎯 根本原因分析
字段映射链断裂:
- 前端传递:
studentCode: "202301001" - BO验证:
studentCode通过验证 ✅ - BO转Entity:
studentCode→studentNo映射失败 ❌ - Service校验:
entity.getStudentNo()为空 ❌ - 异常抛出: "学生学号不能为空"
字段不一致问题:
- 数据库表字段:
student_no - Entity类字段:
studentNo - VO类字段:
studentNo - BO类字段:
studentCode← 不一致的源头
✅ 解决方案
采用统一字段名方案,将所有层级统一使用 studentNo:
1. 修改BO类字段
文件: backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/domain/bo/JcbtScholarshipApplicationBo.java
// 修改前:两个字段并存
private String studentCode; // 带验证注解
private String studentNo; // 无验证注解
// 修改后:统一使用studentNo
@NotBlank(message = "学生学号不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 50, message = "学生学号长度不能超过50个字符")
private String studentNo;
2. 删除自定义setter方法
删除了BO类中的字段同步setter方法:
setStudentCode(String studentCode)setStudentNo(String studentNo)
3. 修改Service层查询条件
文件: backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipApplicationServiceImpl.java
// 修改前
lqw.eq(StringUtils.isNotBlank(bo.getStudentCode()), JcbtScholarshipApplication::getStudentNo, bo.getStudentCode());
// 修改后
lqw.eq(StringUtils.isNotBlank(bo.getStudentNo()), JcbtScholarshipApplication::getStudentNo, bo.getStudentNo());
4. 修改前端字段映射
文件: web/src/views/jcbt/scholarship/review/index.vue
删除了三个位置的手动字段映射:
// 修改前:需要手动映射
const updateData = {
...fullData,
studentCode: fullData.studentNo, // 手动映射
currentStatus: 'APPROVED'
}
// 修改后:直接使用
const updateData = {
...fullData,
currentStatus: 'APPROVED'
}
🎯 修复效果
数据一致性检查:
- ✅ 数据库表:
student_no - ✅ Entity:
studentNo - ✅ VO:
studentNo - ✅ BO:
studentNo(已修复) - ✅ 前端: 使用
studentNo
📋 测试验证
- 编译测试: ✅ Maven编译成功
- 字段映射: ✅ 前端→BO→Entity数据流畅通
- 验证逻辑: ✅ BO验证和Service校验统一
💡 经验总结
- 字段命名一致性:整个数据链路应使用统一的字段名
- 减少手动映射:避免前端手动字段映射,降低出错概率
- 分层检查:问题排查需要从前端到后端完整梳理数据流
🔄 后续改进
建议在代码生成模板中加强字段命名一致性检查,避免类似问题再次发生。
状态: ✅ 已完成
验证: ✅ 编译通过
影响范围: 奖学金申请审核功能