148 lines
3.9 KiB
Markdown
148 lines
3.9 KiB
Markdown
# 宿舍卫生检查编辑时学生评分ID修复报告
|
||
|
||
## 问题描述
|
||
|
||
### 错误现象
|
||
在宿舍卫生检查编辑模式下,提交表单时 `studentScores` 数据中缺少学生评分记录的 `id` 字段,导致后端无法正确识别和更新现有的学生评分记录。
|
||
|
||
### 问题分析
|
||
1. **数据获取阶段**:从历史数据获取学生评分信息时,没有保存学生评分记录的 `id` 字段
|
||
2. **数据提交阶段**:构建提交数据时,没有包含学生评分记录的 `id` 字段
|
||
3. **类型不匹配**:存在 `form.totalScore !== ''` 的类型比较错误
|
||
|
||
## 修复方案
|
||
|
||
### 1. 修复数据获取逻辑
|
||
|
||
**文件:** `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue`
|
||
|
||
**修改内容:**
|
||
```typescript
|
||
// 修复前
|
||
roomStudents.value = studentScoresRes.data.map((studentScore: any) => ({
|
||
studentId: studentScore.studentId,
|
||
// ... 其他字段
|
||
}));
|
||
|
||
// 修复后
|
||
roomStudents.value = studentScoresRes.data.map((studentScore: any) => ({
|
||
// 保存学生评分记录的ID,用于编辑时提交
|
||
id: studentScore.id,
|
||
studentId: studentScore.studentId,
|
||
// ... 其他字段
|
||
}));
|
||
```
|
||
|
||
### 2. 修复数据提交逻辑
|
||
|
||
**修改内容:**
|
||
```typescript
|
||
// 修复前
|
||
const studentScores = roomStudents.value.map((student: any) => ({
|
||
studentId: Number(student.studentId),
|
||
// ... 其他字段
|
||
}));
|
||
|
||
// 修复后
|
||
const studentScores = roomStudents.value.map((student: any) => {
|
||
const studentScore: any = {
|
||
studentId: Number(student.studentId),
|
||
// ... 其他字段
|
||
};
|
||
|
||
// 编辑时包含学生评分记录的ID,新增时不包含
|
||
if (form.id && student.id) {
|
||
studentScore.id = student.id;
|
||
}
|
||
|
||
return studentScore;
|
||
});
|
||
```
|
||
|
||
### 3. 修复类型比较错误
|
||
|
||
**修改内容:**
|
||
```typescript
|
||
// 修复前
|
||
if (
|
||
form.totalScore !== null &&
|
||
form.totalScore !== undefined &&
|
||
form.totalScore !== '' && // ❌ 类型不匹配:number !== string
|
||
form.totalScore !== 0 &&
|
||
String(form.totalScore) !== '0'
|
||
) {
|
||
|
||
// 修复后
|
||
if (
|
||
form.totalScore !== null &&
|
||
form.totalScore !== undefined &&
|
||
form.totalScore !== 0 &&
|
||
String(form.totalScore) !== '0'
|
||
) {
|
||
```
|
||
|
||
### 4. 添加调试日志
|
||
|
||
**新增内容:**
|
||
```typescript
|
||
// 调试日志:输出提交的数据结构
|
||
console.log('提交的完整数据:', submitData);
|
||
console.log('学生评分数据:', studentScores);
|
||
console.log('是否为编辑模式:', !!form.id);
|
||
```
|
||
|
||
## 修复要点
|
||
|
||
### 1. 数据完整性
|
||
- **编辑模式**:包含学生评分记录的 `id` 字段
|
||
- **新增模式**:不包含 `id` 字段(为 `undefined`)
|
||
|
||
### 2. 类型安全
|
||
- 移除不必要的字符串比较
|
||
- 确保数字类型字段的正确处理
|
||
|
||
### 3. 调试支持
|
||
- 添加详细的调试日志
|
||
- 便于问题排查和数据验证
|
||
|
||
## 后端处理逻辑
|
||
|
||
### 当前实现
|
||
后端采用"删除后重新插入"的策略:
|
||
1. 逻辑删除原有学生评分记录
|
||
2. 插入新的学生评分记录
|
||
|
||
### 优势
|
||
- 简化了数据一致性处理
|
||
- 避免了复杂的更新逻辑
|
||
- 确保数据的完整性
|
||
|
||
### 注意事项
|
||
- 即使前端传递了学生评分记录的ID,后端也不会使用它来更新现有记录
|
||
- 但传递ID有助于数据追踪和调试
|
||
|
||
## 测试验证
|
||
|
||
### 1. 编辑模式测试
|
||
- ✅ 正确获取历史学生评分数据
|
||
- ✅ 包含学生评分记录的ID
|
||
- ✅ 提交数据格式正确
|
||
|
||
### 2. 新增模式测试
|
||
- ✅ 不包含学生评分记录的ID
|
||
- ✅ 数据格式符合新增要求
|
||
|
||
### 3. 类型安全测试
|
||
- ✅ 移除类型不匹配的比较
|
||
- ✅ 确保数字字段的正确处理
|
||
|
||
## 总结
|
||
|
||
通过本次修复,解决了宿舍卫生检查编辑时学生评分ID缺失的问题,确保了:
|
||
|
||
1. **数据完整性**:编辑时正确传递学生评分记录的ID
|
||
2. **类型安全**:修复了类型比较错误
|
||
3. **调试支持**:添加了详细的调试日志
|
||
4. **向后兼容**:新增模式不受影响
|
||
|
||
修复后的代码能够正确处理编辑和新增两种模式,确保数据的准确性和一致性。 |