diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php
index 2bf829d..4af1dee 100644
--- a/app/Http/Controllers/ChatController.php
+++ b/app/Http/Controllers/ChatController.php
@@ -196,44 +196,43 @@ class ChatController extends Controller
}
// 统一走通用进场播报逻辑,管理员不再发送单独的特殊登录提示。
- [$text, $color] = $this->broadcast->buildEntryBroadcast($user);
$ridePresencePayload = $this->rideService->buildPresencePayload($user);
- // 座驾优先级高于会员进场主题,避免同一用户进房时同时播放两套全屏特效。
- $vipPresencePayload = $ridePresencePayload
- ? []
- : $this->broadcast->buildVipPresencePayload($user, 'join');
+ if (! $ridePresencePayload) {
+ [$text, $color] = $this->broadcast->buildEntryBroadcast($user);
+ $vipPresencePayload = $this->broadcast->buildVipPresencePayload($user, 'join');
- $generalWelcomeMsg = [
- 'id' => $this->chatState->nextMessageId($id),
- 'room_id' => $id,
- 'from_user' => '进出播报',
- 'to_user' => '大家',
- 'content' => "{$text}",
- 'is_secret' => false,
- 'font_color' => $color,
- 'action' => empty($vipPresencePayload) ? 'system_welcome' : 'vip_presence',
- 'welcome_user' => $user->username,
- 'welcome_kind' => 'entry_broadcast',
- 'sent_at' => now()->toDateTimeString(),
- ];
+ $generalWelcomeMsg = [
+ 'id' => $this->chatState->nextMessageId($id),
+ 'room_id' => $id,
+ 'from_user' => '进出播报',
+ 'to_user' => '大家',
+ 'content' => "{$text}",
+ 'is_secret' => false,
+ 'font_color' => $color,
+ 'action' => empty($vipPresencePayload) ? 'system_welcome' : 'vip_presence',
+ 'welcome_user' => $user->username,
+ 'welcome_kind' => 'entry_broadcast',
+ 'sent_at' => now()->toDateTimeString(),
+ ];
- // 当会员等级带有专属主题时,把横幅与特效字段并入系统消息,供前端展示豪华进场效果。
- if (! empty($vipPresencePayload)) {
- $generalWelcomeMsg = array_merge($generalWelcomeMsg, $vipPresencePayload);
- $initialPresenceTheme = $vipPresencePayload;
- }
+ // 当会员等级带有专属主题时,把横幅与特效字段并入系统消息,供前端展示豪华进场效果。
+ if (! empty($vipPresencePayload)) {
+ $generalWelcomeMsg = array_merge($generalWelcomeMsg, $vipPresencePayload);
+ $initialPresenceTheme = $vipPresencePayload;
+ }
- // 把当前这次进房生成的欢迎消息带回前端,确保用户自己也一定能看到。
- $initialWelcomeMessage = $generalWelcomeMsg;
- $initialWelcomeMessages[] = $generalWelcomeMsg;
+ // 把当前这次进房生成的欢迎消息带回前端,确保用户自己也一定能看到。
+ $initialWelcomeMessage = $generalWelcomeMsg;
+ $initialWelcomeMessages[] = $generalWelcomeMsg;
- $this->chatState->pushMessage($id, $generalWelcomeMsg);
- // 修复:之前使用了 ->toOthers() 导致自己看不到自己的进场提示
- broadcast(new MessageSent($id, $generalWelcomeMsg));
+ $this->chatState->pushMessage($id, $generalWelcomeMsg);
+ // 修复:之前使用了 ->toOthers() 导致自己看不到自己的进场提示
+ broadcast(new MessageSent($id, $generalWelcomeMsg));
- // 会员专属特效需要单独广播给其他在线成员,自己则在页面初始化后本地补播。
- if (! empty($vipPresencePayload['presence_effect'])) {
- broadcast(new \App\Events\EffectBroadcast($id, $vipPresencePayload['presence_effect'], $user->username))->toOthers();
+ // 会员专属特效需要单独广播给其他在线成员,自己则在页面初始化后本地补播。
+ if (! empty($vipPresencePayload['presence_effect'])) {
+ broadcast(new \App\Events\EffectBroadcast($id, $vipPresencePayload['presence_effect'], $user->username))->toOthers();
+ }
}
if ($ridePresencePayload) {
diff --git a/tests/Feature/ChatControllerTest.php b/tests/Feature/ChatControllerTest.php
index 0420a2b..f8737ce 100644
--- a/tests/Feature/ChatControllerTest.php
+++ b/tests/Feature/ChatControllerTest.php
@@ -1128,8 +1128,10 @@ class ChatControllerTest extends TestCase
$response->assertOk();
$history = collect($response->viewData('historyMessages'));
$rideMessage = $history->first(fn (array $message): bool => ($message['welcome_kind'] ?? '') === 'ride_presence');
+ $entryBroadcast = $history->first(fn (array $message): bool => ($message['welcome_kind'] ?? '') === 'entry_broadcast');
$this->assertNotNull($rideMessage);
+ $this->assertNull($entryBroadcast);
$this->assertSame('座驾播报', $rideMessage['from_user']);
$this->assertSame('j35', $rideMessage['ride_key']);
$this->assertSame("{$user->username} 乘坐【歼-35测试座驾】闪亮登场", $rideMessage['effect_title']);
@@ -1217,6 +1219,7 @@ class ChatControllerTest extends TestCase
$this->assertStringContainsString($user->username, $rideMessage['content']);
$this->assertSame('99a', $response->viewData('initialRideEffect'));
$this->assertSame("用户 {$user->username} · 部门 战备部 · 职务 🛡️ 试飞官 · 会员 👑 至尊会员", $response->viewData('initialRideEffectOptions')['effect_user_info']);
+ $this->assertNull($response->viewData('initialWelcomeMessage'));
$this->assertNull($response->viewData('initialPresenceTheme'));
}