package report import ( "context" "time" "github.com/gogf/gf/v2/os/gcron" "github.com/gogf/gf/v2/os/gctx" "github.com/sirupsen/logrus" ) // ExecDailyExtract 执行一次全量每日抽取(遍历所有启用业务+报表) // 提取出独立函数,供定时任务和 HTTP 端点共同使用 func ExecDailyExtract(ctx context.Context) { svc := GetService() logrus.Info("[报表引擎] 开始全量每日抽取任务") businesses, err := svc.GetAllBusinesses(ctx) if err != nil { logrus.Errorf("[报表引擎] 获取业务列表失败: %v", err) return } yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02") for _, biz := range businesses { reports, err := svc.GetAllReports(ctx, biz.BusinessCode) if err != nil { logrus.Errorf("[报表引擎] 获取报表列表失败 [%s]: %v", biz.BusinessCode, err) continue } for _, rpt := range reports { logrus.Infof("[报表引擎] 开始抽取 %s/%s 日期 %s", biz.BusinessCode, rpt.ReportCode, yesterday) resp, err := svc.ExtractDailyData(ctx, biz.BusinessCode, rpt.ReportCode, yesterday, "system") if err != nil { logrus.Errorf("[报表引擎] 抽取失败 %s/%s %s: %v", biz.BusinessCode, rpt.ReportCode, yesterday, err) continue } if resp.Success { logrus.Infof("[报表引擎] 抽取成功 %s/%s %s 总数:%d 耗时:%dms", biz.BusinessCode, rpt.ReportCode, yesterday, resp.TotalCount, resp.ExecTimeMs) } else { logrus.Errorf("[报表引擎] 抽取异常 %s/%s %s: %s", biz.BusinessCode, rpt.ReportCode, yesterday, resp.ErrorMsg) } } } logrus.Info("[报表引擎] 全量每日抽取任务完成") } // StartDailyExtractJob 启动每日自动抽取定时任务 // 每天凌晨 2:00 遍历所有已启用的业务+报表,抽取前一天数据 // 在 main.go 中调用:report.StartDailyExtractJob() func StartDailyExtractJob() { // 每天凌晨 2:00 执行 _, err := gcron.Add(gctx.New(), "0 0 2 * * *", func(ctx context.Context) { ExecDailyExtract(ctx) }, "daily-report-extract") if err != nil { logrus.Errorf("[报表引擎] 启动定时任务失败: %v", err) return } logrus.Info("[报表引擎] 每日自动抽取定时任务已启动 (02:00)") }