70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
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"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
merchant_id = Column(Integer, ForeignKey("merchants.id", ondelete="CASCADE"), index=True)
|
|
name = Column(String(100), nullable=False)
|
|
image_url = Column(String(500), nullable=False)
|
|
product_price = Column(Float, nullable=False) # 原价
|
|
sale_price = Column(Float, nullable=False) # 售价
|
|
settlement_amount = Column(DECIMAL(10,2), nullable=False) # 商家结算金额
|
|
tags = Column(String(200)) # 标签,逗号分隔
|
|
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 模型
|
|
class MerchantProductCreate(BaseModel):
|
|
merchant_id: int
|
|
name: str = Field(..., max_length=100)
|
|
image_url: str = Field(..., max_length=500)
|
|
product_price: float = Field(..., gt=0)
|
|
sale_price: float = Field(..., gt=0)
|
|
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)
|
|
image_url: Optional[str] = Field(None, max_length=500)
|
|
product_price: Optional[float] = Field(None, gt=0)
|
|
sale_price: Optional[float] = Field(None, gt=0)
|
|
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
|
|
sale_price: float
|
|
settlement_amount: float
|
|
tags: str
|
|
max_deduct_points: float
|
|
create_time: datetime
|
|
update_time: Optional[datetime]
|
|
status: ProductStatus
|
|
|
|
class Config:
|
|
from_attributes = True |