From ea9ded11b9b20c629a6c527656f81e5c4312a9e5 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 13 Nov 2025 12:19:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=81=AB=E7=AE=AD=E9=97=AE=E9=A2=98=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/app/RocketRestController.java | 8 -- .../command/rocket/RocketLaunchCmdExe.java | 86 +++++++++++++------ .../rocket/RocketRewardClaimCmdExe.java | 10 --- .../app/manager/RocketEnergyAggregator.java | 35 ++++++-- .../app/manager/RocketLaunchManager.java | 8 +- .../other/app/service/RocketServiceImpl.java | 5 -- .../other/app/service/RocketService.java | 5 -- .../other/domain/rocket/RocketHistory.java | 2 - .../mongo/document/RocketStatusDocument.java | 2 +- 9 files changed, 94 insertions(+), 67 deletions(-) diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/RocketRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/RocketRestController.java index ffaac7fe..05f0d65d 100644 --- a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/RocketRestController.java +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/RocketRestController.java @@ -50,12 +50,4 @@ public class RocketRestController { public RocketRewardCO claimReward(@Valid @RequestBody RocketRewardClaimCmd cmd) { return rocketService.claimReward(cmd); } - - /** - * 手动触发发射 (测试用) - */ -// @PostMapping("/manual-launch") - public void manualLaunch(@RequestParam Long roomId) { - rocketService.manualLaunch(roomId); - } } 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 f268a0af..08d42b01 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 @@ -1,22 +1,32 @@ package com.red.circle.other.app.command.rocket; +import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; +import com.red.circle.external.inner.endpoint.message.ImGroupClient; +import com.red.circle.external.inner.model.cmd.message.BroadcastGroupMsgBodyCmd; +import com.red.circle.external.inner.model.enums.message.GroupMessageTypeEnum; import com.red.circle.other.app.convertor.RocketConvertor; +import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; import com.red.circle.other.app.dto.clientobject.RocketStatusCO; import com.red.circle.other.app.manager.RocketImPushManager; import com.red.circle.other.app.util.DistributedLockUtil; +import com.red.circle.other.app.util.OfficialNoticeUtils; import com.red.circle.other.domain.gateway.RocketConfigGateway; 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.RocketStatus; import com.red.circle.other.domain.rocket.RocketStatusEnum; import com.red.circle.other.infra.database.cache.key.RocketKeys; import com.red.circle.other.infra.database.mongo.service.live.RoomProfileManagerService; +import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Map; /** * 火箭发射命令执行器 @@ -36,15 +46,20 @@ public class RocketLaunchCmdExe { private final RocketImPushManager rocketImPushManager; private final RocketConfigGateway rocketConfigGateway; private final RoomProfileManagerService roomProfileManagerService; + private final ImGroupClient imGroupClient; + private final UserProfileGateway userProfileGateway; + private final UserProfileAppConvertor userProfileAppConvertor; /** * 执行火箭发射 + * @param roomId 房间ID + * @param triggerUserId 触发升级的用户ID */ - public void execute(Long roomId) { + public void execute(Long roomId, Long triggerUserId) { String lockKey = RocketKeys.LOCK.getKey(roomId); distributedLockUtil.executeWithLock(lockKey, 10L, () -> { - doLaunch(roomId); + doLaunch(roomId, triggerUserId); return null; }, "火箭发射操作过于频繁,请稍后重试"); } @@ -52,7 +67,7 @@ public class RocketLaunchCmdExe { /** * 执行发射逻辑 */ - private void doLaunch(Long roomId) { + private void doLaunch(Long roomId, Long triggerUserId) { // 1. 查询当前火箭状态(需要完整数据,包含贡献者) String today = LocalDate.now().toString(); RocketStatus rocketStatus = rocketStatusGateway.findByRoomIdAndDate(roomId, today); @@ -82,6 +97,7 @@ public class RocketLaunchCmdExe { // 5. 保存历史记录(发射前保存,保留贡献者信息) try { + rocketStatus.setLaunchTime(LocalDateTime.now()); RocketHistory history = RocketHistory.fromRocketStatus(rocketStatus); String historyId = rocketHistoryGateway.save(history); log.info("保存火箭历史记录成功: historyId={}, roomId={}, level={}", historyId, roomId, launchedLevel); @@ -89,39 +105,59 @@ public class RocketLaunchCmdExe { log.error("保存火箭历史记录失败: roomId={}", roomId, e); } - // 6. 推送发射动画消息(发射前推送,包含贡献者信息) - try { - RocketStatusCO statusCO = RocketConvertor.toStatusCO(rocketStatus); - rocketImPushManager.pushRocketLaunch( statusCO); - } catch (Exception e) { - log.error("推送火箭发射消息失败: roomId={}", roomId, e); - } - // 7. 发射并自动升级到下一级 rocketStatus.launchAndUpgrade(rocketConfigGateway); // 8. 保存新状态 rocketStatusGateway.save(rocketStatus); - log.info("火箭发射并升级成功: roomId={}, 发射等级={}, 最终能量={}, 贡献者数={}, 升级到={}", + // 9. 广播升级消息(带触发用户信息) + try { + broadcastRocketUpgrade(roomId, launchedLevel, rocketStatus.getLevel().getLevel(), triggerUserId); + } catch (Exception e) { + log.error("广播火箭升级消息失败: roomId={}", roomId, e); + } + + log.info("火箭发射并升级成功: roomId={}, 发射等级={}, 最终能量={}, 贡献者数={}, 升级到={}, 触发用户={}", roomId, launchedLevel, finalEnergy, contributorCount, - rocketStatus.getLevel().getLevel()); + rocketStatus.getLevel().getLevel(), + triggerUserId); - // 9. 如果升级成功,推送升级消息 - if (rocketStatus.getLevel().getLevel() > launchedLevel) { - try { - RocketStatusCO newStatusCO = RocketConvertor.toStatusCO(rocketStatus); - String roomAccount = roomProfileManagerService.getRoomAccount(roomId); - rocketImPushManager.pushEnergyUpdate(roomAccount, newStatusCO); - - String upgradeMsg = launchedLevel == 3 ? "重置为一级火箭" : "升级到" + rocketStatus.getLevel().getName(); - log.info("推送火箭升级消息: roomId={}, {}", roomId, upgradeMsg); - } catch (Exception e) { - log.error("推送火箭升级消息失败: roomId={}", roomId, e); - } + // 10. 推送升级后的状态消息 + try { + RocketStatusCO newStatusCO = RocketConvertor.toStatusCO(rocketStatus); + String roomAccount = roomProfileManagerService.getRoomAccount(roomId); + rocketImPushManager.pushEnergyUpdate(roomAccount, newStatusCO); + } catch (Exception e) { + log.error("推送火箭升级消息失败: roomId={}", roomId, e); + } + } + + /** + * 广播火箭升级消息 + */ + private void broadcastRocketUpgrade(Long roomId, int fromLevel, int toLevel, Long triggerUserId) { + try { + + UserProfileDTO userProfile = userProfileAppConvertor.toUserProfileDTO( + userProfileGateway.getByUserId(triggerUserId)); + Map build = OfficialNoticeUtils.buildUserProfile(userProfile); + build.put("roomId", roomId); + build.put("fromLevel", fromLevel); +// build.put("toLevel", toLevel); + imGroupClient.sendMessageBroadcast( + BroadcastGroupMsgBodyCmd.builder() + .toPlatform(SysOriginPlatformEnum.LIKEI) + .type(GroupMessageTypeEnum.ROCKET_ENERGY_LAUNCH) + .data(build) + .build() + ); + } catch (Exception e) { + log.error("广播火箭升级消息失败: roomId={}, triggerUserId={}", roomId, triggerUserId, e); + throw e; } } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketRewardClaimCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketRewardClaimCmdExe.java index f351ef80..0dba0c50 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketRewardClaimCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/rocket/RocketRewardClaimCmdExe.java @@ -118,16 +118,6 @@ public class RocketRewardClaimCmdExe { // 8. 保存领取记录 saveRewardLog(roomId, userId, latestHistory, selectedReward, walletBizNo); - - // 9. 推送领取成功消息 - try { - String userName = "用户" + userId; - Long rewardAmount = getRewardAmount(selectedReward); - rocketImPushManager.pushRewardClaimed(roomId, userId, userName, rewardAmount); - } catch (Exception e) { - log.error("推送奖励领取消息失败: roomId={}, userId={}", roomId, userId, e); - } - // 10. 构建返回结果 RocketRewardCO rewardCO = new RocketRewardCO(); rewardCO.setRewardType(selectedReward.getType()); diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketEnergyAggregator.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketEnergyAggregator.java index 3e6a6963..c32f3e2b 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketEnergyAggregator.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketEnergyAggregator.java @@ -154,33 +154,52 @@ public class RocketEnergyAggregator { return; } - // 3. 批量增加能量 + // 3. 记录增加能量前的状态 + long energyBeforeAdd = rocketStatus.getCurrentEnergy(); + long maxEnergy = rocketStatus.getMaxEnergy(); + + // 4. 批量增加能量,并找出触发升级的用户 long totalEnergy = 0L; + Long triggerUserId = null; for (RocketEnergyAddCmd cmd : batch) { + // 增加前的能量 + long beforeEnergy = rocketStatus.getCurrentEnergy(); + + // 增加能量 rocketStatus.addEnergy( cmd.getUserId(), cmd.getGiftGoldValue() ); totalEnergy += cmd.getGiftGoldValue(); + + // 增加后的能量 + long afterEnergy = rocketStatus.getCurrentEnergy(); + + // 判断是否是这个用户触发了满能量 + if (beforeEnergy < maxEnergy && afterEnergy >= maxEnergy && triggerUserId == null) { + triggerUserId = cmd.getUserId(); + log.info("找到触发升级的用户: userId={}, beforeEnergy={}, afterEnergy={}, maxEnergy={}", + triggerUserId, beforeEnergy, afterEnergy, maxEnergy); + } } - // 4. 保存状态(一次性保存) + // 5. 保存状态(一次性保存) rocketStatusGateway.save(rocketStatus); log.info("批量增加火箭能量: roomId={}, 批次数量={}, 总能量={}, 当前能量={}/{}", roomId, batch.size(), totalEnergy, rocketStatus.getCurrentEnergy(), rocketStatus.getMaxEnergy()); - // 5. 推送更新消息(节流) + // 6. 推送更新消息(节流) pushEnergyUpdate(roomId, rocketStatus); - // 6. 检查是否需要发射 + // 7. 检查是否需要发射 if (rocketStatus.isFullEnergy()) { - log.info("火箭能量已满, 准备发射, roomId={}, level={}", - roomId, rocketStatus.getLevel().getLevel()); + log.info("火箭能量已满, 准备发射, roomId={}, level={}, 触发用户={}", + roomId, rocketStatus.getLevel().getLevel(), triggerUserId); - // 异步触发发射 - rocketLaunchManager.launchAsync(roomId); + // 异步触发发射,传入触发用户信息 + rocketLaunchManager.launchAsync(roomId, triggerUserId); } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketLaunchManager.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketLaunchManager.java index 61305e25..7433106a 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketLaunchManager.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/manager/RocketLaunchManager.java @@ -22,12 +22,14 @@ public class RocketLaunchManager { /** * 异步发射火箭 + * @param roomId 房间ID + * @param triggerUserId 触发用户ID */ @Async("rocketTaskExecutor") - public void launchAsync(Long roomId) { + public void launchAsync(Long roomId, Long triggerUserId) { try { - log.info("异步执行火箭发射: roomId={}", roomId); - rocketLaunchCmdExe.execute(roomId); + log.info("异步执行火箭发射: roomId={}, 触发用户={}", roomId, triggerUserId); + rocketLaunchCmdExe.execute(roomId, triggerUserId); } catch (Exception e) { log.error("异步火箭发射失败: roomId={}", roomId, e); } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/RocketServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/RocketServiceImpl.java index 54e96730..51495127 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/RocketServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/RocketServiceImpl.java @@ -43,9 +43,4 @@ public class RocketServiceImpl implements RocketService { public RocketRewardCO claimReward(RocketRewardClaimCmd cmd) { return rocketRewardClaimCmdExe.execute(cmd); } - - @Override - public void manualLaunch(Long roomId) { - rocketLaunchCmdExe.execute(roomId); - } } diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/RocketService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/RocketService.java index 0831d21f..4eddb82c 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/RocketService.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/RocketService.java @@ -28,9 +28,4 @@ public interface RocketService { * 领取奖励 */ RocketRewardCO claimReward(RocketRewardClaimCmd cmd); - - /** - * 手动触发火箭发射 (测试用) - */ - void manualLaunch(Long roomId); } diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketHistory.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketHistory.java index 6797c75a..54181034 100644 --- a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketHistory.java +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/rocket/RocketHistory.java @@ -116,8 +116,6 @@ public class RocketHistory { // 设置时间 history.setLaunchTime(status.getLaunchTime()); - history.setClaimStartTime(status.getLaunchTime()); - history.setClaimEndTime(status.getClaimExpireTime()); history.setCreatedAt(LocalDateTime.now()); history.setUpdatedAt(LocalDateTime.now()); diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/document/RocketStatusDocument.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/document/RocketStatusDocument.java index 2b5d30a6..c6a953fd 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/document/RocketStatusDocument.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/document/RocketStatusDocument.java @@ -17,7 +17,7 @@ import java.util.List; */ @Data @Document(collection = "room_rocket_status") -@CompoundIndex(name = "uk_room_date", def = "{'room_id': 1, 'date': 1}", unique = true) +@CompoundIndex(name = "uk_room_date", def = "{'roomId': 1, 'date': 1}", unique = true) public class RocketStatusDocument { /**