params ?? []; $claimWindow = (int) ($config['claim_window_seconds'] ?? 120); $targetRoom = $this->roomId ?? 1; // 自动生成随机暗号(若未指定) $passcode = $this->passcode ?? strtoupper(Str::random(6)); // 根据类型确定奖励范围 [$rewardMin, $rewardMax] = match ($this->boxType) { 'rare' => [ (int) ($config['rare_reward_min'] ?? 5000), (int) ($config['rare_reward_max'] ?? 20000), ], 'trap' => [ (int) ($config['trap_penalty_min'] ?? 200), (int) ($config['trap_penalty_max'] ?? 1000), ], default => [ (int) ($config['normal_reward_min'] ?? 500), (int) ($config['normal_reward_max'] ?? 2000), ], }; // 创建箱子记录 $box = MysteryBox::create([ 'box_type' => $this->boxType, 'passcode' => $passcode, 'reward_min' => $rewardMin, 'reward_max' => $rewardMax, 'status' => 'open', 'expires_at' => now()->addSeconds($claimWindow), 'dropped_by' => $this->droppedBy, ]); // 公屏广播暗号提示 $emoji = $box->typeEmoji(); $typeName = $box->typeName(); $source = $this->droppedBy ? '管理员' : '系统'; $content = "{$emoji}【{$typeName}】{$source}投放了一个神秘箱子!" ."发送暗号「{$passcode}」即可开箱!限时 {$claimWindow} 秒,先到先得!"; $msg = [ 'id' => $chatState->nextMessageId($targetRoom), 'room_id' => $targetRoom, 'from_user' => '系统传音', 'to_user' => '大家', 'content' => $content, 'is_secret' => false, 'font_color' => match ($this->boxType) { 'rare' => '#c4b5fd', 'trap' => '#f87171', default => '#34d399', }, 'action' => '大声宣告', 'sent_at' => now()->toDateTimeString(), ]; $chatState->pushMessage($targetRoom, $msg); broadcast(new MessageSent($targetRoom, $msg)); SaveMessageJob::dispatch($msg); // 定时关闭任务:到期后将箱子标记为 expired ExpireMysteryBoxJob::dispatch($box->id)->delay(now()->addSeconds($claimWindow + 5)); } }