package job import ( "context" "time" "github.com/go-nunu/nunu-layout-advanced/internal/service" "github.com/go-nunu/nunu-layout-advanced/pkg/log" ) // ShardingJob 分表管理定时任务 type ShardingJob struct { shardingService service.ShardingService logger *log.Logger } func NewShardingJob( shardingService service.ShardingService, logger *log.Logger, ) *ShardingJob { return &ShardingJob{ shardingService: shardingService, logger: logger, } } // InitSharding 初始化分表(启动时执行一次) func (j *ShardingJob) InitSharding() { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() j.logger.Info("执行分表初始化任务...") err := j.shardingService.InitializeSharding(ctx) if err != nil { j.logger.Error("分表初始化失败: " + err.Error()) } else { j.logger.Info("分表初始化完成") } } // CleanOldTables 清理过期分表(定时执行) func (j *ShardingJob) CleanOldTables() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() j.logger.Info("执行分表清理任务...") err := j.shardingService.CleanOldTables(ctx) if err != nil { j.logger.Error("分表清理失败: " + err.Error()) } else { j.logger.Info("分表清理完成") } } // CheckNewPeriodTables 检查是否需要创建新周期的分表(每月第一天执行) func (j *ShardingJob) CheckNewPeriodTables() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() j.logger.Info("检查是否需要创建新周期分表...") // 检查是否是月初第一天 now := time.Now() if now.Day() != 1 { j.logger.Info("不是月初第一天,跳过新周期分表检查") return } err := j.shardingService.InitializeSharding(ctx) if err != nil { j.logger.Error("新周期分表创建失败: " + err.Error()) } else { j.logger.Info("新周期分表检查完成") } }