70 lines
3.0 KiB
Python
70 lines
3.0 KiB
Python
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 |