6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/Store/ProductController.php

139 lines
5.2 KiB
PHP

<?php
namespace App\Admin\Controllers\Store;
use Dcat\Admin\{Form, Grid, Admin};
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Models\Administrator;
use App\Models\{ProductCategory, ProductSku};
use App\Models\Store\{Store, ProductSku as StoreProductSku};
class ProductController extends AdminController
{
protected $translation = 'store-product';
public function listByStore()
{
$user = Admin::user();
$canAdmin = $this->canAdmin();
$query = StoreProductSku::with(['productSku']);
if ($canAdmin) {
$query->where('store_id', request('q'));
} else {
$stores = $user->stores->pluck('id');
$query->whereIn('store_id', $stores);
}
$list = $query->get();
$data = [];
foreach($list as $item) {
if ($item->productSku) {
array_push($data, ['id' => $item->productSku->id, 'text' => $item->productSku->name]);
} else {
// logger()->error('店铺 商品 Sku 不存在, sku_id: ' . $item->product_sku_id);
}
}
return $data;
}
protected function grid()
{
$grid = new Grid(StoreProductSku::with(['store', 'productSku.category']));
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$stores = $user->stores->pluck('id');
$grid->model()->whereIn('store_id', $stores);
}
$grid->model()->orderBy('id', 'desc');
$grid->column('productSku.id', 'ID');
$grid->column('store.title', '店铺');
$grid->column('productSku.category.name', '分类');
$grid->column('productSku.name', '名称');
$grid->column('productSku.specs', '规格')->label();
$grid->column('productSku.cost_price', '成本价')->display(function ($value) {
return bcdiv($value, 100, 2);
});
$grid->column('productSku.sell_price', '销售价')->display(function ($value) {
return bcdiv($value, 100, 2);;
});
$grid->column('amount', '库存')->sortable();
$grid->column('status', '状态')->switch();
$grid->paginate(10);
$grid->showCreateButton($user->can('dcat.admin.store.product.create'));
$grid->enableDialogCreate();
$grid->showDeleteButton($user->can('dcat.admin.store.product.destroy'));
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('store_id')->select('api/store')->width(3);
$filter->equal('productSku.category_id', '分类')->select(admin_route('api.product_categories', ['level' => 2]))->width(3);
$filter->like('productSku.name', '名称')->width(3);
});
$grid->tools(function (Grid\Tools $tools) {
$tools->append(new \App\Admin\Actions\Store\ImportProduct());
$tools->append(new \App\Admin\Actions\Store\DownloadProductTemplate());
});
$grid->footer(function ($collection) use ($grid) {
$query = StoreProductSku::join('product_skus', 'product_skus.id', '=', 'store_product_skus.product_sku_id');
$grid->model()->getQueries()->unique()->each(function ($value) use (&$query) {
if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) {
return;
}
$query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []);
});
$count = $query->count();
$market_price = 0;
$cost_price = 0;
$market_price = number_format($query->sum('product_skus.market_price') / 100);
$cost_price = number_format($query->sum('product_skus.cost_price') / 100);
$stock = number_format($query->sum('store_product_skus.amount'));
return <<<HTML
<table class="table table-bordered">
<tbody>
<tr>
<td>统计</td>
<td>总数: $count</td>
<td></td>
<td></td>
<td>成本价: $cost_price</td>
<td>销售价: $market_price</td>
<td>库存: $stock</td>
<tr>
</tbody>
</table>
HTML;
});
return $grid;
}
protected function form()
{
$form = Form::make(StoreProductSku::with(['productSku']));
$form->select('store_id')->options(Store::pluck('title', 'id'));
$form->select('product_sku_id')->options(ProductSku::class)->ajax('api/product-skus');
$form->switch('status', '状态')->default(1);
$form->saving(function (Form $form) {
if ($form->isCreating()) {
$store_id = $form->input('store_id');
$product_sku_id = $form->input('product_sku_id');
if (StoreProductSku::where(compact('store_id', 'product_sku_id'))->exists()) {
return $form->response()->error('该商品已经存在');
}
}
});
return $form;
}
protected function canAdmin()
{
return Admin::user()->isRole('administrator');
}
}