6.1 KiB
6.1 KiB
代码调整记录 - 2025-01-07 - cursor
🔧 修复奖学金申请"班级可用名额不足"错误
📋 问题描述
- 错误现象: 班主任批量申请奖学金时出现"班级可用名额不足,无法提交申请"错误
- 错误位置: 后端 JcbtScholarshipApplicationServiceImpl.java 第206行
- 根本原因: 前后端对班级名额验证逻辑不一致
🔍 问题分析
- 前端验证: 只有当
classQuota.hasQuota = true时才进行名额检查 - 后端验证: 当
queryAvailableQuota返回null时直接报错 - 数据不一致: 班级没有分配名额时,前端显示但后端拒绝提交
✅ 解决方案
采用方案一:修复前端验证逻辑,在提交前严格检查班级名额情况
🔄 第一次修复 (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)
🎯 发现真正问题
通过深入分析后端代码发现:
- 数据结构不匹配: 前端期望嵌套结构,后端返回扁平结构
- 验证逻辑错误: 前端验证逻辑与后端实际数据结构不符
📊 后端实际返回的数据结构
// 后端 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嵌套对象的引用
🎯 修复效果
- 前端阻止: 班级无名额的奖学金类型在提交前就被阻止
- 数据结构匹配: 前端验证逻辑与后端返回数据完全匹配
- 友好提示: 显示准确的错误信息和名额状态
- 避免后端错误: 不再触发后端的"班级可用名额不足"异常
🚨 部署说明
- 影响范围: 前端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
验证状态: 待用户测试验证
优先级: 高(影响核心业务功能)
修复总结: 通过深入分析后端实际数据结构,发现前端验证逻辑与后端返回数据不匹配的根本问题,进行了全面的数据结构适配修复。