From 6ec17b45f06f97881c7dd9a72ed0b1018c262b14 Mon Sep 17 00:00:00 2001 From: wells <123456@qq.com> Date: Wed, 5 Aug 2026 17:51:56 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=20=20=E5=81=87=E4=BA=BA=E6=89=98?= =?UTF-8?q?=E9=A2=86=E5=8F=96=E5=89=A9=E4=BD=99=E4=BB=BD=E9=A2=9D=EF=BC=88?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E9=A2=86=E5=8F=96=E7=9B=B4=E5=88=B0=E7=BA=A2?= =?UTF-8?q?=E5=8C=85=E9=A2=86=E5=AE=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/tailbet/job/GameJob.java | 54 ++++++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/tailbet/job/GameJob.java b/src/main/java/com/tailbet/job/GameJob.java index dcb6468..c9e91ae 100644 --- a/src/main/java/com/tailbet/job/GameJob.java +++ b/src/main/java/com/tailbet/job/GameJob.java @@ -5,12 +5,14 @@ import com.tailbet.model.entity.RedPacket; import com.tailbet.model.entity.User; import com.tailbet.mapper.GameRoundMapper; import com.tailbet.mapper.RedPacketMapper; +import com.tailbet.mapper.RedPacketRecvMapper; import com.tailbet.mapper.UserMapper; import com.tailbet.mapper.DigitWhiteMapper; import com.tailbet.mapper.DrawRecordMapper; import com.tailbet.mapper.SysConfigMapper; import com.tailbet.model.entity.DigitWhite; import com.tailbet.model.entity.DrawRecord; +import com.tailbet.model.entity.RedPacketRecv; import com.tailbet.model.entity.SysConfig; import com.tailbet.service.IGameService; import com.tailbet.service.IRedPacketService; @@ -38,6 +40,7 @@ public class GameJob { private final GameRoundMapper gameRoundMapper; private final RedPacketMapper redPacketMapper; + private final RedPacketRecvMapper redPacketRecvMapper; private final DrawRecordMapper drawRecordMapper; private final SysConfigMapper sysConfigMapper; private final UserMapper userMapper; @@ -122,7 +125,7 @@ public class GameJob { } /** - * 假人托领取剩余份额 + * 假人托领取剩余份额(循环领取直到红包领完) */ private void fakeUserReceiveRemaining(RedPacket rp) { List fakes = fakeUserService.getFakeUsers(); @@ -130,21 +133,42 @@ public class GameJob { return; } - // 随机选一个假人 - User fake = fakes.get((int) (Math.random() * fakes.size())); + // 循环领取直到红包领完 + while (true) { + RedPacket rpCheck = redPacketMapper.selectById(rp.getId()); + if (rpCheck == null || rpCheck.getStatus() != 0) { + // 红包已领完或不存在 + break; + } - // 检查是否已经领取过 - var existing = redPacketMapper.selectList(new LambdaQueryWrapper() - .eq(RedPacket::getUserId, fake.getId())); - if (!existing.isEmpty()) { - return; - } + // 查找还未领取的假人 + User fakeToUse = null; + for (User fake : fakes) { + // 检查该假人是否已领取过本红包 + var received = redPacketRecvMapper.selectList( + new LambdaQueryWrapper() + .eq(RedPacketRecv::getRpId, rp.getId()) + .eq(RedPacketRecv::getUserId, fake.getId())); + if (received.isEmpty()) { + fakeToUse = fake; + break; + } + } - try { - redPacketService.receiveRp(rp.getId(), fake.getId()); - log.info("假人{}领取红包{}剩余份额", fake.getId(), rp.getId()); - } catch (Exception e) { - // 忽略领取失败 + if (fakeToUse == null) { + // 所有假人都已领取过,无法继续 + log.warn("所有假人都已领取过本红包,无法继续: rpId={}", rp.getId()); + break; + } + + try { + redPacketService.receiveRp(rp.getId(), fakeToUse.getId()); + log.info("假人{}领取红包{}剩余份额", fakeToUse.getId(), rp.getId()); + } catch (Exception e) { + log.error("假人领取红包失败: rpId={}, fakeId={}, error={}", rp.getId(), fakeToUse.getId(), e.getMessage()); + // 可能是红包已领完,退出循环 + break; + } } } @@ -369,7 +393,7 @@ public class GameJob { * 通知白名单用户(尾数试算完成) */ private void notifyWhiteUsers(Long roundId) { - List whites = digitWhiteMapper.selectList(new LambdaQueryWrapper()); + List whites = digitWhiteMapper.selectList(new LambdaQueryWrapper<>()); GameRound round = gameRoundMapper.selectById(roundId); if (round == null) return;