# 宿舍卫生检查API字段名修复报告 ## 问题描述 ### 错误信息 ``` {"code":500,"msg":"学生评分数据不能为空","data":null} ``` ### 问题分析 前端发送的API请求中,学生评分数据字段名为 `studentData`,但后端BO类 `XgDormHygieneCheckCompleteBo` 中期望的字段名为 `studentScores`,导致后端验证失败。 ## 修复方案 ### 1. 前端类型定义修复 **文件:** `web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts` **修改内容:** ```typescript // 修复前 export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm { studentData?: DormHygieneStudentScoreForm[]; } // 修复后 export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm { studentScores?: DormHygieneStudentScoreForm[]; } ``` ### 2. 前端数据处理逻辑修复 **文件:** `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue` **修改内容:** ```typescript // 修复前 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. 后端验证规则 ```java @Valid @NotEmpty(message = "学生评分数据不能为空", groups = { AddGroup.class, EditGroup.class }) private List studentScores; ``` ## 测试验证 ### 1. 修复后的请求格式 ```json { "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. 前端验证 1. 打开宿舍卫生检查新增/编辑页面 2. 选择房间,加载学生信息 3. 填写检查信息和学生评分 4. 提交表单,检查网络请求 ### 2. 后端验证 1. 检查请求参数中的字段名是否为 `studentScores` 2. 检查学生评分数据的类型是否正确 3. 验证后端验证是否通过 ### 3. 数据库验证 1. 检查主表数据是否正确插入 2. 检查学生评分表数据是否正确插入 3. 验证关联关系是否正确 ## 总结 通过修复前端字段名和数据类型,解决了"学生评分数据不能为空"的错误。主要修复点: 1. **字段名统一:** `studentData` → `studentScores` 2. **数据类型转换:** 确保数字字段为正确的类型 3. **类型定义更新:** 前端类型定义与后端BO类保持一致 修复后,API请求应该能够正常通过后端验证,成功保存宿舍卫生检查记录和学生评分数据。