feat: 添加实时广播功能,支持风险预警、玩法切换和赔率更新,增强大厅公共频道的广播能力
This commit is contained in:
@@ -2,12 +2,18 @@
|
||||
|
||||
namespace App\Services\Draw;
|
||||
|
||||
use App\Events\OddsUpdateBroadcast;
|
||||
use App\Events\PlayToggleBroadcast;
|
||||
use App\Events\RiskSoldOutBroadcast;
|
||||
use App\Events\RiskWarningBroadcast;
|
||||
use App\Events\DrawCountdownBroadcast;
|
||||
use App\Events\DrawStatusChangeBroadcast;
|
||||
use App\Events\DrawResultPublishedBroadcast;
|
||||
|
||||
/**
|
||||
* 对齐界面文档 §2.1:`draw.countdown`、`draw.status_change`、`result.published`(频道 `lottery-hall`)。
|
||||
* 对齐界面文档 §2.1:大厅公共频道广播(`lottery-hall`)。
|
||||
* 包含:draw.countdown、draw.status_change、result.published、
|
||||
* risk.sold_out、risk.warning、play.toggle、odds.update
|
||||
*/
|
||||
final class LotteryHallRealtimeBroadcaster
|
||||
{
|
||||
@@ -66,6 +72,67 @@ final class LotteryHallRealtimeBroadcaster
|
||||
broadcast(new DrawResultPublishedBroadcast($data, (int) floor(microtime(true) * 1000)));
|
||||
}
|
||||
|
||||
/** `risk.sold_out` —— 号码赔付池耗尽 */
|
||||
public function notifyRiskSoldOut(int $drawId, string $drawNo, string $normalizedNumber): void
|
||||
{
|
||||
if (! $this->driverSupportsRealtime()) {
|
||||
return;
|
||||
}
|
||||
|
||||
broadcast(new RiskSoldOutBroadcast(
|
||||
$drawId,
|
||||
$drawNo,
|
||||
$normalizedNumber,
|
||||
(int) floor(microtime(true) * 1000),
|
||||
));
|
||||
}
|
||||
|
||||
/** `risk.warning` —— 号码赔付池占用超 80% 预警 */
|
||||
public function notifyRiskWarning(int $drawId, string $drawNo, string $normalizedNumber, float $usageRatio): void
|
||||
{
|
||||
if (! $this->driverSupportsRealtime()) {
|
||||
return;
|
||||
}
|
||||
|
||||
broadcast(new RiskWarningBroadcast(
|
||||
$drawId,
|
||||
$drawNo,
|
||||
$normalizedNumber,
|
||||
$usageRatio,
|
||||
(int) floor(microtime(true) * 1000),
|
||||
));
|
||||
}
|
||||
|
||||
/** `play.toggle` —— 玩法开关变更 */
|
||||
public function notifyPlayToggle(string $playCode, bool $enabled, ?string $reason = null): void
|
||||
{
|
||||
if (! $this->driverSupportsRealtime()) {
|
||||
return;
|
||||
}
|
||||
|
||||
broadcast(new PlayToggleBroadcast(
|
||||
$playCode,
|
||||
$enabled,
|
||||
$reason,
|
||||
(int) floor(microtime(true) * 1000),
|
||||
));
|
||||
}
|
||||
|
||||
/** `odds.update` —— 赔率变更 */
|
||||
public function notifyOddsUpdate(int $versionId, string $versionName, ?array $diff = null): void
|
||||
{
|
||||
if (! $this->driverSupportsRealtime()) {
|
||||
return;
|
||||
}
|
||||
|
||||
broadcast(new OddsUpdateBroadcast(
|
||||
$versionId,
|
||||
$versionName,
|
||||
$diff,
|
||||
(int) floor(microtime(true) * 1000),
|
||||
));
|
||||
}
|
||||
|
||||
private function driverSupportsRealtime(): bool
|
||||
{
|
||||
$default = config('broadcasting.default');
|
||||
|
||||
Reference in New Issue
Block a user