diff --git a/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php b/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php index b1625a89..43bdf0d8 100644 --- a/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php +++ b/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php @@ -121,6 +121,63 @@ class ProductSkuController extends Controller ]); } + public function sku($id, Request $request) + { + $user = $request->user(); + $sku = ProductSku::with('buynote')->findOrFail($id); + + $spu = ProductSpu::with(['specs', 'features'])->findOrFail($sku->spu_id); + // 主商品的规格 + $spuSpecs = []; + + if (count($original = (array) $sku->specs) > 0) { + $skus = $spu->skus()->online()->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); + + $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' => ProduckSkuResource::make($sku), + 'is_collected' => $isCollected, + 'features' => ProductFeatureResource::collection($spu->features), + ]); + } + /** * 收藏商品 * diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index a247dd81..5f0f0f59 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -70,6 +70,7 @@ Route::group([ // 筛选商品 Route::get('product/products', [ProductSkuController::class, 'index']); // 查看商品 + Route::get('product/sku/{id}', [ProductSkuController::class, 'sku']); Route::get('product/products/{product}', [ProductSkuController::class, 'show']); //查看搜索热词 Route::get('product/search-hot-keys', [ProductSkuController::class, 'searchHotKeys']);