徽章存在存在则更新过期
This commit is contained in:
parent
db3c779db6
commit
586a461efa
@ -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.BadgeBackpackService;
|
||||||
import com.red.circle.other.infra.database.rds.service.badge.BadgeConfigService;
|
import com.red.circle.other.infra.database.rds.service.badge.BadgeConfigService;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -44,8 +45,8 @@ public class BadgeOperateListener implements MessageListener {
|
|||||||
private final MessageEventProcess messageEventProcess;
|
private final MessageEventProcess messageEventProcess;
|
||||||
private final UserRunProfileService userRunProfileService;
|
private final UserRunProfileService userRunProfileService;
|
||||||
private final UserBadgeCommon userBadgeCommon;
|
private final UserBadgeCommon userBadgeCommon;
|
||||||
private final UserProfileGateway userProfileGateway;
|
private final UserProfileGateway userProfileGateway;
|
||||||
private final DistributedLockUtil distributedLockUtil;
|
private final DistributedLockUtil distributedLockUtil;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Action consume(ConsumerMessage message) {
|
public Action consume(ConsumerMessage message) {
|
||||||
@ -106,22 +107,38 @@ public class BadgeOperateListener implements MessageListener {
|
|||||||
String lockKey = "badge:operate:wear:" + userId + ":" + badgeId;
|
String lockKey = "badge:operate:wear:" + userId + ":" + badgeId;
|
||||||
|
|
||||||
distributedLockUtil.executeWithLock(lockKey, () -> {
|
distributedLockUtil.executeWithLock(lockKey, () -> {
|
||||||
BadgeBackpack existBadge = badgeBackpackService.query()
|
// 在锁内查询,避免并发问题
|
||||||
.eq(BadgeBackpack::getUserId, userId)
|
BadgeBackpack existBadge = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId);
|
||||||
.eq(BadgeBackpack::getBadgeId, badgeId)
|
|
||||||
.getOne();
|
|
||||||
|
|
||||||
if (existBadge != null) {
|
if (existBadge != null) {
|
||||||
log.warn("用户已拥有该徽章, 跳过发放, userId: {}, badgeId: {}", userId, badgeId);
|
// 已存在徽章,执行更新操作(而不是跳过!)
|
||||||
return null;
|
Timestamp newExpireTime = calculateExpireTime(days);
|
||||||
}
|
String expireType = (days != null && days > 0)
|
||||||
|
? BadgeBackpackExpireTypeEnum.TEMPORARY.name()
|
||||||
BadgeBackpack badgeBackpack = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId);
|
: BadgeBackpackExpireTypeEnum.PERMANENT.name();
|
||||||
if (Objects.isNull(badgeBackpack)) {
|
|
||||||
|
// 更新:确保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));
|
badgeBackpackService.save(buildSaveUserBadgeBackpack(badgeId, userId, days));
|
||||||
|
log.info("新增徽章, userId: {}, badgeId: {}, days: {}", userId, badgeId, days);
|
||||||
userProfileGateway.removeCacheAll(userId);
|
userProfileGateway.removeCacheAll(userId);
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
|
return null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,8 +161,18 @@ public class BadgeOperateListener implements MessageListener {
|
|||||||
Set<Long> saveWear = wearBadge.stream().map(UserUseBadgeDTO::getId)
|
Set<Long> saveWear = wearBadge.stream().map(UserUseBadgeDTO::getId)
|
||||||
.filter(id -> !badgeId.equals(id)).collect(Collectors.toSet());
|
.filter(id -> !badgeId.equals(id)).collect(Collectors.toSet());
|
||||||
userRunProfileService.updateUserWearBadgesOverlay(userId,
|
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) {
|
private BadgeBackpack buildSaveUserBadgeBackpack(Long badgeId, Long userId, Long days) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user