198 lines
6.6 KiB
Go
198 lines
6.6 KiB
Go
package radio
|
|
|
|
import (
|
|
"sundynix-go/global"
|
|
"sundynix-go/model/commom/response"
|
|
"sundynix-go/model/radio/request"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type AnalyticsApi struct{}
|
|
|
|
// GetListeningTrend 获取收听趋势
|
|
// @Tags 数据分析
|
|
// @Summary 获取收听趋势(折线图)
|
|
// @Produce application/json
|
|
// @Param startDate query string false "开始日期 2026-01-01"
|
|
// @Param endDate query string false "结束日期 2026-03-10"
|
|
// @Param channelId query string false "频道ID(可选筛选)"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/listening-trend [get]
|
|
func (a *AnalyticsApi) GetListeningTrend(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
if err := c.ShouldBindQuery(&req); err != nil {
|
|
response.FailWithMsg("参数错误: "+err.Error(), c)
|
|
return
|
|
}
|
|
data, err := analyticsService.GetListeningTrend(req.StartDate, req.EndDate, req.ChannelId)
|
|
if err != nil {
|
|
global.Logger.Error("获取收听趋势失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetSubscriptionTrend 获取订阅趋势
|
|
// @Tags 数据分析
|
|
// @Summary 获取订阅趋势(折线图)
|
|
// @Produce application/json
|
|
// @Param startDate query string false "开始日期"
|
|
// @Param endDate query string false "结束日期"
|
|
// @Param channelId query string false "频道ID"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/subscription-trend [get]
|
|
func (a *AnalyticsApi) GetSubscriptionTrend(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
if err := c.ShouldBindQuery(&req); err != nil {
|
|
response.FailWithMsg("参数错误: "+err.Error(), c)
|
|
return
|
|
}
|
|
data, err := analyticsService.GetSubscriptionTrend(req.StartDate, req.EndDate, req.ChannelId)
|
|
if err != nil {
|
|
global.Logger.Error("获取订阅趋势失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetRenewalTrend 获取续费趋势
|
|
// @Tags 数据分析
|
|
// @Summary 获取续费趋势(折线图)
|
|
// @Produce application/json
|
|
// @Param startDate query string false "开始日期"
|
|
// @Param endDate query string false "结束日期"
|
|
// @Param channelId query string false "频道ID"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/renewal-trend [get]
|
|
func (a *AnalyticsApi) GetRenewalTrend(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
if err := c.ShouldBindQuery(&req); err != nil {
|
|
response.FailWithMsg("参数错误: "+err.Error(), c)
|
|
return
|
|
}
|
|
data, err := analyticsService.GetRenewalTrend(req.StartDate, req.EndDate, req.ChannelId)
|
|
if err != nil {
|
|
global.Logger.Error("获取续费趋势失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetSubscriberStats 获取订阅用户统计
|
|
// @Tags 数据分析
|
|
// @Summary 获取订阅用户统计(折线图 + 概览)
|
|
// @Produce application/json
|
|
// @Param startDate query string false "开始日期"
|
|
// @Param endDate query string false "结束日期"
|
|
// @Param channelId query string false "频道ID"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/subscriber-stats [get]
|
|
func (a *AnalyticsApi) GetSubscriberStats(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
if err := c.ShouldBindQuery(&req); err != nil {
|
|
response.FailWithMsg("参数错误: "+err.Error(), c)
|
|
return
|
|
}
|
|
data, err := analyticsService.GetSubscriberStats(req.StartDate, req.EndDate, req.ChannelId)
|
|
if err != nil {
|
|
global.Logger.Error("获取订阅用户统计失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetContentQuality 获取内容质量分析
|
|
// @Tags 数据分析
|
|
// @Summary 获取内容质量分析(完播率等)
|
|
// @Param channelId query string false "频道ID"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/content-quality [get]
|
|
func (a *AnalyticsApi) GetContentQuality(c *gin.Context) {
|
|
channelId := c.Query("channelId")
|
|
data, err := analyticsService.GetContentQuality(channelId)
|
|
if err != nil {
|
|
global.Logger.Error("获取内容质量分析失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetUserStickiness 获取用户留存分析
|
|
// @Tags 数据分析
|
|
// @Summary 获取用户留存分析 (Cohort)
|
|
// @Param startDate query string false "开始日期"
|
|
// @Param endDate query string false "结束日期"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/user-stickiness [get]
|
|
func (a *AnalyticsApi) GetUserStickiness(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
c.ShouldBindQuery(&req)
|
|
data, err := analyticsService.GetUserStickiness(req.StartDate, req.EndDate)
|
|
if err != nil {
|
|
global.Logger.Error("获取用户留存分析失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetBusinessConversion 获取商业转化分析
|
|
// @Tags 数据分析
|
|
// @Summary 获取商业转化分析 (Funnel & LTV)
|
|
// @Param startDate query string false "开始日期"
|
|
// @Param endDate query string false "结束日期"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/business-conversion [get]
|
|
func (a *AnalyticsApi) GetBusinessConversion(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
c.ShouldBindQuery(&req)
|
|
data, err := analyticsService.GetBusinessConversion(req.StartDate, req.EndDate)
|
|
if err != nil {
|
|
global.Logger.Error("获取商业转化分析失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetPreferenceAnalysis 获取品类偏好分析
|
|
// @Tags 数据分析
|
|
// @Summary 获取品类偏好分析
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/preference [get]
|
|
func (a *AnalyticsApi) GetPreferenceAnalysis(c *gin.Context) {
|
|
data, err := analyticsService.GetPreferenceAnalysis()
|
|
if err != nil {
|
|
global.Logger.Error("获取品类偏好分析失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|
|
|
|
// GetVipStats 获取VIP统计数据
|
|
// @Tags 数据分析
|
|
// @Summary 获取VIP统计数据
|
|
// @Param startDate query string false "开始日期"
|
|
// @Param endDate query string false "结束日期"
|
|
// @Success 200 {object} response.Response
|
|
// @Router /radio/analytics/vip-stats [get]
|
|
func (a *AnalyticsApi) GetVipStats(c *gin.Context) {
|
|
var req request.TrendQuery
|
|
c.ShouldBindQuery(&req)
|
|
data, err := analyticsService.GetVipStats(req.StartDate, req.EndDate)
|
|
if err != nil {
|
|
global.Logger.Error("获取VIP统计数据失败!", zap.Error(err))
|
|
response.FailWithMsg(err.Error(), c)
|
|
return
|
|
}
|
|
response.OkWithData(data, c)
|
|
}
|