dashboard_service.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. """工作台统计"""
  2. from datetime import datetime, timedelta
  3. from typing import Any, Dict, List
  4. from sqlalchemy.orm import Session
  5. from app.crud import feedback as feedback_crud
  6. from app.models.business import Feedback, Suggestion
  7. def _feedback_summary(row: Feedback) -> Dict[str, Any]:
  8. content = row.content or ""
  9. return {
  10. "id": row.id,
  11. "bizNo": row.biz_no,
  12. "fbType": row.fb_type,
  13. "content": content[:80],
  14. "status": row.status,
  15. "createTime": row.create_time.isoformat(sep=" ", timespec="seconds")
  16. if row.create_time
  17. else None,
  18. }
  19. def get_dashboard(db: Session) -> Dict[str, Any]:
  20. feedback_total = (
  21. db.query(Feedback).filter(Feedback.del_flag == "0").count()
  22. )
  23. complaint_pending = (
  24. db.query(Feedback)
  25. .filter(
  26. Feedback.del_flag == "0",
  27. Feedback.fb_type == "投诉",
  28. Feedback.status.in_(["待处理", "处理中"]),
  29. )
  30. .count()
  31. )
  32. suggestion_total = (
  33. db.query(Suggestion).filter(Suggestion.del_flag == "0").count()
  34. )
  35. week_ago = datetime.utcnow() - timedelta(days=7)
  36. week_fb = (
  37. db.query(Feedback)
  38. .filter(Feedback.del_flag == "0", Feedback.create_time >= week_ago)
  39. .count()
  40. )
  41. week_sg = (
  42. db.query(Suggestion)
  43. .filter(Suggestion.del_flag == "0", Suggestion.create_time >= week_ago)
  44. .count()
  45. )
  46. recent, _ = feedback_crud.list_feedbacks(db, page=1, page_size=5)
  47. return {
  48. "feedbackTotal": feedback_total,
  49. "complaintPending": complaint_pending,
  50. "suggestionTotal": suggestion_total,
  51. "weekNew": week_fb + week_sg,
  52. "recentFeedback": [_feedback_summary(r) for r in recent],
  53. }