from datetime import datetime from sqlalchemy import JSON, Column, DateTime, func from sqlmodel import JSON, Field, SQLModel class TenantTimeMixin(SQLModel): tenant_id: int = Field(index=True, description="租户ID") created_at: datetime = Field( sa_column=Column( DateTime(timezone=True), server_default=func.now(), nullable=False, ) ) updated_at: datetime = Field( sa_column=Column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, ) ) class Department(TenantTimeMixin, SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) dname: str = Field(max_length=100) name_en: str = Field(max_length=100) department_leader: list[int] = Field(default_factory=list, sa_column=Column(JSON)) parent_id: int = Field(default=0, index=True) order: int = Field(default=0) class Employee(TenantTimeMixin, SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) ename: str = Field(max_length=100) dept_id: int = Field(foreign_key="department.id", index=True) open_userid: str = Field(max_length=100, index=True) class Tenant(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) # ========== 基础信息 ========== name: str = Field(max_length=100, index=True, description="租户名称 / 企业名称") # ========== 企业微信配置 ========== wecom_corp_id: str = Field(max_length=64, index=True, description="企业微信 CorpID") wecom_corp_secret: str = Field(max_length=128, description="企业微信应用 Secret") wecom_agent_id: int = Field(description="企业微信应用 AgentId") wecom_token: str = Field(max_length=64, description="企业微信回调 Token") wecom_encoding_aes_key: str = Field( max_length=64, description="企业微信回调 EncodingAESKey" ) # ========== 时间字段 ========== created_at: datetime = Field( sa_column=Column( DateTime(timezone=True), server_default=func.now(), nullable=False, ) ) updated_at: datetime = Field( sa_column=Column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, ) )