diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/family/FamilyBaseInfoExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/family/FamilyBaseInfoExe.java index fcb968f6..7d309b2a 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/family/FamilyBaseInfoExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/family/FamilyBaseInfoExe.java @@ -1,5 +1,6 @@ package com.red.circle.other.app.command.family; +import cn.hutool.core.collection.CollectionUtil; import com.red.circle.framework.core.asserts.ResponseAssert; import com.red.circle.framework.core.response.CommonErrorCode; import com.red.circle.other.app.dto.clientobject.family.FamilyBaseInfoCO; @@ -21,13 +22,9 @@ import com.red.circle.other.infra.enums.family.FamilyStatusEnum; import com.red.circle.other.infra.enums.family.FamilyBoxConfigEnum; import com.red.circle.other.inner.model.dto.famliy.FamilyDetailsDTO; +import java.math.BigDecimal; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; @@ -108,6 +105,8 @@ public class FamilyBaseInfoExe { FamilyBaseInfoCO.FamilyMemberList memberList, Boolean joinWaiting) { + Map decimalMap = familyLevelExpService.mapTotalExpCountByFamilyIds(new HashSet<>(Collections.singletonList(baseInfo.getId()))); + return new FamilyBaseInfoCO() .setFamilyId(baseInfo.getId()) .setFamilyAdmin(adminInfo) @@ -116,8 +115,7 @@ public class FamilyBaseInfoExe { .setFamilyName(baseInfo.getFamilyName()) .setFamilyNotice(baseInfo.getFamilyNotice()) .setFamilyIntro(baseInfo.getFamilyIntro()) - .setCurrentExp( - familyLevelExpService.getExp(baseInfo.getId(), baseInfo.getFamilyLevelId()).longValue()) + .setCurrentExp(decimalMap.get(baseInfo.getId()).longValue()) .setCurrentMember(getFamilyMemberCount(baseInfo.getId())) .setFamilyLevel(Optional.ofNullable(familyLevel.getLevel()) .orElse(0)) diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/common/family/FamilyCommon.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/common/family/FamilyCommon.java index 0eb18108..3df6d3a3 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/common/family/FamilyCommon.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/common/family/FamilyCommon.java @@ -47,11 +47,7 @@ import com.red.circle.tool.core.json.JacksonUtils; import com.red.circle.tool.core.sequence.IdWorkerUtils; import com.red.circle.tool.core.text.StringUtils; import java.math.BigDecimal; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -236,60 +232,57 @@ public class FamilyCommon { long remainingExp = exp; FamilyDetailsDTO levelInfo = currentLevel; + + // 先统计一次总经验(只统计一次) + expAccumulate(member, exp, regionId); while (remainingExp > 0) { FamilyLevelConfig nextLevel = getNewLevel(sysOrigin, levelInfo); - // 已经是满级,无法继续升级 if (Objects.isNull(nextLevel)) { - addExpWithoutLevelUp(member, levelInfo, remainingExp, regionId); + // 满级了,剩余经验全部加到当前等级 + familyLevelExpService.incrExp(member.getFamilyId(), + levelInfo.getFamilyLevelId(), BigDecimal.valueOf(remainingExp)); 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.mapTotalExpCountByFamilyIds(new HashSet<>(Collections.singletonList(levelInfo.getFamilyId()))) + .getOrDefault(levelInfo.getFamilyId(), BigDecimal.ZERO).longValue(); + long expNeeded = currentLevelCompleteExp - currentFamilyExp; - // 经验不足以升级,只增加经验不升级 if (remainingExp < expNeeded) { - addExpWithoutLevelUp(member, levelInfo, remainingExp, regionId); + // 经验不足以升级,全部加到当前等级 + familyLevelExpService.incrExp(member.getFamilyId(), + levelInfo.getFamilyLevelId(), BigDecimal.valueOf(remainingExp)); break; } - // 经验足够升级:先增加升级所需的经验,然后执行升级 - addExpWithoutLevelUp(member, levelInfo, expNeeded, regionId); - updateFamily(member, nextLevel); - + // 经验足够升级 + // 1. 把当前等级加满 + if (expNeeded > 0) { + familyLevelExpService.incrExp(member.getFamilyId(), + levelInfo.getFamilyLevelId(), BigDecimal.valueOf(expNeeded)); + } + + // 2. 升级 + familyLevelUp(member, nextLevel); + + // 3. 剩余经验进入下一轮循环 remainingExp -= expNeeded; - - // 重新获取升级后的等级信息 + + // 4. 初始化新等级经验记录(如果有剩余经验,在下一轮循环会加上) + if (remainingExp > 0) { + familyLevelExpService.incrExp(member.getFamilyId(), + nextLevel.getId(), BigDecimal.ZERO); + } + + // 5. 刷新等级信息 levelInfo = getFamilyDetails(sysOrigin, member.getFamilyId()); } } - /** - * 增加经验值但不升级 - */ - private void addExpWithoutLevelUp(FamilyMemberInfo member, FamilyDetailsDTO currentLevel, Long exp, String regionId) { - addFamilyExpIncreaseRecord(exp, member, currentLevel.getFamilyLevelId()); - expAccumulate(member, exp, regionId); - } - /** - * 更新家族 - * - * @param member 成员 - * @param newLevel 新等级 - */ - private void updateFamily(FamilyMemberInfo member, FamilyLevelConfig newLevel) { - - // 家族升级 - familyLevelUp(member, newLevel); - - // 更新家族等级缓存数据 -// cacheFamilyLevel(member.getSysOrigin() + member.getFamilyId(), newLevel, member.getFamilyId()); - } /** * 移除家族所有人的头饰与徽章. @@ -429,16 +422,7 @@ public class FamilyCommon { return Lists.newArrayList(userIds); } - /** - * 家族成员增加经验值记录 - * - * @param exp 经验值 - * @param member 成员对象 - * @param levelId 等级ID - */ - private void addFamilyExpIncreaseRecord(Long exp, FamilyMemberInfo member, Long levelId) { - familyLevelExpService.incrExp(member.getFamilyId(), levelId, BigDecimal.valueOf(exp)); - } + /** * 累加经验值(家族成员总榜、家族周榜、家族成员周经验值)