all());
$query->select(['id', 'name as text']);
if ($request->filled('_paginate') || $request->filled('amp;_paginate')) {
$list = $query->paginate();
} else {
$list = $query->get();
}
return $list;
}
public function attr($goods, Content $content)
{
$goods = Goods::with(['type'])->findOrFail($goods);
$form = AttrForm::make([
'type' => $goods->type,
'attr' => $goods->attr,
])->payload(['type_id' => $goods->type?->id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white');
return $content
->translation($this->translation())
->title($goods->name)
->description($goods->type?->name)
->body($form);
}
public function spec($goods, Content $content)
{
$goods = Goods::findOrFail($goods);
$form = SpecForm::make([
'type' => $goods->type,
'spec' => $goods->spec,
])->payload(['type_id' => $goods->type_id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white');
return $content
->translation($this->translation())
->title($goods->name)
->description($goods->type?->name)
->body($form);
}
public function part($goods, Content $content)
{
$goods = Goods::findOrFail($goods);
$form = PartForm::make([
'type' => $goods->type,
'part' => $goods->part,
])->payload(['type_id' => $goods->type_id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white');
return $content
->translation($this->translation())
->title($goods->name)
->description($goods->type?->name)
->body($form);
}
protected function grid()
{
return Grid::make(Goods::with(['category', 'brand', 'type', 'skus']), function (Grid $grid) {
$user = Admin::user();
$grid->export();
$grid->model()->sort();
$grid->selector(function (Selector $selector) {
$brands = GoodsBrand::get();
$types = GoodsType::get();
$categories = GoodsCategory::where('level', 3)->get();
$prices = ['0-999', '1000-1999', '2000-4999', '5000+'];
$selector->selectOne('category_id', __('dcat-admin-goods::goods.fields.category_id'), $categories->pluck('name', 'id'));
$selector->selectOne('brand_id', __('dcat-admin-goods::goods.fields.brand_id'), $brands->pluck('name', 'id'));
$selector->selectOne('type_id', __('dcat-admin-goods::goods.fields.type_id'), $types->pluck('name', 'id'));
$selector->selectOne('price', __('dcat-admin-goods::goods.fields.price'), $prices, function ($q, $value) use ($prices) {
$parsePrice = data_get($prices, $value);
if ($parsePrice) {
$parts = explode('-', $parsePrice);
$parts = array_map(fn ($v) => (int) $v, $parts);
if (count($parts) > 1) {
$q->whereBetween('price', $parts);
} else {
$q->where('price', '>', $parts[0]);
}
}
});
});
$grid->column('goods_sn');
$grid->column('category.name');
$grid->column('brand.name');
$grid->column('type.name')->label();
$grid->column('name')->display(function () {
return ($this->cover_image ? '
' : '') . '' . $this->name . '';
});
$grid->column('price');
$grid->column('stock')
->if(fn () => !!$this->spec)
->display(fn () => $this->skus->sum('stock'))
->else()
->editable();
$grid->column('on_sale')->bool();
$grid->column('is_recommend')->if(fn() => $user->can('dcat.admin.goods.edit'))->switch()->else()->bool();
$grid->column('sold_count');
$grid->createMode(Grid::CREATE_MODE_DEFAULT);
$grid->showCreateButton($user->can('dcat.admin.goods.create'));
$grid->actions(function (Actions $actions) use ($user) {
$row = $actions->row;
$actions->view($user->can('dcat.admin.goods.show'));
$actions->edit($user->can('dcat.admin.goods.edit') && !$row->on_sale);
if ($user->can('dcat.admin.goods.edit') && !$row->on_sale) {
$actions->append('属性介绍');
$actions->append('商品规格');
$actions->append('商品配件');
}
if ($row->spec) {
$actions->append('货品列表');
}
if ($user->can('dcat.admin.goods.edit')) {
$actions->append(new RowGoodsSale());
}
$actions->delete($user->can('dcat.admin.goods.destroy') && !$row->on_sale);
});
$grid->tools(function (Grid\Tools $tools) use ($user) {
if ($user->can('dcat.admin.goods.import')) {
$tools->append(new GridImportGoods());
}
});
$grid->batchActions(function (BatchActions $batch) use ($user) {
if ($user->can('dcat.admin.goods.edit')) {
$batch->add(new BatchGoodsUp());
$batch->add(new BatchGoodsDown());
}
$batch->disableDelete($user->cannot('dcat.admin.goods.destroy'));
});
});
}
protected function detail($id)
{
Admin::css([
'vendor/dcat-admin-goods/goods.css',
]);
$info = Goods::with(['category', 'brand', 'type'])->findOrFail($id);
$show = Show::make($info);
$show->field('name');
$show->field('description');
$show->field('category_id')->as(function () {
if (!$this->category) {
return $this->category_id;
}
$parents = GoodsCategory::whereIn('id', $this->category->parent_ids)->orderBy('level')->pluck('name');
$parents->push($this->category->name);
return $parents;
})->label();
$show->field('price');
$show->field('cover_image')->image('', 100);
$show->field('images')->image('', 100);
$show->field('content')->image('');
$show->field('spec')->view('dcat-admin-goods::goods.grid-attr');
$show->field('attr')->view('dcat-admin-goods::goods.grid-attr');
$show->field('part')->view('dcat-admin-goods::goods.grid-attr');
$show->disableEditButton();
$show->disableListButton();
$show->disableDeleteButton();
$row = new Row();
$row->column(7, $show);
$row->column(5, Show::make($info, function (Show $show) {
$show->panel()
->title('其他信息')
->tools(function (Tools $tools) {
$tools->disableEdit();
$tools->disableList();
$tools->disableDelete();
$tools->disableBack();
});
$show->field('goods_sn');
$show->field('brand.name');
$show->field('type.name');
$show->field('on_sale')->bool();
$show->field('is_recommend')->bool();
$show->field('sold_count');
$show->field('created_at');
$show->field('updated_at');
}));
return $row;
}
protected function form()
{
return Form::make(Goods::with([]), function (Form $form) {
$model = $form->model();
$isCreating = $form->isCreating();
$unique = Rule::unique('goods', 'goods_sn');
if ($isCreating) {
$form->select('type_id')->options(GoodsType::pluck('name', 'id'));
$form->select('merchant_id')->ajax('api/merchants?_paginate=1');
} else {
$type = $model->type_id ? GoodsType::find($model->type_id) : null;
$form->display('type_id')->with(fn () => $model->type_id ? $type->name : '');
$unique->ignore($model->id);
}
$form->select('category_id')->options(GoodsCategory::selectOptions(null, false))->required();
$form->select('brand_id')->options(GoodsBrand::pluck('name', 'id'));
$form->text('name')->required();
$form->text('description');
$form->text('goods_sn')->rules([$unique], ['unique' => '商品编号已经存在']);
$form->image('cover_image')
->uniqueName()
->autoUpload()
->saveFullUrl()
->retainable()
->removable(false)
->autoSave(false)
->move('goods/cover-image')
->required();
$form->multipleImage('images')
->uniqueName()
->autoUpload()
->saveFullUrl()
->retainable()
->removable(false)
->autoSave(false)
->move('goods/images');
$form->multipleImage('content')
->uniqueName()
->autoUpload()
->saveFullUrl()
->retainable()
->removable(false)
->autoSave(false)
->move('goods/content');
if ($isCreating || !$model->spec) {
$form->currency('price')->symbol('¥');
} else {
$form->display('help', '提示')->value('商品其他信息, 请到 货品列表 去修改');
}
$form->hidden('stock')->default(0);
$form->hidden('is_recommend')->default(0);
$form->disableResetButton();
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->disableEditingCheck();
$form->disableDeleteButton();
$form->disableViewButton();
$form->creating(function (Form $form) {
if (!$form->goods_sn) {
$form->goods_sn = GoodsService::make()->generateSn();
}
});
$form->deleting(function (Form $form) {
$data = $form->model()->toArray();
// 删除 SKU
GoodsSku::whereIn('goods_id', array_column($data, 'id'))->delete();
});
});
}
}