deliverer_review.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """配送员评价 CRUD"""
  2. from typing import Optional, List
  3. from sqlalchemy.orm import Session
  4. from sqlalchemy import and_, func
  5. from app.crud.base import CRUDBase
  6. from app.core.utils import generate_id
  7. from app.models.models import BizDelivererReview
  8. class DelivererReviewCRUD(CRUDBase[BizDelivererReview]):
  9. """配送员评价 CRUD"""
  10. def __init__(self):
  11. super().__init__(BizDelivererReview)
  12. def get_by_order(self, db: Session, order_id: str) -> Optional[BizDelivererReview]:
  13. return db.query(self.model).filter(
  14. and_(
  15. self.model.order_id == order_id,
  16. self.model.is_del == 0
  17. )
  18. ).first()
  19. def create_review(
  20. self,
  21. db: Session,
  22. order_id: str,
  23. task_id: Optional[str],
  24. client_id: str,
  25. deliverer_id: str,
  26. score: int,
  27. tags: Optional[List[str]] = None,
  28. content: Optional[str] = None,
  29. is_anonymous: bool = False,
  30. creator: Optional[dict] = None
  31. ) -> BizDelivererReview:
  32. data = {
  33. "id": generate_id(),
  34. "order_id": order_id,
  35. "task_id": task_id,
  36. "client_id": client_id,
  37. "deliverer_id": deliverer_id,
  38. "score": score,
  39. "tags": ",".join(tags) if tags else None,
  40. "content": content,
  41. "is_anonymous": is_anonymous,
  42. "create_by": creator.get("user_id") if creator else None,
  43. "create_name": creator.get("real_name") if creator else None
  44. }
  45. return self.create(db, data)
  46. def get_deliverer_rating_stats(self, db: Session, deliverer_id: str) -> dict:
  47. total = db.query(func.count(self.model.id)).filter(
  48. and_(self.model.deliverer_id == deliverer_id, self.model.is_del == 0)
  49. ).scalar() or 0
  50. avg_score = db.query(func.avg(self.model.score)).filter(
  51. and_(self.model.deliverer_id == deliverer_id, self.model.is_del == 0)
  52. ).scalar()
  53. return {
  54. "total": int(total),
  55. "avgScore": round(float(avg_score), 2) if avg_score is not None else 0.0
  56. }
  57. deliverer_review_crud = DelivererReviewCRUD()