4
0
Fork 0
dcat-admin/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php

228 lines
9.2 KiB
PHP

<?php
namespace Peidikeji\Goods\Http\Controllers\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Grid\Tools\Selector;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Show;
use Illuminate\Routing\Controller;
use Illuminate\Support\Arr;
use Illuminate\Validation\Rule;
use Peidikeji\Goods\GoodsService;
use Peidikeji\Goods\Models\Goods;
use Peidikeji\Goods\Models\GoodsSku;
class GoodsSkuController extends Controller
{
protected $translation = 'peidikeji.dcat-admin-extension-goods::goods-sku';
public function index($goods, Content $content)
{
$goods = Goods::findOrFail($goods);
$grid = Grid::make(new GoodsSku(), function (Grid $grid) use ($goods) {
$grid->model()->where('goods_id', $goods->id);
$grid->selector(function (Selector $selector) use ($goods) {
$specs = $goods->spec;
if ($specs) {
foreach($specs as $key => $item) {
$values = array_column($item['values'], 'value');
$selector->selectOne('spec_' . $key, $item['name'], array_column($item['values'], 'value'), function ($q, $value) use ($values, $item) {
$selected = array_values(Arr::only($values, $value));
if (count($selected) > 0) {
$q->jsonArray([['name' => $item['name'], 'value' => $selected[0]]]);
}
});
}
}
});
$grid->column('id');
$grid->column('sn');
$grid->column('name');
// $grid->column('reset')->display(fn() => $goods->price);
$grid->column('price');
$grid->column('stock');
if ($goods->spec) {
foreach($goods->spec as $key => $item) {
$grid->column('spec_' . $key, $item['name'])->display(function () use ($item) {
$filtered = current(array_filter($this->spec, fn($subItem) => $subItem['name'] === $item['name']));
$value = data_get($filtered, 'value');
$price = data_get($filtered, 'price');
return '<span class="label bg-info">'.$value.'</span>';
});
}
}
// $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.attr');
});
return $content
->translation($this->translation)
->title(admin_trans_label())
->description(trans('admin.list'))
->body($grid);
}
public function show($goods, $id, Content $content)
{
$goods = Goods::findOrFail($goods);
$info = GoodsSku::findOrFail($id);
$show = Show::make($info, function (Show $show) {
$show->field('sn');
$show->field('name');
$show->field('price');
$show->field('discount_price');
$show->field('stock');
$show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec');
});
return $content
->translation($this->translation)
->title(admin_trans_label())
->description(trans('admin.show'))
->body($show);
}
protected function form($goods)
{
return Form::make(new GoodsSku(), function (Form $form) use ($goods) {
$unqiue = Rule::unique('goods_sku', 'sn')->ignore($form->model()->id);
$form->text('sn')->rules([$unqiue], ['unique' => '货号已经存在'])->required();
$form->text('name')->default($goods->name);
$form->number('price')->min(0)->attribute('step', 0.01)->default($goods->price);
$form->number('discount_price')->min(0)->attribute('step', 0.01)->default($goods->discount_price);
$form->number('stock')->min(0)->default($goods->stock);
$form->hidden('spec')->customFormat(fn($v) => json_encode($v));
$form->hidden('goods_id')->default($goods->id);
$spec = $form->model()->spec;
if ($goods->spec) {
foreach($goods->spec as $item) {
$values = array_column($item['values'], 'value', 'value');
$value = null;
if ($spec) {
$filtered = current(array_filter($spec, fn($subItem) => $subItem['name'] === $item['name']));
$value = array_search($filtered['value'], $values);
}
$form->radio($item['name'], $item['name'])->options($values)->value($value);
}
}
$form->saving(function (Form $form) use ($goods) {
$info = $form->model();
$spec = [];
if ($goods->spec) {
foreach($goods->spec as $item) {
array_push($spec, ['name' => $item['name'], 'value' => $form->input($item['name'])]);
$form->deleteInput($item['name']);
}
}
$form->input('spec', $spec);
$query = GoodsSku::where('goods_id', $goods->id)->jsonArray($spec);
if ($form->isEditing()) {
$query->where('id', '!=', $info->id);
}
if ($query->exists()) {
return $form->response()->error('该规格已经存在');
}
});
$form->disableCreatingCheck();
$form->disableEditingCheck();
$form->disableViewCheck();
$form->disableResetButton();
});
}
public function edit($goods, $id, Content $content)
{
$goods = Goods::findOrFail($goods);
return $content
->translation($this->translation)
->title(admin_trans_label())
->description(trans('admin.edit'))
->body($this->form($goods)->edit($id));
}
public function create($goods, Content $content)
{
$goods = Goods::findOrFail($goods);
return $content
->translation($this->translation)
->title(__('peidikeji.dcat-admin-extension-goods::goods-sku.labels.sku'))
->description(__('peidikeji.dcat-admin-extension-goods::goods-sku.labels.create'))
->body($this->createForm($goods));
}
protected function createForm($goods)
{
return Form::make(new GoodsSku(), function (Form $form) use ($goods) {
$form->text('name')->default($goods->name);
if ($goods->spec) {
$form->checkbox('name_append', '')->options([1 => '是否在名称上面追加属性值']);
}
$form->number('price')->min(0)->default($goods->price);
if ($goods->spec) {
$form->checkbox('price_append', '')->options([1 => '是否在价格上面追加属性的加价'])->default([1]);
}
if ($goods->spec) {
foreach($goods->spec as $item) {
$values = array_column($item['values'], 'value', 'value');
$form->checkbox($item['name'], $item['name'])->options($values);
}
$form->checkbox('force', '')->options([1 => '覆盖已经存在的货品'])->default(1);
}
$form->disableCreatingCheck();
$form->disableEditingCheck();
$form->disableViewCheck();
$form->disableResetButton();
$form->saving(function (Form $form) use ($goods) {
$price = $form->price;
$name = $form->name;
$spec = [];
if ($goods->spec) {
foreach($goods->spec as $index => $item) {
$values = $form->input($item['name']);
$values = array_filter($values, fn($v) => $v);
if (count($values) === 0) {
return $form->response()->error('请勾选 ' . $item['name']);
}
array_push($spec, ['name' => $item['name'], 'values' => array_filter($item['values'], fn($v) => in_array($v['value'], $values))]);
$form->deleteInput($item['name']);
}
}
GoodsService::make()->generateSku($goods, [
'spec' => $spec,
'price' => $price,
'name' => $name,
'name_add' => !!data_get($form->name_append, 0),
'price_add' => !!data_get($form->price_append, 0),
'force' => !!$form->force
]);
return $form->response()->success('添加成功')->redirect(admin_route('goods_sku.index', ['goods' => $goods->id]));
});
});
}
public function update($goods, $id)
{
return $this->form(Goods::findOrFail($goods))->update($id);
}
public function store($goods)
{
return $this->createForm(Goods::findOrFail($goods))->store();
}
public function destroy($goods, $id)
{
return $this->form(Goods::findOrFail($goods))->destroy($id);
}
}