6
0
Fork 0

完善商品SKU管理

release
vine_liutk 2021-12-03 11:07:24 +08:00
parent 4cb5240b79
commit ce3c761795
33 changed files with 1552 additions and 236 deletions

View File

@ -56,7 +56,7 @@ class ArticleList extends RowAction
*/
protected function authorize($user): bool
{
return true;
return $user->can('dcat.admin.articles.index');
}
/**

View File

@ -0,0 +1,68 @@
<?php
namespace App\Admin\Actions\Grid;
use App\Models\ProductSku;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class ReleaseCancel extends RowAction
{
/**
* @return string
*/
protected $title = '取消上架申请';
/**
* Handle the action request.
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
try {
DB::beginTransaction();
ProductSku::releaseCancel([$this->getKey()]);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success('操作成功')->refresh();
}
/**
* @return string|array|void
*/
public function confirm()
{
return ['确认当前商品取消上架申请?'];
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return true;
}
/**
* @return array
*/
protected function parameters()
{
return [];
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Admin\Actions\Grid;
use App\Models\ProductSku;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class ReleaseDown extends RowAction
{
/**
* @return string
*/
protected $title = '下架商品';
/**
* Handle the action request.
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
try {
DB::beginTransaction();
ProductSku::skuDown([$this->getKey()]);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success('操作成功')->refresh();
}
/**
* @return string|array|void
*/
public function confirm()
{
return ['确认当前商品下架?'];
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return true;
}
/**
* @return array
*/
protected function parameters()
{
return [];
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Admin\Actions\Grid;
use App\Models\ProductSku;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class ReleaseUp extends RowAction
{
/**
* @return string
*/
protected $title = '上架申请';
/**
* Handle the action request.
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
try {
DB::beginTransaction();
ProductSku::skuUp([$this->getKey()]);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success('申请成功')->refresh();
}
/**
* @return string|array|void
*/
public function confirm()
{
return ['确认当前商品提交上架申请?'];
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return true;
}
/**
* @return array
*/
protected function parameters()
{
return [];
}
}

View File

@ -56,7 +56,7 @@ class SkuList extends RowAction
*/
protected function authorize($user): bool
{
return true;
return $user->can('dcat.admin.product_skus.index');
}
/**

View File

@ -0,0 +1,68 @@
<?php
namespace App\Admin\Actions\Grid;
use App\Models\ProductSku;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class SkuSyncSpu extends RowAction
{
/**
* @return string
*/
protected $title = '同步主商品';
/**
* Handle the action request.
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
try {
DB::beginTransaction();
ProductSku::skuSyncSpuById($this->getKey());
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success('同步成功')->refresh();
}
/**
* @return string|array|void
*/
public function confirm()
{
return ['确认当前商品同步主商品信息?'];
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_skus.sku_sync_spu');
}
/**
* @return array
*/
protected function parameters()
{
return [];
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Admin\Actions\Grid;
use App\Admin\Forms\SkuVerify as SkuVerifyForm;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Traits\HasPermissions;
use Dcat\Admin\Widgets\Modal;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
class SkuVerify extends RowAction
{
/**
* @return string
*/
protected $title = '审核商品';
public function render()
{
$form = SkuVerifyForm::make()->payload(['id'=>$this->getKey()]);
return Modal::make()
->lg()
->title($this->title)
->body($form)
->button($this->title);
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_sku_verifies.verify');
}
}

View File

@ -131,7 +131,7 @@ class ProductCategoryController extends AdminController
return parent::destroy($id);
}
public function list(Request $request)
public function categories(Request $request)
{
$parent_id = (int) $request->input('q');
$query = ProductCategoryModel::select('id', 'name as text');

View File

@ -2,11 +2,24 @@
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\ReleaseCancel;
use App\Admin\Actions\Grid\ReleaseDown;
use App\Admin\Actions\Grid\ReleaseUp;
use App\Admin\Actions\Grid\SkuSyncSpu;
use App\Admin\Extensions\Grid\Tools\Product\BatchReleaseCancel;
use App\Admin\Extensions\Grid\Tools\Product\BatchReleaseDown;
use App\Admin\Extensions\Grid\Tools\Product\BatchReleaseUp;
use App\Admin\Repositories\ProductSku;
use App\Models\ProductBuynote;
use App\Models\ProductGroup;
use App\Models\ProductSku as ProductSkuModel;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Show;
use Illuminate\Http\Request;
class ProductSkuController extends AdminController
{
@ -17,31 +30,74 @@ class ProductSkuController extends AdminController
*/
protected function grid()
{
return Grid::make(new ProductSku(), function (Grid $grid) {
$builder = ProductSku::with('category');
return Grid::make($builder, function (Grid $grid) {
$grid->showRowSelector();
$grid->batchActions(function ($batch) {
//批量下架
if (Admin::user()->can('dcat.admin.product_skus.batch_release_down')) {
$batch->add(new BatchReleaseDown());
}
//批量上架
if (Admin::user()->can('dcat.admin.product_skus.batch_release_up')) {
$batch->add(new BatchReleaseUp());
}
//批量取消审核
if (Admin::user()->can('dcat.admin.product_skus.batch_release_cancel')) {
$batch->add(new BatchReleaseCancel());
}
});
$grid->column('id')->sortable();
$grid->column('spu_id');
// $grid->column('spu_id');
$grid->column('name');
$grid->column('subtitle');
$grid->column('category_id');
$grid->column('cover');
$grid->column('images');
$grid->column('description');
$grid->column('sell_price');
$grid->column('market_price');
$grid->column('cost_price');
$grid->column('vip_price');
$grid->column('media');
$grid->column('category.name');
$grid->column('specs')->label();
$grid->column('sell_price')->prepend('¥');
$grid->column('market_price')->prepend('¥');
$grid->column('cost_price')->prepend('¥');
$grid->column('vip_price')->prepend('¥');
$grid->column('weight');
$grid->column('attrs');
$grid->column('specs');
$grid->column('stock');
$grid->column('sales');
$grid->column('verify_state')
->using([0=>'正常', 1=>'审核中', 2=>'审核失败'])
->dot([
0 => 'success',
1 => 'primary',
2 => 'danger',
]);
$grid->column('release_at');
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->model()->orderBy('created_at', 'desc');
$grid->model()->orderBy('release_at', 'desc');
$grid->actions(function (Grid\Displayers\Actions $actions) {
if (is_null($actions->row->release_at) || $actions->row->verify_state == 1) {//未上架或者审核未通过
$actions->disableEdit(Admin::user()->cannot('dcat.admin.product_skus.edit'));
$actions->disableDelete(Admin::user()->cannot('dcat.admin.product_skus.destroy'));
if ($actions->row->verify_state == 0) {
if (Admin::user()->can('dcat.admin.product_skus.release_up')) {
$actions->append(new ReleaseUp());
}
}
if ($actions->row->verify_state == 1) {
if (Admin::user()->can('dcat.admin.product_skus.release_cancel')) {
$actions->append(new ReleaseCancel());
}
}
}
if ($actions->row->release_at) {//已上架
if (Admin::user()->can('dcat.admin.product_skus.release_down')) {
$actions->append(new ReleaseDown());
}
if (Admin::user()->can('dcat.admin.product_skus.sku_sync_spu')) {
$actions->append(new SkuSyncSpu());
}
}
});
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->panel();
$filter->equal('name')->width(3);
});
});
}
@ -89,27 +145,50 @@ class ProductSkuController extends AdminController
{
return Form::make(new ProductSku(), function (Form $form) {
$form->display('id');
$form->text('spu_id');
$form->text('name');
$form->text('name')->required();
$form->text('subtitle');
$form->text('category_id');
$form->text('cover');
$form->text('images');
$form->text('description');
$form->text('sell_price');
$form->text('market_price');
$form->text('cost_price');
$form->text('vip_price');
$form->text('media');
$form->text('weight');
$form->text('attrs');
$form->text('specs');
$form->text('stock');
$form->text('sales');
$form->text('release_at');
$form->divider();
$form->image('cover')
->move('product-skus/cover/'.Carbon::now()->toDateString())
->saveFullUrl()
->removable(false)
->autoUpload();
$form->multipleImage('images')
->move('product-skus/'.Carbon::now()->toDateString())
->saveFullUrl()
->removable(false)
->autoUpload();
$form->file('media')->chunked()
->accept('mp4', 'mp4/*')
->move('prduct-sku-medias/'.Carbon::now()->toDateString())
->saveFullUrl()
->removable(false)
->autoUpload();
$form->editor('description');
$form->select('buynote_id')->options(ProductBuynote::all()->pluck('name', 'id'));
$form->number('weight');
$form->number('stock');
$form->divider();
$form->currency('sell_price')->symbol('¥')->default(0);
$form->currency('market_price')->symbol('¥')->default(0);
$form->currency('cost_price')->symbol('¥')->default(0);
$form->currency('vip_price')->symbol('¥');
$form->divider();
$form->select('attr_group')->options(ProductGroup::all()->pluck('name', 'id'));
$form->selectAttr('attrs')->listen('attr_group');
$form->ignore(['attr_group']);
$form->display('created_at');
$form->display('updated_at');
});
}
public function skus(Request $request)
{
$name = $request->input('q');
$query = ProductSkuModel::select('id', 'name as text')->where('name', 'like', "%$name%");
$data = $query->get();
return response()->json($data);
}
}

View File

@ -0,0 +1,116 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\SkuVerify;
use App\Admin\Extensions\Grid\Tools\Product\BatchSkuVerify;
use App\Admin\Repositories\ProductSkuVerify;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Show;
class ProductSkuVerifyController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$builder = ProductSkuVerify::with('sku');
return Grid::make($builder, function (Grid $grid) {
$grid->showRowSelector();
$grid->rowSelector()->disable(function ($row) {
return $row->status !== 0;
});
$grid->batchActions(function ($batch) {
if (Admin::user()->can('dcat.admin.product_sku_verifies.batch_verify')) {
$batch->add(new BatchSkuVerify());
}
});
$grid->column('id')->sortable();
$grid->column('sku.name');
// $grid->column('type');
$grid->column('status')
->using([
0=>'未处理',
1=>'成功',
2=>'拒绝',
3=>'已取消',
])
->dot([
0 => 'danger',
1 => 'success',
2 => 'primary',
]);
$grid->column('remarks');
$grid->column('created_at')->sortable();
$grid->model()->orderBy('status', 'asc');
$grid->model()->orderBy('created_at', 'desc');
// $grid->column('updated_at')->sortable();
// //修改
// $grid->showQuickEditButton(Admin::user()->can('dcat.admin.product_sku_verifies.edit'));
//删除以及自定义操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
if ($actions->row->status === 0) {
if (Admin::user()->can('dcat.admin.product_sku_verifies.verify')) {
$actions->append(new SkuVerify());
}
} else {
$actions->disableDelete(Admin::user()->cannot('dcat.admin.product_sku_verifies.destroy'));
}
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('sku_id')->select(admin_route('api.product_skus'))->width('3');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new ProductSkuVerify(), function (Show $show) {
$show->field('id');
$show->field('sku_id');
$show->field('type');
$show->field('status');
$show->field('remarks');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$builder = ProductSkuVerify::with('sku');
return Form::make($builder, function (Form $form) {
$form->display('id');
$form->text('sku.name')->disable();
// $form->text('type');
$form->radio('status')->options([
1 => '成功',
2 => '拒绝',
])->default(1);
$form->text('remarks');
$form->display('created_at');
$form->display('updated_at');
});
}
}

View File

@ -2,8 +2,16 @@
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\ReleaseCancel;
use App\Admin\Actions\Grid\ReleaseDown;
use App\Admin\Actions\Grid\ReleaseUp;
use App\Admin\Actions\Grid\SkuList;
use App\Admin\Actions\Grid\SkuSyncSpu;
use App\Admin\Extensions\Grid\Tools\Product\AddSku;
use App\Admin\Extensions\Grid\Tools\Product\BatchReleaseCancel;
use App\Admin\Extensions\Grid\Tools\Product\BatchReleaseDown;
use App\Admin\Extensions\Grid\Tools\Product\BatchReleaseUp;
use App\Admin\Extensions\Grid\Tools\Product\BatchSkuSyncSpu;
use App\Admin\Extensions\Grid\Tools\Product\InitSkuBySpecs;
use App\Admin\Extensions\Grid\Tools\Product\SettingSpecs;
use App\Admin\Repositories\ProductSpu;
@ -170,16 +178,40 @@ class ProductSpuController extends AdminController
return $content->header(__('product-spu.labels.ProductSpu'))
->description($spu->name)
->body(Grid::make(ProductSku::where('spu_id', $spu->id), function ($grid) use ($spu) {
$grid->showRowSelector();
$grid->setResource('product-skus');
$grid->id();
$grid->disableRowSelector(false);
$grid->tools(function (Grid\Tools $tools) use ($spu) {
//设置规格
$tools->append(new SettingSpecs($spu->id));
if (Admin::user()->can('dcat.admin.product_spus.setting_specs')) {
$tools->append(new SettingSpecs($spu->id));
}
if ($spu->hasSku()) { //下面有sku手动创建sku
$tools->append(new AddSku($spu->id));
if (Admin::user()->can('dcat.admin.product_spus.add_sku')) {
$tools->append(new AddSku($spu->id));
}
} else {//下面无sku根据规格自动生成sku
$tools->append(new InitSkuBySpecs($spu->id));
if (Admin::user()->can('dcat.admin.product_spus.init_sku_by_specs')) {
$tools->append(new InitSkuBySpecs($spu->id));
}
}
});
$grid->batchActions(function ($batch) {
//批量下架
if (Admin::user()->can('dcat.admin.product_skus.batch_release_down')) {
$batch->add(new BatchReleaseDown());
}
//批量上架
if (Admin::user()->can('dcat.admin.product_skus.batch_release_up')) {
$batch->add(new BatchReleaseUp());
}
//批量取消审核
if (Admin::user()->can('dcat.admin.product_skus.batch_release_cancel')) {
$batch->add(new BatchReleaseCancel());
}
//批量同步主商品
if (Admin::user()->can('dcat.admin.product_skus.batch_sku_sync_spu')) {
$batch->add(new BatchSkuSyncSpu());
}
});
$grid->column('name');
@ -190,6 +222,41 @@ class ProductSpuController extends AdminController
$grid->column('cost_price')->prepend('¥');
$grid->column('vip_price')->prepend('¥');
$grid->column('weight');
$grid->column('stock');
$grid->column('sales');
$grid->column('verify_state')
->using([0=>'正常', 1=>'审核中', 2=>'审核失败'])
->dot([
0 => 'success',
1 => 'primary',
2 => 'danger',
]);
$grid->column('release_at');
$grid->actions(function (Grid\Displayers\Actions $actions) {
if (is_null($actions->row->release_at) || $actions->row->verify_state == 1) {//未上架或者审核未通过
$actions->disableEdit(Admin::user()->cannot('dcat.admin.product_skus.edit'));
$actions->disableDelete(Admin::user()->cannot('dcat.admin.product_skus.destroy'));
if ($actions->row->verify_state == 0) {
if (Admin::user()->can('dcat.admin.product_skus.release_up')) {
$actions->append(new ReleaseUp());
}
}
if ($actions->row->verify_state == 1) {
if (Admin::user()->can('dcat.admin.product_skus.release_cancel')) {
$actions->append(new ReleaseCancel());
}
}
}
if ($actions->row->release_at) {//已上架
if (Admin::user()->can('dcat.admin.product_skus.release_down')) {
$actions->append(new ReleaseDown());
}
if (Admin::user()->can('dcat.admin.product_skus.sku_sync_spu')) {
$actions->append(new SkuSyncSpu());
}
}
});
}));
}
}

View File

@ -13,6 +13,12 @@ class AddSku extends AbstractTool
parent::__construct($title);
$this->setKey($spu_id);
}
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_spus.add_sku');
}
/**
* 按钮样式定义,默认 btn btn-white waves-effect
*

View File

@ -0,0 +1,52 @@
<?php
namespace App\Admin\Extensions\Grid\Tools\Product;
use App\Models\ProductSku;
use Dcat\Admin\Grid\BatchAction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class BatchReleaseCancel extends BatchAction
{
protected $title = '取消上架审核';
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_skus.batch_release_cancel');
}
// 确认弹窗信息
public function confirm()
{
return '您确定操作已选中的商品吗?';
}
// 处理请求
public function handle(Request $request)
{
// 获取选中的skuID数组
$keys = $this->getKey();
$query = ProductSku::query()->whereIn('id', $keys)->where('verify_state', 1)->whereNull('release_at');
$list = $query->get();
if ($list->count() != count($keys)) {
return $this->response()->error('操作失败,所选商品含有不能操作项')->refresh();
}
$message = '操作成功';
try {
DB::beginTransaction();
ProductSku::releaseCancel($keys);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success($message)->refresh();
}
}

View File

@ -0,0 +1,53 @@
<?php
namespace App\Admin\Extensions\Grid\Tools\Product;
use App\Models\ProductSku;
use Dcat\Admin\Grid\BatchAction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class BatchReleaseDown extends BatchAction
{
protected $title = '下架操作';
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_skus.batch_release_down');
}
// 确认弹窗信息
public function confirm()
{
return '您确定操作已选中的商品吗?';
}
// 处理请求
public function handle(Request $request)
{
// 获取选中的skuID数组
$keys = $this->getKey();
$query = ProductSku::query()->whereIn('id', $keys)->where('verify_state', 0)->whereNotNull('release_at');
$list = $query->get();
if ($list->count() != count($keys)) {
return $this->response()->error('操作失败,所选商品含有不能操作项')->refresh();
}
$message = '下架成功';
try {
DB::beginTransaction();
ProductSku::skuDown($keys);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success($message)->refresh();
}
}

View File

@ -0,0 +1,54 @@
<?php
namespace App\Admin\Extensions\Grid\Tools\Product;
use App\Models\ProductSku;
use Dcat\Admin\Grid\BatchAction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class BatchReleaseUp extends BatchAction
{
protected $title = '上架审核';
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_skus.batch_release_up');
}
// 确认弹窗信息
public function confirm()
{
return '您确定操作已选中的商品吗?';
}
// 处理请求
public function handle(Request $request)
{
$nowTime = now();
// 获取选中的skuID数组
$keys = $this->getKey();
$query = ProductSku::query()->whereIn('id', $keys)->where('verify_state', 0)->whereNull('release_at');
$list = $query->get();
if ($list->count() != count($keys)) {
return $this->response()->error('操作失败,所选商品含有不能操作项')->refresh();
}
$message = '操作成功';
try {
DB::beginTransaction();
ProductSku::skuUp($keys);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败,'.$th->getMessage())->refresh();
}
return $this->response()->success($message)->refresh();
}
}

View File

@ -0,0 +1,67 @@
<?php
namespace App\Admin\Extensions\Grid\Tools\Product;
use App\Models\ProductSku;
use Dcat\Admin\Grid\BatchAction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class BatchSkuSyncSpu extends BatchAction
{
protected $title = '同步主商品';
/**
* 是否有权限判断.
*
* @param Model|Authenticatable|HasPermissions|null $user
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.batch.sku_sync_spu');
}
// 确认弹窗信息
public function confirm()
{
return '您确定操作已选中的商品吗?';
}
// 处理请求
public function handle(Request $request)
{
// 获取选中的skuID数组
$keys = $this->getKey();
$query = ProductSku::with('spu')->whereIn('id', $keys)->where(function ($query) {
$query->where('verify_state', 0)->orWhere('verify_state', 2);
})->whereNull('release_at');
$list = $query->get();
if ($list->count() != count($keys)) {
return $this->response()->error('操作失败,所选商品含有不能操作项')->refresh();
}
try {
DB::beginTransaction();
foreach ($list as $sku) {
ProductSku::skuSyncSpu($sku);
}
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
}
$message = '操作成功';
return $this->response()->success($message)->refresh();
}
// 设置请求参数
public function parameters()
{
return [
];
}
}

View File

@ -0,0 +1,49 @@
<?php
namespace App\Admin\Extensions\Grid\Tools\Product;
use App\Admin\Forms\SkuVerifyBatch;
use Dcat\Admin\Grid\BatchAction;
use Dcat\Admin\Widgets\Modal;
class BatchSkuVerify extends BatchAction
{
protected $title = '批量审核';
/**
* 是否有权限判断.
*
* @param Model|Authenticatable|HasPermissions|null $user
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_sku_verifies.batch_verify');
}
public function render()
{
// 实例化表单类
$form = SkuVerifyBatch::make();
return Modal::make()
->lg()
->title($this->title)
->body($form)
// 因为此处使用了表单异步加载功能,所以一定要用 onLoad 方法
// 如果是非异步方式加载表单,则需要改成 onShow 方法
->onLoad($this->getModalScript())
->button($this->title);
}
protected function getModalScript()
{
// 弹窗显示后往隐藏的id表单中写入批量选中的行ID
return <<<JS
// 获取选中的ID数组
var key = {$this->getSelectedKeysScript()}
$('#verify-sku-id').val(key);
JS;
}
}

View File

@ -15,6 +15,12 @@ class InitSkuBySpecs extends AbstractTool
parent::__construct($title);
$this->setKey($spu_id);
}
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_spus.init_sku_by_specs');
}
/**
* 按钮样式定义,默认 btn btn-white waves-effect
*
@ -74,7 +80,7 @@ class InitSkuBySpecs extends AbstractTool
}
$insertData[] = [
'spu_id' => $spu->id,
'name' => $spu->name,
'name' => trim($spu->name.' '.implode(' ', $_skuSpecs)),
'subtitle' => $spu->subtitle,
'category_id' => $spu->category_id,
'cover' => $spu->cover,

View File

@ -13,6 +13,12 @@ class SettingSpecs extends AbstractTool
parent::__construct($title);
$this->setKey($spu_id);
}
protected function authorize($user): bool
{
return $user->can('dcat.admin.product_spus.setting_specs');
}
/**
* 按钮样式定义,默认 btn btn-white waves-effect
*

View File

@ -46,7 +46,7 @@ class AddSku extends Form implements LazyRenderable
$spu = ProductSpu::findOrFail($spuId);
ProductSku::create([
'spu_id' => $spu->id,
'name' => $spu->name,
'name' => trim($spu->name.' '.implode(' ', $_skuSpecs)),
'subtitle' => $spu->subtitle,
'category_id' => $spu->category_id,
'cover' => $spu->cover,

View File

@ -0,0 +1,58 @@
<?php
namespace App\Admin\Forms;
use App\Models\ProductSku;
use App\Models\ProductSkuVerify;
use Dcat\Admin\Contracts\LazyRenderable;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;
use Illuminate\Support\Facades\DB;
use Throwable;
class SkuVerify extends Form implements LazyRenderable
{
use LazyWidget;
/**
* Handle the form request.
*
* @param array $input
*
* @return mixed
*/
public function handle(array $input)
{
try {
DB::beginTransaction();
ProductSku::skuVerify([$input['sku_id']], (int) $input['status'], $input['remarks']);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败:'.$th->getMessage());
}
return $this->response()
->success(__('admin.update_succeeded'))
->refresh();
}
/**
* Build a form here.
*/
public function form()
{
$id = $this->payload['id'] ?? 0;
$verify = ProductSkuVerify::with('sku')->findOrFail($id);
$this->text('name')->value($verify->sku->name)->disable();
$this->radio('status')->options([
1 => '成功',
2 => '拒绝',
])->default(1);
$this->text('remarks');
$this->hidden('sku_id')->value($verify->sku_id);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Admin\Forms;
use App\Models\ProductSku;
use App\Models\ProductSkuVerify;
use Dcat\Admin\Contracts\LazyRenderable;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;
use Illuminate\Support\Facades\DB;
use Throwable;
class SkuVerifyBatch extends Form implements LazyRenderable
{
use LazyWidget;
/**
* Handle the form request.
*
* @param array $input
*
* @return mixed
*/
public function handle(array $input)
{
$ids = explode(',', $input['id'] ?? null);
$skuIds = ProductSkuVerify::find($ids)->pluck('sku_id')->toArray();
try {
DB::beginTransaction();
ProductSku::skuVerify($skuIds, (int) $input['status'], $input['remarks']);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
return $this->response()->error('操作失败:'.$th->getMessage());
}
return $this->response()
->success(__('admin.update_succeeded'))
->refresh();
}
/**
* Build a form here.
*/
public function form()
{
$this->radio('status')->options([
1 => '成功',
2 => '拒绝',
])->default(1);
$this->text('remarks');
// 设置隐藏表单传递用户id
$this->hidden('id')->attribute('id', 'verify-sku-id');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Admin\Repositories;
use App\Models\ProductSkuVerify as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class ProductSkuVerify extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

View File

@ -51,12 +51,16 @@ Route::group([
$router->get('product-spus/{spu}/list', 'ProductSpuController@list')->name('product_spus.list');
$router->resource('product-skus', 'ProductSkuController')->only([
'index',
'index', 'edit', 'update', 'destroy',
])->names('product_skus');
$router->resource('product-sku-verifies', 'ProductSkuVerifyController')->only([
'index', 'edit', 'update', 'destroy',
])->names('product_sku_verifies');
/** api接口 **/
$router->get('api/product-categories', 'ProductCategoryController@list')->name('api.product_categories');
$router->get('api/product-categories', 'ProductCategoryController@categories')->name('api.product_categories');
$router->get('api/product-group-details', 'ProductGroupController@details')->name('api.product_group_details');
$router->get('api/product-skus', 'ProductSkuController@skus')->name('api.product_skus');
});

View File

@ -4,6 +4,7 @@ namespace App\Models;
use App\Casts\JsonArray;
use App\Casts\Price;
use App\Traits\Release;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model;
@ -12,6 +13,7 @@ class ProductSku extends Model
{
use Filterable;
use HasDateTimeFormatter;
use Release;
public const STATUS_INVALID = -1; // 无效的
public const STATUS_ONLINE = 1; // 已上架

View File

@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ProductSkuVerify extends Model
{
use HasFactory;
use HasDateTimeFormatter;
public function sku()
{
return $this->belongsTo(ProductSku::class, 'sku_id');
}
}

View File

@ -0,0 +1,161 @@
<?php
namespace App\Traits;
use App\Models\ProductSku;
use App\Models\ProductSkuVerify;
trait Release
{
/**
* SKU上架
*
* @param array|ProductSku $data
* @return void
*/
public static function skuUp(array|ProductSku $ids)
{
$nowTime = now();
if ($ids instanceof ProductSku) {
$ids[] = $ids->id;
}
$query = ProductSku::query()->whereIn('id', $ids)->where('verify_state', 0)->whereNull('release_at');
//执行上架审核动作
$query->update([
'verify_state'=> 1,
]);
ProductSkuVerify::query()->insert(array_map(function ($key) use ($nowTime) {
return [
'sku_id' => $key,
'created_at' => $nowTime,
'updated_at' => $nowTime,
];
}, $ids));
}
/**
* SKU下架操作
*
* @param array|ProductSku $ids
* @return void
*/
public static function skuDown(array|ProductSku $ids)
{
if ($ids instanceof ProductSku) {
$ids[] = $ids->id;
}
$query = ProductSku::query()->whereIn('id', $ids)->where('verify_state', 0)->whereNotNull('release_at');
//执行下架动作
$query->update([
'release_at'=> null,
]);
}
/**
* 取消SKU上架申请
*
* @param array|ProductSku $ids
* @return void
*/
public static function releaseCancel(array|ProductSku $ids)
{
if ($ids instanceof ProductSku) {
$ids[] = $ids->id;
}
$query = ProductSku::query()->whereIn('id', $ids)->where('verify_state', 1)->whereNull('release_at');
//执行取消上架申请
$query->update([
'verify_state'=> 0,
]);
ProductSkuVerify::whereIn('sku_id', $ids)->where('status', 0)->update(['status'=>3]);
}
/**
* 审核SKU
*
* @param array $ids
* @param integer $status
* @param string $remarks
* @return void
*/
public static function skuVerify(array $ids, int $status, ?string $remarks)
{
//获得审核中商品
$query = ProductSku::query()->whereIn('id', $ids)->where('verify_state', 1)->whereNull('release_at');
switch ($status) {
case 1://成功
$query->update([
'verify_state'=> 0,
'release_at'=>now(),
]);
break;
case 2://失败
$query->update([
'verify_state'=> 2,
]);
break;
default:
break;
}
ProductSkuVerify::whereIn('sku_id', $ids)->where('status', 0)->update([
'status'=>$status,
'remarks'=>$remarks,
]);
return;
}
/**
* 通过ID同步SPU
*
* @param integer $id
* @return void
*/
public static function skuSyncSpuById(int $id)
{
static::skuSyncSpu(ProductSku::with('spu')->findOrFail($id));
}
/**
* 同步spu的基本信息
*
* @param ProductSku $sku
* @return void
*/
public static function skuSyncSpu(ProductSku $sku)
{
$_price = 0;
foreach ($sku->specs as $id => $value) {
$spuSpec = $sku->spu->specs->first(function ($item) use ($id) {
return $item->id == $id;
});
foreach ($spuSpec->items as $item) {
if ($item['name'] == $value) {
$_price += $item['value'];
}
}
}
$sku->update(
[
'name' => trim($sku->spu->name.' '.implode(',', $sku->specs)),
'subtitle'=> $sku->spu->subtitle,
'cover' => $sku->spu->cover,
// 'images' => $sku->spu->images,
'description' => $sku->spu->description,
'sell_price' => bcadd($sku->spu->sell_price, $_price),
'market_price' => $sku->spu->market_price,
'cost_price' => $sku->spu->cost_price,
'vip_price' => !is_null($sku->spu->vip_price) ? bcadd($sku->spu->vip_price, $_price) : null,
'media' => $sku->spu->media,
'weight' => $sku->spu->weight,
'attrs' => $sku->spu->attrs,
'verify_state' => 0, //默认调整为正常
]
);
}
}

View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProductSkuVerifiesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('product_sku_verifies', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('sku_id')->comment('sku_id');
$table->tinyInteger('type')->unsigned()->default(1)->comment('审核类别1上架审核2修改审核');
$table->tinyInteger('status')->unsigned()->default(0)->comment('结果:0未处理1通过2拒绝, 3取消');
$table->string('remarks')->nullable()->comment('备注');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('product_sku_verifies');
}
}

View File

@ -62,6 +62,74 @@ class AdminPermissionSeeder extends Seeder
'name'=>'文章分类',
'curd' => ['index', 'create', 'store', 'edit', 'update', 'destroy'],
],
'articles'=>[
'name'=>'文章',
'curd' => true,
],
'product_categories'=>[
'name' =>'商品分类',
'curd'=>['index', 'create', 'store', 'edit', 'update', 'destroy'],
],
'product_groups'=>[
'name' =>'商品分组',
'curd'=>['index', 'create', 'store', 'edit', 'update', 'destroy'],
],
'product_features'=>[
'name' =>'商品特点',
'curd' =>['index', 'create', 'store', 'edit', 'update', 'destroy'],
],
'product_buynotes'=>[
'name' =>'商品购买须知',
'curd'=>['index', 'create', 'store', 'edit', 'update', 'destroy'],
],
'product_spus'=>[
'name' =>'主商品',
'curd'=> true,
'children'=>[
'list'=>[
'name'=>'子商品列表',
],
'setting_specs'=>[
'name'=>'设置规格',
],
'init_sku_by_specs'=>[
'name' =>'初始化SKU',
],
'add_sku'=>[
'name' =>'添加子商品',
],
],
],
'product_skus'=>[
'name' =>'子商品',
'curd' =>['index', 'edit', 'update', 'destroy'],
'children'=>[
'batch_release_up' => [
'name'=>'批量上架申请',
],
'batch_release_down'=>[
'name' =>'批量下架',
],
'batch_release_cacel'=>[
'name' =>'批量取消申请',
],
'batch_sku_sync_spu'=>[
'name' =>'批量同步主商品',
],
],
],
'product_sku_verifies'=>[
'name' =>'商品审核',
'curd'=>['index', 'destroy'],
'children' => [
'verify'=>[
'name' =>'审核商品',
],
'batch_verify'=>[
'name' =>'批量审核',
],
],
],
];
try {
DB::begintransaction();

View File

@ -12,183 +12,183 @@ namespace Dcat\Admin {
/**
* @property Grid\Column|Collection id
* @property Grid\Column|Collection key
* @property Grid\Column|Collection name
* @property Grid\Column|Collection created_at
* @property Grid\Column|Collection dimensions
* @property Grid\Column|Collection is_show
* @property Grid\Column|Collection created_at
* @property Grid\Column|Collection key
* @property Grid\Column|Collection name
* @property Grid\Column|Collection updated_at
* @property Grid\Column|Collection detail
* @property Grid\Column|Collection type
* @property Grid\Column|Collection version
* @property Grid\Column|Collection detail
* @property Grid\Column|Collection is_enabled
* @property Grid\Column|Collection parent_id
* @property Grid\Column|Collection order
* @property Grid\Column|Collection icon
* @property Grid\Column|Collection uri
* @property Grid\Column|Collection extension
* @property Grid\Column|Collection permission_id
* @property Grid\Column|Collection icon
* @property Grid\Column|Collection order
* @property Grid\Column|Collection parent_id
* @property Grid\Column|Collection uri
* @property Grid\Column|Collection menu_id
* @property Grid\Column|Collection slug
* @property Grid\Column|Collection permission_id
* @property Grid\Column|Collection http_method
* @property Grid\Column|Collection http_path
* @property Grid\Column|Collection slug
* @property Grid\Column|Collection role_id
* @property Grid\Column|Collection user_id
* @property Grid\Column|Collection value
* @property Grid\Column|Collection username
* @property Grid\Column|Collection password
* @property Grid\Column|Collection avatar
* @property Grid\Column|Collection password
* @property Grid\Column|Collection remember_token
* @property Grid\Column|Collection username
* @property Grid\Column|Collection address_id
* @property Grid\Column|Collection image
* @property Grid\Column|Collection sort
* @property Grid\Column|Collection jump_type
* @property Grid\Column|Collection jump_link
* @property Grid\Column|Collection is_recommend
* @property Grid\Column|Collection jump_type
* @property Grid\Column|Collection sort
* @property Grid\Column|Collection _lft
* @property Grid\Column|Collection _rgt
* @property Grid\Column|Collection category_id
* @property Grid\Column|Collection is_recommend
* @property Grid\Column|Collection author_name
* @property Grid\Column|Collection subtitle
* @property Grid\Column|Collection cover
* @property Grid\Column|Collection category_id
* @property Grid\Column|Collection content
* @property Grid\Column|Collection uuid
* @property Grid\Column|Collection cover
* @property Grid\Column|Collection subtitle
* @property Grid\Column|Collection connection
* @property Grid\Column|Collection queue
* @property Grid\Column|Collection payload
* @property Grid\Column|Collection exception
* @property Grid\Column|Collection failed_at
* @property Grid\Column|Collection tokenable_type
* @property Grid\Column|Collection tokenable_id
* @property Grid\Column|Collection token
* @property Grid\Column|Collection payload
* @property Grid\Column|Collection queue
* @property Grid\Column|Collection uuid
* @property Grid\Column|Collection abilities
* @property Grid\Column|Collection last_used_at
* @property Grid\Column|Collection token
* @property Grid\Column|Collection tokenable_id
* @property Grid\Column|Collection tokenable_type
* @property Grid\Column|Collection remarks
* @property Grid\Column|Collection attrs
* @property Grid\Column|Collection specs
* @property Grid\Column|Collection part_id
* @property Grid\Column|Collection sku_id
* @property Grid\Column|Collection spu_id
* @property Grid\Column|Collection images
* @property Grid\Column|Collection sell_price
* @property Grid\Column|Collection market_price
* @property Grid\Column|Collection cost_price
* @property Grid\Column|Collection vip_price
* @property Grid\Column|Collection media
* @property Grid\Column|Collection weight
* @property Grid\Column|Collection stock
* @property Grid\Column|Collection sales
* @property Grid\Column|Collection release_at
* @property Grid\Column|Collection feature_id
* @property Grid\Column|Collection product_spu_id
* @property Grid\Column|Collection items
* @property Grid\Column|Collection is_sell
* @property Grid\Column|Collection status
* @property Grid\Column|Collection buynote_id
* @property Grid\Column|Collection phone
* @property Grid\Column|Collection cost_price
* @property Grid\Column|Collection images
* @property Grid\Column|Collection market_price
* @property Grid\Column|Collection media
* @property Grid\Column|Collection release_at
* @property Grid\Column|Collection sales
* @property Grid\Column|Collection sell_price
* @property Grid\Column|Collection spu_id
* @property Grid\Column|Collection stock
* @property Grid\Column|Collection verify_state
* @property Grid\Column|Collection vip_price
* @property Grid\Column|Collection weight
* @property Grid\Column|Collection feature_id
* @property Grid\Column|Collection items
* @property Grid\Column|Collection product_spu_id
* @property Grid\Column|Collection code
* @property Grid\Column|Collection is_use
* @property Grid\Column|Collection expires_at
* @property Grid\Column|Collection is_use
* @property Grid\Column|Collection phone
* @property Grid\Column|Collection birthday
* @property Grid\Column|Collection gender
* @property Grid\Column|Collection inviter_id
* @property Grid\Column|Collection nickname
* @property Grid\Column|Collection gender
* @property Grid\Column|Collection birthday
* @property Grid\Column|Collection phone_verified_at
* @property Grid\Column|Collection email
* @property Grid\Column|Collection email_verified_at
* @property Grid\Column|Collection last_login_ip
* @property Grid\Column|Collection last_login_at
* @property Grid\Column|Collection last_login_ip
* @property Grid\Column|Collection phone_verified_at
* @property Grid\Column|Collection register_ip
* @property Grid\Column|Collection status
* @property Grid\Column|Collection status_remark
*
* @method Grid\Column|Collection id(string $label = null)
* @method Grid\Column|Collection key(string $label = null)
* @method Grid\Column|Collection name(string $label = null)
* @method Grid\Column|Collection created_at(string $label = null)
* @method Grid\Column|Collection dimensions(string $label = null)
* @method Grid\Column|Collection is_show(string $label = null)
* @method Grid\Column|Collection created_at(string $label = null)
* @method Grid\Column|Collection key(string $label = null)
* @method Grid\Column|Collection name(string $label = null)
* @method Grid\Column|Collection updated_at(string $label = null)
* @method Grid\Column|Collection detail(string $label = null)
* @method Grid\Column|Collection type(string $label = null)
* @method Grid\Column|Collection version(string $label = null)
* @method Grid\Column|Collection detail(string $label = null)
* @method Grid\Column|Collection is_enabled(string $label = null)
* @method Grid\Column|Collection parent_id(string $label = null)
* @method Grid\Column|Collection order(string $label = null)
* @method Grid\Column|Collection icon(string $label = null)
* @method Grid\Column|Collection uri(string $label = null)
* @method Grid\Column|Collection extension(string $label = null)
* @method Grid\Column|Collection permission_id(string $label = null)
* @method Grid\Column|Collection icon(string $label = null)
* @method Grid\Column|Collection order(string $label = null)
* @method Grid\Column|Collection parent_id(string $label = null)
* @method Grid\Column|Collection uri(string $label = null)
* @method Grid\Column|Collection menu_id(string $label = null)
* @method Grid\Column|Collection slug(string $label = null)
* @method Grid\Column|Collection permission_id(string $label = null)
* @method Grid\Column|Collection http_method(string $label = null)
* @method Grid\Column|Collection http_path(string $label = null)
* @method Grid\Column|Collection slug(string $label = null)
* @method Grid\Column|Collection role_id(string $label = null)
* @method Grid\Column|Collection user_id(string $label = null)
* @method Grid\Column|Collection value(string $label = null)
* @method Grid\Column|Collection username(string $label = null)
* @method Grid\Column|Collection password(string $label = null)
* @method Grid\Column|Collection avatar(string $label = null)
* @method Grid\Column|Collection password(string $label = null)
* @method Grid\Column|Collection remember_token(string $label = null)
* @method Grid\Column|Collection username(string $label = null)
* @method Grid\Column|Collection address_id(string $label = null)
* @method Grid\Column|Collection image(string $label = null)
* @method Grid\Column|Collection sort(string $label = null)
* @method Grid\Column|Collection jump_type(string $label = null)
* @method Grid\Column|Collection jump_link(string $label = null)
* @method Grid\Column|Collection is_recommend(string $label = null)
* @method Grid\Column|Collection jump_type(string $label = null)
* @method Grid\Column|Collection sort(string $label = null)
* @method Grid\Column|Collection _lft(string $label = null)
* @method Grid\Column|Collection _rgt(string $label = null)
* @method Grid\Column|Collection category_id(string $label = null)
* @method Grid\Column|Collection is_recommend(string $label = null)
* @method Grid\Column|Collection author_name(string $label = null)
* @method Grid\Column|Collection subtitle(string $label = null)
* @method Grid\Column|Collection cover(string $label = null)
* @method Grid\Column|Collection category_id(string $label = null)
* @method Grid\Column|Collection content(string $label = null)
* @method Grid\Column|Collection uuid(string $label = null)
* @method Grid\Column|Collection cover(string $label = null)
* @method Grid\Column|Collection subtitle(string $label = null)
* @method Grid\Column|Collection connection(string $label = null)
* @method Grid\Column|Collection queue(string $label = null)
* @method Grid\Column|Collection payload(string $label = null)
* @method Grid\Column|Collection exception(string $label = null)
* @method Grid\Column|Collection failed_at(string $label = null)
* @method Grid\Column|Collection tokenable_type(string $label = null)
* @method Grid\Column|Collection tokenable_id(string $label = null)
* @method Grid\Column|Collection token(string $label = null)
* @method Grid\Column|Collection payload(string $label = null)
* @method Grid\Column|Collection queue(string $label = null)
* @method Grid\Column|Collection uuid(string $label = null)
* @method Grid\Column|Collection abilities(string $label = null)
* @method Grid\Column|Collection last_used_at(string $label = null)
* @method Grid\Column|Collection token(string $label = null)
* @method Grid\Column|Collection tokenable_id(string $label = null)
* @method Grid\Column|Collection tokenable_type(string $label = null)
* @method Grid\Column|Collection remarks(string $label = null)
* @method Grid\Column|Collection attrs(string $label = null)
* @method Grid\Column|Collection specs(string $label = null)
* @method Grid\Column|Collection part_id(string $label = null)
* @method Grid\Column|Collection sku_id(string $label = null)
* @method Grid\Column|Collection spu_id(string $label = null)
* @method Grid\Column|Collection images(string $label = null)
* @method Grid\Column|Collection sell_price(string $label = null)
* @method Grid\Column|Collection market_price(string $label = null)
* @method Grid\Column|Collection cost_price(string $label = null)
* @method Grid\Column|Collection vip_price(string $label = null)
* @method Grid\Column|Collection media(string $label = null)
* @method Grid\Column|Collection weight(string $label = null)
* @method Grid\Column|Collection stock(string $label = null)
* @method Grid\Column|Collection sales(string $label = null)
* @method Grid\Column|Collection release_at(string $label = null)
* @method Grid\Column|Collection feature_id(string $label = null)
* @method Grid\Column|Collection product_spu_id(string $label = null)
* @method Grid\Column|Collection items(string $label = null)
* @method Grid\Column|Collection is_sell(string $label = null)
* @method Grid\Column|Collection status(string $label = null)
* @method Grid\Column|Collection buynote_id(string $label = null)
* @method Grid\Column|Collection phone(string $label = null)
* @method Grid\Column|Collection cost_price(string $label = null)
* @method Grid\Column|Collection images(string $label = null)
* @method Grid\Column|Collection market_price(string $label = null)
* @method Grid\Column|Collection media(string $label = null)
* @method Grid\Column|Collection release_at(string $label = null)
* @method Grid\Column|Collection sales(string $label = null)
* @method Grid\Column|Collection sell_price(string $label = null)
* @method Grid\Column|Collection spu_id(string $label = null)
* @method Grid\Column|Collection stock(string $label = null)
* @method Grid\Column|Collection verify_state(string $label = null)
* @method Grid\Column|Collection vip_price(string $label = null)
* @method Grid\Column|Collection weight(string $label = null)
* @method Grid\Column|Collection feature_id(string $label = null)
* @method Grid\Column|Collection items(string $label = null)
* @method Grid\Column|Collection product_spu_id(string $label = null)
* @method Grid\Column|Collection code(string $label = null)
* @method Grid\Column|Collection is_use(string $label = null)
* @method Grid\Column|Collection expires_at(string $label = null)
* @method Grid\Column|Collection is_use(string $label = null)
* @method Grid\Column|Collection phone(string $label = null)
* @method Grid\Column|Collection birthday(string $label = null)
* @method Grid\Column|Collection gender(string $label = null)
* @method Grid\Column|Collection inviter_id(string $label = null)
* @method Grid\Column|Collection nickname(string $label = null)
* @method Grid\Column|Collection gender(string $label = null)
* @method Grid\Column|Collection birthday(string $label = null)
* @method Grid\Column|Collection phone_verified_at(string $label = null)
* @method Grid\Column|Collection email(string $label = null)
* @method Grid\Column|Collection email_verified_at(string $label = null)
* @method Grid\Column|Collection last_login_ip(string $label = null)
* @method Grid\Column|Collection last_login_at(string $label = null)
* @method Grid\Column|Collection last_login_ip(string $label = null)
* @method Grid\Column|Collection phone_verified_at(string $label = null)
* @method Grid\Column|Collection register_ip(string $label = null)
* @method Grid\Column|Collection status(string $label = null)
* @method Grid\Column|Collection status_remark(string $label = null)
*/
class Grid {}
@ -197,183 +197,183 @@ namespace Dcat\Admin {
/**
* @property Show\Field|Collection id
* @property Show\Field|Collection key
* @property Show\Field|Collection name
* @property Show\Field|Collection created_at
* @property Show\Field|Collection dimensions
* @property Show\Field|Collection is_show
* @property Show\Field|Collection created_at
* @property Show\Field|Collection key
* @property Show\Field|Collection name
* @property Show\Field|Collection updated_at
* @property Show\Field|Collection detail
* @property Show\Field|Collection type
* @property Show\Field|Collection version
* @property Show\Field|Collection detail
* @property Show\Field|Collection is_enabled
* @property Show\Field|Collection parent_id
* @property Show\Field|Collection order
* @property Show\Field|Collection icon
* @property Show\Field|Collection uri
* @property Show\Field|Collection extension
* @property Show\Field|Collection permission_id
* @property Show\Field|Collection icon
* @property Show\Field|Collection order
* @property Show\Field|Collection parent_id
* @property Show\Field|Collection uri
* @property Show\Field|Collection menu_id
* @property Show\Field|Collection slug
* @property Show\Field|Collection permission_id
* @property Show\Field|Collection http_method
* @property Show\Field|Collection http_path
* @property Show\Field|Collection slug
* @property Show\Field|Collection role_id
* @property Show\Field|Collection user_id
* @property Show\Field|Collection value
* @property Show\Field|Collection username
* @property Show\Field|Collection password
* @property Show\Field|Collection avatar
* @property Show\Field|Collection password
* @property Show\Field|Collection remember_token
* @property Show\Field|Collection username
* @property Show\Field|Collection address_id
* @property Show\Field|Collection image
* @property Show\Field|Collection sort
* @property Show\Field|Collection jump_type
* @property Show\Field|Collection jump_link
* @property Show\Field|Collection is_recommend
* @property Show\Field|Collection jump_type
* @property Show\Field|Collection sort
* @property Show\Field|Collection _lft
* @property Show\Field|Collection _rgt
* @property Show\Field|Collection category_id
* @property Show\Field|Collection is_recommend
* @property Show\Field|Collection author_name
* @property Show\Field|Collection subtitle
* @property Show\Field|Collection cover
* @property Show\Field|Collection category_id
* @property Show\Field|Collection content
* @property Show\Field|Collection uuid
* @property Show\Field|Collection cover
* @property Show\Field|Collection subtitle
* @property Show\Field|Collection connection
* @property Show\Field|Collection queue
* @property Show\Field|Collection payload
* @property Show\Field|Collection exception
* @property Show\Field|Collection failed_at
* @property Show\Field|Collection tokenable_type
* @property Show\Field|Collection tokenable_id
* @property Show\Field|Collection token
* @property Show\Field|Collection payload
* @property Show\Field|Collection queue
* @property Show\Field|Collection uuid
* @property Show\Field|Collection abilities
* @property Show\Field|Collection last_used_at
* @property Show\Field|Collection token
* @property Show\Field|Collection tokenable_id
* @property Show\Field|Collection tokenable_type
* @property Show\Field|Collection remarks
* @property Show\Field|Collection attrs
* @property Show\Field|Collection specs
* @property Show\Field|Collection part_id
* @property Show\Field|Collection sku_id
* @property Show\Field|Collection spu_id
* @property Show\Field|Collection images
* @property Show\Field|Collection sell_price
* @property Show\Field|Collection market_price
* @property Show\Field|Collection cost_price
* @property Show\Field|Collection vip_price
* @property Show\Field|Collection media
* @property Show\Field|Collection weight
* @property Show\Field|Collection stock
* @property Show\Field|Collection sales
* @property Show\Field|Collection release_at
* @property Show\Field|Collection feature_id
* @property Show\Field|Collection product_spu_id
* @property Show\Field|Collection items
* @property Show\Field|Collection is_sell
* @property Show\Field|Collection status
* @property Show\Field|Collection buynote_id
* @property Show\Field|Collection phone
* @property Show\Field|Collection cost_price
* @property Show\Field|Collection images
* @property Show\Field|Collection market_price
* @property Show\Field|Collection media
* @property Show\Field|Collection release_at
* @property Show\Field|Collection sales
* @property Show\Field|Collection sell_price
* @property Show\Field|Collection spu_id
* @property Show\Field|Collection stock
* @property Show\Field|Collection verify_state
* @property Show\Field|Collection vip_price
* @property Show\Field|Collection weight
* @property Show\Field|Collection feature_id
* @property Show\Field|Collection items
* @property Show\Field|Collection product_spu_id
* @property Show\Field|Collection code
* @property Show\Field|Collection is_use
* @property Show\Field|Collection expires_at
* @property Show\Field|Collection is_use
* @property Show\Field|Collection phone
* @property Show\Field|Collection birthday
* @property Show\Field|Collection gender
* @property Show\Field|Collection inviter_id
* @property Show\Field|Collection nickname
* @property Show\Field|Collection gender
* @property Show\Field|Collection birthday
* @property Show\Field|Collection phone_verified_at
* @property Show\Field|Collection email
* @property Show\Field|Collection email_verified_at
* @property Show\Field|Collection last_login_ip
* @property Show\Field|Collection last_login_at
* @property Show\Field|Collection last_login_ip
* @property Show\Field|Collection phone_verified_at
* @property Show\Field|Collection register_ip
* @property Show\Field|Collection status
* @property Show\Field|Collection status_remark
*
* @method Show\Field|Collection id(string $label = null)
* @method Show\Field|Collection key(string $label = null)
* @method Show\Field|Collection name(string $label = null)
* @method Show\Field|Collection created_at(string $label = null)
* @method Show\Field|Collection dimensions(string $label = null)
* @method Show\Field|Collection is_show(string $label = null)
* @method Show\Field|Collection created_at(string $label = null)
* @method Show\Field|Collection key(string $label = null)
* @method Show\Field|Collection name(string $label = null)
* @method Show\Field|Collection updated_at(string $label = null)
* @method Show\Field|Collection detail(string $label = null)
* @method Show\Field|Collection type(string $label = null)
* @method Show\Field|Collection version(string $label = null)
* @method Show\Field|Collection detail(string $label = null)
* @method Show\Field|Collection is_enabled(string $label = null)
* @method Show\Field|Collection parent_id(string $label = null)
* @method Show\Field|Collection order(string $label = null)
* @method Show\Field|Collection icon(string $label = null)
* @method Show\Field|Collection uri(string $label = null)
* @method Show\Field|Collection extension(string $label = null)
* @method Show\Field|Collection permission_id(string $label = null)
* @method Show\Field|Collection icon(string $label = null)
* @method Show\Field|Collection order(string $label = null)
* @method Show\Field|Collection parent_id(string $label = null)
* @method Show\Field|Collection uri(string $label = null)
* @method Show\Field|Collection menu_id(string $label = null)
* @method Show\Field|Collection slug(string $label = null)
* @method Show\Field|Collection permission_id(string $label = null)
* @method Show\Field|Collection http_method(string $label = null)
* @method Show\Field|Collection http_path(string $label = null)
* @method Show\Field|Collection slug(string $label = null)
* @method Show\Field|Collection role_id(string $label = null)
* @method Show\Field|Collection user_id(string $label = null)
* @method Show\Field|Collection value(string $label = null)
* @method Show\Field|Collection username(string $label = null)
* @method Show\Field|Collection password(string $label = null)
* @method Show\Field|Collection avatar(string $label = null)
* @method Show\Field|Collection password(string $label = null)
* @method Show\Field|Collection remember_token(string $label = null)
* @method Show\Field|Collection username(string $label = null)
* @method Show\Field|Collection address_id(string $label = null)
* @method Show\Field|Collection image(string $label = null)
* @method Show\Field|Collection sort(string $label = null)
* @method Show\Field|Collection jump_type(string $label = null)
* @method Show\Field|Collection jump_link(string $label = null)
* @method Show\Field|Collection is_recommend(string $label = null)
* @method Show\Field|Collection jump_type(string $label = null)
* @method Show\Field|Collection sort(string $label = null)
* @method Show\Field|Collection _lft(string $label = null)
* @method Show\Field|Collection _rgt(string $label = null)
* @method Show\Field|Collection category_id(string $label = null)
* @method Show\Field|Collection is_recommend(string $label = null)
* @method Show\Field|Collection author_name(string $label = null)
* @method Show\Field|Collection subtitle(string $label = null)
* @method Show\Field|Collection cover(string $label = null)
* @method Show\Field|Collection category_id(string $label = null)
* @method Show\Field|Collection content(string $label = null)
* @method Show\Field|Collection uuid(string $label = null)
* @method Show\Field|Collection cover(string $label = null)
* @method Show\Field|Collection subtitle(string $label = null)
* @method Show\Field|Collection connection(string $label = null)
* @method Show\Field|Collection queue(string $label = null)
* @method Show\Field|Collection payload(string $label = null)
* @method Show\Field|Collection exception(string $label = null)
* @method Show\Field|Collection failed_at(string $label = null)
* @method Show\Field|Collection tokenable_type(string $label = null)
* @method Show\Field|Collection tokenable_id(string $label = null)
* @method Show\Field|Collection token(string $label = null)
* @method Show\Field|Collection payload(string $label = null)
* @method Show\Field|Collection queue(string $label = null)
* @method Show\Field|Collection uuid(string $label = null)
* @method Show\Field|Collection abilities(string $label = null)
* @method Show\Field|Collection last_used_at(string $label = null)
* @method Show\Field|Collection token(string $label = null)
* @method Show\Field|Collection tokenable_id(string $label = null)
* @method Show\Field|Collection tokenable_type(string $label = null)
* @method Show\Field|Collection remarks(string $label = null)
* @method Show\Field|Collection attrs(string $label = null)
* @method Show\Field|Collection specs(string $label = null)
* @method Show\Field|Collection part_id(string $label = null)
* @method Show\Field|Collection sku_id(string $label = null)
* @method Show\Field|Collection spu_id(string $label = null)
* @method Show\Field|Collection images(string $label = null)
* @method Show\Field|Collection sell_price(string $label = null)
* @method Show\Field|Collection market_price(string $label = null)
* @method Show\Field|Collection cost_price(string $label = null)
* @method Show\Field|Collection vip_price(string $label = null)
* @method Show\Field|Collection media(string $label = null)
* @method Show\Field|Collection weight(string $label = null)
* @method Show\Field|Collection stock(string $label = null)
* @method Show\Field|Collection sales(string $label = null)
* @method Show\Field|Collection release_at(string $label = null)
* @method Show\Field|Collection feature_id(string $label = null)
* @method Show\Field|Collection product_spu_id(string $label = null)
* @method Show\Field|Collection items(string $label = null)
* @method Show\Field|Collection is_sell(string $label = null)
* @method Show\Field|Collection status(string $label = null)
* @method Show\Field|Collection buynote_id(string $label = null)
* @method Show\Field|Collection phone(string $label = null)
* @method Show\Field|Collection cost_price(string $label = null)
* @method Show\Field|Collection images(string $label = null)
* @method Show\Field|Collection market_price(string $label = null)
* @method Show\Field|Collection media(string $label = null)
* @method Show\Field|Collection release_at(string $label = null)
* @method Show\Field|Collection sales(string $label = null)
* @method Show\Field|Collection sell_price(string $label = null)
* @method Show\Field|Collection spu_id(string $label = null)
* @method Show\Field|Collection stock(string $label = null)
* @method Show\Field|Collection verify_state(string $label = null)
* @method Show\Field|Collection vip_price(string $label = null)
* @method Show\Field|Collection weight(string $label = null)
* @method Show\Field|Collection feature_id(string $label = null)
* @method Show\Field|Collection items(string $label = null)
* @method Show\Field|Collection product_spu_id(string $label = null)
* @method Show\Field|Collection code(string $label = null)
* @method Show\Field|Collection is_use(string $label = null)
* @method Show\Field|Collection expires_at(string $label = null)
* @method Show\Field|Collection is_use(string $label = null)
* @method Show\Field|Collection phone(string $label = null)
* @method Show\Field|Collection birthday(string $label = null)
* @method Show\Field|Collection gender(string $label = null)
* @method Show\Field|Collection inviter_id(string $label = null)
* @method Show\Field|Collection nickname(string $label = null)
* @method Show\Field|Collection gender(string $label = null)
* @method Show\Field|Collection birthday(string $label = null)
* @method Show\Field|Collection phone_verified_at(string $label = null)
* @method Show\Field|Collection email(string $label = null)
* @method Show\Field|Collection email_verified_at(string $label = null)
* @method Show\Field|Collection last_login_ip(string $label = null)
* @method Show\Field|Collection last_login_at(string $label = null)
* @method Show\Field|Collection last_login_ip(string $label = null)
* @method Show\Field|Collection phone_verified_at(string $label = null)
* @method Show\Field|Collection register_ip(string $label = null)
* @method Show\Field|Collection status(string $label = null)
* @method Show\Field|Collection status_remark(string $label = null)
*/
class Show {}

View File

@ -0,0 +1,19 @@
<?php
return [
'labels' => [
'ProductSkuVerify' => '商品审核',
'product-sku-verifies' => '商品审核',
],
'fields' => [
'sku'=>[
'name'=>'商品名称',
],
'sku_id' => '子商品',
'type' => '审核类别',
'status' => '状态',
'remarks' => '备注',
],
'options' => [
],
];

View File

@ -1,28 +1,39 @@
<?php
<?php
return [
'labels' => [
'ProductSku' => 'ProductSku',
'product-sku' => 'ProductSku',
'ProductSku' => '子商品列表',
'product-skus' => '子商品列表',
],
'fields' => [
'spu'=>[
'name'=>'主商品名称',
],
'category'=>[
'name'=>'商品分类',
],
'spu_id' => '主商品ID',
'name' => '商品名称',
'subtitle' => '商品副标题',
'category_id' => '商品分类',
'cover' => '封面图',
'images' => '商品图片',
'features' => '商品特点',
'description' => '商品详情',
'sell_price' => '销售价格:分',
'market_price' => '市场价格:分',
'cost_price' => '成本价格:分',
'vip_price' => '会员价格:分',
'buynote_id'=>'购买须知模板',
'sell_price' => '销售价格',
'market_price' => '市场价格',
'cost_price' => '成本价格',
'vip_price' => '会员价格',
'media' => '媒体地址',
'weight' => '重量:g',
'attrs' => '属性文本',
'specs' => '规格属性',
'stock' => '库存',
'sales' => '销量',
'verify_state'=>'状态',
'release_at' => '上架时间',
'attr_group'=>'商品分组',
],
'options' => [
],

View File

@ -23,9 +23,12 @@ return [
'media' => '媒体地址',
'weight' => '重量:g',
'stock' => '库存',
'sales'=>'销量',
'attrs' => '属性文本',
'specs' => '规格属性',
'attr_group'=>'商品分组',
'verify_state'=>'状态',
'release_at'=>'上架时间',
],
'options' => [
],