1.修复自动创建下一期bug
This commit is contained in:
@@ -52,6 +52,7 @@ class Live extends Backend
|
||||
$topics = [
|
||||
'admin.live.snapshot',
|
||||
'admin.live.opened',
|
||||
'admin.live.finalized',
|
||||
'jackpot.hit',
|
||||
'period.tick',
|
||||
'period.locked',
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user