Files
2026-07-16 14:34:06 +08:00

70 lines
2.2 KiB
Go

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)")
}