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); } }