# ============================================================================= # 企微IT智能服务台 — 员工模型 # ============================================================================= # 说明:对应数据库 employees 表,存储通过 OAuth2 认证的员工信息 # US-7 扩展:增加 corp_id 字段支持上下游互联企业场景 # 主企业(亿企赢总部): corp_id = 主企业 corp_id # 下游企业(亿企赢): corp_id = 下游企业 corp_id # 复合唯一键 (corp_id, employee_id) 确保跨企业员工标识唯一 # ============================================================================= import uuid from datetime import datetime from sqlalchemy import DateTime, Index, JSON, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from app.database import Base class Employee(Base): """员工模型 — 对应 employees 表。 通过 OAuth2 认证后记录员工信息,支持跨企业场景(US-7)。 与 Conversation.employee_id 通过 (corp_id, employee_id) 关联。 Attributes: id: 主键(UUID,数据库自动生成) corp_id: 企业微信企业ID(主企业或下游企业) employee_id: 员工UserID(企业内唯一) name: 员工姓名 department: 部门(JSON数组字符串) position: 岗位 mobile: 手机号 email: 邮箱 avatar: 头像URL status: 激活状态(1=已激活, 2=已禁用, 4=未激活) last_login_at: 最后登录时间 created_at: 创建时间 updated_at: 更新时间 """ # 表名 __tablename__ = "employees" # -------------------------------------------------------------------------- # 字段定义 # -------------------------------------------------------------------------- # 主键:UUID id: Mapped[str] = mapped_column( String(36), primary_key=True, default=lambda: str(uuid.uuid4()), comment="员工记录唯一标识", ) # 企业微信企业ID(主企业或下游企业) # US-7: 用于区分不同企业的员工,格式如 "wwa8c87970b2011f41" corp_id: Mapped[str] = mapped_column( String(64), nullable=False, comment="企业微信企业ID", ) # 员工UserID(企业内唯一) # 注意:不同企业的 userid 可能重复,需配合 corp_id 使用 employee_id: Mapped[str] = mapped_column( String(64), nullable=False, comment="企微员工UserID(企业内唯一)", ) # 员工姓名 name: Mapped[str] = mapped_column( String(128), nullable=False, default="", comment="员工姓名", ) # 部门(JSON数组字符串,如 "[1, 2, 3]") department: Mapped[str] = mapped_column( String(512), nullable=False, default="", comment="部门ID列表(JSON数组)", ) # 岗位 position: Mapped[str] = mapped_column( String(128), nullable=False, default="", comment="岗位", ) # 手机号 mobile: Mapped[str] = mapped_column( String(32), nullable=False, default="", comment="手机号", ) # 邮箱 email: Mapped[str] = mapped_column( String(128), nullable=False, default="", comment="邮箱", ) # 头像URL avatar: Mapped[str] = mapped_column( String(512), nullable=False, default="", comment="头像URL", ) # 激活状态(企微通讯录返回: 1=已激活, 2=已禁用, 4=未激活) status: Mapped[int] = mapped_column( default=1, comment="激活状态: 1=已激活, 2=已禁用, 4=未激活", ) # IT技能等级(7级: bronze/silver/gold/platinum/diamond/star/king) it_level: Mapped[str] = mapped_column( String(20), nullable=False, default="silver", comment="IT技能等级", ) # 等级来源(system: 系统自动评定, manual: 坐席手动调整, assessment: 评估结果) it_level_source: Mapped[str] = mapped_column( String(20), nullable=False, default="system", comment="等级来源", ) # 坐席备注(JSON 格式,存储坐席对员工的备注信息) notes: Mapped[dict] = mapped_column( JSON, nullable=False, default=dict, comment="坐席备注", ) # 最后登录时间 last_login_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=True, comment="最后登录时间", ) # 创建时间 created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=datetime.now, comment="创建时间", ) # 更新时间 updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间", ) # -------------------------------------------------------------------------- # 索引和约束定义 # -------------------------------------------------------------------------- __table_args__ = ( # 复合唯一约束:同一企业内 employee_id 唯一 UniqueConstraint("corp_id", "employee_id", name="uq_employee_corp"), # 按 corp_id 查询(查询某企业所有员工) Index("idx_employees_corp_id", "corp_id"), # 按 employee_id 查询 Index("idx_employees_employee_id", "employee_id"), ) def __repr__(self) -> str: """员工对象的字符串表示。""" return ( f"" )