From 182bd8b06f801be6f42bc89189ef18e4b77332c0 Mon Sep 17 00:00:00 2001
From: panliang <1163816051@qq.com>
Date: Mon, 8 Aug 2022 18:03:19 +0800
Subject: [PATCH] generate
---
.../goods/resources/lang/zh_CN/goods-sku.php | 3 +-
.../goods/resources/views/form/spec.blade.php | 272 ++++++++++++------
.../goods/resources/views/grid/attr.blade.php | 2 +-
.../resources/views/grid/attrs.blade.php | 15 +
.../resources/views/grid/parts.blade.php | 15 +
.../goods/resources/views/grid/spec.blade.php | 6 +-
.../resources/views/grid/specs.blade.php | 15 +
packages/goods/src/Form/GoodsAttrForm.php | 13 +-
packages/goods/src/Form/GoodsSpecForm.php | 30 +-
packages/goods/src/Form/Spec.php | 53 +++-
packages/goods/src/GoodsService.php | 47 ++-
.../Controllers/Admin/GoodsController.php | 31 +-
.../Controllers/Admin/GoodsSkuController.php | 132 ++++++---
packages/goods/updates/GoodsTableSeeder.php | 6 +-
resources/views/form/checkbox.blade.php | 4 +-
15 files changed, 450 insertions(+), 194 deletions(-)
create mode 100644 packages/goods/resources/views/grid/attrs.blade.php
create mode 100644 packages/goods/resources/views/grid/parts.blade.php
create mode 100644 packages/goods/resources/views/grid/specs.blade.php
diff --git a/packages/goods/resources/lang/zh_CN/goods-sku.php b/packages/goods/resources/lang/zh_CN/goods-sku.php
index 5c8f5bc..2373eb6 100644
--- a/packages/goods/resources/lang/zh_CN/goods-sku.php
+++ b/packages/goods/resources/lang/zh_CN/goods-sku.php
@@ -4,7 +4,8 @@ return [
'labels' => [
'GoodsSku' => '货品管理',
'goods' => '商品管理',
- 'sku' => '商品管理',
+ 'sku' => '货品管理',
+ 'create' => '添加',
],
'fields' => [
'sn' => '货号',
diff --git a/packages/goods/resources/views/form/spec.blade.php b/packages/goods/resources/views/form/spec.blade.php
index d58c7b7..94990cf 100644
--- a/packages/goods/resources/views/form/spec.blade.php
+++ b/packages/goods/resources/views/form/spec.blade.php
@@ -1,22 +1,29 @@
+
@foreach($headers as $item)
| {{ $item }} |
@endforeach
- |
+
+ @if($type)
+
+ @endif
+ |
- @foreach($value as $item)
+ @foreach($formatValue as $item)
- | {{ $item['name'] }} |
+ {{ $item['name'] }} |
@foreach($item['values'] as $subItem)
- @foreach($subItem as $value)
- | {{ $value }} |
+ @foreach($keys as $key)
+ {{ data_get($subItem, $key) }} |
@endforeach
|
@endforeach
- @foreach($headers as $index => $subItem)
- @if($index > 0)
- |
-
- |
- @endif
+ @foreach($keys as $index => $key)
+
+
+ |
@endforeach
|
- |
@@ -66,89 +71,170 @@
}
diff --git a/packages/goods/resources/views/grid/attr.blade.php b/packages/goods/resources/views/grid/attr.blade.php
index 643a91d..00d5af6 100644
--- a/packages/goods/resources/views/grid/attr.blade.php
+++ b/packages/goods/resources/views/grid/attr.blade.php
@@ -5,7 +5,7 @@
@foreach($value as $item)
{{ $item['name'] }}
- {{ $item['value'] }} {{ isset($item['price']) ? '(+'.$item['price'].')' : '' }}
+ {{ $item['name'] }}({{ $item['value'] }})
@endforeach
@endif
diff --git a/packages/goods/resources/views/grid/attrs.blade.php b/packages/goods/resources/views/grid/attrs.blade.php
new file mode 100644
index 0000000..4f137df
--- /dev/null
+++ b/packages/goods/resources/views/grid/attrs.blade.php
@@ -0,0 +1,15 @@
+
+
+
+@if($value)
+@foreach($value as $item)
+
+ {{ $item['name'] }}
+ @if($item['values'])
+ @foreach($item['values'] as $subItem)
+ {{ $subItem['name'] }}({{ $subItem['value'] }})
+ @endforeach
+ @endif
+
+@endforeach
+@endif
diff --git a/packages/goods/resources/views/grid/parts.blade.php b/packages/goods/resources/views/grid/parts.blade.php
new file mode 100644
index 0000000..e5aa0a5
--- /dev/null
+++ b/packages/goods/resources/views/grid/parts.blade.php
@@ -0,0 +1,15 @@
+
+
+
+@if($value)
+@foreach($value as $item)
+
+ {{ $item['name'] }}
+ @if($item['values'])
+ @foreach($item['values'] as $subItem)
+ {{ $subItem['value'] }}({{ $subItem['price'] }})
+ @endforeach
+ @endif
+
+@endforeach
+@endif
diff --git a/packages/goods/resources/views/grid/spec.blade.php b/packages/goods/resources/views/grid/spec.blade.php
index e5aa0a5..f3a93ef 100644
--- a/packages/goods/resources/views/grid/spec.blade.php
+++ b/packages/goods/resources/views/grid/spec.blade.php
@@ -5,11 +5,7 @@
@foreach($value as $item)
{{ $item['name'] }}
- @if($item['values'])
- @foreach($item['values'] as $subItem)
- {{ $subItem['value'] }}({{ $subItem['price'] }})
- @endforeach
- @endif
+ {{ $item['value'] }}({{ $item['price'] }})
@endforeach
@endif
diff --git a/packages/goods/resources/views/grid/specs.blade.php b/packages/goods/resources/views/grid/specs.blade.php
new file mode 100644
index 0000000..e5aa0a5
--- /dev/null
+++ b/packages/goods/resources/views/grid/specs.blade.php
@@ -0,0 +1,15 @@
+
+
+
+@if($value)
+@foreach($value as $item)
+
+ {{ $item['name'] }}
+ @if($item['values'])
+ @foreach($item['values'] as $subItem)
+ {{ $subItem['value'] }}({{ $subItem['price'] }})
+ @endforeach
+ @endif
+
+@endforeach
+@endif
diff --git a/packages/goods/src/Form/GoodsAttrForm.php b/packages/goods/src/Form/GoodsAttrForm.php
index 502fb0a..49a7613 100644
--- a/packages/goods/src/Form/GoodsAttrForm.php
+++ b/packages/goods/src/Form/GoodsAttrForm.php
@@ -5,7 +5,6 @@ namespace Peidikeji\Goods\Form;
use Dcat\Admin\Contracts\LazyRenderable;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;
-use Illuminate\Support\Arr;
use Peidikeji\Goods\Models\Goods;
class GoodsAttrForm extends Form implements LazyRenderable
@@ -14,20 +13,16 @@ class GoodsAttrForm extends Form implements LazyRenderable
public function handle(array $input)
{
- dd($input);
- $goods = Goods::findOrFail($input['goods_id']);
- $goods->update(['attr' => $input['attr']]);
+ $goods = Goods::findOrFail($this->payload['goods_id']);
+ $goods->update(['attr' => json_decode($input['attr'])]);
return $this->response()->success('保存成功');
}
public function form()
{
- $this->fill(Arr::only($this->payload, ['type_id', 'goods_id', 'attr']));
-
- $this->hidden('type_id');
- $this->hidden('goods_id');
- $this->spec('attr')->header(['分组', '名称', '属性值']);
+ $attr = $this->model()->type?->attr;
+ $this->spec('attr')->header(['分组', '名称', '属性值'])->keys(['name', 'value'])->type($attr);
}
protected function renderResetButton()
diff --git a/packages/goods/src/Form/GoodsSpecForm.php b/packages/goods/src/Form/GoodsSpecForm.php
index d8b4080..e1c4c6e 100644
--- a/packages/goods/src/Form/GoodsSpecForm.php
+++ b/packages/goods/src/Form/GoodsSpecForm.php
@@ -2,12 +2,9 @@
namespace Peidikeji\Goods\Form;
-use Dcat\Admin\Admin;
use Dcat\Admin\Contracts\LazyRenderable;
-use Dcat\Admin\Form\NestedForm;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;
-use Illuminate\Support\Arr;
use Peidikeji\Goods\Models\Goods;
class GoodsSpecForm extends Form implements LazyRenderable
@@ -16,28 +13,21 @@ class GoodsSpecForm extends Form implements LazyRenderable
public function handle(array $input)
{
- $goods = Goods::findOrFail($input['goods_id']);
- $goods->update(['spec' => $input['spec']]);
-
+ $goods = Goods::findOrFail($this->payload['goods_id']);
+ $spec = json_decode($input['spec'], true);
+ foreach($spec as &$item) {
+ foreach($item['values'] as &$subItem) {}
+ $subItem['price'] = floatval($subItem['price']);
+ }
+ $goods->update(['spec' => $spec]);
return $this->response()->success('保存成功');
}
public function form()
{
- $this->spec('spec')->customFormat(function ($v) {
- $list = [];
- foreach($v as $item) {
- $listItem = ['name' => $item['name'], 'values' => []];
- foreach($item['values'] as $subItem) {
- array_push($listItem['values'], [
- 'name' => $subItem['value'],
- 'value' => $subItem['price']
- ]);
- }
- array_push($list, $listItem);
- }
- return $list;
- })->header(['名称', '可选值', '价格']);
+ $spec = $this->model()->type?->spec;
+
+ $this->spec('spec')->header(['名称', '可选值', '价格'])->keys(['value', 'price'])->type($spec);
}
protected function renderResetButton()
diff --git a/packages/goods/src/Form/Spec.php b/packages/goods/src/Form/Spec.php
index 09de009..b2ce6c3 100644
--- a/packages/goods/src/Form/Spec.php
+++ b/packages/goods/src/Form/Spec.php
@@ -3,19 +3,68 @@
namespace Peidikeji\Goods\Form;
use Dcat\Admin\Form\Field;
+use Illuminate\Support\Arr;
class Spec extends Field
{
protected $view = 'peidikeji.dcat-admin-extension-goods::form.spec';
protected $variables = [
- 'headers' => []
+ 'headers' => [],
+ 'keys' => [],
+ 'type' => null,
+ 'formatValue' => [],
];
public function header(array $headers)
{
- $this->addVariables(['headers' => $headers]);
+ $this->addVariables([
+ 'headers' => $headers,
+ ]);
return $this;
}
+
+ public function keys($keys)
+ {
+ $this->addVariables([
+ 'keys' => $keys,
+ ]);
+
+ return $this;
+ }
+
+ public function type($type)
+ {
+ $this->addVariables(['type' => $type]);
+
+ return $this;
+ }
+
+ public function render()
+ {
+ $value = $this->value;
+ $type = $this->variables['type'];
+ $newValue = [];
+ if ($type && !$value) {
+ foreach($type as $item) {
+ $itemValue = $value ? Arr::first($value, fn($i) => $i['name'] === $item['name']) : [];
+ $values = data_get($itemValue, 'values', []);
+ foreach($values as &$items) {
+ $subItem = Arr::first($item['values'], fn($i) => $i['name'] === $items['name']);
+ $items['options'] = data_get($subItem, 'values');
+ }
+ array_push($newValue, [
+ 'name' => $item['name'],
+ 'values' => $values
+ ]);
+ }
+ } else {
+ $newValue = $value ?: [];
+ }
+ $this->addVariables([
+ 'formatValue' => $newValue
+ ]);
+ return parent::render();
+ }
}
diff --git a/packages/goods/src/GoodsService.php b/packages/goods/src/GoodsService.php
index 6bc81ec..a3b87c6 100644
--- a/packages/goods/src/GoodsService.php
+++ b/packages/goods/src/GoodsService.php
@@ -22,14 +22,22 @@ class GoodsService
GoodsSku::where('goods_id', $goods->id)->delete();
}
- public function generateSku(Goods $goods)
+ /**
+ * 根据规格生成SKU
+ *
+ * @param Goods $goods 商品
+ * @param array $options {spec: 指定规格, price: 基础价格, name: 基础名称, stock: 默认库存, name_add: 是否在名称上面追加属性值, price_add: 是否在价格上面追加属性的加价, force: 是否覆盖原有的货品}
+ */
+ public function generateSku(Goods $goods, $options = [])
{
- $this->clearSku($goods);
- if ($goods->spec) {
- $spec = $goods->spec;
- $price = $goods->price;
- $name = $goods->name;
-
+ $spec = data_get($options, 'spec', $goods->spec);
+ $price = data_get($options, 'price', $goods->price);
+ $name = data_get($options, 'name', $goods->name);
+ $stock = data_get($options, 'stock', $goods->stock);
+ $nameAdd = !!data_get($options, 'name_add', false);
+ $priceAdd = !!data_get($options, 'price_add', false);
+ $force = !!data_get($options, 'force', false);
+ if ($spec) {
$specList = [];
foreach ($spec as $item) {
$items = [];
@@ -37,21 +45,30 @@ class GoodsService
array_push($items, [
'name' => $item['name'],
'value' => $value['value'],
- 'price' => $value['price'],
+ 'price' => floatval($value['price']),
]);
}
array_push($specList, $items);
}
$cartesianList = $this->cartesianProduct($specList);
foreach($cartesianList as $items) {
- $specPrice = array_sum(array_column($items, 'price'));
- $goods->skus()->create([
- 'sn' => $this->generateSn(),
- 'name' => $name,
- 'price' => $price + $specPrice,
- 'stock' => $goods->stock,
+ $specPrice = $priceAdd ? $price + array_sum(array_column($items, 'price')) : $price;
+ $specName = $nameAdd ? $name . ' ' . implode(' ', array_column($items, 'value')) : $name;
+ $exists = $goods->skus()->jsonArray($items)->exists();
+ $attributes = [
+ 'name' => $specName,
+ 'price' => $specPrice,
+ 'stock' => $stock,
'spec' => $items,
- ]);
+ ];
+ if ($exists) {
+ if ($force) {
+ $goods->skus()->jsonArray($items)->update($attributes);
+ }
+ } else {
+ $attributes['sn'] = $this->generateSn();
+ $goods->skus()->create($attributes);
+ }
}
}
}
diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsController.php b/packages/goods/src/Http/Controllers/Admin/GoodsController.php
index 6411674..0c96d33 100644
--- a/packages/goods/src/Http/Controllers/Admin/GoodsController.php
+++ b/packages/goods/src/Http/Controllers/Admin/GoodsController.php
@@ -10,11 +10,13 @@ use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Show;
use Dcat\Admin\Widgets\Card;
+use Illuminate\Validation\Rule;
use Peidikeji\Goods\Form\GoodsAttrForm;
use Peidikeji\Goods\Form\GoodsSpecForm;
use Peidikeji\Goods\Models\Goods;
use Peidikeji\Goods\Models\GoodsBrand;
use Peidikeji\Goods\Models\GoodsCategory;
+use Peidikeji\Goods\Models\GoodsSku;
use Peidikeji\Goods\Models\GoodsType;
class GoodsController extends AdminController
@@ -25,8 +27,9 @@ class GoodsController extends AdminController
{
$goods = Goods::with(['type'])->findOrFail($goods);
$form = GoodsAttrForm::make([
- 'type' => $goods->type
- ])->payload(['attr' => $goods->attr, 'type_id' => $goods->type?->id, 'goods_id' => $goods->id])->appendHtmlAttribute('class', 'bg-white');
+ '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)
@@ -83,7 +86,7 @@ class GoodsController extends AdminController
return ($this->cover_image ? '
' : '') . ''.$this->name.'';
});
$grid->column('price')->editable();
- $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec');
+ $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.specs');
$grid->column('on_sale')->switch();
$grid->column('sold_count');
@@ -111,9 +114,9 @@ class GoodsController extends AdminController
$show->field('cover_image')->image('', 100);
$show->field('images')->image('', 100);
$show->field('content')->image('');
- $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec');
- $show->field('attr')->view('peidikeji.dcat-admin-extension-goods::grid.attr');
- $show->field('part')->view('peidikeji.dcat-admin-extension-goods::grid.spec');
+ $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.specs');
+ $show->field('attr')->view('peidikeji.dcat-admin-extension-goods::grid.attrs');
+ $show->field('part')->view('peidikeji.dcat-admin-extension-goods::grid.parts');
$show->field('on_sale')->bool();
$show->field('sold_count');
$show->field('created_at')->as(fn($v) => $this->created_at->format('Y-m-d H:i:s'));
@@ -127,17 +130,21 @@ class GoodsController extends AdminController
return Form::make(new Goods(), 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'));
} else {
- $type = $model->type_id ? GoodsType::find($form->model()->type_id) : null;
- $form->display('type_id')->with(fn() => $type->name);
+ $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('goods_sn');
+ $form->text('goods_sn')->required()->rules([$unique], [
+ 'unique' => '商品编号已经存在'
+ ]);
$form->image('cover_image')
->autoUpload()
->saveFullUrl()
@@ -159,6 +166,12 @@ class GoodsController extends AdminController
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->disableEditingCheck();
+
+ $form->deleting(function (Form $form) {
+ $data = $form->model()->toArray();
+ // 删除 SKU
+ GoodsSku::whereIn('goods_id', array_column($data, 'id'))->delete();
+ });
});
}
}
diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php b/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php
index a901821..0d46b74 100644
--- a/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php
+++ b/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php
@@ -11,6 +11,7 @@ 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;
@@ -26,14 +27,16 @@ class GoodsSkuController extends Controller
$grid->selector(function (Selector $selector) use ($goods) {
$specs = $goods->spec;
- 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]]]);
- }
- });
+ 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]]]);
+ }
+ });
+ }
}
});
@@ -43,13 +46,15 @@ class GoodsSkuController extends Controller
$grid->column('origin_price')->display(fn() => $goods->price);
$grid->column('price');
$grid->column('stock');
- 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 ''.$value.'';
- });
+ 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 ''.$value.'';
+ });
+ }
}
// $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.attr');
});
@@ -69,7 +74,7 @@ class GoodsSkuController extends Controller
$show->field('name');
$show->field('price');
$show->field('stock');
- $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.attr');
+ $show->field('spec')->view('peidikeji.dcat-admin-extension-goods::grid.spec');
// $goods = $show->model()->goods;
// foreach($goods->spec as $key => $item) {
// $show->field('spec_' . $key, $item['name'])->as(function () use ($item) {
@@ -90,11 +95,8 @@ class GoodsSkuController extends Controller
protected function form($goods)
{
return Form::make(new GoodsSku(), function (Form $form) use ($goods) {
- $unqiue = Rule::unique('goods_sku', 'sn');
- if ($form->isEditing()) {
- $unqiue->ignore($form->model()->id);
- }
- $form->text('sn')->rules([$unqiue])->required();
+ $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)->default($goods->price);
$form->number('stock')->min(0)->default($goods->stock);
@@ -102,22 +104,26 @@ class GoodsSkuController extends Controller
$form->hidden('goods_id')->default($goods->id);
$spec = $form->model()->spec;
- foreach($goods->spec as $key => $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);
+ 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->radio($item['name'], $item['name'])->options($values)->value($value);
}
$form->saving(function (Form $form) use ($goods) {
$info = $form->model();
$spec = [];
- foreach($goods->spec as $item) {
- array_push($spec, ['name' => $item['name'], 'value' => $form->input($item['name'])]);
- $form->deleteInput($item['name']);
+ 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);
@@ -148,11 +154,67 @@ class GoodsSkuController extends Controller
public function create($goods, Content $content)
{
+ $goods = Goods::findOrFail($goods);
return $content
->translation($this->translation)
- ->title(admin_trans_label())
- ->description(trans('admin.create'))
- ->body($this->form(Goods::findOrFail($goods)));
+ ->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)
@@ -162,7 +224,7 @@ class GoodsSkuController extends Controller
public function store($goods)
{
- return $this->form(Goods::findOrFail($goods))->store();
+ return $this->createForm(Goods::findOrFail($goods))->store();
}
public function destroy($goods, $id)
diff --git a/packages/goods/updates/GoodsTableSeeder.php b/packages/goods/updates/GoodsTableSeeder.php
index f0539da..fec700d 100644
--- a/packages/goods/updates/GoodsTableSeeder.php
+++ b/packages/goods/updates/GoodsTableSeeder.php
@@ -53,8 +53,10 @@ class GoodsTableSeeder extends Seeder
[
'name' => '笔记本电脑',
'attr' => [
- ['group' => '显示器', 'name' => '屏幕类型', 'values' => ['LED 背光显示屏']],
- ['group' => '显示器','name' => '物理分辨率', 'values' => ['3072 x 1920 (226 ppi)']],
+ ['name' => '显示器', 'values' => [
+ ['name' => '屏幕类型', 'values' => ['LED 背光显示屏']],
+ ['name' => '物理分辨率', 'values' => ['3072 x 1920 (226 ppi)']]
+ ]],
],
'spec' => [
['name' => '颜色', 'values' => ['白色', '灰色']],
diff --git a/resources/views/form/checkbox.blade.php b/resources/views/form/checkbox.blade.php
index 3ea145e..08d4ca4 100755
--- a/resources/views/form/checkbox.blade.php
+++ b/resources/views/form/checkbox.blade.php
@@ -1,6 +1,6 @@