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', '库存'); $grid->column('profit', '毛利')->display(function () { $sell_price = data_get($this->productSku, 'sell_price'); $cost_price = data_get($this->productSku, 'cost_price'); return round(($sell_price - $cost_price) / 100, 2, PHP_ROUND_HALF_DOWN); }); $grid->column('cost', '成本')->display(function () { $cost_price = data_get($this->productSku, 'cost_price'); return round($cost_price / 100 * $this->amount, 2, PHP_ROUND_HALF_DOWN); }); $grid->column('sell', '销售')->display(function () { $sell_price = data_get($this->productSku, 'sell_price'); return round($sell_price / 100 * $this->amount, 2, PHP_ROUND_HALF_DOWN); }); $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->where('category_id', function ($q) { $id = $this->input; $q->whereHas('productSku', fn($q1) => $q1->filter(['category' => $id], \App\Endpoint\Api\Filters\ProductSkuFilter::class)); }, '分类')->select(ProductCategory::selectOptions())->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(); $sell_price = round($query->sum('product_skus.sell_price') / 100, 2, PHP_ROUND_HALF_DOWN); $cost_price = round($query->sum('product_skus.cost_price') / 100, 2, PHP_ROUND_HALF_DOWN); $stock = round($query->sum('store_product_skus.amount'), 2, PHP_ROUND_HALF_DOWN); $cost = round($query->sum(DB::raw('product_skus.cost_price * amount')) / 100, 2, PHP_ROUND_HALF_DOWN); $sell = round($query->sum(DB::raw('product_skus.sell_price * amount')) / 100, 2, PHP_ROUND_HALF_DOWN); return <<