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 = 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'), ); }, 3); } catch (ModelNotFoundException | BizException $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'); $order->load('packages'); 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) { $user = $request->user(); try { return DB::transaction(function () use ($id, $user) { $order = $user->orders()->lockForUpdate()->findOrFail($id); if (! $order->isPending() && ! $order->isWaitShipping()) { throw new BizException('订单状态不是待付款或待发货'); } if ($order->isWaitShipping()) { $order->refundTasks()->create([ 'sn' => OrderHelper::serialNumber(), 'amount' => $order->total_amount, 'reason' => '取消订单', ]); } $order->update([ 'status' => Order::STATUS_CANCELLED, ]); }); } catch (ModelNotFoundException | BizException $e) { throw $e; } catch (Throwable $e) { report($e); throw new BizException('取消失败,请重试'); } return response()->noContent(); } /** * 支付订单 * * @param int $id * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function pay($id, Request $request) { $input = $request->validate([ 'pay_way' => ['bail', 'required'], ]); $user = $request->user(); try { return DB::transaction(function () use ($id, $user, $input) { $order = $user->orders()->findOrFail($id); return (new OrderService())->pay($order, $input['pay_way']); }); } catch (ModelNotFoundException | BizException $e) { throw $e; } catch (Throwable $e) { report($e); throw new BizException('订单支付失败,请重试'); } } /** * 订单包裹列表 */ public function orderPackages($id, Request $request) { $order = $request->user()->orders()->findOrFail($id); return OrderPackageResource::collection($order->packages()->where('is_failed', false)->orderBy('updated_at', 'desc')->get()); } /** * 物流包裹的明细 * * @return void */ public function shippingInfo($id, Request $request) { $package = $request->user()->orderPackages()->where('is_failed', false)->findOrFail($id); return response()->json(array_merge(OrderPackageResource::make($package)->resolve(), [ 'shipping_info'=> KuaidiLog::where(['number'=>$package->shipping_number, 'code'=>$package->shipping_code])->first()?->info, ])); } }