增加优惠券活动领取次数限制。
This commit is contained in:
parent
35875c8f72
commit
a2ab1c6720
@ -132,18 +132,28 @@ async def receive_coupons(
|
|||||||
if current_time < activity.daily_start_time or current_time > activity.daily_end_time:
|
if current_time < activity.daily_start_time or current_time > activity.daily_end_time:
|
||||||
return error_response(code=400, message="不在领取时间范围内")
|
return error_response(code=400, message="不在领取时间范围内")
|
||||||
|
|
||||||
|
# 检查总领取次数
|
||||||
|
total_receive_count = db.query(func.count(CouponReceiveRecordDB.id)).filter(
|
||||||
|
CouponReceiveRecordDB.user_id == current_user.userid,
|
||||||
|
CouponReceiveRecordDB.activity_id == activity_id
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
if activity.total_limit > 0 and total_receive_count >= activity.total_limit:
|
||||||
|
return error_response(code=400, message=f"您只能领取 {activity.total_limit} 次")
|
||||||
|
|
||||||
# 检查今日领取次数
|
# 检查今日领取次数
|
||||||
today = datetime.now().date()
|
today = datetime.now().date()
|
||||||
|
|
||||||
receive_count = db.query(func.count(CouponReceiveRecordDB.id)).filter(
|
today_receive_count = db.query(func.count(CouponReceiveRecordDB.id)).filter(
|
||||||
CouponReceiveRecordDB.user_id == current_user.userid,
|
CouponReceiveRecordDB.user_id == current_user.userid,
|
||||||
CouponReceiveRecordDB.activity_id == activity_id,
|
CouponReceiveRecordDB.activity_id == activity_id,
|
||||||
CouponReceiveRecordDB.receive_date == today
|
CouponReceiveRecordDB.receive_date == today
|
||||||
).scalar()
|
).scalar()
|
||||||
|
|
||||||
if receive_count >= activity.daily_limit:
|
if today_receive_count >= activity.daily_limit:
|
||||||
return error_response(code=400, message="今日领取次数已达上限")
|
return error_response(code=400, message="今日领取次数已达上限")
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 发放优惠券
|
# 发放优惠券
|
||||||
for coupon_id, count in activity.coupon_config.items():
|
for coupon_id, count in activity.coupon_config.items():
|
||||||
|
|||||||
@ -15,6 +15,7 @@ class CouponActivityDB(Base):
|
|||||||
end_time = Column(DateTime(timezone=True), nullable=False) # 活动结束时间
|
end_time = Column(DateTime(timezone=True), nullable=False) # 活动结束时间
|
||||||
daily_start_time = Column(Time, nullable=False) # 每日开始时间
|
daily_start_time = Column(Time, nullable=False) # 每日开始时间
|
||||||
daily_end_time = Column(Time, nullable=False) # 每日结束时间
|
daily_end_time = Column(Time, nullable=False) # 每日结束时间
|
||||||
|
total_limit = Column(Integer, nullable=False, default=0) # 总可领取次数, 0表示不限制
|
||||||
daily_limit = Column(Integer, nullable=False, default=1) # 每日可领取次数
|
daily_limit = Column(Integer, nullable=False, default=1) # 每日可领取次数
|
||||||
is_active = Column(Boolean, nullable=False, default=True) # 是否激活
|
is_active = Column(Boolean, nullable=False, default=True) # 是否激活
|
||||||
coupon_config = Column(JSON, nullable=False) # 可领取的优惠券配置 {coupon_id: count}
|
coupon_config = Column(JSON, nullable=False) # 可领取的优惠券配置 {coupon_id: count}
|
||||||
@ -29,6 +30,7 @@ class CouponActivityCreate(BaseModel):
|
|||||||
end_time: datetime
|
end_time: datetime
|
||||||
daily_start_time: time # 每日开始时间 "HH:MM:SS"
|
daily_start_time: time # 每日开始时间 "HH:MM:SS"
|
||||||
daily_end_time: time # 每日结束时间 "HH:MM:SS"
|
daily_end_time: time # 每日结束时间 "HH:MM:SS"
|
||||||
|
total_limit: int = Field(default=0)
|
||||||
daily_limit: int = Field(..., gt=0)
|
daily_limit: int = Field(..., gt=0)
|
||||||
coupon_config: Dict[int, int] # {coupon_id: count}
|
coupon_config: Dict[int, int] # {coupon_id: count}
|
||||||
is_active: bool = Field(default=True)
|
is_active: bool = Field(default=True)
|
||||||
@ -40,6 +42,7 @@ class CouponActivityUpdate(BaseModel):
|
|||||||
end_time: Optional[datetime] = None
|
end_time: Optional[datetime] = None
|
||||||
daily_start_time: Optional[time] = None
|
daily_start_time: Optional[time] = None
|
||||||
daily_end_time: Optional[time] = None
|
daily_end_time: Optional[time] = None
|
||||||
|
total_limit: Optional[int] = Field(default=0)
|
||||||
daily_limit: Optional[int] = Field(None, gt=0)
|
daily_limit: Optional[int] = Field(None, gt=0)
|
||||||
coupon_config: Optional[Dict[int, int]] = None
|
coupon_config: Optional[Dict[int, int]] = None
|
||||||
is_active: Optional[bool] = None
|
is_active: Optional[bool] = None
|
||||||
@ -52,6 +55,7 @@ class CouponActivityInfo(BaseModel):
|
|||||||
end_time: datetime
|
end_time: datetime
|
||||||
daily_start_time: time
|
daily_start_time: time
|
||||||
daily_end_time: time
|
daily_end_time: time
|
||||||
|
total_limit: int
|
||||||
daily_limit: int
|
daily_limit: int
|
||||||
coupon_config: Dict[int, int]
|
coupon_config: Dict[int, int]
|
||||||
is_active: bool
|
is_active: bool
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user