code-adjust-record-2025-01-27-fix-quota-fields.md 5.7 KB

代码调整记录 - 2025-01-27

调整人员: Cursor AI
调整时间: 2025-01-27 16:45:00
调整类型: Bug修复
影响模块: 奖学金名额分配管理


📋 调整概述

问题描述

奖学金名额分配页面列表中的以下字段显示为空:

  • 奖学金批次
  • 奖学金类型
  • 分配级别
  • 目标部门
  • 状态

问题原因

  1. SQL关联错误: parent_quota_id字段关联到了错误的表
  2. 字段名不匹配: 奖学金类型表中的字段名与查询SQL不一致
  3. 缺少基础数据: 数据库中可能缺少测试用的基础数据

🔧 具体调整内容

1. 核心问题:Service层使用错误的查询方法

问题分析

Service层使用了MyBatis-Plus的selectVoPage()自动方法,该方法不会执行XML中定义的自定义SQL查询,导致关联字段无法正确获取。

解决方案

  • Mapper接口新增: 添加selectQuotaPageList()和selectQuotaList()方法
  • XML查询配置: 为新方法提供自定义SQL查询
  • Service层改造: 替换自动方法为自定义查询方法

2. 修复Mapper XML中的SQL关联错误

文件位置

backend/ruoyi-modules/ruoyi-jcbt/src/main/resources/mapper/JcbtScholarshipQuotaMapper.xml

问题1: 错误的parent_quota_id关联

-- 修复前(错误)
left join sys_dept pd on q.parent_quota_id = pd.dept_id

-- 修复后(正确)
left join jcbt_scholarship_quota pq on q.parent_quota_id = pq.id
left join sys_dept pd on pq.target_dept_id = pd.dept_id

说明: parent_quota_id应该关联另一个名额分配记录的ID,而不是直接关联部门表。

问题2: 字段名不匹配

-- 修复前(错误)
st.level as scholarship_level

-- 修复后(正确)  
st.level_type as scholarship_level

说明: 奖学金类型表中的字段名是level_type,不是level。

2. 创建基础测试数据脚本

文件位置

backend/sql/test_scholarship_basic_data.sql

测试数据内容

  • 奖学金批次: 2个测试批次(2024学年第一、二学期)
  • 奖学金类型: 5种类型(国家奖学金、国家励志奖学金、校级一等奖、校级二等奖、社会专项奖学金)
  • 名额分配: 4条全校级分配记录

📊 修复效果对比

修复前

奖学金批次: [空白]
奖学金类型: [空白] 
分配级别: [空白]
目标部门: [空白]
状态: [空白]

修复后(预期)

奖学金批次: 2024学年第一学期奖学金评定
奖学金类型: 国家奖学金
分配级别: 全校
目标部门: [根据实际配置显示]
状态: 生效

🚀 验证步骤

1. 数据库层面验证

执行测试脚本检查数据:

-- 执行测试脚本
source backend/sql/test_scholarship_basic_data.sql

-- 验证关联查询
SELECT 
    q.id,
    b.batch_name,
    st.type_name as scholarship_type_name,
    q.allocation_level,
    q.total_quota,
    q.status
FROM jcbt_scholarship_quota q
LEFT JOIN jcbt_scholarship_batch b ON q.batch_id = b.id
LEFT JOIN jcbt_scholarship_type st ON q.scholarship_type_id = st.id
WHERE q.deleted = 0;

2. 应用层面验证

  1. 重新编译后端服务(需要手动操作)
  2. 重启服务(需要手动操作)
  3. 刷新前端页面
  4. 检查列表数据显示

⚠️ 重要提醒

3. 新发现:前端字段映射错误

问题分析

前端表格列使用了错误的字段名:

  • 分配级别列:使用allocationLevel,应该使用allocationLevelName
  • 状态列:使用status,应该使用statusName

解决方案

修改前端表格列定义,直接使用后端SQL中转换后的中文名称字段

4. 新需求:取消分配方式选择

需求描述

  • 在新增和修改奖学金名额分配时,取消分配方式的选择按钮
  • 全部默认向后台传递"手动分配"(MANUAL)这个选项的值

实现方案

  1. 隐藏UI组件: 注释掉分配方式选择框,但保留代码结构
  2. 强制设置默认值: 在新增、修改、提交时都确保allocationMethod='MANUAL'
  3. 确保数据一致性: 多重保障机制确保后端始终收到正确值

需要手动操作

  1. 执行SQL脚本: ```bash

    方式1: 使用简单脚本(推荐)

    mysql -u root -p hzdyjs_xg < backend/sql/insert_test_data_simple.sql

# 方式2: 使用完整脚本 mysql -u root -p hzdyjs_xg < backend/sql/test_scholarship_basic_data.sql


2. **重新编译后端**:
   ```bash
   cd backend
   mvn clean compile
  1. 重启后端服务:

    # 停止当前服务
    # 重新启动服务
    
    1. 清除浏览器缓存并刷新前端页面

    验证清单

    • SQL脚本执行成功
    • 后端服务重启成功
    • 前端页面数据正常显示
    • 所有字段都有正确的值
    • 分配级别显示为中文(全校、学院等)
    • 状态显示为中文(生效、失效等)

    📝 技术细节

    SQL关联关系修复

    -- 原始错误的关联逻辑
    jcbt_scholarship_quota.parent_quota_id -> sys_dept.dept_id
    
    -- 修复后的正确关联逻辑  
    jcbt_scholarship_quota.parent_quota_id -> jcbt_scholarship_quota.id
    jcbt_scholarship_quota.target_dept_id -> sys_dept.dept_id
    

字段映射修复

-- 确保字段名与表结构一致
jcbt_scholarship_type.level_type AS scholarship_level
jcbt_scholarship_type.type_name AS scholarship_type_name

数据完整性保证

  • 使用INSERT IGNORE避免重复插入
  • 使用雪花ID确保ID唯一性
  • 设置合理的默认值和状态

变更完成时间: 2025-01-27 16:45:00
下一步操作: 需要手动执行SQL脚本并重启服务
验证预期: 列表页面所有字段正常显示