71 lines
2.4 KiB
Go
71 lines
2.4 KiB
Go
|
|
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{}
|
|||
|
|
}
|