91 lines
3.0 KiB
PHP
91 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Endpoint\Api\Http\Controllers;
|
|
|
|
use App\Endpoint\Api\Http\Resources\DrawActivityResource;
|
|
use App\Endpoint\Api\Http\Resources\DrawLogResource;
|
|
use App\Enums\DrawPrizeType;
|
|
use App\Exceptions\BizException;
|
|
use App\Models\DrawActivity;
|
|
use App\Models\DrawLog;
|
|
use App\Models\DrawTicket;
|
|
use App\Services\DrawActivityService;
|
|
use App\Services\DrawTicketService;
|
|
use Illuminate\Contracts\Cache\LockTimeoutException;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Throwable;
|
|
|
|
class DrawActivityController extends Controller
|
|
{
|
|
public function show($id, Request $request)
|
|
{
|
|
$drawActivity = DrawActivity::with(['prizes' => function ($builder) {
|
|
$builder->orderBy('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();
|
|
|
|
// 保证每个用户, 每月至少一次 抽奖机会
|
|
if ($drawActivity->send_ticket_type == 2) {
|
|
$service = DrawTicketService::make();
|
|
if (!$drawTicket || ($drawTicket->updated_at->lt(now()->startOfMonth()) && $drawTicket->number <= 0)) {
|
|
$service->change($user, $drawActivity, 1, '活动赠送');
|
|
|
|
$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);
|
|
}
|
|
}
|