diff --git a/src/main/java/com/tailbet/controller/RedPacketController.java b/src/main/java/com/tailbet/controller/RedPacketController.java index d7e64bf..ed3cff8 100644 --- a/src/main/java/com/tailbet/controller/RedPacketController.java +++ b/src/main/java/com/tailbet/controller/RedPacketController.java @@ -29,9 +29,9 @@ public class RedPacketController { @PostMapping("/send") public R sendRp(@RequestBody SendRpDTO dto) { Long userId = UserContext.getUserId(); - // roundId从当前group的进行中局获取 - var ongoingRound = gameService.getOngoingRound(dto.getGroupId()); - Long roundId = ongoingRound == null ? null : ongoingRound.getId(); + // roundId从当前group的RP_SENDING状态局获取 + var sendingRound = gameService.getRpSendingRound(dto.getGroupId()); + Long roundId = sendingRound == null ? null : sendingRound.getId(); var rp = redPacketService.sendRp(userId, dto.getGroupId(), dto.getTotalAmount(), dto.getTotalCount(), roundId); return R.ok(rp); diff --git a/src/main/java/com/tailbet/job/GameJob.java b/src/main/java/com/tailbet/job/GameJob.java index 60d4b91..9a835c8 100644 --- a/src/main/java/com/tailbet/job/GameJob.java +++ b/src/main/java/com/tailbet/job/GameJob.java @@ -187,6 +187,14 @@ public class GameJob { } } + /** + * 获取字符串配置值(带默认值) + */ + public String getConfig(String key, String defaultValue) { + String value = configCache.get(key); + return value == null ? defaultValue : value; + } + /** * 检查红包是否需要托领取(每3秒执行) */ @@ -470,10 +478,26 @@ public class GameJob { */ public void botSendRp(Long roundId, Long groupId) { GameRound round = gameRoundMapper.selectById(roundId); - if (round == null || round.getTargetDigit() == null) { + if (round == null) { return; } + // 仅在"开始发红包"状态下才执行,避免误触发 + if (round.getStatus() == null || round.getStatus() != IGameService.STATUS_RP_SENDING) { + log.debug("本局{}当前状态非发红包中(status={}),机器人跳过发包", + roundId, round.getStatus()); + return; + } + + // 已有用户先发包,机器人不再重复发包(让用户的红包触发开奖) + if (round.getFirstRpId() != null) { + log.info("本局{}已有用户先发包(firstRpId={}),机器人跳过发包", + roundId, round.getFirstRpId()); + return; + } + + // 即使未设置目标尾数,机器人也会发包(由RedPacketService按随机金额处理) + // 查找机器人账号 User bot = userMapper.selectOne(new LambdaQueryWrapper() .eq(User::getIsBot, 1) @@ -485,17 +509,16 @@ public class GameJob { } try { - // 机器人发1元3个包 - RedPacket rp = redPacketService.sendRp(bot.getId(), groupId, - new BigDecimal("1"), 3, roundId); + // 从配置读取金额和数量,默认1元3个包 + BigDecimal amount = new BigDecimal(getConfig("bot_rp_amount", "1")); + int count = getConfigInt("bot_rp_count", 3); - // 红包尾数控制: 需要在发红包时预计算各份额金额 - // 确保手气王金额的尾数等于目标尾数 - // 注: 当前实现中红包金额随机分配,实际生产需要调用RedPacketService控制尾数 - log.info("机器人自动发包: roundId={}, rpId={}, targetDigit={}", - roundId, rp.getId(), round != null ? round.getTargetDigit() : "null"); + // 机器人发包 + RedPacket rp = redPacketService.sendRp(bot.getId(), groupId, amount, count, roundId); + log.info("机器人自动发包: roundId={}, rpId={}, amount={}, count={}, targetDigit={}", + roundId, rp.getId(), amount, count, round.getTargetDigit()); } catch (Exception e) { - log.error("机器人发包失败: roundId={}, error={}", roundId, e.getMessage()); + log.error("机器人发包失败: roundId={}, error={}", roundId, e.getMessage(), e); } } diff --git a/src/main/java/com/tailbet/service/IGameService.java b/src/main/java/com/tailbet/service/IGameService.java index 9f56af2..ae345a1 100644 --- a/src/main/java/com/tailbet/service/IGameService.java +++ b/src/main/java/com/tailbet/service/IGameService.java @@ -43,6 +43,16 @@ public interface IGameService { */ GameRound getBettingRound(Long groupId); + /** + * 获取群当前正在发红包的局 + */ + GameRound getRpSendingRound(Long groupId); + + /** + * 获取群当前可发红包的局(已封盘或正在发红包中) + */ + GameRound getActiveSendRound(Long groupId); + /** * 生成期号 */ diff --git a/src/main/java/com/tailbet/service/impl/GameServiceImpl.java b/src/main/java/com/tailbet/service/impl/GameServiceImpl.java index c908179..c97cb1b 100644 --- a/src/main/java/com/tailbet/service/impl/GameServiceImpl.java +++ b/src/main/java/com/tailbet/service/impl/GameServiceImpl.java @@ -67,6 +67,31 @@ public class GameServiceImpl implements IGameService { .last("LIMIT 1")); } + /** + * 获取群当前正在发红包的局 + */ + @Override + public GameRound getRpSendingRound(Long groupId) { + return gameRoundMapper.selectOne(new LambdaQueryWrapper() + .eq(GameRound::getGroupId, groupId) + .eq(GameRound::getStatus, STATUS_RP_SENDING) + .orderByDesc(GameRound::getCreateTime) + .last("LIMIT 1")); + } + + /** + * 获取群当前可发红包的局(已封盘或正在发红包中) + * 改尾数阶段已封盘也允许玩家发红包(普通游戏红包,无尾数控制) + */ + @Override + public GameRound getActiveSendRound(Long groupId) { + return gameRoundMapper.selectOne(new LambdaQueryWrapper() + .eq(GameRound::getGroupId, groupId) + .in(GameRound::getStatus, java.util.Arrays.asList(STATUS_BET_CLOSED, STATUS_RP_SENDING)) + .orderByDesc(GameRound::getCreateTime) + .last("LIMIT 1")); + } + /** * 生成期号 */