user()->orders() ->with('products') ->filter($request->all()) ->latest('id') ->simplePaginate($perPage); return OrderResourceCollection::make($orders); } /** * 创建订单 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function store(Request $request) { $rules = [ 'shipping_address_id' => ['bail', 'required', 'int'], 'coupon_id' => ['bail', 'nullable', 'int'], 'note' => ['bail', 'nullable', 'string', 'max:255'], ]; if ($isQuick = $request->filled('product')) { $rules = array_merge($rules, [ 'product.sku_id' => ['bail', 'required', 'int'], 'product.quantity' => ['bail', 'required', 'int', 'min:1'], ]); } else { $rules = array_merge($rules, [ 'shopping_cart' => ['bail', 'required', 'array'], ]); } $request->validate($rules, [], [ 'product.sku_id' => '商品', 'product.quantity' => '数量', 'shopping_cart' => '购物车商品', 'shipping_address_id' => '收货地址', 'coupon_id' => '优惠券', 'note' => '订单备注', ]); $user = $request->user(); try { $order = retry(3, function () use ($isQuick, $user, $request) { return DB::transaction(function () use ($isQuick, $user, $request) { $orderService = new OrderService(); if ($isQuick) { return $orderService->createQuickOrder( $user, $request->input('product.sku_id'), $request->input('product.quantity'), $request->input('shipping_address_id'), $request->input('coupon_id'), $request->input('note'), ); } return $orderService->createShoppingCartOrder( $user, $request->input('shopping_cart'), $request->input('shipping_address_id'), $request->input('coupon_id'), $request->input('note'), ); }); }); } catch (BizException | ModelNotFoundException $e) { throw $e; } catch (Throwable $e) { report($e); throw new BizException('系统繁忙,请稍后再试'); } return OrderResource::make($order); } /** * 查看订单 * * @param int $id * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function show($id, Request $request) { $order = $request->user()->orders()->findOrFail($id); $order->load('products'); return OrderResource::make($order); } /** * 确认收货/完成订单 * * @param int $id * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function confirm($id, Request $request) { // 确认收货 return response()->noContent(); } /** * 取消订单 * * @param int $id * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function cancel($id, Request $request) { // todo 取消订单 return response()->noContent(); } }