From fcc8985d9aa0f690d2470de0e251383b4e4f1984 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 19 Mar 2026 19:33:39 +0800 Subject: [PATCH] =?UTF-8?q?VIP=E8=BF=87=E6=9C=9F=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=B8=8E=E8=AE=BE=E7=BD=AE=E4=B8=8D=E5=8C=B9=E9=85=8D=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/user/query/FriendCheckQryExe.java | 22 +++++- .../user/vip/UserVipAbilityQryExe.java | 77 ++++++++++++++++--- 2 files changed, 87 insertions(+), 12 deletions(-) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/FriendCheckQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/FriendCheckQryExe.java index 997c35b0..4403b190 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/FriendCheckQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/FriendCheckQryExe.java @@ -51,8 +51,11 @@ public class FriendCheckQryExe { return Boolean.TRUE; } - // 3. 取目标用户的 ContactMode设置 - ContactMode contactMode = userVipAbilitySettingService.getContactMode(targetUserId); + // 3. 取目标用户的 ContactMode,结合其 VIP 等级修正后取实际生效的配置 + ContactMode rawContactMode = userVipAbilitySettingService.getContactMode(targetUserId); + String targetVipName = userProfileGateway.getUserVipName(targetUserId); + SysNobleVipTypeEnum targetVipEnum = SysNobleVipTypeEnum.getByName(targetVipName); + ContactMode contactMode = resolveContactMode(rawContactMode, targetVipEnum); // 4. 拒绝联系 if (ContactMode.DO_NOT_DISTURB.equals(contactMode)) { @@ -76,4 +79,19 @@ public class FriendCheckQryExe { .checkFriend(cmd.requiredReqUserId(), cmd.getUserId()); } + private ContactMode resolveContactMode(ContactMode mode, SysNobleVipTypeEnum vipEnum) { + if (mode == null || mode == ContactMode.EVERYONE) { + return ContactMode.EVERYONE; + } + if (mode == ContactMode.DO_NOT_DISTURB) { + return (vipEnum != null && vipEnum.ordinal() >= SysNobleVipTypeEnum.DUKE.ordinal()) + ? mode : ContactMode.EVERYONE; + } + if (mode.getMinTargetVipLevel() != null) { + return (vipEnum != null && vipEnum.ordinal() >= mode.getMinTargetVipLevel().ordinal()) + ? mode : ContactMode.EVERYONE; + } + return mode; + } + } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/vip/UserVipAbilityQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/vip/UserVipAbilityQryExe.java index 5b3cdf4c..3b36f136 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/vip/UserVipAbilityQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/vip/UserVipAbilityQryExe.java @@ -7,8 +7,10 @@ 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; import com.red.circle.other.domain.enums.VipAbilityType; +import com.red.circle.other.inner.enums.material.SysNobleVipTypeEnum; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.util.Objects; /** @@ -35,24 +37,79 @@ public class UserVipAbilityQryExe { // 从 Gateway 获取 VIP 等级 String vipLevel = userProfileGateway.getUserVipName(userId); + SysNobleVipTypeEnum vipEnum = SysNobleVipTypeEnum.getByName(vipLevel); // 权限开关结合等级判断是否真正可用 + boolean kickPrevention; + boolean mysteriousInvisibility; + boolean antiBlock; + ContactMode finalContactMode; + if (vipLevel != null) { - setting.setKickPrevention(VipAbilityType.KICK_PREVENTION.hasAbility(vipLevel) - && Boolean.TRUE.equals(setting.getKickPrevention())); - setting.setMysteriousInvisibility(VipAbilityType.MYSTERIOUS_INVISIBILITY.hasAbility(vipLevel) - && Boolean.TRUE.equals(setting.getMysteriousInvisibility())); - setting.setAntiBlock(VipAbilityType.ANTI_BLOCK.hasAbility(vipLevel) - && Boolean.TRUE.equals(setting.getAntiBlock())); + kickPrevention = VipAbilityType.KICK_PREVENTION.hasAbility(vipLevel) + && Boolean.TRUE.equals(setting.getKickPrevention()); + mysteriousInvisibility = VipAbilityType.MYSTERIOUS_INVISIBILITY.hasAbility(vipLevel) + && Boolean.TRUE.equals(setting.getMysteriousInvisibility()); + antiBlock = VipAbilityType.ANTI_BLOCK.hasAbility(vipLevel) + && Boolean.TRUE.equals(setting.getAntiBlock()); + finalContactMode = resolveContactMode(setting.getContactMode(), vipEnum); } else { - setting.setContactMode(ContactMode.EVERYONE.name()); - setting.setKickPrevention(false); - setting.setMysteriousInvisibility(false); - setting.setAntiBlock(false); + kickPrevention = false; + mysteriousInvisibility = false; + antiBlock = false; + finalContactMode = ContactMode.EVERYONE; + } + + // 配置与实际不一致时持久化修正 + boolean changed = !Objects.equals(setting.getKickPrevention(), kickPrevention) + || !Objects.equals(setting.getMysteriousInvisibility(), mysteriousInvisibility) + || !Objects.equals(setting.getAntiBlock(), antiBlock) + || !finalContactMode.name().equals(setting.getContactMode()); + + setting.setKickPrevention(kickPrevention); + setting.setMysteriousInvisibility(mysteriousInvisibility); + setting.setAntiBlock(antiBlock); + setting.setContactMode(finalContactMode.name()); + + if (changed) { + userVipAbilitySettingService.upsert(setting); } UserVipAbilityCO co = convertor.toUserVipAbilityCO(setting); co.setVipLevel(vipLevel); return co; } + + /** + * 校验当前 ContactMode 是否匹配用户 VIP 等级,不够则回退 EVERYONE. + * DO_NOT_DISTURB 需要 VIP4(DUKE) 及以上,带 minTargetVipLevel 的模式需要对应等级. + */ + private ContactMode resolveContactMode(String contactModeStr, SysNobleVipTypeEnum vipEnum) { + if (contactModeStr == null) { + return ContactMode.EVERYONE; + } + ContactMode mode; + try { + mode = ContactMode.valueOf(contactModeStr); + } catch (IllegalArgumentException e) { + return ContactMode.EVERYONE; + } + if (mode == ContactMode.EVERYONE) { + return ContactMode.EVERYONE; + } + // DO_NOT_DISTURB 需要 VIP4(DUKE) 及以上 + if (mode == ContactMode.DO_NOT_DISTURB) { + if (vipEnum == null || vipEnum.ordinal() < SysNobleVipTypeEnum.DUKE.ordinal()) { + return ContactMode.EVERYONE; + } + return mode; + } + // VIP2_ABOVE / VIP3_ABOVE / VIP4_ABOVE / VIP5_ABOVE:自身等级需 >= minTargetVipLevel + if (mode.getMinTargetVipLevel() != null) { + if (vipEnum == null || vipEnum.ordinal() < mode.getMinTargetVipLevel().ordinal()) { + return ContactMode.EVERYONE; + } + } + return mode; + } } \ No newline at end of file