love_php/app/Http/Controllers/ExchangeController.php
2026-04-02 09:20:51 +08:00

157 lines
5.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\ExchangeGoodsRequest;
use App\Http\Response\ResponseJson;
use App\Models\CoinExchange;
use App\Models\ExchangeGoods;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
class ExchangeController extends Controller
{
use ResponseJson;
/**
* 兑换商品列表
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function goodsList(Request $request)
{
$goods = ExchangeGoods::show();
$order = $request->input('order');
if ($order) {
$goods = $goods->order();
}else {
$goods = $goods->orderBy('id', 'desc');
}
$goods = $goods->paginate(16);
return $this->success('ok', $goods);
}
/**
* 兑换商品详情
* @param Request $request
* @param ExchangeGoods $goods
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function goods(Request $request, ExchangeGoods $goods)
{
return $this->success('ok', $goods);
}
/**
* 兑换商品
* @param ExchangeGoodsRequest $request
* @param ExchangeGoods $goods
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function exchangeGoods(ExchangeGoodsRequest $request, ExchangeGoods $goods)
{
$data = $request->validated();
$user = auth()->user();
//限制真人认证
if ($user->is_real_approved != 1) return $this->failure("请先完成真人认证");
$num = $request->input('num', 1);
//减库存
// $re = Redis::command('decrby', [ExchangeGoods::STOCKKEY . $goods->id, $num]);
//减多了回滚
// if ($re < 0) {
// Redis::command('incrby', [ExchangeGoods::STOCKKEY . $goods->id, $num]);
// return $this->failure("库存不足");
// }
try {
$need_coin = $num * $goods->coin_num;
//检查福币数量
$coin_info = $user->totalCoin();
if ($coin_info < $need_coin) return $this->failure("福币数量不足,请选择其他商品");
$data = array_merge($data, ['user_id'=>$user->id, 'price'=>$goods->price, 'coin_num'=>$goods->coin_num, 'status'=>'EXCHANGING']);
DB::beginTransaction();
$goods->exchangeLogs()->create($data);
$goods->decrement('stock', $num);
//扣除福币
$user->updateCoinInfo('sub', $need_coin);
DB::commit();
return $this->success('ok');
}catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
// Redis::command('incrby', [ExchangeGoods::STOCKKEY . $goods->id, $num]);
return $this->failure();
}
}
/**
* 兑换记录
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function exchangeLogs(Request $request)
{
$user = auth()->user();
$logs = $user->exchangeLogs()->with('goods:id,title,price,pic,stock,coin_num');
$status = $request->input('status');
if ($status) {
$logs = $logs->status();
}
$logs = $logs->orderByDesc('id')->paginate();
return $this->success('ok', $logs);
}
/**
* 最近兑换记录
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function lastExchangeLogs(Request $request)
{
$logs = CoinExchange::with('goods:id,title','user:id,nickname');
$logs = $logs->orderByDesc('id')->limit(15)->get();
return $this->success('ok', $logs);
}
/**
* 兑换详情
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function exchangeLog(Request $request, CoinExchange $log)
{
$log->goods = $log->goods()->selectRaw('id,title,price,pic,stock,coin_num')->first();
return $this->success('ok', $log);
}
/**
* 签收
* @param Request $request
* @param CoinExchange $log
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function signLog(Request $request, CoinExchange $log)
{
$log->status = 'SIGNED';
$log->save();
return $this->success('ok');
}
/**
* 福币信息
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function coinInfo(Request $request)
{
$user = auth()->user();
$coin = $user->coinInfo();
$coin->total_remain_amount = $coin->remain_amount + $coin->amount_from_other;
return $this->success('ok', $coin);
}
}