daShangDao_psiServer/service/StatistTaskScheduler.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
}
}
}