Files
test/app/schema/employment_schema.py
2026-09-21 19:03:31 +08:00

75 lines
2.9 KiB
Python

"""就业模块出入参(需求 2.3)。"""
from __future__ import annotations
from datetime import date
from pydantic import BaseModel, Field, model_validator
from app.schema.common import ORMBase, STRIP_VALIDATOR
class _EmploymentBase(BaseModel):
open_date: str | None = Field(None, description="就业开放时间 YYYY-MM-DD")
offer_date: str | None = Field(None, description="offer 下发时间 YYYY-MM-DD")
company: str | None = Field(None, max_length=80, description="就业公司名称")
salary: float | None = Field(None, ge=0, description="就业薪资(元/月)")
position: str | None = Field(None, max_length=50, description="岗位")
city: str | None = Field(None, max_length=30, description="就业城市")
remark: str | None = Field(None, description="备注")
_v_strip = STRIP_VALIDATOR
class EmploymentCreate(_EmploymentBase):
stu_id: int = Field(..., description="学生ID(一个学生只能有一条就业记录,重复登记=更新)")
@model_validator(mode="after")
def _at_least_one(self):
if not any([self.open_date, self.offer_date, self.company, self.salary]):
raise ValueError("就业开放时间 / offer 时间 / 公司 / 薪资 至少要填一项")
return self
class EmploymentUpdate(BaseModel):
open_date: str | None = None
offer_date: str | None = None
company: str | None = Field(None, max_length=80)
salary: float | None = Field(None, ge=0)
position: str | None = None
city: str | None = None
remark: str | None = None
_v_strip = STRIP_VALIDATOR
class EmploymentOut(ORMBase):
id: int
stu_id: int
stu_no: str | None = Field(None, description="学号(JOIN 学生表,不落库)")
student_name: str | None = Field(None, description="学生姓名(JOIN 学生表,不落库)")
class_id: int | None = Field(None, description="班级ID(冗余字段)")
class_name: str | None = Field(None, description="班级名称(冗余ID实时取名)")
open_date: date | None = None
offer_date: date | None = None
company: str | None = None
salary: float | None = None
salary_wan: float | None = Field(None, description="薪资(万元/月)")
position: str | None = None
city: str | None = None
duration_days: int | None = Field(None, description="就业时长(天)= offer 时间 - 开放时间")
remark: str | None = None
student_status: int | None = Field(None, description="学生当前状态(联动后的结果)")
student_status_text: str | None = None
class EmploymentRegisterResult(BaseModel):
employment: EmploymentOut
created: bool = Field(True, description="是新增还是更新已有记录")
status_changed: bool = Field(False, description="学生状态是否发生变化")
from_status_text: str | None = None
to_status_text: str | None = None
msg: str = Field("", description="给前端直接展示的一句话")