params ?? []; $betSeconds = (int) ($config['bet_window_seconds'] ?? 60); // 防止重复开局(如果上一局还在押注中则跳过) if (BaccaratRound::currentRound($this->roomId)) { return; } $now = now(); $closesAt = $now->copy()->addSeconds($betSeconds); // 创建新局次 $round = BaccaratRound::create([ 'room_id' => $this->roomId, 'status' => 'betting', 'bet_opens_at' => $now, 'bet_closes_at' => $closesAt, ]); // 广播开局事件 broadcast(new BaccaratRoundOpened($round)); // 公屏系统公告 $minBet = number_format($config['min_bet'] ?? 100); $maxBet = number_format($config['max_bet'] ?? 50000); $bigRate = (int) ($config['big_rate'] ?? 1); $tripleRate = (int) ($config['triple_rate'] ?? 24); $killPoints = $config['kill_points'] ?? [3, 18]; if (! is_array($killPoints)) { $killPoints = explode(',', (string) $killPoints); } $killText = implode('或', array_map('intval', $killPoints)); $quickOpenButton = ''; $content = "🎲 开局:{$betSeconds} 秒下注,{$minBet}~{$maxBet} 金币,🔵/🟡 1:{$bigRate},💥 1:{$tripleRate},☠️ {$killText} 点收割。".$quickOpenButton; $msg = [ 'id' => $chatState->nextMessageId($this->roomId), 'room_id' => $this->roomId, 'from_user' => '系统传音', 'to_user' => '大家', 'content' => $content, 'is_secret' => false, 'font_color' => '#8b5cf6', 'action' => '大声宣告', 'sent_at' => $now->toDateTimeString(), ]; $chatState->pushMessage($this->roomId, $msg); broadcast(new MessageSent($this->roomId, $msg)); SaveMessageJob::dispatch($msg); // 如果允许 AI 参与,延迟一定时间派发 AI 下注任务 $baccaratEnabled = \App\Models\Sysparam::getValue('chatbot_baccarat_enabled', '0') === '1'; if (\App\Models\Sysparam::getValue('chatbot_enabled', '0') === '1' && $baccaratEnabled) { $aiDelay = rand(10, min(40, max(10, $betSeconds - 5))); // 随机在 10 ~ (倒数前5秒) 之间下注 \App\Jobs\AiBaccaratBetJob::dispatch($round)->delay(now()->addSeconds($aiDelay)); } // 在下注截止时安排结算任务 CloseBaccaratRoundJob::dispatch($round)->delay($closesAt); } }