diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketLaunchCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketLaunchCmdExe.java index 019b1e2f..52a2ed58 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketLaunchCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketLaunchCmdExe.java @@ -17,6 +17,7 @@ import com.red.circle.other.domain.gateway.RocketHistoryGateway; import com.red.circle.other.domain.gateway.RocketStatusGateway; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.rocket.RocketHistory; +import com.red.circle.other.domain.rocket.RocketLevel; import com.red.circle.other.domain.rocket.RocketStatus; import com.red.circle.other.domain.rocket.RocketStatusEnum; import com.red.circle.other.infra.database.cache.key.RocketKeys; @@ -100,18 +101,31 @@ public class RocketLaunchCmdExe { long finalEnergy = rocketStatus.getCurrentEnergy(); int contributorCount = rocketStatus.getContributors() != null ? rocketStatus.getContributors().size() : 0; - // 5. 保存历史记录(发射前保存,保留贡献者信息) + // 5. 发射并自动升级到下一级 + // 1. 先计算出能发射的等级 + RocketLevel launchLevel = rocketStatus.calculateLaunchLevel(rocketConfigGateway); + if (launchLevel == null) { + return; + } + + // 2. 标记为已发射状态 + rocketStatus.markAsLaunched(); + + // 3. 保存发射时的历史记录(此时还是发射等级) try { - rocketStatus.setLaunchTime(LocalDateTime.now()); + rocketStatus.setLevel(launchLevel); RocketHistory history = RocketHistory.fromRocketStatus(rocketStatus); String historyId = rocketHistoryGateway.save(history); - log.info("保存火箭历史记录成功: historyId={}, roomId={}, level={}", historyId, roomId, launchedLevel); + log.info("保存火箭历史记录成功: historyId={}, roomId={}, level={}", + historyId, roomId, launchLevel.getLevel()); } catch (Exception e) { log.error("保存火箭历史记录失败: roomId={}", roomId, e); } - // 7. 发射并自动升级到下一级 - rocketStatus.launchAndUpgrade(rocketConfigGateway); + // 4. 找到下一个等级 + RocketLevel nextLevel = launchLevel.getNextLevel(); + // 5. 升级到下一个等级 + rocketStatus.upgradeToLevel(rocketConfigGateway, nextLevel); // 8. 保存新状态 rocketStatusGateway.save(rocketStatus); diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomEnterCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomEnterCmdExe.java index ff190b32..de4c91ad 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomEnterCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomEnterCmdExe.java @@ -127,14 +127,6 @@ public class RoomEnterCmdExe { log.error("进房间添加足迹异常:{}", e.getMessage()); } - // 自动领取火箭奖励 - try { - UserProfile userProfile = userProfileGateway.getByUserId(cmd.getReqUserId()); - rocketRewardClaimCmdExe.executeAsync(cmd.getRoomId(), manager.getRoomAccount(), cmd.getReqUserId(), userProfile.getUserNickname()); - } catch (Exception e) { - log.error("触发自动领取火箭奖励失败: roomId={}, userId={}", cmd.getRoomId(), cmd.getReqUserId(), e); - } - return new EntryRoomResponseCO() .setRoomProfile( new EntryRoomProfileCO() diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/RocketConvertor.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/RocketConvertor.java index 4ebdb414..b76edad3 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/RocketConvertor.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/RocketConvertor.java @@ -60,7 +60,7 @@ public class RocketConvertor { co.setTotalContributors(rocketStatus.getContributors() != null ? rocketStatus.getContributors().size() : 0); - co.setLaunchTime(rocketStatus.getLaunchTime()); +// co.setLaunchTime(rocketStatus.getLaunchTime()); co.setClaimExpireTime(rocketStatus.getClaimExpireTime()); co.setClaimCount(rocketStatus.getClaimCount()); diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/RocketStatusCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/RocketStatusCO.java index 1c9fafdc..eedd0996 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/RocketStatusCO.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/RocketStatusCO.java @@ -73,7 +73,7 @@ public class RocketStatusCO { /** * 发射时间 */ - private LocalDateTime launchTime; +// private LocalDateTime launchTime; /** * 领取过期时间 diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketLevel.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketLevel.java index c6bacba5..0f9a892a 100644 --- a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketLevel.java +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketLevel.java @@ -63,7 +63,7 @@ public enum RocketLevel { return switch (this) { case LEVEL_1 -> LEVEL_2; case LEVEL_2 -> LEVEL_3; - case LEVEL_3 -> null; // 三级是最高级,返回null表示需要重置 + case LEVEL_3 -> LEVEL_3; // 三级是最高级,返回null表示需要重置 }; } diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketStatus.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketStatus.java index 4b486555..93fa0e47 100644 --- a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketStatus.java +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketStatus.java @@ -128,46 +128,78 @@ public class RocketStatus { // RocketStatus.java + /** - * 升级到下一级火箭(使用配置) + * 计算能发射的最高等级 + * @return 能发射的等级,如果能量不足返回null */ - private void upgradeToNextLevel(RocketConfigGateway configGateway) { - RocketLevel nextLevel = this.level.getNextLevel(); + public RocketLevel calculateLaunchLevel(RocketConfigGateway configGateway) { + long currentEnergy = this.currentEnergy; - if (nextLevel != null) { - // 查询下一级配置 - RocketConfig nextConfig = configGateway.findByLevel(nextLevel.getLevel()); - if (nextConfig == null || nextConfig.getStatus() != 1) { - log.warn("下一级火箭配置不存在或未启用, level={}", nextLevel.getLevel()); - return; - } - - // 计算溢出能量(当前能量 - 当前等级最大能量) - long overflowEnergy = this.currentEnergy - this.maxEnergy; - if (overflowEnergy < 0) { - overflowEnergy = 0L; - } - - // 保留当前能量值,不清空 - long preservedEnergy = this.currentEnergy; - - // 升级到下一级 - this.level = nextLevel; - this.maxEnergy = nextConfig.getMaxEnergy(); - this.currentEnergy = preservedEnergy; // 完全保留当前能量 - this.status = RocketStatusEnum.CHARGING; - - // 清空贡献者(新一轮) - this.contributors = new ArrayList<>(); - this.launchTime = null; - this.claimExpireTime = null; - - log.info("火箭升级成功, 升至{}级, 溢出能量={}, 新目标={}", - nextLevel.getLevel(), overflowEnergy, this.maxEnergy); - } else { - // 已经是最高级,重置为一级 -// reset(configGateway); + // 如果当前已经是最高级,不能再发射 + if (this.level.isMaxLevel()) { + return this.level; } + + // 查询所有启用的配置 + List configs = configGateway.findAllEnabled(); + if (configs == null || configs.isEmpty()) { + log.warn("未找到启用的火箭配置"); + return null; + } + + // 按等级从高到低排序 + configs.sort((a, b) -> b.getLevel().compareTo(a.getLevel())); + + // 从最高等级开始查找,找到能量满足发射条件的最高等级 + for (RocketConfig config : configs) { + if (config.getLevel() > this.level.getLevel() + && currentEnergy >= config.getMaxEnergy()) { + return RocketLevel.of(config.getLevel()); + } + } + + return null; + } + + /** + * 标记为已发射状态 + */ + public void markAsLaunched() { + this.status = RocketStatusEnum.LAUNCHED; + this.launchTime = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + /** + * 升级到指定等级 + * @param targetLevel 目标等级 + */ + public void upgradeToLevel(RocketConfigGateway configGateway, RocketLevel targetLevel) { + // 查询目标等级的配置 + RocketConfig targetConfig = configGateway.findByLevel(targetLevel.getLevel()); + if (targetConfig == null || targetConfig.getStatus() != 1) { + log.warn("目标等级火箭配置不存在或未启用, level={}", targetLevel.getLevel()); + return; + } + + // 保留当前能量值 + long preservedEnergy = this.currentEnergy; + + // 升级到目标等级 + RocketLevel oldLevel = this.level; + this.level = targetLevel; + this.maxEnergy = targetConfig.getMaxEnergy(); + this.currentEnergy = preservedEnergy; // 完全保留当前能量 + this.status = RocketStatusEnum.CHARGING; + + // 清空贡献者(新一轮) + this.contributors = new ArrayList<>(); + this.launchTime = null; + this.claimExpireTime = null; + + log.info("火箭升级成功, {}级 -> {}级, 保留能量={}, 新目标={}", + oldLevel.getLevel(), targetLevel.getLevel(), preservedEnergy, this.maxEnergy); } /** @@ -179,7 +211,7 @@ public class RocketStatus { this.updatedAt = LocalDateTime.now(); // 升级到下一级 - upgradeToNextLevel(configGateway); +// upgradeToNextLevel(configGateway); } /**