from datetime import datetime from typing import Optional, List from pydantic import BaseModel, ConfigDict, Field class DepartmentCreateSchema(BaseModel): """创建部门请求""" enterprise_id: str = Field(..., description="企业ID") department_name: str = Field(..., description="部门名称") department_code: Optional[str] = Field(default=None, description="部门编码") parent_department_id: Optional[str] = Field(default=None, description="上级部门ID") sort_order: Optional[int] = Field(default=None, description="排序值") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人ID") leader_employee_name: Optional[str] = Field(default=None, description="部门负责人姓名") class DepartmentUpdateSchema(BaseModel): """更新部门请求""" department_name: Optional[str] = Field(default=None, description="部门名称") department_code: Optional[str] = Field(default=None, description="部门编码") parent_department_id: Optional[str] = Field(default=None, description="上级部门ID") sort_order: Optional[int] = Field(default=None, description="排序值") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人ID") leader_employee_name: Optional[str] = Field(default=None, description="部门负责人姓名") class DepartmentOutSchema(BaseModel): """部门响应模型""" model_config = ConfigDict(from_attributes=True) # id: int = Field(description="主键ID") department_id: str = Field(description="部门ID") department_name: str = Field(description="部门名称") department_code: Optional[str] = Field(default=None, description="部门编码") parent_department_id: Optional[str] = Field(default=None, description="上级部门ID") enterprise_id: str = Field(description="企业ID") status: str = Field(description="状态") sort_order: Optional[int] = Field(default=None, description="排序值") leader_employee_id: Optional[str] = Field(default=None, description="部门负责人ID") leader_employee_name: Optional[str] = Field(default=None, description="部门负责人姓名") # created_time: datetime = Field(description="创建时间") # updated_time: datetime = Field(description="更新时间") # tenant_id: int = Field(description="租户ID") class DepartmentListOutSchema(BaseModel): """部门列表响应""" model_config = ConfigDict(from_attributes=True) id: int = Field(description="主键ID") department_id: str = Field(description="部门ID") department_name: str = Field(description="部门名称") department_code: Optional[str] = Field(default=None, description="部门编码") parent_department_id: Optional[str] = Field(default=None, description="上级部门ID") enterprise_id: str = Field(description="企业ID") status: str = Field(description="状态") sort_order: Optional[int] = Field(default=None, description="排序值") leader_employee_name: Optional[str] = Field(default=None, description="部门负责人姓名") created_time: datetime = Field(description="创建时间") class DepartmentDetailOutSchema(BaseModel): """部门详情响应""" model_config = ConfigDict(from_attributes=True) department: DepartmentOutSchema = Field(description="部门信息") sub_departments: List[DepartmentOutSchema] = Field(default_factory=list, description="子部门列表") class DepartmentPageQuery(BaseModel): """部门分页查询参数""" page_no: int = Field(default=1, description="页码") page_size: int = Field(default=20, description="每页数量") enterprise_id: Optional[str] = Field(default=None, description="企业ID") department_name: Optional[str] = Field(default=None, description="部门名称") department_code: Optional[str] = Field(default=None, description="部门编码") parent_department_id: Optional[str] = Field(default=None, description="上级部门ID") status: Optional[str] = Field(default=None, description="状态") class DepartmentOperationOutSchema(BaseModel): """部门操作响应""" department_id: str = Field(description="部门ID") department_name: str = Field(description="部门名称") class DepartmentTreeOutSchema(BaseModel): """部门树形结构响应""" model_config = ConfigDict(from_attributes=True) id: int = Field(description="主键ID") department_id: str = Field(description="部门ID") department_name: str = Field(description="部门名称") department_code: Optional[str] = Field(default=None, description="部门编码") parent_department_id: Optional[str] = Field(default=None, description="上级部门ID") status: str = Field(description="状态") sort_order: Optional[int] = Field(default=None, description="排序值") leader_employee_name: Optional[str] = Field(default=None, description="部门负责人姓名") children: List["DepartmentTreeOutSchema"] = Field(default_factory=list, description="子部门列表") # 递归更新类型提示 DepartmentTreeOutSchema.model_rebuild() # 部门状态常量 DEPARTMENT_STATUS = { "NORMAL": "正常", "DISABLED": "禁用" } # 部门状态标签类型 DEPARTMENT_STATUS_TAG_TYPE = { "NORMAL": "success", "DISABLED": "warning" } # 部门状态标签 DEPARTMENT_STATUS_LABEL = { "NORMAL": "正常", "DISABLED": "禁用" }