56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
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
|
|
}
|
|
}
|
|
}
|