diff --git a/app/Admin/Controllers/StoreAdminController.php b/app/Admin/Controllers/StoreAdminController.php new file mode 100644 index 00000000..d9715c27 --- /dev/null +++ b/app/Admin/Controllers/StoreAdminController.php @@ -0,0 +1,48 @@ +tree('admin_user', '选择管理员') + ->nodes(Administrator::all()->toArray()) + ->value($store->adminUsers()->pluck('id')) + ->setTitleColumn('name'); + return (new Content())->title('新增')->body($form); + } + + public function store($store_id, Request $request) + { + $store = Store::findOrFail($store_id); + if ($request->input('admin_user')) { + $admin_ids = explode(',', $request->input('admin_user')); + $store->adminUsers()->sync($admin_ids); + } else { + $store->adminUsers()->detach(); + } + + return $this->sendResponse($this->response()->success(trans('admin.save_succeeded'))); + } + + public function destroy($store_id, $id) + { + $store = Store::findOrFail($store_id); + $admin_ids = explode(',', $id); + $store->adminUsers()->detach($admin_ids); + return $this->sendResponse($this->response()->success(trans('admin.delete_succeeded'))); + } +} diff --git a/app/Admin/Controllers/StoreController.php b/app/Admin/Controllers/StoreController.php index a27bd389..50ca6495 100644 --- a/app/Admin/Controllers/StoreController.php +++ b/app/Admin/Controllers/StoreController.php @@ -2,7 +2,7 @@ namespace App\Admin\Controllers; -use App\Models\{Store, ProductSku}; +use App\Models\{Store, StoreProductSku, ProductSku}; use Dcat\Admin\Form; use Dcat\Admin\Grid; use Dcat\Admin\Show; @@ -11,6 +11,8 @@ use Carbon\Carbon; use Dcat\Admin\Admin; use Illuminate\Support\Facades\DB; use Dcat\Admin\Models\Administrator; +use Dcat\Admin\Layout\Row; +use Dcat\Admin\Widgets\{Box, Tab, Card}; class StoreController extends AdminController { @@ -68,7 +70,8 @@ class StoreController extends AdminController $ids = DB::table('store_admin_users')->where('admin_user_id', $user->id)->pluck('store_id'); $query = $query->whereIn('id', $ids); } - return Show::make($id, $query, function (Show $show) use ($canAdmin) { + $row = new Row(); + $show = Show::make($id, $query, function (Show $show) use ($canAdmin) { $show->field('id'); $show->field('title'); @@ -78,49 +81,20 @@ class StoreController extends AdminController $show->field('remarks'); $show->field('created_at'); - if ($canAdmin) { - $show->relation('admin_users', function ($model) { - $grid = new Grid(new Administrator()); - - $grid->model()->join('store_admin_users', function ($join) use ($model) { - $join->on('store_admin_users.admin_user_id', 'id')->where('store_id', '=', $model->id); - }); - - $grid->column('id'); - $grid->column('username'); - $grid->column('name'); - - $grid->quickSearch(['username', 'name']); - - $grid->paginate(10); - $grid->disableActions(); - - return $grid; - }); - } - - $show->relation('product_skus', function ($model) { - $grid = new Grid(new ProductSku()); - - $grid->model()->join('store_product_skus', function ($join) use ($model) { - $join->on('store_product_skus.product_sku_id', 'id')->where('store_id', '=', $model->id); - }); - - $grid->quickSearch(['name']); - - $grid->column('name'); - $grid->column('specs')->label(); - - $grid->paginate(10); - $grid->disableActions(); - - return $grid; - }); - $show->panel()->tools(function ($tools) { $tools->disableDelete(); }); }); + $row->column(5, $show); + + $tab = Tab::make()->theme(); + $tab->add('商品', Card::make($this->gridProduct($id))); + if ($canAdmin) { + $tab->add('管理员', Card::make($this->gridAdmin($id))); + } + + $row->column(7, $tab); + return $row; } /** @@ -143,17 +117,17 @@ class StoreController extends AdminController $form->switch('status')->default(1); $form->number('sort')->min(1)->default(1); - if ($canAdmin) { - $form->multipleSelectTable('admin_users') - ->from(\App\Admin\Renderable\AdministratorTable::make()) - ->model(Administrator::class, 'id', 'name') - ->customFormat(function ($v) { - if (! $v) { - return []; - } - return array_column($v, 'id'); - }); - } + // if ($canAdmin) { + // $form->multipleSelectTable('admin_users') + // ->from(\App\Admin\Renderable\AdministratorTable::make()) + // ->model(Administrator::class, 'id', 'name') + // ->customFormat(function ($v) { + // if (! $v) { + // return []; + // } + // return array_column($v, 'id'); + // }); + // } $form->multipleSelectTable('product_skus') ->from(\App\Admin\Renderable\ProductSkuSimpleTable::make()) @@ -192,4 +166,49 @@ class StoreController extends AdminController { return Admin::user()->isRole('administrator'); } + + protected function gridAdmin($id) + { + $grid = Grid::make(new Administrator()); + $grid->model()->join('store_admin_users', function ($join) use ($id) { + $join->on('store_admin_users.admin_user_id', 'id')->where('store_id', '=', $id); + }); + + $grid->setResource('store/' . $id . '/admin'); + + $grid->column('id'); + $grid->column('username'); + $grid->column('name'); + $grid->paginate(10); + + $grid->showCreateButton(); + $grid->enableDialogCreate(); + + $grid->disableActions(); + $grid->showRowSelector(); + + return $grid; + } + + protected function gridProduct($id) + { + $grid = new Grid(StoreProductSku::with(['productSku'])); + $grid->model()->where('store_id', $id); + + $grid->setResource('store/'.$id.'/product'); + + $grid->column('productSku.id', 'ID'); + $grid->column('productSku.name', '名称'); + $grid->column('amount', '库存')->editable(); + $grid->column('productSku.specs', '规格')->label(); + $grid->column('status', '状态')->switch(); + $grid->paginate(10); + + $grid->showCreateButton(); + $grid->enableDialogCreate(); + + $grid->disableActions(); + $grid->showRowSelector(); + return $grid; + } } diff --git a/app/Admin/Controllers/StoreProductController.php b/app/Admin/Controllers/StoreProductController.php new file mode 100644 index 00000000..024e10ef --- /dev/null +++ b/app/Admin/Controllers/StoreProductController.php @@ -0,0 +1,62 @@ +selectTable('product', '商品') + ->from(\App\Admin\Renderable\ProductSkuSimpleTable::make()) + ->model(\App\Models\ProductSku::class, 'id', 'name') + ->required(); + $form->number('amount', '库存')->min(0); + $form->switch('status', '状态')->default(1); + return (new Content())->title('新增')->body($form); + } + + public function store($store_id, Request $request) + { + $store = Store::findOrFail($store_id); + $product_id = $request->input('product'); + if ($product_id) { + $product = $store->productSkus()->find($product_id); + if ($product) { + $store->productSkus()->updateExistingPivot($product_id, $request->only(['amount', 'status'])); + } else { + $store->productSkus()->attach([ + $product_id => $request->only(['amount', 'status']) + ]); + } + } + + return $this->sendResponse($this->response()->success(trans('admin.save_succeeded'))); + } + + public function update($store_id, $id, Request $request) + { + $store = Store::findOrFail($store_id); + $product = $store->productSkus()->wherePivot('id', $id)->firstOrFail(); + $store->productSkus()->updateExistingPivot($product->id, $request->only(['status', 'amount'])); + return $this->sendResponse($this->response()->success(trans('admin.update_succeeded'))); + } + + public function destroy($store_id, $id) + { + $store = Store::findOrFail($store_id); + dd($id); + return $this->sendResponse($this->response()->success(trans('admin.delete_succeeded'))); + } +} diff --git a/app/Admin/Renderable/ProductSkuSimpleTable.php b/app/Admin/Renderable/ProductSkuSimpleTable.php index c6cddd19..d7e74a34 100644 --- a/app/Admin/Renderable/ProductSkuSimpleTable.php +++ b/app/Admin/Renderable/ProductSkuSimpleTable.php @@ -14,7 +14,7 @@ class ProductSkuSimpleTable extends LazyRenderable return Grid::make($builder, function (Grid $grid) { $grid->disableRowSelector(false); $grid->column('name'); - $grid->column('specs')->label(); + $grid->column('specs', '规格')->label(); $grid->quickSearch(['name']); $grid->disableActions(); }); diff --git a/app/Admin/routes.php b/app/Admin/routes.php index b3abefa3..729dbb65 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -176,6 +176,8 @@ Route::group([ /** 调试接口 **/ // $router->get('test', 'HomeController@test'); + $router->resource('store/{store_id}/product', 'StoreProductController'); + $router->resource('store/{store_id}/admin', 'StoreAdminController'); $router->resource('store', 'StoreController'); $router->resource('profit', 'OrderProfitController'); diff --git a/app/Models/ProductSku.php b/app/Models/ProductSku.php index db97bac1..194b3214 100644 --- a/app/Models/ProductSku.php +++ b/app/Models/ProductSku.php @@ -119,6 +119,14 @@ class ProductSku extends Model return $this->belongsTo(ProductBuynote::class, 'buynote_id'); } + /** + * 关联的店铺 + */ + public function stores() + { + return $this->belongsToMany(Store::class, 'store_product_skus', 'product_sku_id', 'store_id'); + } + /** * 确认此商品是否已上架 * diff --git a/app/Models/StoreProductSku.php b/app/Models/StoreProductSku.php new file mode 100644 index 00000000..e7ac6597 --- /dev/null +++ b/app/Models/StoreProductSku.php @@ -0,0 +1,23 @@ +belongsTo(Store::class, 'store_id'); + } + + public function productSku() + { + return $this->belongsTo(ProductSku::class, 'product_sku_id'); + } +} diff --git a/database/migrations/2022_05_06_161251_create_stores_table.php b/database/migrations/2022_05_06_161251_create_stores_table.php index c78f5845..b7aaf460 100644 --- a/database/migrations/2022_05_06_161251_create_stores_table.php +++ b/database/migrations/2022_05_06_161251_create_stores_table.php @@ -24,13 +24,17 @@ class CreateStoresTable extends Migration }); Schema::create('store_admin_users', function (Blueprint $table) { - $table->unsignedInteger('store_id'); - $table->unsignedInteger('admin_user_id'); + $table->id(); + $table->unsignedBigInteger('store_id'); + $table->unsignedBigInteger('admin_user_id'); }); Schema::create('store_product_skus', function (Blueprint $table) { - $table->unsignedInteger('store_id'); - $table->unsignedInteger('product_sku_id'); + $table->id(); + $table->unsignedBigInteger('store_id'); + $table->unsignedBigInteger('product_sku_id'); + $table->unsignedInteger('amount')->comment('库存'); + $table->tinyInteger('status')->default(1)->comment('状态(1: 可用, 0: 不可用)'); }); } diff --git a/database/seeders/AdminMenuSeeder.php b/database/seeders/AdminMenuSeeder.php index 2f9e095b..2d073ae8 100644 --- a/database/seeders/AdminMenuSeeder.php +++ b/database/seeders/AdminMenuSeeder.php @@ -41,7 +41,7 @@ class AdminMenuSeeder extends Seeder 'icon' => 'fa fa-shopping-bag', 'uri' => '', 'children'=>[ - [ 'title' => '店铺管理', 'icon' => '', 'uri' => 'store' ], + [ 'title' => '门店管理', 'icon' => '', 'uri' => 'store' ], [ 'title' =>'文章管理', 'icon' => '', @@ -193,6 +193,7 @@ class AdminMenuSeeder extends Seeder 'icon' => '', 'uri' => 'order-refunds', ], + ['title' => '提成管理', 'icon' => '', 'uri' => 'profit'] ], ], [ @@ -274,7 +275,6 @@ class AdminMenuSeeder extends Seeder 'icon' => '', 'uri' =>'finance-after-sales?state=5', ], - ['title' => '提成管理', 'icon' => '', 'uri' => 'profit'] ], ], [