deliveryman-api/app/models/coupon_activity.py
2025-03-28 19:13:33 +08:00

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