157 lines
5.3 KiB
PHP
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);
|
|
}
|
|
|
|
|
|
}
|