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} 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, int] # {coupon_id: count} is_active: bool = Field(default=True) 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, int]] = None is_active: Optional[bool] = None 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, int] is_active: bool create_time: datetime update_time: Optional[datetime] class Config: from_attributes = True