Files
LoveACE-EndF/provider/aufe/jwc/model.py

297 lines
9.7 KiB
Python
Raw Normal View History

2025-08-03 16:50:56 +08:00
from typing import Dict, List, Optional, Any
from pydantic import BaseModel, Field
class AcademicDataItem(BaseModel):
"""学术信息数据项用于直接反序列化JSON数组中的元素"""
completed_courses: int = Field(0, alias="courseNum")
failed_courses: int = Field(0, alias="coursePas")
gpa: float = Field(0, alias="gpa")
current_term: str = Field("", alias="zxjxjhh")
pending_courses: int = Field(0, alias="courseNum_bxqyxd")
class AcademicInfo(BaseModel):
"""学术信息数据模型 - 兼容旧版API"""
completed_courses: int = Field(0, alias="count")
failed_courses: int = Field(0, alias="countNotPass")
gpa: float = Field(0, alias="gpa")
# ==================== 学期和成绩相关模型 ====================
class TermInfo(BaseModel):
"""学期信息模型"""
term_id: str = Field("", description="学期ID2024-2025-2-1")
term_name: str = Field("", description="学期名称2024-2025春季学期")
class ScoreRecord(BaseModel):
"""成绩记录模型"""
sequence: int = Field(0, description="序号")
term_id: str = Field("", description="学期ID")
course_code: str = Field("", description="课程代码")
course_class: str = Field("", description="课程班级")
course_name_cn: str = Field("", description="课程名称(中文)")
course_name_en: str = Field("", description="课程名称(英文)")
credits: str = Field("", description="学分")
hours: int = Field(0, description="学时")
course_type: str = Field("", description="课程性质")
exam_type: str = Field("", description="考试性质")
score: str = Field("", description="成绩")
retake_score: Optional[str] = Field(None, description="重修成绩")
makeup_score: Optional[str] = Field(None, description="补考成绩")
class TermScoreResponse(BaseModel):
"""学期成绩响应模型"""
page_size: int = Field(50, description="每页大小")
page_num: int = Field(1, description="页码")
total_count: int = Field(0, description="总记录数")
records: List[ScoreRecord] = Field(default_factory=list, description="成绩记录列表")
# ==================== 原有模型继续 ====================
class TrainingPlanDataItem(BaseModel):
"""培养方案数据项"""
plan_name: str = "" # 第一项为培养方案名称
plan_id: str = "" # 第二项为培养方案ID
class TrainingPlanResponseWrapper(BaseModel):
"""培养方案响应模型"""
count: int = 0
data: List[List[str]] = []
class TrainingPlanInfo(BaseModel):
"""培养方案信息模型 - 兼容旧版API"""
plan_name: str = Field("", alias="pyfa")
current_term: str = Field("", alias="term")
pending_courses: int = Field(0, alias="courseCount")
major_name: str = Field("", alias="major")
grade: str = Field("", alias="grade")
class CourseSelectionStatusDirectResponse(BaseModel):
"""选课状态响应模型新格式"""
term_name: str = Field("", alias="zxjxjhm")
status_code: str = Field("", alias="retString")
class CourseSelectionStatus(BaseModel):
"""选课状态信息"""
can_select: bool = Field(False, alias="isCanSelect")
start_time: str = Field("", alias="startTime")
end_time: str = Field("", alias="endTime")
class CourseId(BaseModel):
"""课程ID信息"""
evaluated_people: str = Field("", alias="evaluatedPeople")
coure_sequence_number: str = Field("", alias="coureSequenceNumber")
evaluation_content_number: str = Field("", alias="evaluationContentNumber")
class Questionnaire(BaseModel):
"""问卷信息"""
questionnaire_number: str = Field("", alias="questionnaireNumber")
questionnaire_name: str = Field("", alias="questionnaireName")
class Course(BaseModel):
"""课程基本信息"""
id: Optional[CourseId] = None
questionnaire: Optional[Questionnaire] = Field(None, alias="questionnaire")
evaluated_people: str = Field("", alias="evaluatedPeople")
is_evaluated: str = Field("", alias="isEvaluated")
evaluation_content: str = Field("", alias="evaluationContent")
class CourseListResponse(BaseModel):
"""课程列表响应"""
not_finished_num: int = Field(0, alias="notFinishedNum")
evaluation_num: int = Field(0, alias="evaluationNum")
data: List[Course] = Field(default_factory=list, alias="data")
msg: str = Field("", alias="msg")
result: str = "success" # 设置默认值
class EvaluationResponse(BaseModel):
"""评价提交响应"""
result: str = ""
msg: str = ""
data: Any = None
class EvaluationRequestParam(BaseModel):
"""评价请求参数"""
opt_type: str = "submit"
token_value: str = ""
questionnaire_code: str = ""
evaluation_content: str = ""
evaluated_people_number: str = ""
count: str = ""
zgpj: str = ""
rating_items: Dict[str, str] = {}
def to_form_data(self) -> Dict[str, str]:
"""将对象转换为表单数据映射"""
form_data = {
"optType": self.opt_type,
"tokenValue": self.token_value,
"questionnaireCode": self.questionnaire_code,
"evaluationContent": self.evaluation_content,
"evaluatedPeopleNumber": self.evaluated_people_number,
"count": self.count,
"zgpj": self.zgpj,
}
# 添加评分项
form_data.update(self.rating_items)
return form_data
class ExamScheduleItem(BaseModel):
"""考试安排项目 - 校统考格式"""
title: str = "" # 考试标题,包含课程名、时间、地点等信息
start: str = "" # 考试日期 (YYYY-MM-DD)
color: str = "" # 显示颜色
class OtherExamRecord(BaseModel):
"""其他考试记录"""
term_code: str = Field("", alias="ZXJXJHH") # 学期代码
term_name: str = Field("", alias="ZXJXJHM") # 学期名称
exam_name: str = Field("", alias="KSMC") # 考试名称
course_code: str = Field("", alias="KCH") # 课程代码
course_name: str = Field("", alias="KCM") # 课程名称
class_number: str = Field("", alias="KXH") # 课序号
student_id: str = Field("", alias="XH") # 学号
student_name: str = Field("", alias="XM") # 姓名
exam_location: str = Field("", alias="KSDD") # 考试地点
exam_date: str = Field("", alias="KSRQ") # 考试日期
exam_time: str = Field("", alias="KSSJ") # 考试时间
note: str = Field("", alias="BZ") # 备注
row_number: str = Field("", alias="RN") # 行号
class OtherExamResponse(BaseModel):
"""其他考试查询响应"""
page_size: int = Field(0, alias="pageSize")
page_num: int = Field(0, alias="pageNum")
page_context: Dict[str, int] = Field(default_factory=dict, alias="pageContext")
records: List[OtherExamRecord] = Field(default_factory=list, alias="records")
class UnifiedExamInfo(BaseModel):
"""统一考试信息模型 - 对外提供的统一格式"""
course_name: str = "" # 课程名称
exam_date: str = "" # 考试日期 (YYYY-MM-DD)
exam_time: str = "" # 考试时间
exam_location: str = "" # 考试地点
exam_type: str = "" # 考试类型 (校统考/其他考试)
note: str = "" # 备注信息
class ExamInfoResponse(BaseModel):
"""考试信息统一响应模型"""
exams: List[UnifiedExamInfo] = Field(default_factory=list)
total_count: int = 0
# ==================== 错误响应模型 ====================
class ErrorAcademicInfo(AcademicInfo):
"""错误的学术信息数据模型"""
completed_courses: int = Field(-1, alias="count")
failed_courses: int = Field(-1, alias="countNotPass")
gpa: float = Field(-1.0, alias="gpa")
class ErrorTrainingPlanInfo(TrainingPlanInfo):
"""错误的培养方案信息模型"""
plan_name: str = Field("请求失败,请稍后重试", alias="pyfa")
current_term: str = Field("", alias="term")
pending_courses: int = Field(-1, alias="courseCount")
major_name: str = Field("请求失败", alias="major")
grade: str = Field("", alias="grade")
class ErrorCourseSelectionStatus(CourseSelectionStatus):
"""错误的选课状态信息"""
can_select: bool = Field(False, alias="isCanSelect")
start_time: str = Field("请求失败", alias="startTime")
end_time: str = Field("请求失败", alias="endTime")
class ErrorCourse(Course):
"""错误的课程基本信息"""
id: Optional[CourseId] = None
questionnaire: Optional[Questionnaire] = None
evaluated_people: str = Field("请求失败", alias="evaluatedPeople")
is_evaluated: str = Field("", alias="isEvaluated")
evaluation_content: str = Field("请求失败,请稍后重试", alias="evaluationContent")
class ErrorCourseListResponse(CourseListResponse):
"""错误的课程列表响应"""
not_finished_num: int = Field(-1, alias="notFinishedNum")
evaluation_num: int = Field(-1, alias="evaluationNum")
data: List[Course] = Field(default_factory=list, alias="data")
msg: str = Field("网络请求失败,已进行多次重试", alias="msg")
result: str = "failed"
class ErrorEvaluationResponse(EvaluationResponse):
"""错误的评价提交响应"""
result: str = "failed"
msg: str = "网络请求失败,已进行多次重试"
data: Any = None
class ErrorExamInfoResponse(ExamInfoResponse):
"""错误的考试信息响应模型"""
exams: List[UnifiedExamInfo] = Field(default_factory=list)
total_count: int = -1
class ErrorTermScoreResponse(BaseModel):
"""错误的学期成绩响应模型"""
page_size: int = Field(-1, description="每页大小")
page_num: int = Field(-1, description="页码")
total_count: int = Field(-1, description="总记录数")
records: List[ScoreRecord] = Field(default_factory=list, description="成绩记录列表")