70 lines
2.2 KiB
Go
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)")
|
|
}
|