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) # 每日结束时间 daily_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" daily_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 daily_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 daily_limit: int coupon_config: Dict[int, int] is_active: bool create_time: datetime update_time: Optional[datetime] class Config: from_attributes = True