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

6.1 KiB

代码调整记录 - 2025-01-07 - cursor

🔧 修复奖学金申请"班级可用名额不足"错误

📋 问题描述

  • 错误现象: 班主任批量申请奖学金时出现"班级可用名额不足,无法提交申请"错误
  • 错误位置: 后端 JcbtScholarshipApplicationServiceImpl.java 第206行
  • 根本原因: 前后端对班级名额验证逻辑不一致

🔍 问题分析

  1. 前端验证: 只有当 classQuota.hasQuota = true 时才进行名额检查
  2. 后端验证: 当 queryAvailableQuota 返回 null 时直接报错
  3. 数据不一致: 班级没有分配名额时,前端显示但后端拒绝提交

✅ 解决方案

采用方案一:修复前端验证逻辑,在提交前严格检查班级名额情况


🔄 第一次修复 (21:25:00)

📝 修改内容

文件:web/src/views/jcbt/scholarship/application/index.vue

修改位置: submitBatchApplication 方法中的名额验证逻辑(约第1195-1238行)

修改前:

// 优先检查班级名额
if (scholarshipType.classQuota && scholarshipType.classQuota.hasQuota) {
  if (count > scholarshipType.classQuota.availableQuota) {
    ElMessage.error(`申请人数超过班级可用名额`);
    return;
  }
}

修改后:

// 检查班级名额情况
if (scholarshipType.classQuota) {
  // 如果班级没有分配名额,直接报错
  if (!scholarshipType.classQuota.hasQuota) {
    ElMessage.error(`${scholarshipType.name} 在当前班级没有分配名额,无法申请`);
    return;
  }
  // 如果有名额但不足,报错
  if (count > scholarshipType.classQuota.availableQuota) {
    ElMessage.error(`${scholarshipType.name} 申请人数(${count})超过班级可用名额(${scholarshipType.classQuota.availableQuota})`);
    return;
  }
}

🚨 第一次修复结果

用户反馈: "还是有这个报错,没有任何改变"


🔍 深度分析 (21:45:00)

🎯 发现真正问题

通过深入分析后端代码发现:

  1. 数据结构不匹配: 前端期望嵌套结构,后端返回扁平结构
  2. 验证逻辑错误: 前端验证逻辑与后端实际数据结构不符

📊 后端实际返回的数据结构

// 后端 getScholarshipTypesWithQuota 实际返回结构
{
  id: 123,
  name: "国家奖学金",
  hasQuota: true,        // true=有班级名额分配, false=无班级名额分配
  totalQuota: 5,         // 总名额
  usedQuota: 2,          // 已用名额  
  availableQuota: 3,     // 可用名额
  quotaStatus: "available" // available/full/unlimited
}

📋 前端错误期望的结构

// 前端错误期望的嵌套结构
{
  classQuota: {
    hasQuota: true,
    availableQuota: 3
  },
  schoolQuota: {
    hasQuota: false,
    quotaStatus: 'unlimited'
  }
}

🔧 第二次修复 (22:00:00)

📝 全面修复内容

1. 修复 submitBatchApplication 验证逻辑

文件: web/src/views/jcbt/scholarship/application/index.vue 位置: 第1195-1268行

修复后逻辑:

// 根据后端实际返回的数据结构进行验证
// 如果hasQuota为true,表示有班级名额分配
if (scholarshipType.hasQuota === true) {
  const availableQuota = scholarshipType.availableQuota || 0;
  if (availableQuota <= 0) {
    ElMessage.error(`${scholarshipType.name} 在当前班级没有可用名额,无法申请`);
    return;
  }
  if (count > availableQuota) {
    ElMessage.error(`${scholarshipType.name} 申请人数(${count})超过班级可用名额(${availableQuota})`);
    return;
  }
}
// 如果hasQuota为false,表示没有班级名额分配,使用全校名额
else if (scholarshipType.hasQuota === false) {
  const quotaStatus = scholarshipType.quotaStatus;
  const availableQuota = scholarshipType.availableQuota || 0;
  
  if (quotaStatus === 'unlimited') {
    // 无限制名额,允许申请
  } else if (quotaStatus === 'available') {
    if (count > availableQuota) {
      ElMessage.error(`${scholarshipType.name} 申请人数(${count})超过全校可用名额(${availableQuota})`);
      return;
    }
  } else if (quotaStatus === 'full') {
    ElMessage.error(`${scholarshipType.name} 全校名额已满,无法申请`);
    return;
  }
}

2. 修复 isScholarshipTypeSelectable 函数

位置: 第895-933行

修复要点:

  • 直接使用 hasQuota 字段判断是否有班级名额分配
  • 使用 quotaStatus 字段判断名额状态
  • 移除对不存在的嵌套结构的依赖

3. 修复 isQuotaExceeded 和 getRemainingQuota 函数

位置: 第935-1010行

修复要点:

  • 统一使用扁平的数据结构
  • 正确处理 unlimited 状态的名额
  • 移除对 classQuota 和 schoolQuota 嵌套对象的引用

🎯 修复效果

  1. 前端阻止: 班级无名额的奖学金类型在提交前就被阻止
  2. 数据结构匹配: 前端验证逻辑与后端返回数据完全匹配
  3. 友好提示: 显示准确的错误信息和名额状态
  4. 避免后端错误: 不再触发后端的"班级可用名额不足"异常

🚨 部署说明

  • 影响范围: 前端Vue组件的3个核心验证函数
  • 需要重启: 前端开发服务器 (npm run dev)
  • 清除缓存: 建议强制刷新浏览器缓存

📊 测试验证

  • 有班级名额的奖学金类型:正常提交
  • 无班级名额的奖学金类型:前端阻止并显示友好错误
  • 名额不足的奖学金类型:显示具体名额不足信息
  • 无限制名额的奖学金类型:正常提交

📚 相关文档

  • API文档: docs/开发文档/API/奖学金申请管理API.md
  • 前端规范: .cursor/cursorrules-frontend.md
  • 数据结构: 后端 JcbtScholarshipApplicationServiceImpl.getScholarshipTypesWithQuota 方法

第一次修复时间: 2025-01-07 21:25:00
第二次修复时间: 2025-01-07 22:00:00
修复人员: Cursor AI Assistant
验证状态: 待用户测试验证
优先级: 高(影响核心业务功能)

修复总结: 通过深入分析后端实际数据结构,发现前端验证逻辑与后端返回数据不匹配的根本问题,进行了全面的数据结构适配修复。