增加限购功能。

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 fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy import func
from typing import List from typing import List
from app.models.merchant_order import ( from app.models.merchant_order import (
MerchantOrderDB, MerchantOrderDB,
@ -35,6 +36,25 @@ async def create_merchant_order(
if not product: if not product:
return error_response(code=404, message="商品不存在") 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) original_amount = float(product.sale_price)
pay_amount = original_amount 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.dialects.mysql import DECIMAL
from sqlalchemy.sql import func from sqlalchemy.sql import func
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@ -23,6 +23,7 @@ class MerchantProductDB(Base):
sale_price = Column(Float, nullable=False) # 售价 sale_price = Column(Float, nullable=False) # 售价
settlement_amount = Column(DECIMAL(10,2), nullable=False) # 商家结算金额 settlement_amount = Column(DECIMAL(10,2), nullable=False) # 商家结算金额
tags = Column(String(200)) # 标签,逗号分隔 tags = Column(String(200)) # 标签,逗号分隔
purchase_limit = Column(Integer, nullable=False, default=0) # 限购次数0表示不限购
create_time = Column(DateTime(timezone=True), server_default=func.now()) create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now())
status = Column(Enum(ProductStatus), nullable=False, default=ProductStatus.UNLISTING) status = Column(Enum(ProductStatus), nullable=False, default=ProductStatus.UNLISTING)
@ -37,6 +38,7 @@ class MerchantProductCreate(BaseModel):
sale_price: float = Field(..., gt=0) sale_price: float = Field(..., gt=0)
settlement_amount: float = Field(..., gt=0) settlement_amount: float = Field(..., gt=0)
tags: str = Field("", max_length=200) tags: str = Field("", max_length=200)
purchase_limit: int = Field(0, ge=0) # 限购次数默认0表示不限购
status: ProductStatus = ProductStatus.UNLISTING status: ProductStatus = ProductStatus.UNLISTING
class MerchantProductUpdate(BaseModel): class MerchantProductUpdate(BaseModel):
@ -46,6 +48,7 @@ class MerchantProductUpdate(BaseModel):
sale_price: Optional[float] = Field(None, gt=0) sale_price: Optional[float] = Field(None, gt=0)
settlement_amount: Optional[float] = Field(None, gt=0) settlement_amount: Optional[float] = Field(None, gt=0)
tags: Optional[str] = Field(None, max_length=200) tags: Optional[str] = Field(None, max_length=200)
purchase_limit: Optional[int] = Field(None, ge=0) # 限购次数,可选字段
status: Optional[ProductStatus] = None status: Optional[ProductStatus] = None
class MerchantProductInfo(BaseModel): class MerchantProductInfo(BaseModel):
@ -58,9 +61,10 @@ class MerchantProductInfo(BaseModel):
sale_price: float sale_price: float
settlement_amount: float settlement_amount: float
tags: str tags: str
purchase_limit: int # 限购次数
create_time: datetime create_time: datetime
update_time: Optional[datetime] update_time: Optional[datetime]
status: ProductStatus status: ProductStatus
class Config: class Config:
from_attributes = True from_attributes = True