64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
"""成绩模块出入参(需求 2.2)。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from datetime import date
|
||
from decimal import Decimal
|
||
|
||
from pydantic import BaseModel, Field, field_validator
|
||
|
||
from app.schema.common import ORMBase, STRIP_VALIDATOR
|
||
|
||
|
||
class ScoreCreate(BaseModel):
|
||
stu_id: int = Field(..., description="学生ID")
|
||
exam_seq: int = Field(..., ge=1, le=99, description="考核序次,如 1=第一次考核")
|
||
score: Decimal = Field(..., ge=0, le=1000, description="成绩")
|
||
exam_name: str | None = Field(None, max_length=50, description="考核名称")
|
||
exam_date: str | None = Field(None, description="考核日期 YYYY-MM-DD")
|
||
remark: str | None = Field(None, max_length=255, description="备注")
|
||
|
||
_v_strip = STRIP_VALIDATOR
|
||
|
||
|
||
class ScoreBatchCreate(BaseModel):
|
||
"""一个学生一次性录入多次考核成绩。"""
|
||
|
||
stu_id: int = Field(..., description="学生ID")
|
||
scores: list[ScoreCreate] = Field(..., min_length=1, description="成绩列表")
|
||
|
||
@field_validator("scores")
|
||
@classmethod
|
||
def _same_student(cls, v, info): # noqa: ANN001, ANN201
|
||
return v
|
||
|
||
|
||
class ScoreUpdate(BaseModel):
|
||
score: Decimal | None = Field(None, ge=0, le=1000, description="新成绩")
|
||
exam_name: str | None = None
|
||
exam_date: str | None = None
|
||
remark: str | None = None
|
||
|
||
|
||
class ScoreOut(ORMBase):
|
||
id: int
|
||
stu_id: int
|
||
student_name: str | None = Field(None, description="学生姓名(JOIN)")
|
||
class_name: str | None = Field(None, description="班级名称(JOIN)")
|
||
exam_seq: int
|
||
exam_name: str | None = None
|
||
exam_date: date | None = None
|
||
score: float
|
||
flag: int
|
||
is_warning: bool = Field(False, description="是否低于红线")
|
||
remark: str | None = None
|
||
|
||
|
||
class ScoreRecordResult(BaseModel):
|
||
"""录入结果:把红线预警顺手带回去,前端可以直接弹提示。"""
|
||
|
||
record: ScoreOut
|
||
warning: bool = Field(False, description="是否触发红线预警")
|
||
warning_msg: str | None = Field(None, description="预警文案")
|
||
avg_score: float | None = Field(None, description="录入后该生平均分")
|