Files
zkxw/backend/app/schemas/product_review.py
2026-05-12 16:35:07 +08:00

111 lines
3.7 KiB
Python

"""Pydantic schemas - 售后评价"""
from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime
class ProductReviewBase(BaseModel):
"""售后评价基础字段"""
product_id: str = Field(..., description="商品ID")
order_id: Optional[str] = Field(None, description="订单ID")
order_item_id: Optional[str] = Field(None, description="订单项ID")
user_id: str = Field(..., description="评价用户ID")
rating: int = Field(default=5, ge=1, le=5, description="评分(1-5星)")
rating_tags: Optional[str] = Field(None, max_length=500, description="评价标签,多个逗号分隔")
content: Optional[str] = Field(None, description="评价内容")
is_anonymous: int = Field(default=0, description="是否匿名:0-否, 1-是")
class ProductReviewCreate(ProductReviewBase):
"""创建售后评价请求"""
pass
class ProductReviewUpdate(BaseModel):
"""更新售后评价请求(用户可更新自己的评价)"""
rating: Optional[int] = Field(None, ge=1, le=5, description="评分")
rating_tags: Optional[str] = None
content: Optional[str] = None
is_anonymous: Optional[int] = None
class ProductReviewReplyRequest(BaseModel):
"""回复评价请求"""
reply_content: str = Field(..., description="回复内容")
class ProductReviewRejectRequest(BaseModel):
"""拒绝评价请求"""
reject_reason: str = Field(..., max_length=500, description="拒绝原因")
class ProductReviewTopRequest(BaseModel):
"""置顶评价请求"""
is_top: int = Field(..., description="是否置顶:0-否, 1-是")
class ProductReviewResponse(ProductReviewBase):
"""售后评价响应"""
id: str
user_name: Optional[str] = None
reply_content: Optional[str] = None
reply_time: Optional[datetime] = None
reply_by: Optional[str] = None
reply_by_name: Optional[str] = None
like_count: int = 0
is_top: int = 0
status: str = "pending"
reject_reason: Optional[str] = None
create_at: datetime
create_by: Optional[str] = None
create_name: Optional[str] = None
update_at: Optional[datetime] = None
class Config:
from_attributes = True
class ProductReviewDetailResponse(ProductReviewResponse):
"""售后评价详情响应(包含媒体列表)"""
media_list: List["ProductReviewMediaResponse"] = []
class ProductReviewListResponse(BaseModel):
"""售后评价列表响应"""
list: List[ProductReviewDetailResponse]
total: int
page: int
pageSize: int
class ProductReviewStatisticsResponse(BaseModel):
"""评价统计响应"""
total_count: int = Field(description="总评价数")
pending_count: int = Field(description="待审核数")
approved_count: int = Field(description="已通过数")
rejected_count: int = Field(description="已拒绝数")
avg_rating: float = Field(description="平均评分")
rating_distribution: dict = Field(description="评分分布,格式:{'5': 10, '4': 5, '3': 2, '2': 1, '1': 0}")
class ProductReviewAdminListRequest(BaseModel):
"""管理员评价列表查询参数"""
product_id: Optional[str] = None
product_name: Optional[str] = None
user_name: Optional[str] = None
status: Optional[str] = None
rating: Optional[int] = None
start_date: Optional[str] = None
end_date: Optional[str] = None
class MiniReviewListRequest(BaseModel):
"""小程序评价列表查询参数"""
product_id: str = Field(..., description="商品ID")
has_media: Optional[int] = Field(None, description="是否有媒体:0-全部, 1-有图/视频")
# 前向引用
from app.schemas.product_review_media import ProductReviewMediaResponse
ProductReviewDetailResponse.model_rebuild()