analytics_controller.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. users *service.UserService
  12. }
  13. func NewAnalyticsController(analytics *service.AnalyticsService, users *service.UserService) *AnalyticsController {
  14. return &AnalyticsController{analytics: analytics, users: users}
  15. }
  16. // GetSummary GET /agent/analytics/summary?from=YYYY-MM-DD&to=YYYY-MM-DD
  17. func (ac *AnalyticsController) GetSummary(c *gin.Context) {
  18. if !requirePermission(c, ac.users, string(service.PermAnalytics)) {
  19. return
  20. }
  21. from := c.Query("from")
  22. to := c.Query("to")
  23. if from == "" || to == "" {
  24. // 默认最近 7 天(含今天)
  25. loc, _ := time.LoadLocation("Asia/Shanghai")
  26. now := time.Now().In(loc)
  27. to = now.Format("2006-01-02")
  28. from = now.AddDate(0, 0, -6).Format("2006-01-02")
  29. }
  30. res, err := ac.analytics.GetSummary(from, to)
  31. if err != nil {
  32. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  33. return
  34. }
  35. c.JSON(http.StatusOK, res)
  36. }
  37. type widgetOpenRequest struct {
  38. VisitorID uint `json:"visitor_id"`
  39. }
  40. // PostWidgetOpen POST /visitor/analytics/widget-open — 访客打开小窗时上报(无需登录)
  41. func (ac *AnalyticsController) PostWidgetOpen(c *gin.Context) {
  42. var req widgetOpenRequest
  43. if err := c.ShouldBindJSON(&req); err != nil || req.VisitorID == 0 {
  44. c.JSON(http.StatusBadRequest, gin.H{"error": "请提供有效的 visitor_id"})
  45. return
  46. }
  47. if err := ac.analytics.RecordWidgetOpen(req.VisitorID); err != nil {
  48. c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
  49. return
  50. }
  51. c.JSON(http.StatusOK, gin.H{"ok": true})
  52. }