1.ws优化bet.win订阅,修复中大奖没有推送

This commit is contained in:
2026-05-26 19:01:28 +08:00
parent 98b2696f89
commit 6d3711e1db
4 changed files with 208 additions and 0 deletions

View File

@@ -494,6 +494,50 @@ final class GameBetSettleService
$effectiveBetWins = self::buildBetWinPayloadsFromSettledOrders($periodId, $resultNumber);
}
self::publishBetWinsAfterCommit($effectiveBetWins, $periodId);
if ($periodId > 0 && $resultNumber > 0) {
self::ensurePeriodBetWinNotifications($periodId, $resultNumber);
}
}
/**
* 开奖后兜底:库内已有中奖但 Redis 无 bet.win 去重键时补推(避免 streak/wallet 整期 dedup 或旧版逻辑漏推)。
*/
public static function ensurePeriodBetWinNotifications(int $periodId, int $resultNumber): void
{
if ($periodId <= 0 || $resultNumber < 1) {
return;
}
$payloads = self::buildBetWinPayloadsFromSettledOrders($periodId, $resultNumber);
if ($payloads === []) {
return;
}
$missing = [];
foreach ($payloads as $payload) {
if (!is_array($payload)) {
continue;
}
$userId = filter_var($payload['user_id'] ?? 0, FILTER_VALIDATE_INT);
if ($userId === false || $userId <= 0) {
continue;
}
$key = self::BET_WIN_NOTIFY_DEDUP_PREFIX . $periodId . ':' . $userId;
try {
$existing = Redis::get($key);
if ($existing !== false && $existing !== null && $existing !== '') {
continue;
}
} catch (Throwable) {
}
$missing[] = $payload;
}
if ($missing !== []) {
Log::warning('bet.win ensurePeriodBetWinNotifications republish', [
'period_id' => $periodId,
'result_number' => $resultNumber,
'user_ids' => array_map(static fn (array $p): int => (int) ($p['user_id'] ?? 0), $missing),
]);
self::publishBetWinsAfterCommit($missing, $periodId);
}
}
private static function markBetWinNotifyOnce(int $periodId, int $userId): bool