# -*- coding: utf-8 -*- from datetime import date, datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field class EmploymentBase(BaseModel): student_id: str = Field(..., max_length=20, description="学生ID") class_id: Optional[str] = Field(None, max_length=64, description="班级ID") education: Optional[str] = Field(None, max_length=20, description="学历:专科/本科/硕士/博士") code: str = Field(..., max_length=12, description="就业城市编码") job_title: str = Field(..., max_length=50, description="就业岗位名称") company_name: str = Field(..., max_length=128, description="就业公司名称") salary: Optional[float] = Field(None, description="就业月薪(元)") offer_date: date = Field(..., description="offer下发/签约时间") resume_open_date: Optional[date] = Field(None, description="简历开放时间") employment_int: int = Field(..., description="就业状态:1=已就业,2=升学,3=灵活就业") class EmploymentUpsert(EmploymentBase): pass class EmploymentUpdate(BaseModel): class_id: Optional[str] = Field(None, max_length=64, description="班级ID") education: Optional[str] = Field(None, max_length=20, description="学历") code: Optional[str] = Field(None, max_length=12, description="就业城市编码") job_title: Optional[str] = Field(None, max_length=50, description="就业岗位名称") company_name: Optional[str] = Field(None, max_length=128, description="就业公司名称") salary: Optional[float] = Field(None, description="就业月薪(元)") offer_date: Optional[date] = Field(None, description="offer下发/签约时间") resume_open_date: Optional[date] = Field(None, description="简历开放时间") employment_int: Optional[int] = Field(None, description="就业状态:1=已就业,2=升学,3=灵活就业") model_config = ConfigDict( json_schema_extra={ "example": { "class_id": "c01", "education": "本科", "code": "310115", "job_title": "AI开发工程师", "company_name": "上海拼多多", "salary": 25000, "offer_date": "2026-08-01", "resume_open_date": "2026-05-15", "employment_int": 1, } } ) class EmploymentOut(BaseModel): emp_id: str = Field(..., max_length=32, description="就业记录ID") student_id: str = Field(..., max_length=20, description="学生ID") class_id: Optional[str] = Field(None, max_length=64, description="班级ID") education: Optional[str] = Field(None, max_length=20, description="学历") code: str = Field(..., max_length=12, description="就业城市编码") job_title: str = Field(..., max_length=50, description="就业岗位名称") company_name: str = Field(..., max_length=128, description="就业公司名称") salary: Optional[float] = Field(None, description="就业月薪(元)") offer_date: date = Field(..., description="offer下发/签约时间") resume_open_date: Optional[date] = Field(None, description="简历开放时间") employment_int: int = Field(..., description="就业状态") is_deleted: int = Field(..., description="是否删除 0否1是") create_time: datetime = Field(..., description="创建时间") update_time: datetime = Field(..., description="更新时间") # ==================== 新增功能点 ==================== class ClassEmploymentStats(BaseModel): class_id: str = Field(..., description="班级ID") total_count: int = Field(..., description="班级总就业记录数") employed_count: int = Field(..., description="已就业") graduate_count: int = Field(..., description="升学") flexible_count: int = Field(..., description="灵活就业") employment_rate: float = Field(..., description="就业率(%)") avg_salary: Optional[float] = Field(None, description="平均薪资") max_salary: Optional[float] = Field(None, description="最高薪资") min_salary: Optional[float] = Field(None, description="最低薪资") job_title_distribution: dict = Field(..., description="各岗位人数分布") class SalaryMarketComparison(BaseModel): code: str = Field(..., description="城市编码") job_title: str = Field(..., description="岗位名称") sample_count: int = Field(..., description="行情样本数") avg_salary: Optional[float] = Field(None, description="行情平均薪资") max_salary: Optional[float] = Field(None, description="行情最高薪资") min_salary: Optional[float] = Field(None, description="行情最低薪资") current_student_id: str = Field(..., description="学生ID") current_salary: Optional[float] = Field(None, description="当前学生薪资") deviation_percent: Optional[float] = Field(None, description="偏差百分比") advice: str = Field(..., description="薪资建议")