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,70 @@
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{}
}