6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/StoreController.php

161 lines
5.4 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Store\Store;
use App\Models\{ProductSku, ProductSpu};
use App\Helpers\Paginator;
use App\Models\Store\ProductSku as StoreProductSku;
use App\Endpoint\Api\Http\Resources\{StoreResource, StoreProductSkuResource, StoreProductSpuResource, ProductSpuResource};
use App\Endpoint\Api\Http\Resources\ProductFeatureResource;
use App\Events\ProductSkuViewed;
use App\Models\Store\Desk;
use App\Endpoint\Api\Http\Resources\DeskResource;
class StoreController extends Controller
{
public function index(Request $request)
{
$query = Store::effective()->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 = ProductSpu::with(['specs'])->whereIn('id', $spuIds)->filter($input)->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50));
return ProductSpuResource::collection($list);
// $list = $store->productSpus()
// ->with(['specs'])
// ->filter($input)
// ->wherePivot('status', 1)
// ->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);
}
public function desk($id)
{
$info = Desk::with(['store'])->findOrFail($id);
return DeskResource::make($info);
}
}