from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field class DepartmentCreateSchema(BaseModel): """创建部门请求""" name: str = Field(max_length=128, description="部门名称") code: Optional[str] = Field(default=None, max_length=64, description="部门编码") parent_id: Optional[str] = Field(default=None, description="上级部门ID") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人员工ID") sort_order: Optional[int] = Field(default=0, description="排序值(越大越靠前)") class DepartmentUpdateSchema(BaseModel): """更新部门请求""" name: Optional[str] = Field(default=None, max_length=128, description="部门名称") code: Optional[str] = Field(default=None, max_length=64, description="部门编码") parent_id: Optional[str] = Field(default=None, description="上级部门ID") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人员工ID") sort_order: Optional[int] = Field(default=None, description="排序值(越大越靠前)") status: Optional[str] = Field(default=None, description="状态") class DepartmentOutSchema(BaseModel): """部门响应模型""" model_config = ConfigDict(from_attributes=True) id: int = Field(description="主键ID") department_id: Optional[str] = Field(default=None, description="部门ID(业务主键)") enterprise_id: Optional[str] = Field(default=None, description="企业ID") name: str = Field(description="部门名称") code: Optional[str] = Field(default=None, description="部门编码") parent_id: Optional[str] = Field(default=None, description="上级部门ID") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人员工ID") sort_order: int = Field(description="排序值") status: str = Field(description="状态") created_time: Optional[datetime] = Field(default=None, description="创建时间") updated_time: Optional[datetime] = Field(default=None, description="更新时间") class DepartmentTreeSchema(BaseModel): """部门树形结构响应""" model_config = ConfigDict(from_attributes=True) department_id: Optional[str] = Field(default=None, description="部门ID") name: str = Field(description="部门名称") code: Optional[str] = Field(default=None, description="部门编码") parent_id: Optional[str] = Field(default=None, description="上级部门ID") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人员工ID") sort_order: int = Field(description="排序值") status: str = Field(description="状态") children: list["DepartmentTreeSchema"] = Field(default_factory=list, description="子部门") class DepartmentMoveSchema(BaseModel): """移动部门请求""" parent_id: Optional[str] = Field(default=None, description="新的上级部门ID")