params ?? []; $betSeconds = (int) ($config['bet_window_seconds'] ?? 60); // 防止重复开局(如果上一局还在押注中则跳过) if (BaccaratRound::currentRound()) { return; } $now = now(); $closesAt = $now->copy()->addSeconds($betSeconds); // 创建新局次 $round = BaccaratRound::create([ '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)); $content = "🎲 【百家乐】第 #{$round->id} 局开始!下注时间 {$betSeconds} 秒,押注范围 {$minBet}~{$maxBet} 金币。赔率:🔵大/🟡小 1:{$bigRate} · 💥豹子 1:{$tripleRate}(☠️ {$killText} 点庄家收割)"; $msg = [ 'id' => $chatState->nextMessageId(1), 'room_id' => 1, 'from_user' => '系统传音', 'to_user' => '大家', 'content' => $content, 'is_secret' => false, 'font_color' => '#8b5cf6', 'action' => '大声宣告', 'sent_at' => $now->toDateTimeString(), ]; $chatState->pushMessage(1, $msg); broadcast(new MessageSent(1, $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); } }