vip开关设置更改

This commit is contained in:
tianfeng 2026-03-19 15:17:09 +08:00
parent ad741c84c5
commit 2056775fff
4 changed files with 46 additions and 22 deletions

View File

@ -25,20 +25,31 @@ public class UserVipAbilityCmdExe {
// 获取用户 VIP 等级
String vipLevel = userProfileGateway.getUserVipName(userId);
// 功能开关结合 VIP 等级判断是否可用
Boolean kickPrevention = VipAbilityType.KICK_PREVENTION.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getKickPrevention());
Boolean mysteriousInvisibility = VipAbilityType.MYSTERIOUS_INVISIBILITY.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getMysteriousInvisibility());
Boolean antiBlock = VipAbilityType.ANTI_BLOCK.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getAntiBlock());
// ContactMode 单选互斥逻辑默认 EVERYONE
ContactMode selectedMode = cmd.getContactMode() != null
? ContactMode.valueOf(cmd.getContactMode())
: ContactMode.EVERYONE;
// 获取用户 VIP 等级枚举
SysNobleVipTypeEnum vipEnum = SysNobleVipTypeEnum.getByName(vipLevel);
// 取已有配置前端未传的字段保持原值
UserVipAbilitySetting existing = userVipAbilitySettingService.findByUserId(userId);
// 功能开关前端传了才更新没传保持原值同时结合 VIP 等级限制
Boolean kickPrevention = resolveSwitch(cmd.getKickPrevention(),
existing != null ? existing.getKickPrevention() : Boolean.TRUE,
VipAbilityType.KICK_PREVENTION.hasAbility(vipLevel));
Boolean mysteriousInvisibility = resolveSwitch(cmd.getMysteriousInvisibility(),
existing != null ? existing.getMysteriousInvisibility() : Boolean.TRUE,
VipAbilityType.MYSTERIOUS_INVISIBILITY.hasAbility(vipLevel));
Boolean antiBlock = resolveSwitch(cmd.getAntiBlock(),
existing != null ? existing.getAntiBlock() : Boolean.TRUE,
VipAbilityType.ANTI_BLOCK.hasAbility(vipLevel));
// ContactMode前端未传保持原值
ContactMode selectedMode;
if (cmd.getContactMode() != null) {
selectedMode = ContactMode.valueOf(cmd.getContactMode());
} else if (existing != null && existing.getContactMode() != null) {
selectedMode = ContactMode.valueOf(existing.getContactMode());
} else {
selectedMode = ContactMode.EVERYONE;
}
ContactMode finalMode = getContactMode(selectedMode, vipEnum);
// 构建 MongoDB 对象
@ -54,6 +65,18 @@ public class UserVipAbilityCmdExe {
userVipAbilitySettingService.upsert(setting);
}
/**
* 前端传了值则取前端值结合VIP等级限制未传则保持原值.
*/
private Boolean resolveSwitch(Boolean cmdValue, Boolean existingValue, boolean hasVipLevel) {
if (cmdValue == null) {
// 未传保持原值但如果VIP等级不够则强制关闭
return hasVipLevel && Boolean.TRUE.equals(existingValue);
}
// 传了结合VIP等级
return hasVipLevel && Boolean.TRUE.equals(cmdValue);
}
@NotNull
private static ContactMode getContactMode(ContactMode selectedMode, SysNobleVipTypeEnum vipEnum) {
ContactMode finalMode;

View File

@ -2,6 +2,7 @@ package com.red.circle.other.app.command.user.vip;
import com.red.circle.other.app.dto.clientobject.user.vip.UserVipAbilityCO;
import com.red.circle.other.app.convertor.user.UserVipAbilityAppConvertor;
import com.red.circle.other.domain.enums.ContactMode;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.infra.database.mongo.entity.user.profile.UserVipAbilitySetting;
import com.red.circle.other.infra.database.mongo.service.user.profile.UserVipAbilitySettingService;
@ -9,7 +10,6 @@ import com.red.circle.other.domain.enums.VipAbilityType;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 查询用户 VIP 设置
@ -27,7 +27,7 @@ public class UserVipAbilityQryExe {
if (setting == null) {
setting = new UserVipAbilitySetting();
setting.setUserId(userId);
setting.setContactMode("EVERYONE");
setting.setContactMode(ContactMode.EVERYONE.name());
setting.setKickPrevention(true);
setting.setMysteriousInvisibility(true);
setting.setAntiBlock(true);

View File

@ -13,15 +13,18 @@ public class UserVipAbilitySetting {
@Id
private Long userId;
/**
* 联系模式枚举: EVERYONE, VIP2_ABOVE, VIP5_ABOVE, DO_NOT_DISTURB
*/
/** 联系权限模式: EVERYONE / VIP2_ABOVE / VIP5_ABOVE / DO_NOT_DISTURB */
private String contactMode;
/** 功能开关 */
/** 防踢开关 */
private Boolean kickPrevention;
/** 排行榜隐身开关 */
private Boolean mysteriousInvisibility;
/** 防拉黑开关 */
private Boolean antiBlock;
/** 最后更新时间 */
private Date updateTime;
}

View File

@ -506,10 +506,8 @@ public class UserProfileGatewayImpl implements UserProfileGateway {
@Override
public boolean getUserVipAbility(Long userId, VipAbilityType abilityType) {
if (!inWhiteList(userId)) return false;
boolean hasVipLevel = abilityType.hasAbility(resolveUserVipName(userId));
boolean switchOn = userVipAbilitySettingService.isEnabled(userId, abilityType);
return hasVipLevel && switchOn;
if (!abilityType.hasAbility(resolveUserVipName(userId))) return false;
return userVipAbilitySettingService.isEnabled(userId, abilityType);
}
@Override