All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
**变更说明**: - 删除所有 *_test.go 文件(单元测试、集成测试、验收测试、流程测试) - 删除整个 tests/ 目录 - 更新 CLAUDE.md:用"测试禁令"章节替换所有测试要求 - 删除测试生成 Skill (openspec-generate-acceptance-tests) - 删除测试生成命令 (opsx:gen-tests) - 更新 tasks.md:删除所有测试相关任务 **新规范**: - ❌ 禁止编写任何形式的自动化测试 - ❌ 禁止创建 *_test.go 文件 - ❌ 禁止在任务中包含测试相关工作 - ✅ 仅当用户明确要求时才编写测试 **原因**: 业务系统的正确性通过人工验证和生产环境监控保证,测试代码维护成本高于价值。 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
117 lines
2.9 KiB
Go
117 lines
2.9 KiB
Go
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
|
|
}
|