| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- """API - 售后评价管理"""
- from typing import Optional, List
- from fastapi import APIRouter, Depends, HTTPException, Query
- from sqlalchemy.orm import Session
- from app.core.database import get_db
- from app.core.auth import get_current_user
- from app.core.response import success_response, error_response
- from app.crud.product_review import product_review
- from app.crud.product_review_media import product_review_media
- from app.schemas.product_review import (
- ProductReviewReplyRequest,
- ProductReviewRejectRequest,
- ProductReviewTopRequest,
- ProductReviewResponse,
- ProductReviewListResponse,
- ProductReviewStatisticsResponse
- )
- router = APIRouter(prefix="/web/admin/reviews", tags=["售后评价管理"])
- def require_admin(current_user: dict = Depends(get_current_user)):
- """验证运营人员权限"""
- if current_user.get("role") != "admin":
- raise HTTPException(status_code=403, detail="需要运营人员权限")
- return current_user
- @router.get("", response_model=dict)
- def list_reviews(
- page: int = Query(1, ge=1, description="页码"),
- pageSize: int = Query(10, ge=1, le=100, description="每页条数"),
- productId: Optional[str] = Query(None, description="商品ID"),
- productName: Optional[str] = Query(None, description="商品名称"),
- userName: Optional[str] = Query(None, description="用户名称"),
- status: Optional[str] = Query(None, description="状态:pending/approved/rejected"),
- rating: Optional[int] = Query(None, ge=1, le=5, description="评分"),
- startDate: Optional[str] = Query(None, description="开始日期"),
- endDate: Optional[str] = Query(None, description="结束日期"),
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """获取评价列表"""
- items, total = product_review.get_admin_list(
- db,
- skip=(page - 1) * pageSize,
- limit=pageSize,
- product_id=productId,
- user_name=userName,
- status=status,
- rating=rating,
- start_date=startDate,
- end_date=endDate
- )
-
- # 获取每个评价的媒体列表
- result_list = []
- for item in items:
- media_list = product_review_media.get_by_review(db, item.id)
- result_list.append({
- "id": item.id,
- "productId": item.product_id,
- "orderId": item.order_id,
- "orderItemId": item.order_item_id,
- "userId": item.user_id,
- "userName": "匿名用户" if item.is_anonymous else item.user_name,
- "rating": item.rating,
- "ratingTags": item.rating_tags,
- "content": item.content,
- "isAnonymous": item.is_anonymous,
- "replyContent": item.reply_content,
- "replyTime": str(item.reply_time) if item.reply_time else None,
- "replyBy": item.reply_by,
- "replyByName": item.reply_by_name,
- "likeCount": item.like_count,
- "isTop": item.is_top,
- "status": item.status,
- "rejectReason": item.reject_reason,
- "createAt": str(item.create_at) if item.create_at else None,
- "mediaList": [{
- "id": m.id,
- "mediaType": m.media_type,
- "fileUrl": m.file_url,
- "thumbnailUrl": m.thumbnail_url,
- "sortOrder": m.sort_order
- } for m in media_list]
- })
-
- return success_response({
- "list": result_list,
- "total": total,
- "page": page,
- "pageSize": pageSize
- })
- @router.get("/statistics", response_model=dict)
- def get_review_statistics(
- productId: Optional[str] = Query(None, description="商品ID"),
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """获取评价统计"""
- stats = product_review.get_statistics(db, productId)
- return success_response(stats)
- @router.get("/{review_id}", response_model=dict)
- def get_review(
- review_id: str,
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """获取评价详情"""
- review = product_review.get(db, review_id)
- if not review:
- return error_response(404, "评价不存在")
-
- media_list = product_review_media.get_by_review(db, review_id)
-
- return success_response({
- "id": review.id,
- "productId": review.product_id,
- "orderId": review.order_id,
- "orderItemId": review.order_item_id,
- "userId": review.user_id,
- "userName": "匿名用户" if review.is_anonymous else review.user_name,
- "rating": review.rating,
- "ratingTags": review.rating_tags,
- "content": review.content,
- "isAnonymous": review.is_anonymous,
- "replyContent": review.reply_content,
- "replyTime": str(review.reply_time) if review.reply_time else None,
- "replyBy": review.reply_by,
- "replyByName": review.reply_by_name,
- "likeCount": review.like_count,
- "isTop": review.is_top,
- "status": review.status,
- "rejectReason": review.reject_reason,
- "createAt": str(review.create_at) if review.create_at else None,
- "mediaList": [{
- "id": m.id,
- "mediaType": m.media_type,
- "fileUrl": m.file_url,
- "thumbnailUrl": m.thumbnail_url,
- "sortOrder": m.sort_order
- } for m in media_list]
- })
- @router.put("/{review_id}/approve", response_model=dict)
- def approve_review(
- review_id: str,
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """审核通过评价"""
- review = product_review.approve(db, review_id)
- if not review:
- return error_response(404, "评价不存在")
- return success_response({"message": "审核通过", "id": review.id})
- @router.put("/{review_id}/reject", response_model=dict)
- def reject_review(
- review_id: str,
- reject_data: ProductReviewRejectRequest,
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """拒绝评价"""
- updater = {"user_id": current_user.get("user_id"), "real_name": current_user.get("real_name")}
- review = product_review.reject(db, review_id, reject_data.reject_reason, updater)
- if not review:
- return error_response(404, "评价不存在")
- return success_response({"message": "已拒绝", "id": review.id})
- @router.put("/{review_id}/reply", response_model=dict)
- def reply_review(
- review_id: str,
- reply_data: ProductReviewReplyRequest,
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """回复评价"""
- updater = {"user_id": current_user.get("user_id"), "real_name": current_user.get("real_name")}
- review = product_review.reply(db, review_id, reply_data.reply_content, updater)
- if not review:
- return error_response(404, "评价不存在")
- return success_response({
- "message": "回复成功",
- "id": review.id,
- "replyContent": review.reply_content,
- "replyTime": str(review.reply_time) if review.reply_time else None
- })
- @router.put("/{review_id}/top", response_model=dict)
- def toggle_top_review(
- review_id: str,
- top_data: ProductReviewTopRequest,
- db: Session = Depends(get_db),
- current_user: dict = Depends(require_admin)
- ):
- """置顶/取消置顶评价"""
- review = product_review.toggle_top(db, review_id, top_data.is_top)
- if not review:
- return error_response(404, "评价不存在")
- return success_response({
- "message": "操作成功",
- "id": review.id,
- "isTop": review.is_top
- })
|