119 lines
3.9 KiB
Python
119 lines
3.9 KiB
Python
# =============================================================================
|
||
# 企微IT智能服务台 — 员工 Pydantic Schema
|
||
# =============================================================================
|
||
# 说明:定义员工相关的请求/响应数据结构
|
||
# 包含:IT等级更新请求、员工响应 Schema
|
||
# =============================================================================
|
||
|
||
from datetime import datetime
|
||
from typing import Any, Dict, List, Optional
|
||
|
||
from pydantic import BaseModel, Field, field_validator
|
||
|
||
|
||
# --------------------------------------------------------------------------
|
||
# IT 等级合法值
|
||
# --------------------------------------------------------------------------
|
||
VALID_IT_LEVELS = {"bronze", "silver", "gold", "platinum", "diamond", "star", "king"}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 等级来源合法值
|
||
# --------------------------------------------------------------------------
|
||
VALID_LEVEL_SOURCES = {"system", "manual", "assessment"}
|
||
|
||
|
||
# --------------------------------------------------------------------------
|
||
# IT 等级更新请求 Schema
|
||
# --------------------------------------------------------------------------
|
||
class ItLevelUpdateRequest(BaseModel):
|
||
"""IT技能等级更新请求 Schema。
|
||
|
||
坐席手动调整员工IT技能等级时使用。
|
||
|
||
Attributes:
|
||
it_level: 新的IT技能等级
|
||
source: 等级来源(默认 manual)
|
||
"""
|
||
|
||
it_level: str = Field(..., description="IT技能等级: bronze/silver/gold/platinum/diamond/star/king")
|
||
source: str = Field(default="manual", description="等级来源: system/manual/assessment")
|
||
|
||
@field_validator("it_level")
|
||
@classmethod
|
||
def validate_it_level(cls, v: str) -> str:
|
||
"""校验IT等级值是否合法。"""
|
||
if v not in VALID_IT_LEVELS:
|
||
raise ValueError(f"无效的IT等级: {v},合法值为: {VALID_IT_LEVELS}")
|
||
return v
|
||
|
||
@field_validator("source")
|
||
@classmethod
|
||
def validate_source(cls, v: str) -> str:
|
||
"""校验等级来源值是否合法。"""
|
||
if v not in VALID_LEVEL_SOURCES:
|
||
raise ValueError(f"无效的等级来源: {v},合法值为: {VALID_LEVEL_SOURCES}")
|
||
return v
|
||
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 员工响应 Schema(返回给前端的数据结构)
|
||
# --------------------------------------------------------------------------
|
||
class EmployeeResponse(BaseModel):
|
||
"""员工响应 Schema。
|
||
|
||
返回给前端的员工数据结构。
|
||
使用 from_attributes=True 支持从 SQLAlchemy 模型直接转换。
|
||
|
||
Attributes:
|
||
id: 员工记录唯一标识
|
||
corp_id: 企业微信企业ID
|
||
employee_id: 企微员工UserID
|
||
name: 员工姓名
|
||
department: 部门
|
||
position: 岗位
|
||
mobile: 手机号
|
||
email: 邮箱
|
||
avatar: 头像URL
|
||
status: 激活状态
|
||
it_level: IT技能等级
|
||
it_level_source: 等级来源
|
||
notes: 坐席备注
|
||
last_login_at: 最后登录时间
|
||
created_at: 创建时间
|
||
updated_at: 更新时间
|
||
"""
|
||
|
||
id: str
|
||
corp_id: str
|
||
employee_id: str
|
||
name: str
|
||
department: str
|
||
position: str
|
||
mobile: str
|
||
email: str
|
||
avatar: str
|
||
status: int
|
||
it_level: str = "silver"
|
||
it_level_source: str = "system"
|
||
notes: Dict[str, Any] = Field(default_factory=dict, description="坐席备注")
|
||
last_login_at: Optional[datetime] = None
|
||
created_at: datetime
|
||
updated_at: datetime
|
||
|
||
model_config = {"from_attributes": True}
|
||
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 员工列表响应 Schema
|
||
# --------------------------------------------------------------------------
|
||
class EmployeeListResponse(BaseModel):
|
||
"""员工列表响应 Schema。
|
||
|
||
Attributes:
|
||
items: 员工列表
|
||
total: 总数
|
||
"""
|
||
|
||
items: List[EmployeeResponse]
|
||
total: int
|