成绩复盘与 PC 端上传优化:各科考试状态多选及树状统计。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-28 16:33:21 +08:00
parent acfe002fbf
commit ff4e0b1d37
14 changed files with 956 additions and 556 deletions
+24
View File
@@ -11,6 +11,16 @@ class ExamTypeEnum(str, Enum):
final = "final"
class ReviewStatusEnum(str, Enum):
careless = "careless"
unknown = "unknown"
nervous = "nervous"
normal = "normal"
REVIEW_STATUS_VALUES = {s.value for s in ReviewStatusEnum}
class WrongQuestionStatusEnum(str, Enum):
pending = "pending"
ocr_done = "ocr_done"
@@ -151,6 +161,7 @@ class ScoreInput(BaseModel):
subject_id: int
total_score: float
obtained_score: float
review_statuses: list[ReviewStatusEnum] = []
@field_validator("total_score")
@classmethod
@@ -169,6 +180,18 @@ class ScoreInput(BaseModel):
raise ValueError("得分不能为负")
return v
@field_validator("review_statuses")
@classmethod
def validate_review_statuses(cls, v: list[ReviewStatusEnum]) -> list[ReviewStatusEnum]:
seen: set[str] = set()
unique: list[ReviewStatusEnum] = []
for item in v:
key = item.value if isinstance(item, ReviewStatusEnum) else str(item)
if key not in seen:
seen.add(key)
unique.append(item if isinstance(item, ReviewStatusEnum) else ReviewStatusEnum(key))
return unique
class ScoreOut(BaseModel):
id: UUID
@@ -177,6 +200,7 @@ class ScoreOut(BaseModel):
total_score: float
obtained_score: float
ratio: float
review_statuses: list[ReviewStatusEnum] = []
model_config = {"from_attributes": True}