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{} }