package polling import ( "context" "time" "go.uber.org/zap" packagepkg "github.com/break/junhong_cmp_fiber/internal/service/package" ) // DataResetHandler 流量重置调度处理器 // 任务 20: 定期检查需要重置的套餐并调用 ResetService 执行重置 type DataResetHandler struct { resetService *packagepkg.ResetService logger *zap.Logger // 上次执行时间(用于限流,避免重复执行) lastDailyReset time.Time lastMonthlyReset time.Time lastYearlyReset time.Time } // NewDataResetHandler 创建流量重置调度处理器 func NewDataResetHandler( resetService *packagepkg.ResetService, logger *zap.Logger, ) *DataResetHandler { return &DataResetHandler{ resetService: resetService, logger: logger, } } // HandleDataReset 任务 20.2: 处理流量重置调度 // 每 10 秒被 Scheduler 调用一次,检查是否需要执行日/月/年重置 func (h *DataResetHandler) HandleDataReset(ctx context.Context) error { now := time.Now() // 任务 20.3: 日重置调度(每分钟检查一次,避免频繁查询数据库) if now.Sub(h.lastDailyReset) >= time.Minute { if err := h.processDailyReset(ctx); err != nil { h.logger.Warn("日重置调度失败", zap.Error(err)) } h.lastDailyReset = now } // 任务 20.4: 月重置调度(每分钟检查一次) if now.Sub(h.lastMonthlyReset) >= time.Minute { if err := h.processMonthlyReset(ctx); err != nil { h.logger.Warn("月重置调度失败", zap.Error(err)) } h.lastMonthlyReset = now } // 任务 20.5: 年重置调度(每分钟检查一次) if now.Sub(h.lastYearlyReset) >= time.Minute { if err := h.processYearlyReset(ctx); err != nil { h.logger.Warn("年重置调度失败", zap.Error(err)) } h.lastYearlyReset = now } return nil } // processDailyReset 任务 20.3: 日重置调度 func (h *DataResetHandler) processDailyReset(ctx context.Context) error { if h.resetService == nil { return nil } startTime := time.Now() if err := h.resetService.ResetDailyUsage(ctx); err != nil { return err } h.logger.Info("日重置调度完成", zap.Duration("duration", time.Since(startTime))) return nil } // processMonthlyReset 任务 20.4: 月重置调度 func (h *DataResetHandler) processMonthlyReset(ctx context.Context) error { if h.resetService == nil { return nil } startTime := time.Now() if err := h.resetService.ResetMonthlyUsage(ctx); err != nil { return err } h.logger.Info("月重置调度完成", zap.Duration("duration", time.Since(startTime))) return nil } // processYearlyReset 任务 20.5: 年重置调度 func (h *DataResetHandler) processYearlyReset(ctx context.Context) error { if h.resetService == nil { return nil } startTime := time.Now() if err := h.resetService.ResetYearlyUsage(ctx); err != nil { return err } h.logger.Info("年重置调度完成", zap.Duration("duration", time.Since(startTime))) return nil }