""" 小程序认证相关 Pydantic 模型。 覆盖:微信登录、用户申请、审核、人员匹配、店铺切换等场景。 """ from __future__ import annotations from pydantic import BaseModel, Field # ── 微信登录 ────────────────────────────────────────────── class WxLoginRequest(BaseModel): """微信登录请求。""" code: str = Field(..., min_length=1, description="微信临时登录凭证") class WxLoginResponse(BaseModel): """微信登录响应。""" access_token: str refresh_token: str token_type: str = "bearer" user_status: str # pending / approved / rejected / disabled user_id: int # ── 用户申请 ────────────────────────────────────────────── class ApplicationRequest(BaseModel): """用户申请提交请求。""" site_code: str = Field(..., pattern=r"^[A-Za-z]{2}\d{3}$", description="球房ID") applied_role_text: str = Field(..., min_length=1, max_length=100, description="申请身份") phone: str = Field(..., pattern=r"^\d{11}$", description="手机号") employee_number: str | None = Field(None, max_length=50, description="员工编号") nickname: str | None = Field(None, max_length=50, description="昵称") class ApplicationResponse(BaseModel): """申请记录响应。""" id: int site_code: str applied_role_text: str status: str review_note: str | None = None created_at: str reviewed_at: str | None = None # ── 用户状态 ────────────────────────────────────────────── class UserStatusResponse(BaseModel): """用户状态查询响应。""" user_id: int status: str nickname: str | None = None applications: list[ApplicationResponse] = [] # ── 店铺 ────────────────────────────────────────────────── class SiteInfo(BaseModel): """店铺信息。""" site_id: int site_name: str roles: list[dict] = [] class SwitchSiteRequest(BaseModel): """切换店铺请求。""" site_id: int # ── 刷新令牌 ────────────────────────────────────────────── class RefreshTokenRequest(BaseModel): """刷新令牌请求。""" refresh_token: str = Field(..., min_length=1, description="刷新令牌") # ── 人员匹配 ────────────────────────────────────────────── class MatchCandidate(BaseModel): """匹配候选人。""" source_type: str # assistant / staff id: int name: str mobile: str | None = None job_num: str | None = None # ── 管理端审核 ──────────────────────────────────────────── class ApproveRequest(BaseModel): """批准申请请求。""" role_id: int binding: dict | None = None # {"assistant_id": ..., "staff_id": ..., "binding_type": ...} review_note: str | None = None class RejectRequest(BaseModel): """拒绝申请请求。""" review_note: str = Field(..., min_length=1, description="拒绝原因")