deliveryman-api/app/models/community.py
2025-03-09 23:37:33 +08:00

79 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 sqlalchemy.orm import relationship
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
# 小区定价
base_price = Column(DECIMAL(10,2), nullable=False, default=3.0) # 基础费用
extra_package_price = Column(DECIMAL(10,2), nullable=False, default=0.5) # 额外包裹费用
extra_package_threshold = Column(Integer, nullable=False, default=5) # 额外收费阈值
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)
base_price: Optional[float] = Field(None)
extra_package_price: Optional[float] = Field(None)
extra_package_threshold: Optional[int] = Field(None)
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
base_price: Optional[float] = None
extra_package_price: Optional[float] = None
extra_package_threshold: Optional[int] = None
optimized_qy_group_qrcode: Optional[str] = None
distance: Optional[float] = None # 距离,单位:米
class Config:
from_attributes = True