221 lines
6.2 KiB
Markdown
221 lines
6.2 KiB
Markdown
|
|
# 多选题判断修复说明
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
在成绩管理的详情页面中,多选题判断出现错误:学生实际选择正确,但系统判断为错误。
|
|||
|
|
|
|||
|
|
## 问题原因
|
|||
|
|
|
|||
|
|
多选题答案存在两种格式:
|
|||
|
|
|
|||
|
|
1. **选项标签格式**:`A,B,C`
|
|||
|
|
2. **选项内容格式**:`选项内容1,选项内容2,选项内容3`
|
|||
|
|
|
|||
|
|
原有的比对逻辑无法处理这两种格式混用的情况,导致:
|
|||
|
|
- 如果学生答案是"内容格式",正确答案是"标签格式",比对失败
|
|||
|
|
- 或者反过来,也会比对失败
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 1. 后端代码优化
|
|||
|
|
|
|||
|
|
在 `StudyScoreController.java` 中重写了 `compareMultipleAnswers` 方法,实现了智能比对功能:
|
|||
|
|
|
|||
|
|
**新功能:**
|
|||
|
|
- ✅ 支持两种答案格式的自动识别
|
|||
|
|
- ✅ 当格式不一致时,自动转换后再比对
|
|||
|
|
- ✅ 通过题目的选项列表进行标签和内容的映射转换
|
|||
|
|
- ✅ 忽略大小写差异
|
|||
|
|
- ✅ 支持 JSON 数组和逗号分隔两种选项存储格式
|
|||
|
|
|
|||
|
|
**核心逻辑:**
|
|||
|
|
```java
|
|||
|
|
private boolean compareMultipleAnswers(String studentAnswer, String correctAnswer, String optionsJson)
|
|||
|
|
{
|
|||
|
|
// 1. 先尝试直接比对(忽略大小写)
|
|||
|
|
// 2. 如果失败,判断答案格式是否一致
|
|||
|
|
// 3. 如果一个是标签格式,一个是内容格式,进行转换
|
|||
|
|
// 4. 转换后再次比对
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 自动重新计算
|
|||
|
|
|
|||
|
|
**成绩详情查询时:**
|
|||
|
|
- 系统会使用新的判断逻辑重新计算所有题目的对错和得分
|
|||
|
|
- 不会修改数据库中的历史记录
|
|||
|
|
- 确保显示的结果是准确的
|
|||
|
|
|
|||
|
|
**修改位置:**
|
|||
|
|
- `getInfo` 方法(第178行):查看成绩详情时重新计算
|
|||
|
|
|
|||
|
|
### 3. 答案格式说明
|
|||
|
|
|
|||
|
|
**推荐的答案存储格式:**
|
|||
|
|
|
|||
|
|
为了避免混淆,建议统一使用以下格式之一:
|
|||
|
|
|
|||
|
|
**方案一:统一使用标签格式(推荐)**
|
|||
|
|
- 学生答案:`A,B,C`
|
|||
|
|
- 正确答案:`A,B,C`
|
|||
|
|
- 优点:简洁、不受选项内容变化影响
|
|||
|
|
|
|||
|
|
**方案二:统一使用内容格式**
|
|||
|
|
- 学生答案:`北京,上海,广州`
|
|||
|
|
- 正确答案:`北京,上海,广州`
|
|||
|
|
- 优点:直观、易理解
|
|||
|
|
|
|||
|
|
**当前系统:** 已支持两种格式混用,会自动转换比对
|
|||
|
|
|
|||
|
|
## 使用步骤
|
|||
|
|
|
|||
|
|
### 1. 重启后端服务
|
|||
|
|
|
|||
|
|
修改了后端代码后,需要重启后端服务:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 停止服务
|
|||
|
|
# 重新编译并启动
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 验证修复效果
|
|||
|
|
|
|||
|
|
1. 打开管理端 → 成绩管理
|
|||
|
|
2. 点击任意成绩的"查看详情"
|
|||
|
|
3. 查看多选题的判断结果是否正确
|
|||
|
|
4. 系统会自动使用新逻辑重新计算
|
|||
|
|
|
|||
|
|
### 3. 诊断工具(可选)
|
|||
|
|
|
|||
|
|
如果需要深入分析问题,可以执行诊断 SQL:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 执行以下SQL文件
|
|||
|
|
E:\ry_study\Study-Vue-redis\database_recheck_multiple_questions.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
该 SQL 脚本可以:
|
|||
|
|
- 查看所有多选题的答案格式
|
|||
|
|
- 统计判断错误的数量
|
|||
|
|
- 分析格式差异
|
|||
|
|
- 查看具体的答题记录
|
|||
|
|
|
|||
|
|
### 4. 数据修复(如需要)
|
|||
|
|
|
|||
|
|
**方法一:自动重新计算(推荐)**
|
|||
|
|
- 管理员查看成绩详情时,系统自动使用新逻辑显示正确结果
|
|||
|
|
- 不需要修改数据库
|
|||
|
|
|
|||
|
|
**方法二:重新提交(彻底修复)**
|
|||
|
|
- 让学生重新提交答案
|
|||
|
|
- 新提交的答案会使用新逻辑评分
|
|||
|
|
- 数据库中的记录也会更新
|
|||
|
|
|
|||
|
|
## 技术细节
|
|||
|
|
|
|||
|
|
### 答案格式识别
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 判断是否为标签格式(A,B,C)
|
|||
|
|
private boolean isLabelFormat(Set<String> answerSet) {
|
|||
|
|
return answerSet.stream()
|
|||
|
|
.allMatch(s -> s.length() == 1 &&
|
|||
|
|
s.toUpperCase().charAt(0) >= 'A' &&
|
|||
|
|
s.toUpperCase().charAt(0) <= 'Z');
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 格式转换
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 将标签格式(A,B,C)转换为内容格式
|
|||
|
|
private Set<String> convertLabelsToContent(Set<String> labels, List<String> options) {
|
|||
|
|
Set<String> contents = new HashSet<>();
|
|||
|
|
for (String label : labels) {
|
|||
|
|
char c = label.toUpperCase().charAt(0);
|
|||
|
|
int index = c - 'A';
|
|||
|
|
if (index >= 0 && index < options.size()) {
|
|||
|
|
contents.add(options.get(index));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return contents;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 选项解析
|
|||
|
|
|
|||
|
|
支持两种选项存储格式:
|
|||
|
|
1. **JSON 数组**:`["选项1","选项2","选项3"]`
|
|||
|
|
2. **逗号分隔**:`选项1,选项2,选项3`
|
|||
|
|
|
|||
|
|
## 测试建议
|
|||
|
|
|
|||
|
|
### 测试场景
|
|||
|
|
|
|||
|
|
1. **格式一致 - 都是标签格式**
|
|||
|
|
- 学生答案:`A,B,C`
|
|||
|
|
- 正确答案:`A,B,C`
|
|||
|
|
- 预期:✅ 判断正确
|
|||
|
|
|
|||
|
|
2. **格式一致 - 都是内容格式**
|
|||
|
|
- 学生答案:`北京,上海,广州`
|
|||
|
|
- 正确答案:`北京,上海,广州`
|
|||
|
|
- 预期:✅ 判断正确
|
|||
|
|
|
|||
|
|
3. **格式不一致 - 学生用标签,正确答案用内容**
|
|||
|
|
- 学生答案:`A,B,C`
|
|||
|
|
- 正确答案:`北京,上海,广州`
|
|||
|
|
- 选项列表:`["北京","上海","广州","深圳"]`
|
|||
|
|
- 预期:✅ 自动转换后判断正确
|
|||
|
|
|
|||
|
|
4. **格式不一致 - 学生用内容,正确答案用标签**
|
|||
|
|
- 学生答案:`北京,上海,广州`
|
|||
|
|
- 正确答案:`A,B,C`
|
|||
|
|
- 选项列表:`["北京","上海","广州","深圳"]`
|
|||
|
|
- 预期:✅ 自动转换后判断正确
|
|||
|
|
|
|||
|
|
5. **选项顺序不同**
|
|||
|
|
- 学生答案:`C,A,B`
|
|||
|
|
- 正确答案:`A,B,C`
|
|||
|
|
- 预期:✅ 顺序无关,判断正确
|
|||
|
|
|
|||
|
|
6. **大小写不同**
|
|||
|
|
- 学生答案:`a,b,c`
|
|||
|
|
- 正确答案:`A,B,C`
|
|||
|
|
- 预期:✅ 忽略大小写,判断正确
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **选项顺序**:系统会自动处理选项顺序问题,`A,B,C` 和 `C,A,B` 被视为相同答案
|
|||
|
|
|
|||
|
|
2. **大小写**:系统会忽略大小写差异
|
|||
|
|
|
|||
|
|
3. **空格**:答案中的前后空格会被自动去除
|
|||
|
|
|
|||
|
|
4. **分隔符**:统一使用逗号(`,`)作为分隔符,不支持分号、顿号等
|
|||
|
|
|
|||
|
|
5. **历史数据**:查看成绩详情时会自动重新计算,但不会修改数据库中的原始记录
|
|||
|
|
|
|||
|
|
## 后续优化建议
|
|||
|
|
|
|||
|
|
1. **统一答案格式**:建议修改前端,统一使用标签格式(A,B,C)提交答案
|
|||
|
|
|
|||
|
|
2. **数据迁移**:如果需要,可以编写脚本将所有历史答案统一为一种格式
|
|||
|
|
|
|||
|
|
3. **答案验证**:在题目创建时,验证正确答案格式的一致性
|
|||
|
|
|
|||
|
|
## 更新日志
|
|||
|
|
|
|||
|
|
- **2025-11-26**:修复多选题判断逻辑,支持标签和内容格式的自动转换
|
|||
|
|
- **2025-11-26**:优化成绩详情查询,自动重新计算得分
|
|||
|
|
- **2025-11-26**:添加诊断 SQL 脚本
|
|||
|
|
|
|||
|
|
## 技术支持
|
|||
|
|
|
|||
|
|
如有问题,请查看:
|
|||
|
|
- 后端日志:检查是否有答案格式相关的警告
|
|||
|
|
- 数据库数据:使用诊断 SQL 查看实际的答案格式
|
|||
|
|
- 前端控制台:查看提交的答案格式
|
|||
|
|
|
|||
|
|
|