From ef14928e961b4edcb0baa377702d3ee1f31e0ec8 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 23 Jan 2025 15:02:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=99=90=E8=B4=AD=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/merchant_order.py | 20 ++++++++++++++++++++ app/models/merchant_product.py | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index b339dff..f382593 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -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 diff --git a/app/models/merchant_product.py b/app/models/merchant_product.py index 63c85be..4a3b0bd 100644 --- a/app/models/merchant_product.py +++ b/app/models/merchant_product.py @@ -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 \ No newline at end of file + from_attributes = True \ No newline at end of file