182 lines
6.0 KiB
Python
182 lines
6.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Post Schema - 岗位数据验证模式
|
|
"""
|
|
from datetime import datetime
|
|
from typing import Optional, List, Dict
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
|
|
from app.base_schema import CSTDatetime
|
|
|
|
|
|
class PostBase(BaseModel):
|
|
"""岗位基础Schema"""
|
|
name: str = Field(..., min_length=1, max_length=64, description="岗位名称")
|
|
code: str = Field(..., min_length=1, max_length=32, description="岗位编码")
|
|
post_type: int = Field(default=4, description="岗位类型(0-管理岗, 1-技术岗, 2-业务岗, 3-职能岗, 4-其他)")
|
|
post_level: int = Field(default=3, description="岗位级别(0-高层, 1-中层, 2-基层, 3-一般员工)")
|
|
status: bool = Field(default=True, description="岗位状态")
|
|
description: Optional[str] = Field(None, description="岗位描述")
|
|
dept_id: Optional[str] = Field(None, description="所属部门ID")
|
|
sort: int = Field(default=0, description="排序")
|
|
|
|
@field_validator("code")
|
|
@classmethod
|
|
def validate_code(cls, v):
|
|
"""验证岗位编码格式"""
|
|
if not v:
|
|
raise ValueError("岗位编码不能为空")
|
|
if not all(c.isalnum() or c in '_-' for c in v):
|
|
raise ValueError("岗位编码只能包含字母、数字、下划线和横线")
|
|
return v
|
|
|
|
@field_validator("post_type")
|
|
@classmethod
|
|
def validate_post_type(cls, v):
|
|
"""验证岗位类型"""
|
|
if v is not None and v not in [0, 1, 2, 3, 4]:
|
|
raise ValueError("岗位类型必须在 0-4 之间")
|
|
return v
|
|
|
|
@field_validator("post_level")
|
|
@classmethod
|
|
def validate_post_level(cls, v):
|
|
"""验证岗位级别"""
|
|
if v is not None and v not in [0, 1, 2, 3]:
|
|
raise ValueError("岗位级别必须在 0-3 之间")
|
|
return v
|
|
|
|
|
|
class PostCreate(PostBase):
|
|
"""岗位创建Schema"""
|
|
pass
|
|
|
|
|
|
class PostUpdate(BaseModel):
|
|
"""岗位更新Schema - 所有字段可选"""
|
|
name: Optional[str] = Field(None, min_length=1, max_length=64, description="岗位名称")
|
|
code: Optional[str] = Field(None, min_length=1, max_length=32, description="岗位编码")
|
|
post_type: Optional[int] = Field(None, description="岗位类型")
|
|
post_level: Optional[int] = Field(None, description="岗位级别")
|
|
status: Optional[bool] = Field(None, description="岗位状态")
|
|
description: Optional[str] = Field(None, description="岗位描述")
|
|
dept_id: Optional[str] = Field(None, description="所属部门ID")
|
|
sort: Optional[int] = Field(None, description="排序")
|
|
|
|
@field_validator("code")
|
|
@classmethod
|
|
def validate_code(cls, v):
|
|
"""验证岗位编码格式"""
|
|
if v is not None:
|
|
if not v:
|
|
raise ValueError("岗位编码不能为空")
|
|
if not all(c.isalnum() or c in '_-' for c in v):
|
|
raise ValueError("岗位编码只能包含字母、数字、下划线和横线")
|
|
return v
|
|
|
|
@field_validator("post_type")
|
|
@classmethod
|
|
def validate_post_type(cls, v):
|
|
"""验证岗位类型"""
|
|
if v is not None and v not in [0, 1, 2, 3, 4]:
|
|
raise ValueError("岗位类型必须在 0-4 之间")
|
|
return v
|
|
|
|
@field_validator("post_level")
|
|
@classmethod
|
|
def validate_post_level(cls, v):
|
|
"""验证岗位级别"""
|
|
if v is not None and v not in [0, 1, 2, 3]:
|
|
raise ValueError("岗位级别必须在 0-3 之间")
|
|
return v
|
|
|
|
|
|
class PostResponse(BaseModel):
|
|
"""岗位响应Schema"""
|
|
id: str
|
|
name: str
|
|
code: str
|
|
post_type: int
|
|
post_type_display: Optional[str] = None
|
|
post_level: int
|
|
post_level_display: Optional[str] = None
|
|
status: bool
|
|
description: Optional[str] = None
|
|
dept_id: Optional[str] = None
|
|
dept_name: Optional[str] = None
|
|
user_count: int = 0
|
|
sort: int = 0
|
|
is_deleted: bool = False
|
|
sys_create_datetime: Optional[CSTDatetime] = None
|
|
sys_update_datetime: Optional[CSTDatetime] = None
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class PostSimple(BaseModel):
|
|
"""岗位简单输出(用于选择器)"""
|
|
id: str
|
|
name: str
|
|
code: str
|
|
post_type: int
|
|
post_level: int
|
|
status: bool
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class PostBatchDeleteIn(BaseModel):
|
|
"""批量删除岗位输入"""
|
|
ids: List[str] = Field(..., description="要删除的岗位ID列表")
|
|
|
|
|
|
class PostBatchDeleteOut(BaseModel):
|
|
"""批量删除岗位输出"""
|
|
count: int = Field(..., description="删除的记录数")
|
|
failed_ids: List[str] = Field(default=[], description="删除失败的ID列表")
|
|
|
|
|
|
class PostBatchUpdateStatusIn(BaseModel):
|
|
"""批量更新岗位状态输入"""
|
|
ids: List[str] = Field(..., description="岗位ID列表")
|
|
status: bool = Field(..., description="岗位状态")
|
|
|
|
|
|
class PostBatchUpdateStatusOut(BaseModel):
|
|
"""批量更新岗位状态输出"""
|
|
count: int = Field(..., description="更新的记录数")
|
|
|
|
|
|
class PostUserSchema(BaseModel):
|
|
"""岗位用户信息"""
|
|
id: str
|
|
name: Optional[str] = None
|
|
username: str
|
|
avatar: Optional[str] = None
|
|
email: Optional[str] = None
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class PostUserIn(BaseModel):
|
|
"""岗位用户操作输入"""
|
|
post_id: str = Field(..., description="岗位ID")
|
|
user_ids: List[str] = Field(default=[], description="用户ID列表")
|
|
user_id: Optional[str] = Field(None, description="单个用户ID")
|
|
|
|
|
|
class PostStatsResponse(BaseModel):
|
|
"""岗位统计输出"""
|
|
total_count: int = Field(..., description="总岗位数")
|
|
active_count: int = Field(..., description="启用岗位数")
|
|
inactive_count: int = Field(..., description="禁用岗位数")
|
|
type_stats: Dict[str, int] = Field(..., description="按类型统计")
|
|
level_stats: Dict[str, int] = Field(..., description="按级别统计")
|
|
|
|
|
|
class PostSearchRequest(BaseModel):
|
|
"""搜索岗位请求"""
|
|
keyword: str = Field(..., description="搜索关键词")
|