From 9cc593b30585a088d286734be7e553f7050b8cb0 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Fri, 17 Jan 2025 00:30:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E5=93=81=E7=9A=84?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=9E=B6=E5=8A=9F=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_product.py | 42 ++++++++++++++++++++------- app/models/merchant_product.py | 12 +++++++- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/api/endpoints/merchant_product.py b/app/api/endpoints/merchant_product.py index 7ae1500..d1ddf0d 100644 --- a/app/api/endpoints/merchant_product.py +++ b/app/api/endpoints/merchant_product.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session -from typing import List +from typing import List, Optional from app.models.merchant_product import ( MerchantProductDB, MerchantProductCreate, @@ -69,23 +69,45 @@ async def update_product( db.rollback() return error_response(code=500, message=f"更新失败: {str(e)}") -@router.get("/merchant/{merchant_id}", response_model=ResponseModel) +@router.get("/list", response_model=ResponseModel) async def list_merchant_products( - merchant_id: int, + merchant_id: Optional[int] = None, skip: int = 0, limit: int = 20, db: Session = Depends(get_db) ): - """获取商家的产品列表""" - products = db.query(MerchantProductDB).filter( - MerchantProductDB.merchant_id == merchant_id - ).order_by( + """获取商品列表""" + # 联表查询商家信息 + query = db.query( + MerchantProductDB, + MerchantDB.name.label('merchant_name') + ).join( + MerchantDB, + MerchantProductDB.merchant_id == MerchantDB.id + ) + + # 如果指定了商家ID,添加筛选条件 + if merchant_id: + query = query.filter(MerchantProductDB.merchant_id == merchant_id) + + total = query.count() + results = query.order_by( MerchantProductDB.create_time.desc() ).offset(skip).limit(limit).all() - return success_response(data=[ - MerchantProductInfo.model_validate(p) for p in products - ]) + # 处理返回数据 + products = [] + for product, merchant_name in results: + product_info = MerchantProductInfo.model_validate(product) + products.append({ + **product_info.model_dump(), + "merchant_name": merchant_name + }) + + return success_response(data={ + "total": total, + "items": products + }) @router.get("/{product_id}", response_model=ResponseModel) async def get_product( diff --git a/app/models/merchant_product.py b/app/models/merchant_product.py index 8831cb3..2031459 100644 --- a/app/models/merchant_product.py +++ b/app/models/merchant_product.py @@ -1,12 +1,17 @@ -from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey +from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey, Enum from sqlalchemy.dialects.mysql import DECIMAL from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime from .database import Base +import enum +class ProductStatus(str, enum.Enum): + LISTING = "LISTING" # 上架 + UNLISTING = "UNLISTING" # 下架 + class MerchantProductDB(Base): __tablename__ = "merchant_products" @@ -21,6 +26,7 @@ class MerchantProductDB(Base): max_deduct_points = Column(DECIMAL(10,2), default=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) # Pydantic 模型 @@ -33,6 +39,7 @@ class MerchantProductCreate(BaseModel): settlement_amount: float = Field(..., gt=0) tags: str = Field("", max_length=200) max_deduct_points: float = Field(0.0, ge=0) + status: ProductStatus = ProductStatus.UNLISTING class MerchantProductUpdate(BaseModel): name: Optional[str] = Field(None, max_length=100) @@ -42,10 +49,12 @@ class MerchantProductUpdate(BaseModel): settlement_amount: Optional[float] = Field(None, gt=0) tags: Optional[str] = Field(None, max_length=200) max_deduct_points: Optional[float] = Field(None, ge=0) + status: Optional[ProductStatus] = None class MerchantProductInfo(BaseModel): id: int merchant_id: int + merchant_name: Optional[str] = None # 添加商家名称字段 name: str image_url: str product_price: float @@ -55,6 +64,7 @@ class MerchantProductInfo(BaseModel): max_deduct_points: float create_time: datetime update_time: Optional[datetime] + status: ProductStatus class Config: from_attributes = True \ No newline at end of file