package service import ( "log" "time" ) // StatistTaskScheduler 统计任务调度器 type StatistTaskScheduler struct { taskService *StatistTaskService } // NewStatistTaskScheduler 创建统计任务调度器 func NewStatistTaskScheduler() *StatistTaskScheduler { return &StatistTaskScheduler{ taskService: &StatistTaskService{}, } } // Start 启动定时任务调度器 func (s *StatistTaskScheduler) Start() { log.Println("统计任务调度器启动") // 立即执行一次生成昨天的统计数据 go func() { if err := s.taskService.GenerateDailyStat(); err != nil { log.Printf("生成每日统计失败: %v", err) } }() // 每天凌晨2点执行生成前一天的统计数据 ticker := time.NewTicker(1 * time.Hour) // 每小时检查一次是否到了凌晨2点 defer ticker.Stop() var lastRunDate string for range ticker.C { now := time.Now() currentDateStr := now.Format("2006-01-02") hour := now.Hour() // 如果是凌晨2点且今天还没运行过 if hour == 2 && currentDateStr != lastRunDate { go func(date string) { log.Printf("开始执行每日统计任务,日期: %s", date) if err := s.taskService.GenerateDailyStat(); err != nil { log.Printf("生成每日统计失败: %v", err) } else { log.Printf("每日统计任务执行成功,日期: %s", date) } }(currentDateStr) lastRunDate = currentDateStr } } }