From 586a461efaae1bab6a3d244302b338903fbd2122 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 18 Dec 2025 23:27:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=BD=E7=AB=A0=E5=AD=98=E5=9C=A8=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=88=99=E6=9B=B4=E6=96=B0=E8=BF=87=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/listener/BadgeOperateListener.java | 57 ++++++++++++++----- 1 file changed, 42 insertions(+), 15 deletions(-) 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 91e16cd9..f667997f 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 @@ -19,6 +19,7 @@ import com.red.circle.other.infra.database.rds.entity.badge.BadgeConfig; import com.red.circle.other.infra.database.rds.service.badge.BadgeBackpackService; import com.red.circle.other.infra.database.rds.service.badge.BadgeConfigService; +import java.sql.Timestamp; import java.util.List; import java.util.Objects; import java.util.Set; @@ -44,8 +45,8 @@ public class BadgeOperateListener implements MessageListener { private final MessageEventProcess messageEventProcess; private final UserRunProfileService userRunProfileService; private final UserBadgeCommon userBadgeCommon; - private final UserProfileGateway userProfileGateway; - private final DistributedLockUtil distributedLockUtil; + private final UserProfileGateway userProfileGateway; + private final DistributedLockUtil distributedLockUtil; @Override public Action consume(ConsumerMessage message) { @@ -106,22 +107,38 @@ public class BadgeOperateListener implements MessageListener { String lockKey = "badge:operate:wear:" + userId + ":" + badgeId; distributedLockUtil.executeWithLock(lockKey, () -> { - BadgeBackpack existBadge = badgeBackpackService.query() - .eq(BadgeBackpack::getUserId, userId) - .eq(BadgeBackpack::getBadgeId, badgeId) - .getOne(); + // 在锁内查询,避免并发问题 + BadgeBackpack existBadge = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId); if (existBadge != null) { - log.warn("用户已拥有该徽章, 跳过发放, userId: {}, badgeId: {}", userId, badgeId); - return null; - } - - BadgeBackpack badgeBackpack = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId); - if (Objects.isNull(badgeBackpack)) { + // 已存在徽章,执行更新操作(而不是跳过!) + Timestamp newExpireTime = calculateExpireTime(days); + String expireType = (days != null && days > 0) + ? BadgeBackpackExpireTypeEnum.TEMPORARY.name() + : BadgeBackpackExpireTypeEnum.PERMANENT.name(); + + // 更新:确保useProps=true 且更新过期时间 + boolean updateCount = badgeBackpackService.update() + .set(BadgeBackpack::getUseProps, Boolean.TRUE) + .set(BadgeBackpack::getExpireTime, newExpireTime) + .set(BadgeBackpack::getExpireType, expireType) + .eq(BadgeBackpack::getId, existBadge.getId()) + .execute(); + + if (updateCount) { + log.info("更新已存在的徽章, userId: {}, badgeId: {}, days: {}", userId, badgeId, days); + userProfileGateway.removeCacheAll(userId); + } else { + log.warn("更新徽章失败, userId: {}, badgeId: {}", userId, badgeId); + } + } else { + // 不存在则插入 badgeBackpackService.save(buildSaveUserBadgeBackpack(badgeId, userId, days)); + log.info("新增徽章, userId: {}, badgeId: {}, days: {}", userId, badgeId, days); userProfileGateway.removeCacheAll(userId); } - return null; + + return null; }); } @@ -144,8 +161,18 @@ public class BadgeOperateListener implements MessageListener { Set saveWear = wearBadge.stream().map(UserUseBadgeDTO::getId) .filter(id -> !badgeId.equals(id)).collect(Collectors.toSet()); userRunProfileService.updateUserWearBadgesOverlay(userId, - userBadgeCommon.listUseBadge(userId, userProfile.getSysOriginChild(), saveWear) - ); + userBadgeCommon.listUseBadge(userId, userProfile.getSysOriginChild(), saveWear)); + } + + /** + * 计算过期时间. + */ + private Timestamp calculateExpireTime(Long days) { + if (days != null && days > 0) { + return TimestampUtils.nowPlusDays(days.intValue()); + } else { + return TimestampUtils.now(); + } } private BadgeBackpack buildSaveUserBadgeBackpack(Long badgeId, Long userId, Long days) {