184 lines
5.5 KiB
Markdown
184 lines
5.5 KiB
Markdown
# 宿舍卫生检查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<XgDormHygieneStudentScoreBo> 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请求应该能够正常通过后端验证,成功保存宿舍卫生检查记录和学生评分数据。 |