家族升级处理
This commit is contained in:
parent
dca8ba79f1
commit
79d2132bd4
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 更新家族
|
||||
*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user