69 lines
2.1 KiB
Go
69 lines
2.1 KiB
Go
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
|
||
}
|