json([ 'tiers' => $this->wedding->activeTiers()->map(fn ($t) => [ 'id' => $t->id, 'tier' => $t->tier, 'name' => $t->name, 'icon' => $t->icon, 'amount' => $t->amount, 'description' => $t->description, ]), ]); } /** * 设置并发起婚礼(结婚后由接受方配置)。 */ public function setup(Request $request, Marriage $marriage): JsonResponse { $user = $request->user(); // 只有婚姻双方可设置 if (! $marriage->involves($user->id)) { return response()->json(['ok' => false, 'message' => '无权操作此婚姻。'], 403); } if ($marriage->status !== 'married') { return response()->json(['ok' => false, 'message' => '婚姻状态异常。'], 422); } $data = $request->validate([ 'tier_id' => 'nullable|integer|exists:wedding_tiers,id', 'payer_type' => 'required|in:groom,joint', 'ceremony_type' => 'required|in:immediate,scheduled', 'ceremony_at' => 'nullable|date|after:now', ]); $ceremonyAt = isset($data['ceremony_at']) ? Carbon::parse($data['ceremony_at']) : null; $result = $this->wedding->setup( $marriage, $data['tier_id'] ?? null, $data['payer_type'], $data['ceremony_type'], $ceremonyAt, ); // 立即婚礼:直接触发 if ($result['ok'] && $data['ceremony_type'] === 'immediate') { $ceremony = WeddingCeremony::find($result['ceremony_id']); if ($ceremony) { $triggerResult = $this->wedding->trigger($ceremony); // 广播全房间婚礼事件 broadcast(new WeddingCelebration($ceremony, $marriage)); } } return response()->json($result); } /** * 领取婚礼红包。 */ public function claim(Request $request, WeddingCeremony $ceremony): JsonResponse { $result = $this->wedding->claim($ceremony, $request->user()); return response()->json($result); } /** * 查询用户在婚礼中是否有待领取红包。 */ public function envelopeStatus(Request $request, WeddingCeremony $ceremony): JsonResponse { $claim = $this->wedding->getUnclaimedEnvelope($ceremony, $request->user()->id); return response()->json([ 'has_envelope' => $claim !== null, 'amount' => $claim?->amount ?? 0, 'expires_at' => $ceremony->expires_at, ]); } }