feat(server-release): 出题批阅业务逻辑优化 — 移除20题限制、max_total支持、填空题格式校验、修正认证状态码

- exam_pkg/api.py: 移除总题数20道上限,改为50道警告;修正认证错误使用正确的UNAUTHORIZED/FORBIDDEN状态码;端点保持同步模式
- exam_pkg/generator.py: AI智能出题prompt支持max_total参数
- exam_pkg/grader.py: 填空题增加学生答案格式校验(列表类型+字符串元素)
This commit is contained in:
User
2026-07-03 12:03:46 +08:00
parent 4a262728b1
commit c709360c7c
3 changed files with 35 additions and 11 deletions

View File

@@ -219,6 +219,29 @@ def grade_fill_blank(answer: Dict) -> Dict:
student_answers = answer.get('student_answer', [])
max_score = answer.get('max_score', 4.0)
# 校验学生答案格式(必须是列表)
if not isinstance(student_answers, list):
logger.warning(f"填空题学生答案格式错误: 期望列表,实际为 {type(student_answers).__name__}: {student_answers}")
return {
"question_id": answer.get('question_id'),
"score": 0,
"max_score": max_score,
"grading_status": "failed",
"details": {"error": f"学生答案格式错误,期望列表,实际为 {type(student_answers).__name__}"}
}
# 校验学生答案列表中的每个元素必须是字符串
for i, ans in enumerate(student_answers):
if not isinstance(ans, str):
logger.warning(f"填空题学生答案第 {i+1} 项格式错误: 期望字符串,实际为 {type(ans).__name__}: {ans}")
return {
"question_id": answer.get('question_id'),
"score": 0,
"max_score": max_score,
"grading_status": "failed",
"details": {"error": f"填空题学生答案第 {i+1} 项格式错误,期望字符串,实际为 {type(ans).__name__}"}
}
# 归一化答案格式(修复 LLM 生成的扁平数组问题)
blank_count = question_content.get('data', {}).get('blank_count', 0)
correct_answers = _normalize_fill_blank_answer(correct_answers, blank_count)