You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.2 KiB
102 lines
3.2 KiB
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\CouponTemplate;
|
|
use App\Models\ScoreLog;
|
|
use App\Models\User;
|
|
use App\Models\UserHasCoupon;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class CouponController extends Controller
|
|
{
|
|
/**
|
|
* 处理用户领取优惠券的请求
|
|
*
|
|
* @param Request $request 请求对象
|
|
* @return \Illuminate\Http\JsonResponse 返回 JSON 响应
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
// 获取请求中的优惠券模板 ID
|
|
$templateId = $request->input('template_id');
|
|
|
|
/**
|
|
* @var $user User
|
|
*/
|
|
// 获取当前登录用户
|
|
$user = auth()->user();
|
|
// 如果用户未登录,返回未授权响应
|
|
if (is_null($user)) {
|
|
return responseJsonAsUnAuthorized('请先登录再领取优惠券');
|
|
}
|
|
|
|
// 查找优惠券模板
|
|
$template = CouponTemplate::query()->find($templateId);
|
|
// 如果模板不存在,返回无效优惠券响应
|
|
if (is_null($template)) {
|
|
return responseJsonAsBadRequest('无效的优惠券');
|
|
}
|
|
|
|
// 判断优惠券是否过期
|
|
$today = Carbon::today();
|
|
$endDate = Carbon::make($template->end_date);
|
|
// 如果当前日期大于优惠券结束日期,返回过期响应
|
|
if ($today->gt($endDate)) {
|
|
return responseJsonAsBadRequest('优惠券已过期');
|
|
}
|
|
|
|
// 检查用户积分是否足够
|
|
if ($user->score_now < $template->score) {
|
|
return responseJsonAsBadRequest("积分不足{$template->score},请先去获取积分");
|
|
}
|
|
|
|
// 确保每个用户只能领取一张优惠券
|
|
if ($user->coupons()->where('template_id', $templateId)->exists()) {
|
|
return responseJsonAsBadRequest('你已经领取过优惠券了');
|
|
}
|
|
|
|
// 开始数据库事务
|
|
DB::beginTransaction();
|
|
|
|
try {
|
|
// 用户减少积分
|
|
if ($template->score > 0) {
|
|
$user->score_now -= $template->score;
|
|
$user->save();
|
|
|
|
// 生成积分日志
|
|
$log = new ScoreLog();
|
|
$log->user_id = $user->getKey();
|
|
$log->description = "领取优惠券";
|
|
$log->score = -1 * $template->score; // 记录减少的积分
|
|
$log->save();
|
|
}
|
|
|
|
// 创建用户优惠券记录
|
|
$coupon = new UserHasCoupon();
|
|
$coupon->template_id = $template->getKey();
|
|
$coupon->user_id = $user->getKey();
|
|
$coupon->title = $template->title;
|
|
$coupon->amount = $template->amount;
|
|
$coupon->full_amount = $template->full_amount;
|
|
$coupon->start_date = $template->start_date;
|
|
$coupon->end_date = $template->end_date;
|
|
$coupon->save();
|
|
|
|
} catch (\Exception $e) {
|
|
// 如果发生异常,回滚事务
|
|
DB::rollBack();
|
|
return responseJsonAsServerError('服务器异常,请稍后再试');
|
|
}
|
|
|
|
// 提交事务
|
|
DB::commit();
|
|
|
|
// 返回成功响应
|
|
return responseJson(200, '领取成功');
|
|
}
|
|
}
|