from sqlalchemy import Column, Integer, String, DateTime, Boolean, JSON, Time from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional, List, Dict from datetime import datetime, time from .database import Base class CouponActivityDB(Base): __tablename__ = "coupon_activities" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(100), nullable=False) # 活动名称 description = Column(String(500), nullable=True) # 活动描述 start_time = Column(DateTime(timezone=True), nullable=False) # 活动开始时间 end_time = Column(DateTime(timezone=True), nullable=False) # 活动结束时间 daily_start_time = Column(Time, nullable=False) # 每日开始时间 daily_end_time = Column(Time, nullable=False) # 每日结束时间 total_limit = Column(Integer, nullable=False, default=0) # 总可领取次数, 0表示不限制 user_limit = Column(Integer, nullable=False, default=1) # 用户可领取次数 is_active = Column(Boolean, nullable=False, default=True) # 是否激活 coupon_config = Column(JSON, nullable=False) # 可领取的优惠券配置 {coupon_id: count} qr_code = Column(String(200), nullable=True) # 活动小程序码URL create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) # Pydantic 模型 class CouponActivityCreate(BaseModel): name: str = Field(..., max_length=100) description: Optional[str] = Field(None, max_length=500) start_time: datetime end_time: datetime daily_start_time: time # 每日开始时间 "HH:MM:SS" daily_end_time: time # 每日结束时间 "HH:MM:SS" total_limit: int = Field(default=0) user_limit: int = Field(..., gt=0) coupon_config: Dict[int, Dict[str, int]] # {coupon_id: {'count': int, 'days': int}} is_active: bool = Field(default=True) qr_code: Optional[str] = Field(None, max_length=200) # 活动小程序码URL class CouponActivityUpdate(BaseModel): name: Optional[str] = Field(None, max_length=100) description: Optional[str] = Field(None, max_length=500) start_time: Optional[datetime] = None end_time: Optional[datetime] = None daily_start_time: Optional[time] = None daily_end_time: Optional[time] = None total_limit: Optional[int] = Field(default=0) user_limit: Optional[int] = Field(None, gt=0) coupon_config: Optional[Dict[int, Dict[str, int]]] = None is_active: Optional[bool] = None qr_code: Optional[str] = Field(None, max_length=200) # 活动小程序码URL class CouponActivityInfo(BaseModel): id: int name: str description: Optional[str] start_time: datetime end_time: datetime daily_start_time: time daily_end_time: time total_limit: int user_limit: int coupon_config: Dict[int, Dict[str, int]] is_active: bool qr_code: Optional[str] # 活动小程序码URL create_time: datetime update_time: Optional[datetime] class Config: from_attributes = True