新增 发送荣誉的时候 发送徽章

This commit is contained in:
tianfeng 2026-05-28 18:33:28 +08:00
parent c10b7dc378
commit 78b17b991a
3 changed files with 151 additions and 81 deletions

View File

@ -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<String> 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<String> 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;
});
}

View File

@ -126,4 +126,13 @@ public interface BadgeConfigService extends BaseService<BadgeConfig> {
* @return 徽章配置
*/
BadgeConfig getByBadgeKey(String badgeKey);
/**
* 根据类型和徽章Key查询徽章配置.
*
* @param type 徽章类型
* @param badgeKey 徽章Key
* @return 徽章配置
*/
BadgeConfig getByTypeAndBadgeKey(String type, String badgeKey);
}

View File

@ -35,10 +35,10 @@ public class BadgeConfigServiceImpl extends BaseServiceImpl<BadgeConfigDAO, Badg
@Override
public List<BadgeConfig> listBadgeByType(SysBadgeConfigTypeEnum type) {
List<BadgeConfig> 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<BadgeConfigDAO, Badg
@Override
public Long getFreightBadgeId() {
return Optional.ofNullable(
query().select(BadgeConfig::getId)
.eq(BadgeConfig::getType, BadgeConfigTypeEnum.HONOR_ADMIN)
.eq(BadgeConfig::getBadgeKey, BadgeKeyEnum.RECHARGE_AGENCY)
.eq(BadgeConfig::getDel, Boolean.FALSE)
.last(PageConstant.LIMIT_ONE)
.getOne())
.map(BadgeConfig::getId)
.orElse(null);
query().select(BadgeConfig::getId)
.eq(BadgeConfig::getType, BadgeConfigTypeEnum.HONOR_ADMIN)
.eq(BadgeConfig::getBadgeKey, BadgeKeyEnum.RECHARGE_AGENCY)
.eq(BadgeConfig::getDel, Boolean.FALSE)
.last(PageConstant.LIMIT_ONE)
.getOne())
.map(BadgeConfig::getId)
.orElse(null);
}
@Override
public List<Long> 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<Long> 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<BadgeConfig> 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<BadgeConfig> 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<BadgeConfigDAO, Badg
}
return query().eq(BadgeConfig::getType, type)
.eq(BadgeConfig::getDel, Boolean.FALSE)
.orderByAsc(BadgeConfig::getBadgeLevel)
.last(PageConstant.formatLimit(200)).list();
.eq(BadgeConfig::getDel, Boolean.FALSE)
.orderByAsc(BadgeConfig::getBadgeLevel)
.last(PageConstant.formatLimit(200)).list();
}
@Override
public List<BadgeConfig> listByIds(List<Long> ids) {
return CollectionUtils.isEmpty(ids) ? CollectionUtils.newArrayList()
: query().in(BadgeConfig::getId, ids).list();
: query().in(BadgeConfig::getId, ids).list();
}
@Override
public Map<Long, BadgeConfig> mapByIds(Set<Long> 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<BadgeConfig> getGiveBadgePage(GiveBadgeConfigQryCmd query, Set<Long> 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<BadgeConfig> listBadgeByIds(SysBadgeConfigTypeEnum type, Set<Long> 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<BadgeConfig> 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<BadgeConfigDAO, Badg
@Override
public List<BadgeConfig> 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();
}
}