analytics_controller.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package controller
  2. import (
  3. "net/http"
  4. "time"
  5. "github.com/2930134478/AI-CS/backend/service"
  6. "github.com/gin-gonic/gin"
  7. )
  8. // AnalyticsController 数据分析报表(客服端查询 + 访客端埋点)
  9. type AnalyticsController struct {
  10. analytics *service.AnalyticsService
  11. }
  12. func NewAnalyticsController(analytics *service.AnalyticsService) *AnalyticsController {
  13. return &AnalyticsController{analytics: analytics}
  14. }
  15. // GetSummary GET /agent/analytics/summary?from=YYYY-MM-DD&to=YYYY-MM-DD
  16. func (ac *AnalyticsController) GetSummary(c *gin.Context) {
  17. userID := getUserIDFromHeader(c)
  18. if userID == 0 {
  19. c.JSON(http.StatusUnauthorized, gin.H{"error": "未授权,请提供 X-User-Id"})
  20. return
  21. }
  22. from := c.Query("from")
  23. to := c.Query("to")
  24. if from == "" || to == "" {
  25. // 默认最近 7 天(含今天)
  26. loc, _ := time.LoadLocation("Asia/Shanghai")
  27. now := time.Now().In(loc)
  28. to = now.Format("2006-01-02")
  29. from = now.AddDate(0, 0, -6).Format("2006-01-02")
  30. }
  31. res, err := ac.analytics.GetSummary(from, to)
  32. if err != nil {
  33. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  34. return
  35. }
  36. c.JSON(http.StatusOK, res)
  37. }
  38. type widgetOpenRequest struct {
  39. VisitorID uint `json:"visitor_id"`
  40. }
  41. // PostWidgetOpen POST /visitor/analytics/widget-open — 访客打开小窗时上报(无需登录)
  42. func (ac *AnalyticsController) PostWidgetOpen(c *gin.Context) {
  43. var req widgetOpenRequest
  44. if err := c.ShouldBindJSON(&req); err != nil || req.VisitorID == 0 {
  45. c.JSON(http.StatusBadRequest, gin.H{"error": "请提供有效的 visitor_id"})
  46. return
  47. }
  48. if err := ac.analytics.RecordWidgetOpen(req.VisitorID); err != nil {
  49. c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
  50. return
  51. }
  52. c.JSON(http.StatusOK, gin.H{"ok": true})
  53. }