家族升级处理

This commit is contained in:
tianfeng 2025-12-30 20:32:03 +08:00
parent dca8ba79f1
commit 79d2132bd4

View File

@ -131,50 +131,78 @@ public class FamilyCommon {
);
}
/**
* 增加家族经验值并处理升级
*
* @param userId 用户userId
* @param sysOrigin 系统平台
* @param exp 经验值
*/
public void addFamilyExpAndLevelUp(Long userId, String sysOrigin, Long exp) {
FamilyMemberInfo member = getFamilyMember(userId);
if (Objects.isNull(member)) {
return;
}
String lockKey = "family:level:lock:" + member.getFamilyId();
int maxRetry = 5;
int retryCount = 0;
boolean lockAcquired = false;
while (retryCount < maxRetry) {
try {
boolean locked = redisService.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
if (locked) {
lockAcquired = redisService.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
if (lockAcquired) {
try {
processExpAndLevelUpWithLock(member, sysOrigin, exp);
return;
} catch (Exception ex) {
log.error("处理家族经验升级异常,FamilyId:{},userId:{},exp:{},error:{}",
member.getFamilyId(), userId, exp, Throwables.getStackTraceAsString(ex));
throw ex;
} finally {
redisService.delete(lockKey);
try {
redisService.delete(lockKey);
lockAcquired = false;
} catch (Exception e) {
log.error("释放家族升级锁异常,FamilyId:{},error:{}",
member.getFamilyId(), e.getMessage());
}
}
}
// 未获取到锁进行重试
retryCount++;
if (retryCount < maxRetry) {
Thread.sleep(100 * retryCount);
Thread.sleep(100L * retryCount);
}
} catch (InterruptedException e) {
// 中断异常处理
Thread.currentThread().interrupt();
log.error("获取家族升级锁被中断,FamilyId:{}", member.getFamilyId());
if (lockAcquired) {
try {
redisService.delete(lockKey);
} catch (Exception ex) {
log.error("中断时释放锁异常,FamilyId:{}", member.getFamilyId());
}
}
return;
} catch (Exception ex) {
log.error("FamilyCommon.addFamilyExpAndLevelUp.userId:{},{}", userId, Throwables.getStackTraceAsString(ex));
// 其他异常处理包括业务异常
log.error("获取家族升级锁异常,FamilyId:{},userId:{},error:{}",
member.getFamilyId(), userId, Throwables.getStackTraceAsString(ex));
if (lockAcquired) {
try {
redisService.delete(lockKey);
} catch (Exception e) {
log.error("异常时释放锁失败,FamilyId:{}", member.getFamilyId());
}
}
return;
}
}
log.error("获取家族升级锁失败,重试{}次后放弃,FamilyId:{},userId:{},exp:{}", maxRetry, member.getFamilyId(), userId, exp);
// 重试失败日志
log.error("获取家族升级锁失败,重试{}次后放弃,FamilyId:{},userId:{},exp:{}",
maxRetry, member.getFamilyId(), userId, exp);
}
/**
@ -203,32 +231,39 @@ public class FamilyCommon {
/**
* 处理经验值增加和升级逻辑
*/
private void processExpAndLevelUp(FamilyMemberInfo member, FamilyDetailsDTO currentLevel,
Long exp, String sysOrigin, String regionId) {
private void processExpAndLevelUp(FamilyMemberInfo member, FamilyDetailsDTO currentLevel,
Long exp, String sysOrigin, String regionId) {
long remainingExp = exp;
FamilyDetailsDTO levelInfo = currentLevel;
while (remainingExp > 0) {
FamilyLevelConfig nextLevel = getNewLevel(sysOrigin, levelInfo);
// 已经是满级无法继续升级
if (Objects.isNull(nextLevel)) {
addExpWithoutLevelUp(member, levelInfo, remainingExp, regionId);
break;
}
long currentLevelCompleteExp = levelInfo.getLevelExp();
long currentFamilyExp = familyLevelExpService.getExp(levelInfo.getFamilyId(), levelInfo.getFamilyLevelId()).longValue();
long expNeeded = currentLevelCompleteExp - currentFamilyExp;
long currentLevelCompleteExp = levelInfo.getLevelExp(); // 当前等级满级所需总经验
long currentFamilyExp = familyLevelExpService.getExp(levelInfo.getFamilyId(),
levelInfo.getFamilyLevelId()).longValue(); // 当前已有经验
long expNeeded = currentLevelCompleteExp - currentFamilyExp; // 还需要多少经验才能升级
if (remainingExp <= expNeeded) {
// 经验不足以升级只增加经验不升级
if (remainingExp < expNeeded) {
addExpWithoutLevelUp(member, levelInfo, remainingExp, regionId);
break;
}
performLevelUp(member, nextLevel, currentLevelCompleteExp, regionId);
// 经验足够升级先增加升级所需的经验然后执行升级
addExpWithoutLevelUp(member, levelInfo, expNeeded, regionId);
updateFamily(member, nextLevel);
remainingExp -= expNeeded;
// 重新获取升级后的等级信息
levelInfo = getFamilyDetails(sysOrigin, member.getFamilyId());
}
}
@ -241,17 +276,6 @@ public class FamilyCommon {
expAccumulate(member, exp, regionId);
}
/**
* 执行升级操作
*/
private void performLevelUp(FamilyMemberInfo member, FamilyLevelConfig newLevel, Long exp, String regionId) {
addFamilyExpIncreaseRecord(exp, member, newLevel.getId());
expAccumulate(member, exp, regionId);
updateFamily(member, newLevel);
}
/**
* 更新家族
*