2025-12-06 15:24:30 +08:00
|
|
|
|
package controller
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
2025-12-09 13:32:43 +08:00
|
|
|
|
"fmt"
|
2025-12-06 15:24:30 +08:00
|
|
|
|
|
2025-12-09 16:10:45 +08:00
|
|
|
|
"cid/model/dto"
|
|
|
|
|
|
"cid/service"
|
2025-12-06 15:24:30 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2025-12-08 16:56:38 +08:00
|
|
|
|
var StatReport = new(statReport)
|
2025-12-06 15:24:30 +08:00
|
|
|
|
|
|
|
|
|
|
type statReport struct{}
|
|
|
|
|
|
|
|
|
|
|
|
// GenerateReport 生成报表
|
|
|
|
|
|
func (c *statReport) GenerateReport(ctx context.Context, req *dto.ReportGenerateReq) (res *dto.ReportGenerateRes, err error) {
|
|
|
|
|
|
var resp *dto.ReportGenerateResp
|
|
|
|
|
|
|
|
|
|
|
|
switch req.ReportType {
|
|
|
|
|
|
case "daily":
|
|
|
|
|
|
resp, err = service.StatReport.GenerateDailyReport(ctx, req)
|
2025-12-09 13:32:43 +08:00
|
|
|
|
case "weekly":
|
|
|
|
|
|
resp, err = service.StatReport.GenerateWeeklyReport(ctx, req)
|
2025-12-06 15:24:30 +08:00
|
|
|
|
case "monthly":
|
|
|
|
|
|
resp, err = service.StatReport.GenerateMonthlyReport(ctx, req)
|
|
|
|
|
|
case "quarterly":
|
|
|
|
|
|
resp, err = service.StatReport.GenerateQuarterlyReport(ctx, req)
|
|
|
|
|
|
case "yearly":
|
|
|
|
|
|
resp, err = service.StatReport.GenerateYearlyReport(ctx, req)
|
|
|
|
|
|
default:
|
2025-12-09 13:32:43 +08:00
|
|
|
|
return nil, fmt.Errorf("不支持的报表类型: %s", req.ReportType)
|
2025-12-06 15:24:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &dto.ReportGenerateRes{
|
|
|
|
|
|
Data: resp,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetReportList 获取报表列表
|
|
|
|
|
|
func (c *statReport) GetReportList(ctx context.Context, req *dto.ReportListReq) (res *dto.ReportListRes, err error) {
|
|
|
|
|
|
resp, err := service.StatReport.GetReportList(ctx, req)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &dto.ReportListRes{
|
|
|
|
|
|
Data: resp,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetReportDetail 获取报表详情
|
|
|
|
|
|
func (c *statReport) GetReportDetail(ctx context.Context, req *dto.ReportDetailReq) (res *dto.ReportDetailRes, err error) {
|
|
|
|
|
|
resp, err := service.StatReport.GetReportDetail(ctx, req.ReportID)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &dto.ReportDetailRes{
|
|
|
|
|
|
Data: resp,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// QueryStats 统计查询
|
|
|
|
|
|
func (c *statReport) QueryStats(ctx context.Context, req *dto.StatQueryReq) (res *dto.StatQueryRes, err error) {
|
|
|
|
|
|
// 这里调用统计查询服务
|
|
|
|
|
|
// resp, err := service.StatReport.QueryStats(ctx, req)
|
|
|
|
|
|
// 暂时返回示例数据
|
|
|
|
|
|
resp := &dto.StatQueryResp{
|
|
|
|
|
|
Data: []*dto.StatDataPoint{
|
|
|
|
|
|
{
|
|
|
|
|
|
Date: "2024-01-01",
|
|
|
|
|
|
Impressions: 1000,
|
|
|
|
|
|
Clicks: 50,
|
|
|
|
|
|
Revenue: 500.0,
|
|
|
|
|
|
CTR: 5.0,
|
|
|
|
|
|
AvgDuration: 30.5,
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
Summary: &dto.StatSummary{
|
|
|
|
|
|
TotalImpressions: 1000,
|
|
|
|
|
|
TotalClicks: 50,
|
|
|
|
|
|
TotalRevenue: 500.0,
|
|
|
|
|
|
AvgCTR: 5.0,
|
|
|
|
|
|
AvgDuration: 30.5,
|
|
|
|
|
|
GrowthRate: &dto.GrowthRate{
|
|
|
|
|
|
Impressions: 10.5,
|
|
|
|
|
|
Clicks: 8.2,
|
|
|
|
|
|
Revenue: 12.3,
|
|
|
|
|
|
CTR: -1.2,
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &dto.StatQueryRes{
|
|
|
|
|
|
Data: resp,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// RealTimeStats 实时统计
|
|
|
|
|
|
func (c *statReport) RealTimeStats(ctx context.Context, req *dto.RealTimeStatReq) (res *dto.RealTimeStatRes, err error) {
|
|
|
|
|
|
// 这里调用实时统计服务
|
|
|
|
|
|
// resp, err := service.StatReport.GetRealTimeStats(ctx, req)
|
|
|
|
|
|
// 暂时返回示例数据
|
|
|
|
|
|
resp := &dto.RealTimeStatResp{
|
|
|
|
|
|
CurrentHour: &dto.HourlyStat{
|
|
|
|
|
|
Hour: "14:00",
|
|
|
|
|
|
Impressions: 120,
|
|
|
|
|
|
Clicks: 6,
|
|
|
|
|
|
Revenue: 60.0,
|
|
|
|
|
|
},
|
|
|
|
|
|
Last24Hours: []*dto.HourlyStat{
|
|
|
|
|
|
{
|
|
|
|
|
|
Hour: "13:00",
|
|
|
|
|
|
Impressions: 110,
|
|
|
|
|
|
Clicks: 5,
|
|
|
|
|
|
Revenue: 55.0,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
Hour: "12:00",
|
|
|
|
|
|
Impressions: 100,
|
|
|
|
|
|
Clicks: 4,
|
|
|
|
|
|
Revenue: 50.0,
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &dto.RealTimeStatRes{
|
|
|
|
|
|
Data: resp,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ExportReport 导出报表
|
2025-12-06 18:36:43 +08:00
|
|
|
|
func (c *statReport) ExportReport(ctx context.Context, req *dto.ExportReportReq) (res *dto.ExportReportRes, err error) {
|
2025-12-06 15:24:30 +08:00
|
|
|
|
// 获取报表详情
|
|
|
|
|
|
resp, err := service.StatReport.GetReportDetail(ctx, req.ReportID)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回导出数据,由上层处理HTTP响应
|
|
|
|
|
|
return &dto.ExportReportRes{
|
|
|
|
|
|
ReportData: resp,
|
|
|
|
|
|
}, nil
|
|
|
|
|
|
}
|