From 372e534bbc7b68f461d95b253f83311aa3288575 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 18 Sep 2025 19:02:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AD=89=E7=BA=A7=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/core/level/LevelCalculation.java | 267 ++++++++++++++++-- .../business/core/level/LevelUtils.java | 25 ++ .../user/query/UserLevelExperienceQryExe.java | 2 +- .../gateway/user/UserProfileGatewayImpl.java | 4 +- 4 files changed, 272 insertions(+), 26 deletions(-) diff --git a/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelCalculation.java b/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelCalculation.java index ca440245..8d02c35a 100644 --- a/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelCalculation.java +++ b/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelCalculation.java @@ -21,39 +21,56 @@ public class LevelCalculation { this.levelSpacing = 10; } - public void printEacLevelExperienceGold() { - Long[] experiences = {1L, 5L, 10L, 20L, 30L, 40L, 50L, 60L, 80L, 100L}; - for (int index = 0; index < experiences.length; index++) { - printLevel(index + 1, experiences[index]); - } - WealthCharismaLevelEnums[] wealthCharismaLevels = WealthCharismaLevelEnums - .values(); - for (int index = 1; index < wealthCharismaLevels.length; index++) { - WealthCharismaLevelEnums perv = wealthCharismaLevels[index - 1]; - WealthCharismaLevelEnums that = wealthCharismaLevels[index]; - long stepExperience = - (that.getConsumeGold(goldLowPrice) - perv.getConsumeGold(goldLowPrice)) / levelSpacing; - for (int levelIndex = 1; levelIndex <= NumConstant.TEN; levelIndex++) { - long upgradeExperience = perv.getConsumeGold(goldLowPrice) + (stepExperience * levelIndex); - int nextLevel = perv.getEndLevel() + levelIndex; - printLevel(nextLevel, upgradeExperience); - } - } - } - public static void main(String[] args) { LevelCalculation levelCalculation = new LevelCalculation(1000); - levelCalculation.printEacLevelExperienceGold(); + // 测试新版等级计算 + System.out.println("\n=== 新版等级计算测试 ==="); + levelCalculation.testNewLevelCalculation(); } + + /** + * 测试新版等级计算方法 + */ + public void testNewLevelCalculation() { + // 测试用户等级计算 + System.out.println("=== 用户等级测试 ==="); + Long[] testGolds = {0L, 2500L, 7500L, 1090650L, 2520000L}; + + for (Long gold : testGolds) { + UserLevelExperience result = getLevelV2(gold); + log.info("消费金币: {}, 当前用户等级: {}, 当前经验: {}, 下一级还需: {}", + gold, result.getLevel(), result.getThatExperience(), result.getNextExperience()); + } - private void printLevel(int level, long experiences) { - log.info("升级:{},所需消费:{},金币数量:{}", level, experiences, experiences * goldLowPrice); + // 测试财富等级计算 + System.out.println("\n=== 财富等级测试 ==="); + Long[] testWealthGolds = {0L, 10000L, 243450L, 1370000L, 6820000L}; + + for (Long gold : testWealthGolds) { + UserLevelExperience result = getWealthLevel(gold); + log.info("消费金币: {}, 当前财富等级: {}, 当前经验: {}, 下一级还需: {}", + gold, result.getLevel(), result.getThatExperience(), result.getNextExperience()); + } } public UserLevelExperience getLevel(Long experience) { return calculationLevel(experience); } + /** + * 新版等级计算方法 - 基于新的用户等级配置 + */ + public UserLevelExperience getLevelV2(Long experience) { + return calculationLevelV2(experience, NewLevelConfigEnums.values()); + } + + /** + * 财富等级计算方法 + */ + public UserLevelExperience getWealthLevel(Long experience) { + return calculationLevelV2(experience, WealthLevelConfigEnums.values()); + } + private UserLevelExperience calculationLevel(Long consumeGold) { if (Objects.isNull(consumeGold)) { return getLevelOneToTen(0L); @@ -92,6 +109,51 @@ public class LevelCalculation { throw new IllegalArgumentException("getLevelOneToTen param error:" + consumeGold); } + /** + * 通用等级计算逻辑 - 基于累积经验值查找等级 + * @param consumeGold 消费金额 + * @param configs 等级配置枚举数组 + */ + private UserLevelExperience calculationLevelV2(Long consumeGold, LevelConfig[] configs) { + if (Objects.isNull(consumeGold) || consumeGold <= 0) { + // 没有消费,返回1级,距离2级还需要的经验 + long nextLevelGold = configs[0].getCumulativeExperience(); + return getBuildUserLevelExperience(1, 0L, nextLevelGold); + } + + // 遍历等级配置 + for (int i = 0; i < configs.length; i++) { + LevelConfig config = configs[i]; + long cumulativeGold = config.getCumulativeExperience(); + + if (consumeGold <= cumulativeGold) { + // 找到对应等级 + int currentLevel = config.getToLevel(); + + if (consumeGold == cumulativeGold) { + // 正好达到某一级 + if (i == configs.length - 1) { + // 已经是最高级 + return getBuildUserLevelExperience(currentLevel, consumeGold, 0L); + } else { + // 计算到下一级还需要的经验 + long nextLevelGold = configs[i + 1].getCumulativeExperience(); + long needGold = nextLevelGold - cumulativeGold; + return getBuildUserLevelExperience(currentLevel, consumeGold, needGold); + } + } else { + // 在当前级别,但未达到下一级 + long needGold = cumulativeGold - consumeGold; + return getBuildUserLevelExperience(currentLevel - 1, consumeGold, needGold); + } + } + } + + // 如果超过最高级配置,返回最高级 + LevelConfig maxConfig = configs[configs.length - 1]; + return getBuildUserLevelExperience(maxConfig.getToLevel(), consumeGold, 0L); + } + private UserLevelExperience getLevelOneToTen(Long consumeGold) { Long[] experiences = {1L, 5L, 10L, 20L, 30L, 40L, 50L, 60L, 80L, 100L}; for (int index = 0; index < experiences.length; index++) { @@ -118,6 +180,14 @@ public class LevelCalculation { .setNextExperienceFormat(NumUtils.formatLong(nextExperience)); } + /** + * 等级配置接口 - 抽象公共逻辑 + */ + interface LevelConfig { + int getToLevel(); + long getCumulativeExperience(); + } + /** * l~10=1, 5, 10, 20, 30, 40, 50, 60, 80, 100 other=(prev$-thisRange$)/10 */ @@ -207,4 +277,155 @@ public class LevelCalculation { return consumeGold * goldLowPrice; } } + + /** + * 新版用户等级配置枚举 - 基于累积经验值 + * 每个枚举项表示达到某个等级所需的累积经验值 + */ + enum NewLevelConfigEnums implements LevelConfig { + LEVEL_1_TO_2(2, 2500), + LEVEL_2_TO_3(3, 7500), + LEVEL_3_TO_4(4, 15000), + LEVEL_4_TO_5(5, 30000), + LEVEL_5_TO_6(6, 60000), + LEVEL_6_TO_7(7, 110000), + LEVEL_7_TO_8(8, 200000), + LEVEL_8_TO_9(9, 330000), + LEVEL_9_TO_10(10, 530000), + LEVEL_10_TO_11(11, 780000), + LEVEL_11_TO_12(12, 1080000), + LEVEL_12_TO_13(13, 1450000), + LEVEL_13_TO_14(14, 1920000), + LEVEL_14_TO_15(15, 2520000), + LEVEL_15_TO_16(16, 3270000), + LEVEL_16_TO_17(17, 4170000), + LEVEL_17_TO_18(18, 5270000), + LEVEL_18_TO_19(19, 6620000), + LEVEL_19_TO_20(20, 8120000), + LEVEL_20_TO_21(21, 9820000), + LEVEL_21_TO_22(22, 11820000), + LEVEL_22_TO_23(23, 14220000), + LEVEL_23_TO_24(24, 17120000), + LEVEL_24_TO_25(25, 20620000), + LEVEL_25_TO_26(26, 24820000), + LEVEL_26_TO_27(27, 29820000), + LEVEL_27_TO_28(28, 35720000), + LEVEL_28_TO_29(29, 42620000), + LEVEL_29_TO_30(30, 50620000), + LEVEL_30_TO_31(31, 60120000), + LEVEL_31_TO_32(32, 71120000), + LEVEL_32_TO_33(33, 84120000), + LEVEL_33_TO_34(34, 99120000), + LEVEL_34_TO_35(35, 119120000), + LEVEL_35_TO_36(36, 142120000), + LEVEL_36_TO_37(37, 167120000), + LEVEL_37_TO_38(38, 194120000), + LEVEL_38_TO_39(39, 223120000), + LEVEL_39_TO_40(40, 263120000), + LEVEL_40_TO_41(41, 308120000), + LEVEL_41_TO_42(42, 363120000), + LEVEL_42_TO_43(43, 428520000), + LEVEL_43_TO_44(44, 503520000), + LEVEL_44_TO_45(45, 603520000), + LEVEL_45_TO_46(46, 753520000), + LEVEL_46_TO_47(47, 1003520000), + LEVEL_47_TO_48(48, 1353520000), + LEVEL_48_TO_49(49, 1803520000L), + LEVEL_49_TO_50(50, 2403520000L); + + private final int toLevel; + private final long cumulativeExperience; + + NewLevelConfigEnums(int toLevel, long cumulativeExperience) { + this.toLevel = toLevel; + this.cumulativeExperience = cumulativeExperience; + } + + public int getToLevel() { + return toLevel; + } + + public long getCumulativeExperience() { + return cumulativeExperience; + } + + /** + * @deprecated 新版本不需要乘以goldLowPrice,直接使用getCumulativeExperience() + */ + @Deprecated + public long getCumulativeGold(Long goldLowPrice) { + return cumulativeExperience; + } + } + + /** + * 财富等级配置枚举 - 基于累积经验值 + */ + enum WealthLevelConfigEnums implements LevelConfig { + WEALTH_1_TO_2(2, 10000), + WEALTH_2_TO_3(3, 30000), + WEALTH_3_TO_4(4, 60000), + WEALTH_4_TO_5(5, 100000), + WEALTH_5_TO_6(6, 150000), + WEALTH_6_TO_7(7, 220000), + WEALTH_7_TO_8(8, 310000), + WEALTH_8_TO_9(9, 420000), + WEALTH_9_TO_10(10, 540000), + WEALTH_10_TO_11(11, 670000), + WEALTH_11_TO_12(12, 810000), + WEALTH_12_TO_13(13, 960000), + WEALTH_13_TO_14(14, 1120000), + WEALTH_14_TO_15(15, 1370000), + WEALTH_15_TO_16(16, 1640000), + WEALTH_16_TO_17(17, 1930000), + WEALTH_17_TO_18(18, 2240000), + WEALTH_18_TO_19(19, 2570000), + WEALTH_19_TO_20(20, 3120000), + WEALTH_20_TO_21(21, 3720000), + WEALTH_21_TO_22(22, 4370000), + WEALTH_22_TO_23(23, 5070000), + WEALTH_23_TO_24(24, 5820000), + WEALTH_24_TO_25(25, 6820000), + WEALTH_25_TO_26(26, 7920000), + WEALTH_26_TO_27(27, 9120000), + WEALTH_27_TO_28(28, 10420000), + WEALTH_28_TO_29(29, 11820000), + WEALTH_29_TO_30(30, 13370000), + WEALTH_30_TO_31(31, 15020000), + WEALTH_31_TO_32(32, 16770000), + WEALTH_32_TO_33(33, 18670000), + WEALTH_33_TO_34(34, 21170000), + WEALTH_34_TO_35(35, 24370000), + WEALTH_35_TO_36(36, 28370000), + WEALTH_36_TO_37(37, 33370000), + WEALTH_37_TO_38(38, 40370000), + WEALTH_38_TO_39(39, 50370000), + WEALTH_39_TO_40(40, 65370000), + WEALTH_40_TO_41(41, 88370000), + WEALTH_41_TO_42(42, 123370000), + WEALTH_42_TO_43(43, 173370000), + WEALTH_43_TO_44(44, 243370000), + WEALTH_44_TO_45(45, 343370000), + WEALTH_45_TO_46(46, 493370000), + WEALTH_46_TO_47(47, 743370000), + WEALTH_47_TO_48(48, 1113370000), + WEALTH_48_TO_49(49, 1613370000L), + WEALTH_49_TO_50(50, 2513370000L); + + private final int toLevel; + private final long cumulativeExperience; + + WealthLevelConfigEnums(int toLevel, long cumulativeExperience) { + this.toLevel = toLevel; + this.cumulativeExperience = cumulativeExperience; + } + + public int getToLevel() { + return toLevel; + } + + public long getCumulativeExperience() { + return cumulativeExperience; + } + } } diff --git a/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelUtils.java b/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelUtils.java index f7066072..9ef6fc41 100644 --- a/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelUtils.java +++ b/rc-common-business/common-business-core/src/main/java/com/red/circle/common/business/core/level/LevelUtils.java @@ -32,9 +32,34 @@ public class LevelUtils { LevelType.USER, new LevelCalculation(1000L * 5L), LevelType.ROOM, new LevelCalculation(10000L * 5L), LevelType.CARD, new LevelCalculation(1000L * 5L) + ), + SysOriginPlatformEnum.LIKEI, Map.of( + LevelType.USER, new LevelCalculation(500L * 5L), + LevelType.ROOM, new LevelCalculation(10000L * 5L), + LevelType.CARD, new LevelCalculation(1000L * 5L) ) ); + /** + * 用户等级新版. + */ + public static UserLevelExperience getUserLevelV2(SysOriginPlatformEnum sysOrigin, Long experience) { + if (Objects.isNull(sysOrigin)) { + throw new IllegalArgumentException(ERROR_USER_LEVEL_REQUIRED); + } + return getLevelCalculation(sysOrigin).get(LevelType.USER).getLevelV2(experience); + } + + /** + * 用户等级新版. + */ + public static UserLevelExperience getWealthLevel(SysOriginPlatformEnum sysOrigin, Long experience) { + if (Objects.isNull(sysOrigin)) { + throw new IllegalArgumentException(ERROR_USER_LEVEL_REQUIRED); + } + return getLevelCalculation(sysOrigin).get(LevelType.USER).getWealthLevel(experience); + } + /** * 用户等级. */ diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/UserLevelExperienceQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/UserLevelExperienceQryExe.java index cfedc996..ff43a069 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/UserLevelExperienceQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/query/UserLevelExperienceQryExe.java @@ -21,7 +21,7 @@ public class UserLevelExperienceQryExe { private final ConsumptionLevelService consumptionLevelService; public UserLevelExperience execute(UserLevelCmd cmd) { - return LevelUtils.getUserLevel(cmd.requireReqSysOriginEnum(), getQuantity(cmd).longValue()); + return LevelUtils.getUserLevelV2(cmd.requireReqSysOriginEnum(), getQuantity(cmd).longValue()); } private BigDecimal getQuantity(UserLevelCmd cmd) { diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/UserProfileGatewayImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/UserProfileGatewayImpl.java index 1aca4bf2..aea3dd21 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/UserProfileGatewayImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/user/UserProfileGatewayImpl.java @@ -419,9 +419,9 @@ public class UserProfileGatewayImpl implements UserProfileGateway { } return new ConsumptionLevelCache() - .setWealthLevel(LevelUtils.getUserLevel(sysOrigin, level.getConsumptionGolds().longValue()).getLevel()) + .setWealthLevel(LevelUtils.getWealthLevel(sysOrigin, level.getConsumptionGolds().longValue()).getLevel()) .setWealthExp(level.getConsumptionGolds()) - .setCharmLevel(LevelUtils.getUserLevel(sysOrigin, level.getConsumptionDiamond().longValue()).getLevel()) + .setCharmLevel(LevelUtils.getUserLevelV2(sysOrigin, level.getConsumptionDiamond().longValue()).getLevel()) .setCharmExp(level.getConsumptionDiamond()); }) );