function ($builder) { $builder->latest('sort'); }])->onlyPublished()->findOrFail($id); $drawTicket = null; $drawLog = null; if ($user = $request->user()) { // 当前用户的抽奖机会 $drawTicket = DrawTicket::where('draw_activity_id', $drawActivity->id) ->where('user_id', $user->id) ->first(); // 当前用户未填写收货地址的实物奖品 $drawLog = DrawLog::whereRelation('prize', 'type', DrawPrizeType::Goods->value) ->where('draw_activity_id', $drawActivity->id) ->where('user_id', $user->id) ->whereNull('consignee_name') ->first(); } return response()->json([ 'draw_activity' => DrawActivityResource::make($drawActivity), 'draw_log_id' => $drawLog?->id, 'draw_tickets_number' => (int) $drawTicket?->number, ]); } public function draw($id, Request $request, DrawActivityService $drawActivityService) { $drawActivity = DrawActivity::onlyPublished()->findOrFail($id); $lock = Cache::lock("draw_activity_{$drawActivity->id}", 5); $user = $request->user(); try { $lock->block(3); DB::beginTransaction(); $drawLog = $drawActivityService->draw($drawActivity, $user); DB::commit(); } catch (Throwable $e) { DB::rollBack(); if ($e instanceof LockTimeoutException) { $e = new BizException('抽奖人数较多,请稍后'); } throw $e; } finally { $lock?->release(); } return DrawLogResource::make($drawLog); } }