This commit is contained in:
2026-04-29 11:38:59 +08:00
parent e96e3f9583
commit 7d363f4e8a
30 changed files with 1135 additions and 215 deletions

View File

@@ -0,0 +1,68 @@
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
}