This commit is contained in:
2023-03-08 09:16:04 +08:00
commit e78454540f
1318 changed files with 210569 additions and 0 deletions

View File

@@ -0,0 +1,228 @@
<?php
namespace Modules\Mall\Http\Controllers\Admin;
use App\Admin\Traits\WithUploads;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Illuminate\Support\Arr;
use Illuminate\Support\MessageBag;
use Illuminate\Support\Str;
use Modules\Mall\Models\Brand;
use Modules\Mall\Models\Category;
use Modules\Mall\Models\Delivery;
use Modules\Mall\Models\Goods;
use Modules\Mall\Models\Shop;
use Modules\Mall\Models\Tag;
class GoodsController extends AdminController
{
use WithUploads,
WithShop;
protected $title = '商品管理';
protected function grid(): Grid
{
$grid = new Grid(new Goods);
$grid->quickSearch('id')->placeholder('商品编号快速搜索');
$grid->filter(function (Grid\Filter $filter) {
$filter->scope('trashed', '回收站')->onlyTrashed();
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->like('name', '商品名称');
$filter->equal('channel', '类型')->select(Goods::Channels);
});
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->equal('shop_id', '所属店铺')->select(function ($shopId) {
if ($shopId) {
return Shop::where('id', $shopId)->pluck('name', 'id');
}
})->ajax(route('admin.mall.shops.ajax'));
});
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->equal('category_id', '分类')->select(Category::shown()->pluck('name', 'id'));
});
});
$grid->model()
->with(['category', 'shop', 'delivery'])
->withCount(['specs', 'skus'])
->orderByDesc('updated_at');
$grid->column('id', '#ID#');
$grid->column('brand.name', '品牌名称');
$grid->column('category.name', '商品分类');
// $grid->column('tags', '标签')
// ->pluck('name')
// ->label();
$grid->column('shop.name', '所属店铺');
$grid->column('name', '商品名称');
$grid->column('type', '规格类型')->using(Goods::TYPE_MAP);
$grid->column('sales', '销量');
$grid->column('original_price', '原价');
$grid->column('channel', '类型')->using(Goods::Channels)->label();
$grid->column('规格属性')
->display(function () {
if ($this->type === Goods::TYPE_MULTIPLE) {
return $this->specs_count;
}
})
->link(function () {
return route('admin.mall.goods.specs.index', $this);
}, '_self');
$grid->column('价格条目')
->display(function () {
return $this->skus_count;
})
->link(function () {
return route('admin.mall.goods.skus.index', $this);
}, '_self');
$grid->column('delivery.name', '运费模板');
$grid->column('status', '状态')->switch([
'on' => ['value' => 1, 'text' => '上架', 'color' => 'primary'],
'off' => ['value' => 3, 'text' => '下架', 'color' => 'default'],
]);
// $grid->column('status', '状态')->display(function () {
// return $this->status_text;
// });
$grid->column('created_at', '创建时间');
return $grid;
}
public function form(): Form
{
$form = new Form(new Goods());
$form->text('name', '商品名称')->required();
$form->textarea('description', '商品简介')->required();
$this->shop($form)->required();
$form->select('category_id', '商品分类')
->options(function ($categoryId) {
$category = Category::find($categoryId);
if ($category) {
return [$category->id => $category->name];
}
})
->ajax(route('admin.mall.categories.ajax'))
->required();
$form->select('brand_id', '所属品牌')
->options(function ($brandId) {
$brand = Brand::find($brandId);
if ($brand) {
return [$brand->id => $brand->name];
}
})
->ajax(route('admin.mall.brands.ajax'))
->required();
// $form->multipleSelect('tags', '商品标签')
// ->options(function ($tagIds) {
// if ($tagIds) {
// return Tag::find($tagIds)->pluck('name', 'id');
// }
// })
// ->ajax(route('admin.mall.tags.ajax'));
$this->cover($form);
$this->pictures($form);
$states = [
'on' => ['value' => 1, 'text' => '是', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'danger'],
];
$form->switch('is_post_sale', '是否允许售后')->states($states)->default(1);
$form->radioButton('deduct_stock_type', '库存扣减')
->default(1)
->options(Goods::DEDUCT_STOCK_MAP)
->required();
$form->radioButton('pay_type', '支付方式')
->default(1)
->options(Goods::PAY_TYPE_MAP)
->required();
$form->select('delivery_id', '运费模板')
->options(function ($deliveryId) {
$delivery = Delivery::find($deliveryId);
if ($delivery) {
return [$delivery->id => $delivery->name];
}
})
->ajax(route('admin.mall.deliveries.ajax'))
->required();
$form->currency('original_price', '展示原价')
->default(0)
->help('仅作展示使用');
$form->radioButton('channel', '商品类型')
->options(Goods::Channels)
->required();
$form->radioButton('type', '规格类型')
->options(Goods::TYPE_MAP)
->default(Goods::CHANNEL_NORMAL)
->required()
->when(Goods::TYPE_SINGLE, function (Form $form) {
$form->hasMany('skus', '单规格', function (Form\NestedForm $form) {
$form->currency('price', '销售价格')
->default(0)
->required();
$form->hidden('score', '积分')
->default(0)
->required();
$form->hidden('assets', '资产')
->default(0)
->required();
$form->number('stock', '商品库存')
->default(0)
->required();
$form->text('weight', '商品重量')
->default(0)
->setWidth(2)
->required();
});
})
->when(Goods::TYPE_MULTIPLE, function ($form) {
})
->default(function () use ($form) {
return $form->isCreating() ? Goods::TYPE_SINGLE : '';
});
$form->ueditor('content', '商品详情')->required();
$form->switch('status', '状态')
->states([
'on' => ['value' => 1, 'text' => '上架', 'color' => 'success'],
'off' => ['value' => 3, 'text' => '下架', 'color' => 'danger'],
])
->default(1);
$form->ignore(['single']);
$form->saving(function (Form $form) {
if ($form->type === Goods::TYPE_SINGLE) {
$form->skus = [Arr::first($form->skus)];
}
if ($form->channel == Goods::CHANNEL_FREE && $form->isCreating()) {
$hasOne = Goods::where('channel', Goods::CHANNEL_FREE)->exists();
if ($hasOne) {
$error = new MessageBag([
'title' => '错误',
'message' => '免费产品只有一个',
]);
return back()->withInput()->with(compact('error'));
}
}
$form->content = Str::of(request()->get('content'))->replace('style=""', '');
});
return $form;
}
}