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

This commit is contained in:
wells
2026-08-05 17:51:56 +08:00
parent f889eeab77
commit 6ec17b45f0
+39 -15
View File
@@ -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<User> 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<RedPacket>()
.eq(RedPacket::getUserId, fake.getId()));
if (!existing.isEmpty()) {
return;
}
// 查找还未领取的假人
User fakeToUse = null;
for (User fake : fakes) {
// 检查该假人是否已领取过本红包
var received = redPacketRecvMapper.selectList(
new LambdaQueryWrapper<RedPacketRecv>()
.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<DigitWhite> whites = digitWhiteMapper.selectList(new LambdaQueryWrapper<DigitWhite>());
List<DigitWhite> whites = digitWhiteMapper.selectList(new LambdaQueryWrapper<>());
GameRound round = gameRoundMapper.selectById(roundId);
if (round == null) return;