vip权限枚举类修改
This commit is contained in:
parent
b58ff31f76
commit
206383602d
@ -65,6 +65,14 @@ public enum SysNobleVipTypeEnum {
|
|||||||
.orElse(StringUtils.UNKNOWN);
|
.orElse(StringUtils.UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 根据名称返回枚举对象,找不到返回 null */
|
||||||
|
public static SysNobleVipTypeEnum getByName(String name) {
|
||||||
|
return Arrays.stream(SysNobleVipTypeEnum.values())
|
||||||
|
.filter(v -> Objects.equals(v.getName(), name))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,19 @@
|
|||||||
package com.red.circle.other.app.command.user.query;
|
package com.red.circle.other.app.command.user.query;
|
||||||
|
|
||||||
import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd;
|
import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd;
|
||||||
|
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.sys.CustomerServiceConfig;
|
import com.red.circle.other.infra.database.mongo.entity.sys.CustomerServiceConfig;
|
||||||
import com.red.circle.other.infra.database.mongo.service.sys.CustomerServiceConfigService;
|
import com.red.circle.other.infra.database.mongo.service.sys.CustomerServiceConfigService;
|
||||||
|
import com.red.circle.other.infra.database.mongo.service.user.profile.UserVipAbilitySettingService;
|
||||||
import com.red.circle.other.infra.database.rds.service.sys.AdministratorService;
|
import com.red.circle.other.infra.database.rds.service.sys.AdministratorService;
|
||||||
import com.red.circle.other.infra.database.rds.service.user.user.RelationshipFriendService;
|
import com.red.circle.other.infra.database.rds.service.user.user.RelationshipFriendService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.red.circle.other.inner.enums.material.SysNobleVipTypeEnum;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -24,8 +29,14 @@ public class FriendCheckQryExe {
|
|||||||
private final AdministratorService administratorService;
|
private final AdministratorService administratorService;
|
||||||
private final RelationshipFriendService relationshipFriendService;
|
private final RelationshipFriendService relationshipFriendService;
|
||||||
private final CustomerServiceConfigService customerServiceConfigService;
|
private final CustomerServiceConfigService customerServiceConfigService;
|
||||||
|
private final UserVipAbilitySettingService userVipAbilitySettingService;
|
||||||
|
private final UserProfileGateway userProfileGateway;
|
||||||
|
|
||||||
public Boolean execute(AppUserIdCmd cmd) {
|
public Boolean execute(AppUserIdCmd cmd) {
|
||||||
|
Long reqUserId = cmd.requiredReqUserId();
|
||||||
|
Long targetUserId = cmd.getUserId();
|
||||||
|
|
||||||
|
// 1. 管理员优先
|
||||||
Boolean isAdmin = administratorService.existsAvailable(
|
Boolean isAdmin = administratorService.existsAvailable(
|
||||||
Set.of(cmd.requiredReqUserId(), cmd.getUserId()));
|
Set.of(cmd.requiredReqUserId(), cmd.getUserId()));
|
||||||
|
|
||||||
@ -33,12 +44,35 @@ public class FriendCheckQryExe {
|
|||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2. 客服配置优先
|
||||||
List<CustomerServiceConfig> configList = customerServiceConfigService.list(cmd.getReqSysOrigin().getOrigin(), "");
|
List<CustomerServiceConfig> configList = customerServiceConfigService.list(cmd.getReqSysOrigin().getOrigin(), "");
|
||||||
boolean match = configList.stream().anyMatch(c -> c.getUserId().equals(cmd.getUserId()) || c.getUserId().equals(cmd.getReqUserId()));
|
boolean match = configList.stream().anyMatch(c -> c.getUserId().equals(cmd.getUserId()) || c.getUserId().equals(cmd.getReqUserId()));
|
||||||
if (match) {
|
if (match) {
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. ContactMode
|
||||||
|
ContactMode contactMode = userVipAbilitySettingService.getContactMode(reqUserId);
|
||||||
|
|
||||||
|
// 4. 拒绝联系
|
||||||
|
if (ContactMode.DO_NOT_DISTURB.equals(contactMode)) {
|
||||||
|
// 检查是否好友
|
||||||
|
boolean isFriend = relationshipFriendService.checkFriend(reqUserId, targetUserId);
|
||||||
|
if (!isFriend) {
|
||||||
|
return Boolean.FALSE;
|
||||||
|
}
|
||||||
|
// 好友可以联系
|
||||||
|
return Boolean.TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. VIP2_ABOVE / VIP5_ABOVE → 限制联系对象 VIP 等级
|
||||||
|
String targetVipLevel = userProfileGateway.getUserVipName(targetUserId);
|
||||||
|
// 检查联系对象 VIP 等级
|
||||||
|
SysNobleVipTypeEnum targetVip = SysNobleVipTypeEnum.getByName(targetVipLevel);
|
||||||
|
if (contactMode.getMinTargetVipLevel() != null && (targetVip == null || targetVip.ordinal() < contactMode.getMinTargetVipLevel().ordinal())) {
|
||||||
|
return false; // 目标等级不够
|
||||||
|
}
|
||||||
|
|
||||||
return relationshipFriendService
|
return relationshipFriendService
|
||||||
.checkFriend(cmd.requiredReqUserId(), cmd.getUserId());
|
.checkFriend(cmd.requiredReqUserId(), cmd.getUserId());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,9 @@ import com.red.circle.other.infra.database.mongo.entity.user.profile.UserVipAbil
|
|||||||
import com.red.circle.other.infra.database.mongo.service.user.profile.UserVipAbilitySettingService;
|
import com.red.circle.other.infra.database.mongo.service.user.profile.UserVipAbilitySettingService;
|
||||||
import com.red.circle.other.domain.enums.VipAbilityType;
|
import com.red.circle.other.domain.enums.VipAbilityType;
|
||||||
import com.red.circle.other.domain.enums.ContactMode;
|
import com.red.circle.other.domain.enums.ContactMode;
|
||||||
|
import com.red.circle.other.inner.enums.material.SysNobleVipTypeEnum;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -29,29 +31,20 @@ public class UserVipAbilityCmdExe {
|
|||||||
Boolean mysteriousInvisibility = VipAbilityType.MYSTERIOUS_INVISIBILITY.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getMysteriousInvisibility());
|
Boolean mysteriousInvisibility = VipAbilityType.MYSTERIOUS_INVISIBILITY.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getMysteriousInvisibility());
|
||||||
Boolean antiBlock = VipAbilityType.ANTI_BLOCK.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getAntiBlock());
|
Boolean antiBlock = VipAbilityType.ANTI_BLOCK.hasAbility(vipLevel) && Boolean.TRUE.equals(cmd.getAntiBlock());
|
||||||
|
|
||||||
// ContactMode 单选互斥逻辑
|
// ContactMode 单选互斥逻辑,默认 EVERYONE
|
||||||
String contactMode = cmd.getContactMode();
|
ContactMode selectedMode = cmd.getContactMode() != null
|
||||||
if (contactMode == null) {
|
? ContactMode.valueOf(cmd.getContactMode())
|
||||||
contactMode = ContactMode.EVERYONE.name();
|
: ContactMode.EVERYONE;
|
||||||
}
|
|
||||||
|
|
||||||
// DO_NOT_DISTURB 与其他模式互斥
|
// 获取用户 VIP 等级枚举
|
||||||
if (ContactMode.DO_NOT_DISTURB.name().equals(contactMode)) {
|
SysNobleVipTypeEnum vipEnum = SysNobleVipTypeEnum.getByName(vipLevel);
|
||||||
// 用户选择拒绝所有人联系
|
|
||||||
contactMode = ContactMode.DO_NOT_DISTURB.name();
|
ContactMode finalMode = getContactMode(selectedMode, vipEnum);
|
||||||
} else {
|
|
||||||
// 非 VIP 等级不可选择高级模式
|
|
||||||
if (ContactMode.VIP2_ABOVE.name().equals(contactMode) && (vipLevel == null || vipLevel.compareTo("EARL") < 0)) {
|
|
||||||
contactMode = ContactMode.EVERYONE.name();
|
|
||||||
} else if (ContactMode.VIP5_ABOVE.name().equals(contactMode) && (vipLevel == null || vipLevel.compareTo("KING") < 0)) {
|
|
||||||
contactMode = ContactMode.EVERYONE.name();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建 MongoDB 对象
|
// 构建 MongoDB 对象
|
||||||
UserVipAbilitySetting setting = new UserVipAbilitySetting();
|
UserVipAbilitySetting setting = new UserVipAbilitySetting();
|
||||||
setting.setUserId(userId);
|
setting.setUserId(userId);
|
||||||
setting.setContactMode(contactMode);
|
setting.setContactMode(String.valueOf(finalMode));
|
||||||
setting.setKickPrevention(kickPrevention);
|
setting.setKickPrevention(kickPrevention);
|
||||||
setting.setMysteriousInvisibility(mysteriousInvisibility);
|
setting.setMysteriousInvisibility(mysteriousInvisibility);
|
||||||
setting.setAntiBlock(antiBlock);
|
setting.setAntiBlock(antiBlock);
|
||||||
@ -60,4 +53,25 @@ public class UserVipAbilityCmdExe {
|
|||||||
// 执行 upsert
|
// 执行 upsert
|
||||||
userVipAbilitySettingService.upsert(setting);
|
userVipAbilitySettingService.upsert(setting);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static ContactMode getContactMode(ContactMode selectedMode, SysNobleVipTypeEnum vipEnum) {
|
||||||
|
ContactMode finalMode;
|
||||||
|
|
||||||
|
if (selectedMode == ContactMode.DO_NOT_DISTURB) {
|
||||||
|
// 用户选择拒绝所有人联系,直接生效
|
||||||
|
finalMode = ContactMode.DO_NOT_DISTURB;
|
||||||
|
} else if (selectedMode.getMinTargetVipLevel() != null) {
|
||||||
|
// 高等级模式,检查 VIP 等级是否满足要求
|
||||||
|
if (vipEnum == null || vipEnum.ordinal() < selectedMode.getMinTargetVipLevel().ordinal()) {
|
||||||
|
finalMode = ContactMode.EVERYONE; // 等级不足回退
|
||||||
|
} else {
|
||||||
|
finalMode = selectedMode; // 等级足够
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 普通模式或没有限制
|
||||||
|
finalMode = selectedMode;
|
||||||
|
}
|
||||||
|
return finalMode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -1,8 +1,32 @@
|
|||||||
package com.red.circle.other.domain.enums;
|
package com.red.circle.other.domain.enums;
|
||||||
|
|
||||||
|
import com.red.circle.other.inner.enums.material.SysNobleVipTypeEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系权限模式
|
||||||
|
*/
|
||||||
public enum ContactMode {
|
public enum ContactMode {
|
||||||
EVERYONE,
|
|
||||||
VIP2_ABOVE,
|
/** 所有人可联系 */
|
||||||
VIP5_ABOVE,
|
EVERYONE(null),
|
||||||
DO_NOT_DISTURB
|
|
||||||
|
/** 仅 VIP2 及以上可联系 */
|
||||||
|
VIP2_ABOVE(SysNobleVipTypeEnum.EARL),
|
||||||
|
|
||||||
|
/** 仅 VIP5 及以上可联系 */
|
||||||
|
VIP5_ABOVE(SysNobleVipTypeEnum.KING),
|
||||||
|
|
||||||
|
/** 拒绝非好友联系 */
|
||||||
|
DO_NOT_DISTURB(null);
|
||||||
|
|
||||||
|
/** 最低允许被联系的 VIP 等级,null 表示不限制 */
|
||||||
|
private final SysNobleVipTypeEnum minTargetVipLevel;
|
||||||
|
|
||||||
|
ContactMode(SysNobleVipTypeEnum minTargetVipLevel) {
|
||||||
|
this.minTargetVipLevel = minTargetVipLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysNobleVipTypeEnum getMinTargetVipLevel() {
|
||||||
|
return minTargetVipLevel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user