from __future__ import annotations from dataclasses import dataclass from datetime import date SUBJECTS = ["数学", "语文", "英语", "物理", "化学", "生物", "历史", "地理", "政治", "道法"] SUBJECT_ALIASES = { "数": "数学", "语": "语文", "英": "英语", "物": "物理", "化": "化学", "生": "生物", "史": "历史", "地": "地理", "政": "政治", } FALLBACK_ALIASES = { "施亿涵": "施忆涵", "施凯其": "施凯萁", "宇浩": "黄宇澔", "肖恒罄": "肖恒馨", } ACCOUNT_STATUSES = {"正常", "预警", "欠费", "结课", "退费"} WEEKDAYS = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] UNKNOWN_TEACHERS = {"", "待核对老师", "未知老师"} UNKNOWN_SUBJECTS = {"", "待核对科目", "未知科目"} HIGH_CONFIDENCE_VALUES = {"high", "高", "高置信", "true", "1", "yes"} AUTO_RECOGNITION_SOURCES = {"keyword", "rule", "model", "model_high_confidence", "大模型高置信识别", "关键词"} ROLE_WORDS = { "student": ("学生", "学员", "孩子", "同学"), "teacher": ("老师", "教师"), } @dataclass(frozen=True) class Payment: date: str hours: float @dataclass(frozen=True) class Account: student_id: str student: str payments: list[Payment] remaining: float account_status: str note: str @dataclass(frozen=True) class ClassRecord: date: str weekday: str time: str student: str duration: str duration_hours: float teacher: str subject: str @dataclass(frozen=True) class QuerySpec: raw_query: str start_date: date | None end_date: date | None students: list[str] teachers: list[str] subjects: list[str] class DuplicateRecordError(ValueError): pass