5.5 KiB
5.5 KiB
宿舍卫生检查API字段名修复报告
问题描述
错误信息
{"code":500,"msg":"学生评分数据不能为空","data":null}
问题分析
前端发送的API请求中,学生评分数据字段名为 studentData,但后端BO类 XgDormHygieneCheckCompleteBo 中期望的字段名为 studentScores,导致后端验证失败。
修复方案
1. 前端类型定义修复
文件: web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts
修改内容:
// 修复前
export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm {
studentData?: DormHygieneStudentScoreForm[];
}
// 修复后
export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm {
studentScores?: DormHygieneStudentScoreForm[];
}
2. 前端数据处理逻辑修复
文件: web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue
修改内容:
// 修复前
const studentData = roomStudents.value.map((student: any) => ({
studentId: student.studentId,
// ... 其他字段
}));
const submitData: DormHygieneCheckCompleteForm = {
...form,
studentData: studentData
};
// 修复后
const studentScores = roomStudents.value.map((student: any) => ({
studentId: Number(student.studentId), // 确保是数字类型
studentName: student.studentName,
studentNo: student.studentNo,
className: student.className,
majorName: student.majorName,
collegeName: student.collegeName,
bedId: student.bedId ? Number(student.bedId) : undefined,
bedCode: student.bedName,
studentScore: student.student_score ? Number(student.student_score) : undefined,
attendanceStatus: student.attendance_status,
studentGrade: student.student_grade,
isResponsiblePerson: student.isResponsiblePerson ? Number(student.isResponsiblePerson) : 0,
scoreRemarks: student.scoreRemarks || '',
improvementNotes: student.improvementNotes || ''
}));
const submitData: DormHygieneCheckCompleteForm = {
...form,
studentScores: studentScores
};
修复要点
1. 字段名统一
- 前端发送:
studentData→ 修复后:studentScores - 后端期望:
studentScores✅
2. 数据类型转换
- studentId: 确保为数字类型 (
Number()) - studentScore: 确保为数字类型 (
Number()) - isResponsiblePerson: 确保为数字类型 (
Number()) - bedId: 可选字段,有值时转换为数字类型
3. 后端验证规则
@Valid
@NotEmpty(message = "学生评分数据不能为空", groups = { AddGroup.class, EditGroup.class })
private List<XgDormHygieneStudentScoreBo> studentScores;
测试验证
1. 修复后的请求格式
{
"checkTitle": "20250816宿舍卫生检查",
"checkDate": "2025-08-16 13:31:58",
"checkerId": 1,
"checkerName": "疯狂的狮子1Li",
"checkType": "1",
"checkLevel": "1",
"roomId": "1947682802646568962",
"roomCode": "1101寝室",
"roomName": "1101寝室",
"buildingId": "1947658035881234434",
"buildingName": "1号楼",
"areaId": "1947656427264987137",
"areaName": "女生宿舍区",
"campusId": "1946815553291304962",
"campusName": "西溪校区",
"totalScore": "95",
"hygieneGrade": "A",
"attachmentIds": "1956710620841684994,1956710620841684995,1956710620841684996",
"checkSummary": "123",
"improvementSuggestions": "123",
"checkRemarks": "123123123",
"studentScores": [ // ✅ 修复:使用正确的字段名
{
"studentId": 1949111889824882689, // ✅ 修复:数字类型
"studentName": "张新",
"studentNo": "2025ZY24113",
"className": "中药241",
"majorName": "中药",
"collegeName": "人文学院",
"bedCode": "2上",
"studentScore": 95.0, // ✅ 修复:数字类型
"attendanceStatus": "1",
"studentGrade": "A",
"isResponsiblePerson": 0, // ✅ 修复:数字类型
"scoreRemarks": "",
"improvementNotes": ""
}
]
}
2. 测试脚本
文件: test/宿舍卫生检查API修复测试.py
包含完整的测试数据和验证逻辑,可用于验证修复效果。
影响范围
1. 修改的文件
- ✅
web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts - ✅
web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue
2. 新增的文件
- ✅
test/宿舍卫生检查API修复测试.py - ✅
docs/开发文档/宿舍卫生检查API字段名修复报告.md
3. 不受影响的功能
- 后端API接口逻辑保持不变
- 数据库表结构保持不变
- 其他相关功能不受影响
验证步骤
1. 前端验证
- 打开宿舍卫生检查新增/编辑页面
- 选择房间,加载学生信息
- 填写检查信息和学生评分
- 提交表单,检查网络请求
2. 后端验证
- 检查请求参数中的字段名是否为
studentScores - 检查学生评分数据的类型是否正确
- 验证后端验证是否通过
3. 数据库验证
- 检查主表数据是否正确插入
- 检查学生评分表数据是否正确插入
- 验证关联关系是否正确
总结
通过修复前端字段名和数据类型,解决了"学生评分数据不能为空"的错误。主要修复点:
- 字段名统一:
studentData→studentScores - 数据类型转换: 确保数字字段为正确的类型
- 类型定义更新: 前端类型定义与后端BO类保持一致
修复后,API请求应该能够正常通过后端验证,成功保存宿舍卫生检查记录和学生评分数据。