| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package controller
- import (
- "net/http"
- "time"
- "github.com/2930134478/AI-CS/backend/service"
- "github.com/gin-gonic/gin"
- )
- // AnalyticsController 数据分析报表(客服端查询 + 访客端埋点)
- type AnalyticsController struct {
- analytics *service.AnalyticsService
- }
- func NewAnalyticsController(analytics *service.AnalyticsService) *AnalyticsController {
- return &AnalyticsController{analytics: analytics}
- }
- // GetSummary GET /agent/analytics/summary?from=YYYY-MM-DD&to=YYYY-MM-DD
- func (ac *AnalyticsController) GetSummary(c *gin.Context) {
- userID := getUserIDFromHeader(c)
- if userID == 0 {
- c.JSON(http.StatusUnauthorized, gin.H{"error": "未授权,请提供 X-User-Id"})
- return
- }
- from := c.Query("from")
- to := c.Query("to")
- if from == "" || to == "" {
- // 默认最近 7 天(含今天)
- loc, _ := time.LoadLocation("Asia/Shanghai")
- now := time.Now().In(loc)
- to = now.Format("2006-01-02")
- from = now.AddDate(0, 0, -6).Format("2006-01-02")
- }
- res, err := ac.analytics.GetSummary(from, to)
- if err != nil {
- c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
- return
- }
- c.JSON(http.StatusOK, res)
- }
- type widgetOpenRequest struct {
- VisitorID uint `json:"visitor_id"`
- }
- // PostWidgetOpen POST /visitor/analytics/widget-open — 访客打开小窗时上报(无需登录)
- func (ac *AnalyticsController) PostWidgetOpen(c *gin.Context) {
- var req widgetOpenRequest
- if err := c.ShouldBindJSON(&req); err != nil || req.VisitorID == 0 {
- c.JSON(http.StatusBadRequest, gin.H{"error": "请提供有效的 visitor_id"})
- return
- }
- if err := ac.analytics.RecordWidgetOpen(req.VisitorID); err != nil {
- c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
- return
- }
- c.JSON(http.StatusOK, gin.H{"ok": true})
- }
|