Files
stu/schema/employment_schema.py
2026-09-22 17:01:14 +08:00

95 lines
4.9 KiB
Python

# -*- 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="薪资建议")