sort(); if ($request->filled('title')) { $query->where('title', 'like', '%'.$request->input('title').'%'); } $list = $query->simplePaginate($request->input('per_page', 10)); return StoreResource::collection($list); } public function show($id) { $info = Store::findOrFail($id); return StoreResource::make($info); } public function productSpus($id, Request $request) { $store = Store::findOrFail($id); $input = $request->all(); if ($request->isNotFilled('sort')) { $input['sort'] = '-id'; } // $spuIds = StoreProductSku::where('store_id', $store->id)->where('status', 1)->pluck('product_spu_id')->toArray(); // $spuIds = array_unique($spuIds); // $spuIds = array_values($spuIds); $list = $store->productSpus() ->with(['specs']) ->filter($input) ->wherePivot('status', 1) ->groupBy('store_product_skus.spu_id') ->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); return StoreProductSpuResource::collection($list); } public function productSpu($store, $id, Request $request) { $store = Store::findOrFail($store); $user = $request->user(); $spu = $store->productSpus()->with(['specs', 'features'])->findOrFail($id); $sku = $store->productSkus()->where('product_spu_id', $spu->id)->first(); if (!$sku) { throw new BizException('商品sku未上架'); } // 主商品的规格 $spuSpecs = []; if (count($original = (array) $sku->specs) > 0) { $skus = $spu->skus()->get(['id', 'specs', 'stock', 'release_at']); $mapSkus = $skus->mapWithKeys(function ($item) { $key = implode('_', $item->specs) ?: $item->id; return [$key => $item]; }); foreach ($spu->specs as $spec) { $spuSpecItems = []; foreach ($spec->items as $value) { // 根据当前 SKU 的规格,组装可能出现的其它规格组合 $jSpecs = $original; $jSpecs[$spec->id] = $value['name']; $key = implode('_', $jSpecs); $mapSku = $mapSkus->get($key); if ($mapSku) { $spuSpecItems[] = [ 'name' => $value['name'], 'selected' => $sku->is($mapSku), 'sku_id' => (int) $mapSku?->id, 'sku_stock' => (int) $mapSku?->saleable_stock, ]; } } $spuSpecs[] = [ 'name' => $spec->name, 'items' => $spuSpecItems, ]; } } ProductSkuViewed::dispatch($user, $sku, now()); // 是否收藏商品 $isCollected = (bool) $user?->skuFavorites()->where('sku_id', $sku->id)->exists(); return response()->json([ 'spu_specs' => $spuSpecs, 'sku' => StoreProductSkuResource::make($sku), 'is_collected' => $isCollected, 'features' => ProductFeatureResource::collection($spu->features), 'is_pre_sale' => !!$spu->is_pre_sale ]); } public function productSkus($id, Request $request) { $store = Store::findOrFail($id); $query = $store->productSkus() ->select(['product_skus.id', 'product_skus.specs', 'product_skus.name', 'product_skus.cover', 'product_skus.sell_price', 'product_skus.vip_price', 'product_skus.market_price', 'store_product_skus.amount']) ->filter($request->all()) ->when($request->filled('id'), function ($q) use ($request) { $id = explode(',', $request->input('id')); $q->whereIn('product_skus.id', $id); }) ->wherePivot('status', 1); if ($request->input('per_page') == -1) { $list = $query->get(); } else { $list = $query->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); } return StoreProductSkuResource::collection($list); } public function productSku($store, $id, Request $request) { $store = Store::findOrFail($store); $sku = $store->productSkus()->findOrFail($id); return StoreProductSkuResource::make($sku); } }