deliveryman-api/app/models/merchant_product.py
2025-03-21 11:33:10 +08:00

125 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey, Enum, Boolean, Date, Text
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, date
from .database import Base
import enum
from app.core.utils import CommonUtils
from app.core.imageprocessor import process_image, ImageFormat
class ProductStatus(str, enum.Enum):
LISTING = "LISTING" # 上架
UNLISTING = "UNLISTING" # 下架
class DeliveryType(str, enum.Enum):
"""配送类型枚举"""
DELIVERY = "DELIVERY" # 配送到家
PICKUP = "PICKUP" # 自提
class DeliveryTimeType(str, enum.Enum):
"""配送时间类型枚举"""
IMMEDIATE = "IMMEDIATE" # 立即送
SCHEDULED = "SCHEDULED" # 定时送
class MerchantProductDB(Base):
__tablename__ = "merchant_products"
id = Column(Integer, primary_key=True, autoincrement=True)
merchant_id = Column(Integer, ForeignKey("merchants.id"), nullable=False)
name = Column(String(100), nullable=False)
image_url = Column(String(500), nullable=False)
product_price = Column(Float, nullable=False) # 原价
sale_price = Column(DECIMAL(10,2), nullable=False) # 售价
settlement_amount = Column(DECIMAL(10,2), nullable=False) # 商家结算金额
tags = Column(String(200)) # 标签,逗号分隔
purchase_limit = Column(Integer, nullable=False, default=0) # 限购次数0表示不限购
gift_points_rate = Column(DECIMAL(4,2), nullable=False, default=0.00) # 购买赠送积分比例默认0%
promotion_text = Column(String(100)) # 促销文本
product_detail = Column(Text, nullable=True) # 产品详细描述Markdown格式
purchase_note = Column(Text, nullable=True) # 购买须知,用于提供商品购买相关注意事项
qty = Column(Integer, nullable=False, default=0) # 库存
is_sellout = Column(Boolean, nullable=False, default=False) # 是否售罄
delivery_type = Column(Enum(DeliveryType), nullable=False, default=DeliveryType.DELIVERY) # 配送类型
pickup_place = Column(String(200), nullable=True) # 自提点
delivery_time_type = Column(Enum(DeliveryTimeType), nullable=False, default=DeliveryTimeType.IMMEDIATE) # 配送时间类型
delivery_date = Column(Date, nullable=True) # 配送日期,仅对定时送有效
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)
@property
def optimized_image_url(self):
return process_image(self.image_url).thumbnail(width=800, height=800).format(ImageFormat.WEBP).build()
# 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)
purchase_limit: int = Field(0, ge=0) # 限购次数默认0表示不限购
product_detail: Optional[str] = None # 产品详细描述Markdown格式
purchase_note: Optional[str] = None # 购买须知,用于提供商品购买相关注意事项
qty: int = Field(0, ge=0) # 库存
is_sellout: bool = Field(False) # 是否售罄
delivery_type: DeliveryType = Field(DeliveryType.DELIVERY) # 配送类型
pickup_place: Optional[str] = Field(None, max_length=200) # 自提点
delivery_time_type: DeliveryTimeType = Field(DeliveryTimeType.IMMEDIATE) # 配送时间类型
delivery_date: Optional[date] = Field(None) # 配送日期
status: ProductStatus = ProductStatus.UNLISTING
promotion_text: Optional[str] = Field(None, max_length=100) # 促销文本
gift_points_rate: Optional[float] = Field(10.00, ge=0, le=100) # 购买赠送积分比例
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)
purchase_limit: Optional[int] = Field(None, ge=0) # 限购次数,可选字段
product_detail: Optional[str] = None # 产品详细描述Markdown格式
purchase_note: Optional[str] = None # 购买须知,用于提供商品购买相关注意事项
qty: Optional[int] = Field(None, ge=0) # 库存
is_sellout: Optional[bool] = None # 是否售罄
delivery_type: Optional[DeliveryType] = None # 配送类型
pickup_place: Optional[str] = Field(None, max_length=200) # 自提点
delivery_time_type: Optional[DeliveryTimeType] = None # 配送时间类型
delivery_date: Optional[date] = None # 配送日期
status: Optional[ProductStatus] = None
promotion_text: Optional[str] = Field(None, max_length=100) # 促销文本
gift_points_rate: Optional[float] = Field(None, ge=0, le=100) # 购买赠送积分比例
class MerchantProductInfo(BaseModel):
id: int
merchant_id: int
merchant_name: Optional[str] = None # 添加商家名称字段
name: str
image_url: str
optimized_image_url: Optional[str] = None
product_price: float
sale_price: float
settlement_amount: float
tags: str
purchase_limit: int # 限购次数
product_detail: Optional[str] = None # 产品详细描述Markdown格式
purchase_note: Optional[str] = None # 购买须知,用于提供商品购买相关注意事项
qty: int # 库存
is_sellout: bool # 是否售罄
delivery_type: DeliveryType # 配送类型
pickup_place: Optional[str] = None # 自提点
delivery_time_type: DeliveryTimeType # 配送时间类型
delivery_date: Optional[date] = None # 配送日期
gift_points_rate: float
promotion_text: Optional[str] = None # 促销文本
create_time: datetime
update_time: Optional[datetime]
status: ProductStatus
class Config:
from_attributes = True