from sqlalchemy import Column, String, Integer, DateTime, JSON, Boolean, ForeignKey, Text from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional, List, Dict, Any from datetime import datetime from .database import Base class WecomExternalChatDB(Base): """企业微信外部群聊表""" __tablename__ = "wecom_external_chats" id = Column(Integer, primary_key=True, autoincrement=True) chat_id = Column(String(64), nullable=False, unique=True, index=True) # 群聊ID name = Column(String(100), nullable=True) # 群名称 owner = Column(String(64), nullable=True) # 群主ID create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) member_count = Column(Integer, nullable=False, default=0) # 成员数量 notice = Column(String(500), nullable=True) # 群公告 is_active = Column(Boolean, nullable=False, default=True) # 是否活跃 class WecomExternalChatMemberDB(Base): """企业微信外部群聊成员表""" __tablename__ = "wecom_external_chat_members" id = Column(Integer, primary_key=True, autoincrement=True) chat_id = Column(String(64), nullable=False, index=True) # 群聊ID user_id = Column(String(64), nullable=False, index=True) # 用户ID type = Column(String(32), nullable=False) # 成员类型: INTERNAL(内部成员)、EXTERNAL(外部联系人) join_time = Column(DateTime(timezone=True), server_default=func.now()) # 加入时间 unionid = Column(String(64), nullable=True) # 微信unionid name = Column(String(100), nullable=True) # 成员名称 mobile = Column(String(20), nullable=True) # 手机号 welcome_sent = Column(Boolean, nullable=False, default=False) # 是否已发送欢迎消息 # 设置联合唯一索引 __table_args__ = ( {"mysql_charset": "utf8mb4"}, ) # Pydantic 模型 class WecomExternalChatCreate(BaseModel): chat_id: str name: Optional[str] = None owner: Optional[str] = None member_count: int = 0 notice: Optional[str] = None is_active: bool = True class WecomExternalChatUpdate(BaseModel): name: Optional[str] = None owner: Optional[str] = None member_count: Optional[int] = None notice: Optional[str] = None is_active: Optional[bool] = None class WecomExternalChatInfo(BaseModel): id: int chat_id: str name: Optional[str] = None owner: Optional[str] = None create_time: datetime update_time: Optional[datetime] = None member_count: int = 0 notice: Optional[str] = None is_active: bool = True class Config: from_attributes = True class WecomExternalChatMemberCreate(BaseModel): chat_id: str user_id: str type: str unionid: Optional[str] = None name: Optional[str] = None mobile: Optional[str] = None welcome_sent: bool = False class WecomExternalChatMemberUpdate(BaseModel): unionid: Optional[str] = None name: Optional[str] = None mobile: Optional[str] = None welcome_sent: Optional[bool] = None class WecomExternalChatMemberInfo(BaseModel): id: int chat_id: str user_id: str type: str join_time: datetime unionid: Optional[str] = None name: Optional[str] = None mobile: Optional[str] = None welcome_sent: bool class Config: from_attributes = True