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.
aquaculture/app/Http/Controllers/CouponController.php

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, '领取成功');
}
}