"""技能差距分析 + 定制简历 Schema 请求参数 Param、响应 Dto、Redis 缓存模型。 字段命名使用 camelCase alias,与前端 JSON 对齐。 """ from pydantic import BaseModel, Field # ===== 请求参数 ===== class SkillGapParam(BaseModel): job_id: int = Field(..., alias="jobId") class CustomizeResumeParam(BaseModel): job_id: int = Field(..., alias="jobId") resume_id: int = Field(..., alias="resumeId") optimize_modules: list[str] = Field(..., alias="optimizeModules") add_skills: list[str] = Field(default_factory=list, alias="addSkills") class AiEditParam(BaseModel): job_id: int = Field(..., alias="jobId") instruction: str = Field(...) chat_history: list[dict] = Field(default_factory=list, alias="chatHistory") # ===== Redis 缓存子模型 ===== class _AliasModel(BaseModel): """带 alias 的基类,允许同时用 alias 和字段名赋值""" model_config = {"populate_by_name": True} class Paragraph(_AliasModel): id: str = Field(...) text: str = Field(default="") class ResumeProfile(_AliasModel): avatar_url: str = Field(default="", alias="avatarUrl") name: str = Field(default="") email: str = Field(default="") mobile_number: str = Field(default="", alias="mobileNumber") city: str = Field(default="") wechat_number: str = Field(default="", alias="wechatNumber") portfolio_url: str = Field(default="", alias="portfolioUrl") skills: list[str] = Field(default_factory=list) certificates: list[str] = Field(default_factory=list) summary: str = Field(default="") class Education(_AliasModel): id: str = Field(default="") school: str = Field(default="") major: str = Field(default="") degree: str = Field(default="") study_type: str = Field(default="", alias="studyType") start_date: str = Field(default="", alias="startDate") end_date: str = Field(default="", alias="endDate") description: list[Paragraph] = Field(default_factory=list) class Work(_AliasModel): id: str = Field(default="") company_name: str = Field(default="", alias="companyName") position: str = Field(default="") start_date: str = Field(default="", alias="startDate") end_date: str = Field(default="", alias="endDate") description: list[Paragraph] = Field(default_factory=list) class Internship(_AliasModel): id: str = Field(default="") company_name: str = Field(default="", alias="companyName") position: str = Field(default="") start_date: str = Field(default="", alias="startDate") end_date: str = Field(default="", alias="endDate") description: list[Paragraph] = Field(default_factory=list) class Project(_AliasModel): id: str = Field(default="") company_name: str = Field(default="", alias="companyName") project_name: str = Field(default="", alias="projectName") role: str = Field(default="") start_date: str = Field(default="", alias="startDate") end_date: str = Field(default="", alias="endDate") description: list[Paragraph] = Field(default_factory=list) class Competition(_AliasModel): id: str = Field(default="") competition_name: str = Field(default="", alias="competitionName") award: str = Field(default="") award_date: str = Field(default="", alias="awardDate") description: list[Paragraph] = Field(default_factory=list) class CustomizeResume(_AliasModel): """定制简历 Redis 缓存结构""" resume: ResumeProfile = Field(default_factory=ResumeProfile) education: list[Education] = Field(default_factory=list) work: list[Work] = Field(default_factory=list) internship: list[Internship] = Field(default_factory=list) project: list[Project] = Field(default_factory=list) competition: list[Competition] = Field(default_factory=list)