diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java index 6da08466..6a0bb5ed 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java @@ -22,6 +22,7 @@ import com.red.circle.other.infra.database.rds.service.badge.BadgeBackpackServic import com.red.circle.other.infra.database.rds.service.badge.BadgeConfigService; import com.red.circle.other.inner.endpoint.material.props.PropsBackpackClient; import com.red.circle.other.inner.enums.material.BadgeBackpackExpireTypeEnum; +import com.red.circle.other.inner.enums.material.BadgeConfigTypeEnum; import com.red.circle.other.inner.enums.material.BadgeKeyEnum; import com.red.circle.other.inner.enums.material.ConsolePropsTypeEnum; import com.red.circle.other.inner.model.cmd.material.GivePropsBackpackCmd; @@ -56,6 +57,17 @@ public class BadgeOperateListener implements MessageListener { .put(BadgeKeyEnum.RECHARGE_AGENCY.name(), 2054123011514957825L) .build(); + /** ADMINISTRATOR 类型的 badgeKey 集合. */ + private static final Set ADMINISTRATOR_BADGE_KEYS = Sets.newHashSet( + BadgeKeyEnum.BD.name(), + BadgeKeyEnum.HOST.name(), + BadgeKeyEnum.SUPER_ADMIN.name(), + BadgeKeyEnum.AGENCY.name(), + BadgeKeyEnum.ADMIN.name(), + BadgeKeyEnum.MANAGER.name(), + BadgeKeyEnum.RECHARGE_AGENCY.name() + ); + private final BadgeConfigService badgeConfigService; private final BadgeBackpackService badgeBackpackService; private final MessageEventProcess messageEventProcess; @@ -91,8 +103,13 @@ public class BadgeOperateListener implements MessageListener { return; } - Long finalBadgeId = badgeId; + // badgeKey 属于 ADMINISTRATOR_BADGE_KEYS,同时操作 ADMINISTRATOR 和 HONOR_ADMIN 两个徽章 + if (badgeId == null && badgeKey != null && ADMINISTRATOR_BADGE_KEYS.contains(badgeKey)) { + handleDualTypeBadgeOperate(userId, badgeKey, operationType, event.getDays()); + return; + } + Long finalBadgeId = badgeId; if (finalBadgeId == null) { if (badgeKey == null) { log.warn("徽章操作事件缺少badgeKey和badgeId, userId: {}", userId); @@ -115,10 +132,36 @@ public class BadgeOperateListener implements MessageListener { } } + /** + * ADMINISTRATOR_BADGE_KEYS 类型的 badgeKey 同时操作 ADMINISTRATOR 和 HONOR_ADMIN 两个徽章. + */ + private void handleDualTypeBadgeOperate(Long userId, String badgeKey, String operationType, Long days) { + List types = List.of(BadgeConfigTypeEnum.ADMINISTRATOR.name(), BadgeConfigTypeEnum.HONOR_ADMIN.name()); + for (String type : types) { + BadgeConfig badgeConfig = badgeConfigService.getByTypeAndBadgeKey(type, badgeKey); + if (badgeConfig == null) { + log.warn("徽章配置不存在, type: {}, badgeKey: {}", type, badgeKey); + continue; + } + if (BadgeOperateEvent.OperationType.WEAR.name().equals(operationType)) { + handleWearBadge(userId, badgeConfig.getId(), badgeKey, days, false); + } else if (BadgeOperateEvent.OperationType.REMOVE.name().equals(operationType)) { + handleRemoveBadge(userId, badgeConfig.getId(), badgeKey, false); + } + } + // 头像框只操作一次 + int avatarFrameDays = BadgeOperateEvent.OperationType.WEAR.name().equals(operationType) ? 999 : -999; + giveAvatarFrameIfMapped(badgeKey, userId, avatarFrameDays); + } + /** * 佩戴徽章. */ private void handleWearBadge(Long userId, Long badgeId, String badgeKey, Long days) { + handleWearBadge(userId, badgeId, badgeKey, days, true); + } + + private void handleWearBadge(Long userId, Long badgeId, String badgeKey, Long days, boolean giveAvatarFrame) { String lockKey = "badge:operate:wear:" + userId + ":" + badgeId; distributedLockUtil.executeWithLock(lockKey, () -> { @@ -143,7 +186,9 @@ public class BadgeOperateListener implements MessageListener { } refreshUserWearBadges(userId); - giveAvatarFrameIfMapped(badgeKey, userId, 999); + if (giveAvatarFrame) { + giveAvatarFrameIfMapped(badgeKey, userId, 999); + } return null; }); @@ -165,12 +210,18 @@ public class BadgeOperateListener implements MessageListener { * 移除徽章. */ private void handleRemoveBadge(Long userId, Long badgeId, String badgeKey) { + handleRemoveBadge(userId, badgeId, badgeKey, true); + } + + private void handleRemoveBadge(Long userId, Long badgeId, String badgeKey, boolean giveAvatarFrame) { String lockKey = "badge:operate:remove:" + userId + ":" + badgeId; distributedLockUtil.executeWithLock(lockKey, () -> { badgeBackpackService.deleteBadges(userId, Sets.newHashSet(badgeId)); refreshUserWearBadges(userId); - giveAvatarFrameIfMapped(badgeKey, userId, -999); + if (giveAvatarFrame) { + giveAvatarFrameIfMapped(badgeKey, userId, -999); + } return null; }); } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/BadgeConfigService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/BadgeConfigService.java index 916604d7..240bfcbe 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/BadgeConfigService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/BadgeConfigService.java @@ -126,4 +126,13 @@ public interface BadgeConfigService extends BaseService { * @return 徽章配置 */ BadgeConfig getByBadgeKey(String badgeKey); + + /** + * 根据类型和徽章Key查询徽章配置. + * + * @param type 徽章类型 + * @param badgeKey 徽章Key + * @return 徽章配置 + */ + BadgeConfig getByTypeAndBadgeKey(String type, String badgeKey); } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeConfigServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeConfigServiceImpl.java index 76ca90d6..8193fa7a 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeConfigServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeConfigServiceImpl.java @@ -35,10 +35,10 @@ public class BadgeConfigServiceImpl extends BaseServiceImpl listBadgeByType(SysBadgeConfigTypeEnum type) { List badgeConfigs = query() - .eq(BadgeConfig::getType, type) - .eq(BadgeConfig::getDel, Boolean.FALSE) - .orderByDesc(BadgeConfig::getId) - .list(); + .eq(BadgeConfig::getType, type) + .eq(BadgeConfig::getDel, Boolean.FALSE) + .orderByDesc(BadgeConfig::getId) + .list(); if (CollectionUtils.isEmpty(badgeConfigs)) { return Lists.newArrayList(); @@ -50,53 +50,53 @@ public class BadgeConfigServiceImpl extends BaseServiceImpl listAdministratorIds() { return Optional.ofNullable(query().select(BadgeConfig::getId) - .eq(BadgeConfig::getType, BadgeConfigTypeEnum.ADMINISTRATOR) - .eq(BadgeConfig::getDel, Boolean.FALSE) - .list()) - .map(badgeConfigs -> badgeConfigs.stream().map(BadgeConfig::getId).collect( - Collectors.toList())) - .orElse(null); + .eq(BadgeConfig::getType, BadgeConfigTypeEnum.ADMINISTRATOR) + .eq(BadgeConfig::getDel, Boolean.FALSE) + .list()) + .map(badgeConfigs -> badgeConfigs.stream().map(BadgeConfig::getId).collect( + Collectors.toList())) + .orElse(null); } @Override public List listAdminBadgeIds() { return Optional.ofNullable( - query().select(BadgeConfig::getId) - .eq(BadgeConfig::getType, SysBadgeConfigTypeEnum.HONOR_ADMIN) - .likeLeft(BadgeConfig::getBadgeKey, BadgeKeyEnum.ADMIN) - .eq(BadgeConfig::getDel, Boolean.FALSE) - .list()) - .map(sysBadgeConfigs -> sysBadgeConfigs.stream().map(BadgeConfig::getId).collect( - Collectors.toList())) - .orElse(null); + query().select(BadgeConfig::getId) + .eq(BadgeConfig::getType, SysBadgeConfigTypeEnum.HONOR_ADMIN) + .likeLeft(BadgeConfig::getBadgeKey, BadgeKeyEnum.ADMIN) + .eq(BadgeConfig::getDel, Boolean.FALSE) + .list()) + .map(sysBadgeConfigs -> sysBadgeConfigs.stream().map(BadgeConfig::getId).collect( + Collectors.toList())) + .orElse(null); } @Override public List listByBadgeKey(BadgeKeyEnum badgeKey) { return query().eq(BadgeConfig::getBadgeKey, badgeKey) - .eq(BadgeConfig::getDel, Boolean.FALSE) - .orderByAsc(BadgeConfig::getBadgeLevel) - .list(); + .eq(BadgeConfig::getDel, Boolean.FALSE) + .orderByAsc(BadgeConfig::getBadgeLevel) + .list(); } @Override public List listBadgeConfig(BadgeConfigTypeEnum type) { if (type == BadgeConfigTypeEnum.ALL) { return query() - .in(BadgeConfig::getType, Arrays.asList(BadgeConfigTypeEnum.ACTIVITY, BadgeConfigTypeEnum.ACHIEVEMENT, BadgeConfigTypeEnum.ADMINISTRATOR)) + .in(BadgeConfig::getType, Arrays.asList(BadgeConfigTypeEnum.ACTIVITY, BadgeConfigTypeEnum.ACHIEVEMENT, BadgeConfigTypeEnum.ADMINISTRATOR)) .eq(BadgeConfig::getDel, Boolean.FALSE) .orderByAsc(BadgeConfig::getBadgeLevel) .last(PageConstant.formatLimit(300)) @@ -104,89 +104,89 @@ public class BadgeConfigServiceImpl extends BaseServiceImpl listByIds(List ids) { return CollectionUtils.isEmpty(ids) ? CollectionUtils.newArrayList() - : query().in(BadgeConfig::getId, ids).list(); + : query().in(BadgeConfig::getId, ids).list(); } @Override public Map mapByIds(Set ids) { return CollectionUtils.isEmpty(ids) - ? CollectionUtils.newHashMap() - : Optional.ofNullable(query().in(BadgeConfig::getId, ids).list2Map(BadgeConfig::getId)) - .orElseGet(CollectionUtils::newHashMap); + ? CollectionUtils.newHashMap() + : Optional.ofNullable(query().in(BadgeConfig::getId, ids).list2Map(BadgeConfig::getId)) + .orElseGet(CollectionUtils::newHashMap); } @Override public PageResult getGiveBadgePage(GiveBadgeConfigQryCmd query, Set collect) { return query() - .eq(BadgeConfig::getDel, Boolean.FALSE) - .in(BadgeConfig::getId, collect) - .ne(BadgeConfig::getType, SysBadgeConfigTypeEnum.ACHIEVEMENT.getName()) - .ne(BadgeConfig::getType, SysBadgeConfigTypeEnum.FAMILY.getName()) - .ne(BadgeConfig::getType, SysBadgeConfigTypeEnum.ROOM_ACHIEVEMENT.getName()) - .orderByDesc(BadgeConfig::getCreateTime).page(query.getPageQuery()); + .eq(BadgeConfig::getDel, Boolean.FALSE) + .in(BadgeConfig::getId, collect) + .ne(BadgeConfig::getType, SysBadgeConfigTypeEnum.ACHIEVEMENT.getName()) + .ne(BadgeConfig::getType, SysBadgeConfigTypeEnum.FAMILY.getName()) + .ne(BadgeConfig::getType, SysBadgeConfigTypeEnum.ROOM_ACHIEVEMENT.getName()) + .orderByDesc(BadgeConfig::getCreateTime).page(query.getPageQuery()); } @Override public List listBadgeByIds(SysBadgeConfigTypeEnum type, Set collect) { return query().eq(BadgeConfig::getType, type) - .in(BadgeConfig::getId, collect) - .list(); + .in(BadgeConfig::getId, collect) + .list(); } @Override public void deleteBadge(Long id) { update() - .set(BadgeConfig::getDel, Boolean.TRUE) - .eq(BadgeConfig::getId, id) - .execute(); + .set(BadgeConfig::getDel, Boolean.TRUE) + .eq(BadgeConfig::getId, id) + .execute(); } @Override public void updateBadgeConfig(BadgeConfig badgeConfig) { update() - .set(BadgeConfig::getBadgeName, badgeConfig.getBadgeName()) - .set(BadgeConfig::getType, badgeConfig.getType()) - .set(BadgeConfig::getBadgeKey, badgeConfig.getBadgeKey()) - .set(BadgeConfig::getBadgeLevel, badgeConfig.getBadgeLevel()) - .set(BadgeConfig::getMilestone, badgeConfig.getMilestone()) - .eq(BadgeConfig::getId, badgeConfig.getId()) - .last(PageConstant.LIMIT_ONE) - .execute(); + .set(BadgeConfig::getBadgeName, badgeConfig.getBadgeName()) + .set(BadgeConfig::getType, badgeConfig.getType()) + .set(BadgeConfig::getBadgeKey, badgeConfig.getBadgeKey()) + .set(BadgeConfig::getBadgeLevel, badgeConfig.getBadgeLevel()) + .set(BadgeConfig::getMilestone, badgeConfig.getMilestone()) + .eq(BadgeConfig::getId, badgeConfig.getId()) + .last(PageConstant.LIMIT_ONE) + .execute(); } @Override public PageResult getBadgeConfig(SysBadgeConfigQryCmd query) { return query() - .eq(BadgeConfig::getDel, Boolean.FALSE) - .like(StringUtils.isNotBlank(query.getBadgeName()), BadgeConfig::getBadgeName, - query.getBadgeName()) - .like(StringUtils.isNotBlank(query.getBadgeKey()), BadgeConfig::getBadgeKey, - query.getBadgeKey()) - .eq(Objects.nonNull(query.getId()), BadgeConfig::getId, query.getId()) - .eq(StringUtils.isNotBlank(query.getType()), BadgeConfig::getType, query.getType()) - .orderByDesc(BadgeConfig::getCreateTime) - .page(query.getPageQuery()); + .eq(BadgeConfig::getDel, Boolean.FALSE) + .like(StringUtils.isNotBlank(query.getBadgeName()), BadgeConfig::getBadgeName, + query.getBadgeName()) + .like(StringUtils.isNotBlank(query.getBadgeKey()), BadgeConfig::getBadgeKey, + query.getBadgeKey()) + .eq(Objects.nonNull(query.getId()), BadgeConfig::getId, query.getId()) + .eq(StringUtils.isNotBlank(query.getType()), BadgeConfig::getType, query.getType()) + .orderByDesc(BadgeConfig::getCreateTime) + .page(query.getPageQuery()); } @Override public Long getAdminBadgeId(String key) { return Optional.ofNullable( - query().select(BadgeConfig::getId) - .eq(BadgeConfig::getType, SysBadgeConfigTypeEnum.HONOR_ADMIN) - .eq(BadgeConfig::getBadgeKey, key) - .eq(BadgeConfig::getDel, Boolean.FALSE) - .last(PageConstant.LIMIT_ONE) - .getOne()) - .map(BadgeConfig::getId) - .orElse(null); + query().select(BadgeConfig::getId) + .eq(BadgeConfig::getType, SysBadgeConfigTypeEnum.HONOR_ADMIN) + .eq(BadgeConfig::getBadgeKey, key) + .eq(BadgeConfig::getDel, Boolean.FALSE) + .last(PageConstant.LIMIT_ONE) + .getOne()) + .map(BadgeConfig::getId) + .orElse(null); } @Override @@ -196,15 +196,25 @@ public class BadgeConfigServiceImpl extends BaseServiceImpl getBadgeConfigList(BadgeConfigTypeEnum type, String sysOrgin) { - return baseDAO.getBadgeConfigList(type,sysOrgin); + return baseDAO.getBadgeConfigList(type, sysOrgin); } @Override public BadgeConfig getByBadgeKey(String badgeKey) { return query() - .eq(BadgeConfig::getBadgeKey, badgeKey) - .eq(BadgeConfig::getDel, Boolean.FALSE) - .last(PageConstant.LIMIT_ONE) - .getOne(); + .eq(BadgeConfig::getBadgeKey, badgeKey) + .eq(BadgeConfig::getDel, Boolean.FALSE) + .last(PageConstant.LIMIT_ONE) + .getOne(); + } + + @Override + public BadgeConfig getByTypeAndBadgeKey(String type, String badgeKey) { + return query() + .eq(BadgeConfig::getType, type) + .eq(BadgeConfig::getBadgeKey, badgeKey) + .eq(BadgeConfig::getDel, Boolean.FALSE) + .last(PageConstant.LIMIT_ONE) + .getOne(); } }