addSeconds(30); } /** * @param int $drawId 期号 ID * @param string $drawNo 期号编号 * @param string $normalizedNumber 标准化后的 4 位号码 * @param float $usageRatio 占用比例(0-1 之间,如 0.85 表示 85%) * @param int $emittedAtMs 发送时间戳(毫秒) */ public function __construct( public readonly int $drawId, public readonly string $drawNo, public readonly string $normalizedNumber, public readonly float $usageRatio, public readonly int $emittedAtMs, ) {} /** * 公共频道,所有在大厅的玩家都能收到。 * * @return array */ public function broadcastOn(): array { return [new Channel('lottery-hall')]; } public function broadcastAs(): string { return 'risk.warning'; } /** * @return array{draw_id: int, draw_no: string, normalized_number: string, usage_ratio: float, usage_percent: int, warning_threshold: float, emitted_at_ms: int} */ public function broadcastWith(): array { return [ 'draw_id' => $this->drawId, 'draw_no' => $this->drawNo, 'normalized_number' => $this->normalizedNumber, 'usage_ratio' => round($this->usageRatio, 4), 'usage_percent' => (int) round($this->usageRatio * 100), 'warning_threshold' => 0.8, // 80% 阈值 'emitted_at_ms' => $this->emittedAtMs, ]; } }