Files
hzdyjs/docs/设计文档/database/code-adjust-record-2025-08-08-wuzhen.md
T
2025-08-10 00:28:48 +08:00

3.3 KiB
Raw Blame History

代码调整记录 - 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

📋 测试验证

  1. 编译测试: ✅ Maven编译成功
  2. 字段映射: ✅ 前端→BO→Entity数据流畅通
  3. 验证逻辑: ✅ BO验证和Service校验统一

💡 经验总结

  1. 字段命名一致性:整个数据链路应使用统一的字段名
  2. 减少手动映射:避免前端手动字段映射,降低出错概率
  3. 分层检查:问题排查需要从前端到后端完整梳理数据流

🔄 后续改进

建议在代码生成模板中加强字段命名一致性检查,避免类似问题再次发生。


状态: ✅ 已完成
验证: ✅ 编译通过
影响范围: 奖学金申请审核功能