From 2c6f405524dab2870151c9456aa13d5221f676bb Mon Sep 17 00:00:00 2001 From: wells <123456@qq.com> Date: Sun, 9 Aug 2026 11:40:04 +0800 Subject: [PATCH] =?UTF-8?q?processPendingTasks=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/tailbet/job/GameJob.java | 30 +++++++++++++++---- .../service/impl/RedPacketServiceImpl.java | 13 ++++++-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/tailbet/job/GameJob.java b/src/main/java/com/tailbet/job/GameJob.java index a509489..435c011 100644 --- a/src/main/java/com/tailbet/job/GameJob.java +++ b/src/main/java/com/tailbet/job/GameJob.java @@ -139,20 +139,24 @@ public class GameJob { /** * 从数据库恢复延迟任务队列 + * 注:包括已过期的任务,过期任务会在processPendingTasks中立即执行 */ private void recoverPendingTasks() { try { - List dbTasks = pendingTaskMapper.selectList( - new LambdaQueryWrapper() - .gt(PendingTask::getExecuteTime, LocalDateTime.now())); + // 数据库中残留的记录都是未执行的(执行成功后会立即删除),全部恢复 + List dbTasks = pendingTaskMapper.selectList(null); if (dbTasks == null || dbTasks.isEmpty()) { log.info("无待执行的延迟任务,无需恢复"); return; } + LocalDateTime now = LocalDateTime.now(); + int recovered = 0; + int expiredCount = 0; for (PendingTask dbTask : dbTasks) { - if (dbTask.getExecuteTime() == null || !dbTask.getExecuteTime().isAfter(LocalDateTime.now())) { + if (dbTask.getExecuteTime() == null) { + log.warn("跳过executeTime为空的延迟任务: taskId={}", dbTask.getTaskId()); continue; } PendingTaskInfo info = new PendingTaskInfo(); @@ -163,9 +167,16 @@ public class GameJob { info.setDigit(dbTask.getDigit()); info.setExecuteTime(dbTask.getExecuteTime()); pendingTasks.put(info.getTaskId(), info); + recovered++; + if (!dbTask.getExecuteTime().isAfter(now)) { + expiredCount++; + log.warn("恢复已过期任务,启动后立即执行: taskId={}, type={}, groupId={}, executeTime={}", + dbTask.getTaskId(), dbTask.getType(), dbTask.getGroupId(), dbTask.getExecuteTime()); + } } - log.info("延迟任务恢复完成,共恢复 {} 个待执行任务", pendingTasks.size()); + log.info("延迟任务恢复完成,共恢复 {} 个待执行任务,其中 {} 个已过期将立即执行", + recovered, expiredCount); } catch (Exception e) { log.error("恢复延迟任务失败: {}", e.getMessage(), e); } @@ -784,7 +795,14 @@ public class GameJob { */ private boolean onAutoNext(Long groupId) { try { - gameService.startGame(groupId, 0L); // 0L表示系统自动 + GameRound round = gameService.startGame(groupId, 0L); // 0L表示系统自动 + if (round == null || round.getId() == null) { + log.warn("自动开始下一期失败:startGame未返回局信息, groupId={}", groupId); + return false; + } + // 复用与手动流程一致的逻辑:注册roundTasks监控 + 广播开始下注 + int betWindowSeconds = getConfigInt("bet_window_seconds", 60); + onGameStart(round.getId(), groupId, betWindowSeconds); return true; } catch (Exception e) { log.error("自动开始下一期失败: groupId={}, error={}", groupId, e.getMessage()); diff --git a/src/main/java/com/tailbet/service/impl/RedPacketServiceImpl.java b/src/main/java/com/tailbet/service/impl/RedPacketServiceImpl.java index bed46b9..7200c26 100644 --- a/src/main/java/com/tailbet/service/impl/RedPacketServiceImpl.java +++ b/src/main/java/com/tailbet/service/impl/RedPacketServiceImpl.java @@ -16,6 +16,7 @@ import com.tailbet.service.IAuditService; import com.tailbet.service.IPointsService; import com.tailbet.service.IRedPacketService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -174,11 +175,19 @@ public class RedPacketServiceImpl implements IRedPacketService { redPacketMapper.updateById(rp); - // 如果是游戏红包且已领完,发布开奖事件 + // 如果是游戏红包且已领完,标记手气王并发布开奖事件 if (isFinished && TYPE_GAME.equals(rp.getType()) && rp.getRoundId() != null) { + // 标记手气王的领取记录 is_lucky=1 + if (rp.getLuckyUserId() != null) { + redPacketRecvMapper.update(null, new LambdaUpdateWrapper() + .eq(RedPacketRecv::getRpId, rpId) + .eq(RedPacketRecv::getUserId, rp.getLuckyUserId()) + .set(RedPacketRecv::getIsLucky, 1)); + } eventPublisher.publishEvent(new RedPacketFinishedEvent( this, rp.getRoundId(), rp.getGroupId(), rp.getId(), rp.getLuckyDigit())); - log.info("游戏红包领完,发布开奖事件: roundId={}, luckyDigit={}", rp.getRoundId(), rp.getLuckyDigit()); + log.info("游戏红包领完,标记手气王并发布开奖事件: roundId={}, luckyDigit={}, luckyUserId={}", + rp.getRoundId(), rp.getLuckyDigit(), rp.getLuckyUserId()); } // 加积分