功能:婚姻系统第8&10步(Controllers + Events + 路由)
- MarriageController:propose/accept/reject/divorce/confirmDivorce/status
- WeddingController:tiers/setup(立即触发)/claim/envelopeStatus
- 8个 WebSocket Events:
Marriage{Proposed|Accepted|Rejected|Expired|Divorced|DivorceRequested}
WeddingCelebration / EnvelopeClaimed
- 前台路由:marriage.* + wedding.*
- 后台路由:admin.marriages.*(superlevel 层)
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 文件功能:前台婚礼控制器
|
||||
*
|
||||
* 处理婚礼设置(档位选择/时间/付款方)、婚礼触发、红包领取。
|
||||
* 所有操作通过 WeddingService 执行。
|
||||
*
|
||||
* @author ChatRoom Laravel
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Events\WeddingCelebration;
|
||||
use App\Models\Marriage;
|
||||
use App\Models\WeddingCeremony;
|
||||
use App\Services\WeddingService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
|
||||
class WeddingController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly WeddingService $wedding,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 获取可用的婚礼档位列表(前台设置弹窗用)。
|
||||
*/
|
||||
public function tiers(): JsonResponse
|
||||
{
|
||||
return response()->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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user