from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from sqlalchemy import func as sqlfunc from app.database import get_db from app.auth import get_current_user from app.models.review import Review, ReviewSummary from app.schemas.review import ReviewSchema, ReviewResponse, ReviewListResponse, ReviewSummarySchema router = APIRouter(prefix="/api/reviews", tags=["客户评价"], dependencies=[Depends(get_current_user)]) @router.get("/summary", response_model=ReviewSummarySchema) def get_summary(db: Session = Depends(get_db)): summary = db.query(ReviewSummary).first() if not summary: return ReviewSummarySchema() return ReviewSummarySchema(total_count=summary.total_count, approval_rate=summary.approval_rate, keywords=summary.keywords or []) @router.put("/summary") def update_summary(req: ReviewSummarySchema, db: Session = Depends(get_db)): summary = db.query(ReviewSummary).first() if not summary: summary = ReviewSummary() db.add(summary) summary.total_count = req.total_count summary.approval_rate = req.approval_rate summary.keywords = req.keywords db.commit() return {"message": "评价概要更新成功"} @router.get("/", response_model=ReviewListResponse) def list_reviews( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), keyword: str = Query("", description="搜索关键词"), db: Session = Depends(get_db), ): query = db.query(Review) if keyword: query = query.filter(Review.nickname.contains(keyword) | Review.content.contains(keyword)) total = query.count() items = query.order_by(Review.sort_order, Review.id).offset((page - 1) * page_size).limit(page_size).all() return ReviewListResponse( items=[ReviewResponse.model_validate(r) for r in items], total=total, ) @router.post("/", response_model=ReviewResponse, status_code=201) def create_review(req: ReviewSchema, db: Session = Depends(get_db)): max_order = db.query(sqlfunc.max(Review.sort_order)).scalar() or 0 review = Review( nickname=req.nickname, travel_date=req.travel_date, product_version=req.product_version, screenshot=req.screenshot, content=req.content, scenes=req.scenes, concerns=req.concerns, is_visible=req.is_visible, sort_order=max_order + 1, ) db.add(review) db.commit() db.refresh(review) return ReviewResponse.model_validate(review) @router.put("/{review_id}", response_model=ReviewResponse) def update_review(review_id: int, req: ReviewSchema, db: Session = Depends(get_db)): review = db.query(Review).get(review_id) if not review: raise HTTPException(status_code=404, detail="评价不存在") for key, val in req.model_dump().items(): setattr(review, key, val) db.commit() db.refresh(review) return ReviewResponse.model_validate(review) @router.delete("/{review_id}") def delete_review(review_id: int, db: Session = Depends(get_db)): review = db.query(Review).get(review_id) if not review: raise HTTPException(status_code=404, detail="评价不存在") db.delete(review) db.commit() return {"message": "删除成功"} @router.put("/reorder/batch") def reorder_reviews(ids: list[int], db: Session = Depends(get_db)): for i, rid in enumerate(ids): db.query(Review).filter(Review.id == rid).update({"sort_order": i}) db.commit() return {"message": "排序更新成功"}