增加限购功能。

This commit is contained in:
aaron 2025-01-23 15:02:57 +08:00
parent 35488ca919
commit ef14928e96
2 changed files with 26 additions and 2 deletions

View File

@ -1,5 +1,6 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import func
from typing import List
from app.models.merchant_order import (
MerchantOrderDB,
@ -35,6 +36,25 @@ async def create_merchant_order(
if not product:
return error_response(code=404, message="商品不存在")
# 检查限购
if product.purchase_limit:
# 查询用户已购买数量
purchased_count = db.query(func.count(MerchantOrderDB.id)).filter(
MerchantOrderDB.user_id == current_user.userid,
MerchantOrderDB.merchant_product_id == product.id,
MerchantOrderDB.status.in_([
MerchantOrderStatus.CREATED,
MerchantOrderStatus.VERIFIED,
MerchantOrderStatus.UNVERIFIED
])
).scalar()
if purchased_count >= product.purchase_limit:
return error_response(
code=400,
message=f"该商品限购{product.purchase_limit}次,您已达到限购次数"
)
original_amount = float(product.sale_price)
pay_amount = original_amount

View File

@ -1,4 +1,4 @@
from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey, Enum
from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey, Enum, Boolean
from sqlalchemy.dialects.mysql import DECIMAL
from sqlalchemy.sql import func
from pydantic import BaseModel, Field
@ -23,6 +23,7 @@ class MerchantProductDB(Base):
sale_price = Column(Float, nullable=False) # 售价
settlement_amount = Column(DECIMAL(10,2), nullable=False) # 商家结算金额
tags = Column(String(200)) # 标签,逗号分隔
purchase_limit = Column(Integer, nullable=False, default=0) # 限购次数0表示不限购
create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now())
status = Column(Enum(ProductStatus), nullable=False, default=ProductStatus.UNLISTING)
@ -37,6 +38,7 @@ class MerchantProductCreate(BaseModel):
sale_price: float = Field(..., gt=0)
settlement_amount: float = Field(..., gt=0)
tags: str = Field("", max_length=200)
purchase_limit: int = Field(0, ge=0) # 限购次数默认0表示不限购
status: ProductStatus = ProductStatus.UNLISTING
class MerchantProductUpdate(BaseModel):
@ -46,6 +48,7 @@ class MerchantProductUpdate(BaseModel):
sale_price: Optional[float] = Field(None, gt=0)
settlement_amount: Optional[float] = Field(None, gt=0)
tags: Optional[str] = Field(None, max_length=200)
purchase_limit: Optional[int] = Field(None, ge=0) # 限购次数,可选字段
status: Optional[ProductStatus] = None
class MerchantProductInfo(BaseModel):
@ -58,9 +61,10 @@ class MerchantProductInfo(BaseModel):
sale_price: float
settlement_amount: float
tags: str
purchase_limit: int # 限购次数
create_time: datetime
update_time: Optional[datetime]
status: ProductStatus
class Config:
from_attributes = True
from_attributes = True