from typing import Optional import enum from sqlalchemy import Column, Integer, String, DECIMAL, DateTime, Enum from sqlalchemy.sql import func from pydantic import BaseModel, Field from .database import Base from app.core.imageprocessor import process_image, ImageFormat class CommunityStatus(str, enum.Enum): UNOPEN = "UNOPEN" # 未运营 OPENING = "OPENING" # 已运营 # 数据库模型 class CommunityDB(Base): __tablename__ = "communities" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(100), nullable=False) address = Column(String(200), nullable=False) longitude = Column(DECIMAL(9,6), nullable=False) # 经度,精确到小数点后6位 latitude = Column(DECIMAL(9,6), nullable=False) # 纬度,精确到小数点后6位 status = Column(Enum(CommunityStatus), nullable=False, default=CommunityStatus.UNOPEN) qy_group_qrcode = Column(String(200), nullable=True) # 企业微信群二维码地址 webot_webhook = Column(String(200), nullable=True) # 企业微信机器人webhook create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) @property def optimized_qy_group_qrcode(self): if self.qy_group_qrcode: return process_image(self.qy_group_qrcode).thumbnail(800, 800).format(ImageFormat.WEBP).build() return None # Pydantic 模型 class CommunityCreate(BaseModel): name: str = Field(..., max_length=100) address: str = Field(..., max_length=200) longitude: float = Field(..., ge=-180, le=180) latitude: float = Field(..., ge=-90, le=90) status: CommunityStatus = Field(default=CommunityStatus.UNOPEN) qy_group_qrcode: Optional[str] = Field(None, max_length=200) webot_webhook: Optional[str] = Field(None, max_length=200) class CommunityUpdate(BaseModel): name: Optional[str] = Field(None, max_length=100) address: Optional[str] = Field(None, max_length=200) longitude: Optional[float] = Field(None, ge=-180, le=180) latitude: Optional[float] = Field(None, ge=-90, le=90) status: Optional[CommunityStatus] = None qy_group_qrcode: Optional[str] = Field(None, max_length=200) webot_webhook: Optional[str] = Field(None, max_length=200) class CommunityInfo(BaseModel): id: int name: str address: str latitude: float longitude: float status: CommunityStatus qy_group_qrcode: Optional[str] = None webot_webhook: Optional[str] = None optimized_qy_group_qrcode: Optional[str] = None distance: Optional[float] = None # 距离,单位:米 class Config: from_attributes = True