Files
bdrp-server/app/main/api/internal/service/agentMembershipService.go
2026-04-29 11:38:59 +08:00

71 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"context"
"database/sql"
"time"
"bdrp-server/app/main/model"
"bdrp-server/common/globalkey"
)
// IsMembershipExpired 判断代理会员是否已过期仅VIP/SVIP会被判定
func IsMembershipExpired(agent *model.Agent, now time.Time) bool {
if agent == nil {
return false
}
if agent.LevelName != model.AgentLeveNameVIP && agent.LevelName != model.AgentLeveNameSVIP {
return false
}
if !agent.MembershipExpiryTime.Valid {
return true
}
return !agent.MembershipExpiryTime.Time.After(now)
}
// DowngradeExpiredMembership 将已过期会员降级为普通代理,返回是否发生了降级
func DowngradeExpiredMembership(ctx context.Context, agentModel model.AgentModel, agentID int64, now time.Time) (bool, error) {
agent, err := agentModel.FindOne(ctx, agentID)
if err != nil {
return false, err
}
if !IsMembershipExpired(agent, now) {
return false, nil
}
agent.LevelName = model.AgentLeveNameNormal
ClearMembershipOnDowngrade(agent)
agent.UpdateTime = now
if err = agentModel.UpdateWithVersion(ctx, nil, agent); err != nil {
return false, err
}
return true, nil
}
// ListTodayWillExpireAgents 查询当天将到期的VIP/SVIP代理
func ListTodayWillExpireAgents(ctx context.Context, agentModel model.AgentModel, start, end time.Time) ([]*model.Agent, error) {
builder := agentModel.SelectBuilder().
Where("level_name IN (?, ?)", model.AgentLeveNameVIP, model.AgentLeveNameSVIP).
Where("membership_expiry_time IS NOT NULL").
Where("membership_expiry_time >= ?", start).
Where("membership_expiry_time <= ?", end).
Where("del_state = ?", globalkey.DelStateNo)
return agentModel.FindAll(ctx, builder, "membership_expiry_time ASC")
}
// ListExpiredUnprocessedAgents 查询已过期但仍为VIP/SVIP的代理
func ListExpiredUnprocessedAgents(ctx context.Context, agentModel model.AgentModel, now time.Time) ([]*model.Agent, error) {
builder := agentModel.SelectBuilder().
Where("level_name IN (?, ?)", model.AgentLeveNameVIP, model.AgentLeveNameSVIP).
Where("membership_expiry_time IS NOT NULL").
Where("membership_expiry_time <= ?", now).
Where("del_state = ?", globalkey.DelStateNo)
return agentModel.FindAll(ctx, builder, "membership_expiry_time ASC")
}
// ClearMembershipOnDowngrade 降级时清理会员有效期,避免脏状态
func ClearMembershipOnDowngrade(agent *model.Agent) {
agent.MembershipExpiryTime = sql.NullTime{}
}