package queue import ( "context" "time" "bdrp-server/app/main/api/internal/service" "bdrp-server/app/main/api/internal/svc" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" ) type AgentMembershipExpireScanHandler struct { svcCtx *svc.ServiceContext } func NewAgentMembershipExpireScanHandler(svcCtx *svc.ServiceContext) *AgentMembershipExpireScanHandler { return &AgentMembershipExpireScanHandler{ svcCtx: svcCtx, } } func (l *AgentMembershipExpireScanHandler) ProcessTask(ctx context.Context, t *asynq.Task) error { now := time.Now() dayStart := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) dayEnd := dayStart.Add(24*time.Hour - time.Second) // 1. 扫描当天将到期会员,并为每个会员安排准点处理任务 todayAgents, err := service.ListTodayWillExpireAgents(ctx, l.svcCtx.AgentModel, dayStart, dayEnd) if err != nil { logx.Errorf("扫描当天到期会员失败: %v", err) return err } for _, agent := range todayAgents { processAt := agent.MembershipExpiryTime.Time if processAt.Before(now) { processAt = now } if l.svcCtx.AsynqService != nil { if sendErr := l.svcCtx.AsynqService.SendAgentMembershipExpireHandleTask(agent.Id, processAt); sendErr != nil { logx.Errorf("安排会员到期处理任务失败,代理ID: %d, 错误: %v", agent.Id, sendErr) } } } // 2. 补偿处理:扫描已过期但尚未降级的会员并立即降级 expiredAgents, err := service.ListExpiredUnprocessedAgents(ctx, l.svcCtx.AgentModel, now) if err != nil { logx.Errorf("扫描已过期未处理会员失败: %v", err) return err } downgradedCount := 0 for _, agent := range expiredAgents { downgraded, degradeErr := service.DowngradeExpiredMembership(ctx, l.svcCtx.AgentModel, agent.Id, now) if degradeErr != nil { logx.Errorf("补偿降级失败,代理ID: %d, 错误: %v", agent.Id, degradeErr) continue } if downgraded { downgradedCount++ } } logx.Infof("会员到期扫描完成,当天到期会员: %d, 补偿降级数量: %d", len(todayAgents), downgradedCount) return nil }