| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- """配送员评价 CRUD"""
- from typing import Optional, List
- from sqlalchemy.orm import Session
- from sqlalchemy import and_, func
- from app.crud.base import CRUDBase
- from app.core.utils import generate_id
- from app.models.models import BizDelivererReview
- class DelivererReviewCRUD(CRUDBase[BizDelivererReview]):
- """配送员评价 CRUD"""
- def __init__(self):
- super().__init__(BizDelivererReview)
- def get_by_order(self, db: Session, order_id: str) -> Optional[BizDelivererReview]:
- return db.query(self.model).filter(
- and_(
- self.model.order_id == order_id,
- self.model.is_del == 0
- )
- ).first()
- def create_review(
- self,
- db: Session,
- order_id: str,
- task_id: Optional[str],
- client_id: str,
- deliverer_id: str,
- score: int,
- tags: Optional[List[str]] = None,
- content: Optional[str] = None,
- is_anonymous: bool = False,
- creator: Optional[dict] = None
- ) -> BizDelivererReview:
- data = {
- "id": generate_id(),
- "order_id": order_id,
- "task_id": task_id,
- "client_id": client_id,
- "deliverer_id": deliverer_id,
- "score": score,
- "tags": ",".join(tags) if tags else None,
- "content": content,
- "is_anonymous": is_anonymous,
- "create_by": creator.get("user_id") if creator else None,
- "create_name": creator.get("real_name") if creator else None
- }
- return self.create(db, data)
- def get_deliverer_rating_stats(self, db: Session, deliverer_id: str) -> dict:
- total = db.query(func.count(self.model.id)).filter(
- and_(self.model.deliverer_id == deliverer_id, self.model.is_del == 0)
- ).scalar() or 0
- avg_score = db.query(func.avg(self.model.score)).filter(
- and_(self.model.deliverer_id == deliverer_id, self.model.is_del == 0)
- ).scalar()
- return {
- "total": int(total),
- "avgScore": round(float(avg_score), 2) if avg_score is not None else 0.0
- }
- deliverer_review_crud = DelivererReviewCRUD()
|