1.修复自动创建下一期bug

This commit is contained in:
2026-05-26 17:35:45 +08:00
parent 827da2058f
commit 5f8f5aa4ca
3 changed files with 110 additions and 13 deletions

View File

@@ -252,12 +252,16 @@ final class GameLiveService
$now = time();
Db::startTrans();
try {
Db::name('game_record')->where('id', $recordId)->where('status', 3)->update([
$affected = Db::name('game_record')->where('id', $recordId)->where('status', 3)->update([
'status' => 4,
'payout_until' => null,
'update_time' => $now,
]);
$newPeriodNo = GameRecordService::createNextRecordAfterDraw();
if ($affected < 1) {
Db::rollback();
return;
}
Db::commit();
} catch (Throwable $e) {
Db::rollback();
@@ -267,6 +271,17 @@ final class GameLiveService
]);
return;
}
$newPeriodNo = null;
if (GameRecordService::isAutoCreateEnabled()) {
try {
$newPeriodNo = GameRecordService::createNextRecordAfterDraw();
} catch (Throwable $e) {
Log::warning('game live startup create next record failed', [
'record_id' => $recordId,
'error' => $e->getMessage(),
]);
}
}
GameHotDataCoordinator::afterGameRecordCommitted($recordId);
try {
GameRecordStatService::refreshForRecordId($recordId);
@@ -283,6 +298,9 @@ final class GameLiveService
public static function buildSnapshot(?int $recordId = null): array
{
// HTTP/WS 拉快照时也尝试结单,避免仅 gameLiveTicker 未跑时派彩倒计时归零后长期卡住
self::finalizePayoutGrace();
$record = self::resolveRecord($recordId);
if ($record) {
$periodSeconds = self::getConfigInt(self::KEY_PERIOD_SECONDS, 30);
@@ -717,6 +735,8 @@ final class GameLiveService
$id = (int) $row['id'];
$lock = GameHotDataLock::tryAcquireWithWait(GameHotDataLock::TYPE_GAME_RECORD, (string) $id, 2000);
if (!$lock['acquired']) {
Log::warning('finalizePayoutGrace: lock not acquired', ['record_id' => $id]);
return;
}
try {
@@ -726,14 +746,22 @@ final class GameLiveService
$resultNumber = null;
}
$newPeriodNo = null;
$now = time();
Db::startTrans();
try {
Db::name('game_record')->where('id', $id)->update([
'status' => 4,
'payout_until' => null,
'update_time' => time(),
]);
$newPeriodNo = GameRecordService::createNextRecordAfterDraw();
$affected = Db::name('game_record')
->where('id', $id)
->where('status', 3)
->update([
'status' => 4,
'payout_until' => null,
'update_time' => $now,
]);
if ($affected < 1) {
Db::rollback();
return;
}
Db::commit();
} catch (Throwable $e) {
Db::rollback();
@@ -741,13 +769,33 @@ final class GameLiveService
return;
}
if (GameRecordService::isAutoCreateEnabled()) {
try {
$newPeriodNo = GameRecordService::createNextRecordAfterDraw();
} catch (Throwable $e) {
Log::warning('finalizePayoutGrace: create next record failed', [
'record_id' => $id,
'error' => $e->getMessage(),
]);
}
}
GameHotDataCoordinator::afterGameRecordCommitted($id);
GameRecordStatService::refreshForRecordId($id);
self::publishPublicPeriodFinished($id, $periodNo, $resultNumber);
GameWebSocketEventBus::publish('admin.live.finalized', [
'period_id' => $id,
'period_no' => $periodNo,
'result_number' => $resultNumber,
'runtime_enabled' => GameRecordService::isLiveRuntimeEnabled(),
'maintenance_ui' => !GameRecordService::isLiveRuntimeEnabled()
&& !GameRecordService::hasActiveRecord(),
'server_time' => $now,
]);
self::publishSnapshot(null);
if (!GameRecordService::isLiveRuntimeEnabled()) {
self::voidRemainingOpenRoundsOnMaintenanceAfterFinalize();
GameHotDataRedis::gameRecordRefreshAggregateCaches();
self::publishSnapshot(null);
} elseif (is_string($newPeriodNo ?? null) && $newPeriodNo !== '') {
self::publishImmediateBettingTickAfterFinalize();
}