161 lines
5.4 KiB
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);
|
|
}
|
|
}
|