fix 假人托领取剩余份额(循环领取直到红包领完)

This commit is contained in:
wells
2026-08-05 17:51:56 +08:00
parent f889eeab77
commit 6ec17b45f0
+36 -12
View File
@@ -5,12 +5,14 @@ import com.tailbet.model.entity.RedPacket;
import com.tailbet.model.entity.User; import com.tailbet.model.entity.User;
import com.tailbet.mapper.GameRoundMapper; import com.tailbet.mapper.GameRoundMapper;
import com.tailbet.mapper.RedPacketMapper; import com.tailbet.mapper.RedPacketMapper;
import com.tailbet.mapper.RedPacketRecvMapper;
import com.tailbet.mapper.UserMapper; import com.tailbet.mapper.UserMapper;
import com.tailbet.mapper.DigitWhiteMapper; import com.tailbet.mapper.DigitWhiteMapper;
import com.tailbet.mapper.DrawRecordMapper; import com.tailbet.mapper.DrawRecordMapper;
import com.tailbet.mapper.SysConfigMapper; import com.tailbet.mapper.SysConfigMapper;
import com.tailbet.model.entity.DigitWhite; import com.tailbet.model.entity.DigitWhite;
import com.tailbet.model.entity.DrawRecord; import com.tailbet.model.entity.DrawRecord;
import com.tailbet.model.entity.RedPacketRecv;
import com.tailbet.model.entity.SysConfig; import com.tailbet.model.entity.SysConfig;
import com.tailbet.service.IGameService; import com.tailbet.service.IGameService;
import com.tailbet.service.IRedPacketService; import com.tailbet.service.IRedPacketService;
@@ -38,6 +40,7 @@ public class GameJob {
private final GameRoundMapper gameRoundMapper; private final GameRoundMapper gameRoundMapper;
private final RedPacketMapper redPacketMapper; private final RedPacketMapper redPacketMapper;
private final RedPacketRecvMapper redPacketRecvMapper;
private final DrawRecordMapper drawRecordMapper; private final DrawRecordMapper drawRecordMapper;
private final SysConfigMapper sysConfigMapper; private final SysConfigMapper sysConfigMapper;
private final UserMapper userMapper; private final UserMapper userMapper;
@@ -122,7 +125,7 @@ public class GameJob {
} }
/** /**
* 假人托领取剩余份额 * 假人托领取剩余份额(循环领取直到红包领完)
*/ */
private void fakeUserReceiveRemaining(RedPacket rp) { private void fakeUserReceiveRemaining(RedPacket rp) {
List<User> fakes = fakeUserService.getFakeUsers(); List<User> fakes = fakeUserService.getFakeUsers();
@@ -130,21 +133,42 @@ public class GameJob {
return; 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<RedPacket>() User fakeToUse = null;
.eq(RedPacket::getUserId, fake.getId())); for (User fake : fakes) {
if (!existing.isEmpty()) { // 检查该假人是否已领取过本红包
return; var received = redPacketRecvMapper.selectList(
new LambdaQueryWrapper<RedPacketRecv>()
.eq(RedPacketRecv::getRpId, rp.getId())
.eq(RedPacketRecv::getUserId, fake.getId()));
if (received.isEmpty()) {
fakeToUse = fake;
break;
}
}
if (fakeToUse == null) {
// 所有假人都已领取过,无法继续
log.warn("所有假人都已领取过本红包,无法继续: rpId={}", rp.getId());
break;
} }
try { try {
redPacketService.receiveRp(rp.getId(), fake.getId()); redPacketService.receiveRp(rp.getId(), fakeToUse.getId());
log.info("假人{}领取红包{}剩余份额", fake.getId(), rp.getId()); log.info("假人{}领取红包{}剩余份额", fakeToUse.getId(), rp.getId());
} catch (Exception e) { } 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) { private void notifyWhiteUsers(Long roundId) {
List<DigitWhite> whites = digitWhiteMapper.selectList(new LambdaQueryWrapper<DigitWhite>()); List<DigitWhite> whites = digitWhiteMapper.selectList(new LambdaQueryWrapper<>());
GameRound round = gameRoundMapper.selectById(roundId); GameRound round = gameRoundMapper.selectById(roundId);
if (round == null) return; if (round == null) return;