166 lines
6.5 KiB
PHP
166 lines
6.5 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers\Store;
|
|
|
|
use App\Models\Admin\Administrator;
|
|
use App\Models\Store\{Store, StockLog, ProductSku};
|
|
use App\Models\User;
|
|
use Carbon\Carbon;
|
|
use Dcat\Admin\{Form, Grid, Admin, Show};
|
|
use Dcat\Admin\Http\Controllers\AdminController;
|
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
|
|
|
class StockController extends AdminController
|
|
{
|
|
protected $translation = 'store-stock';
|
|
protected function grid()
|
|
{
|
|
$grid = new Grid(StockLog::with(['store', 'productSku', 'tag']));
|
|
|
|
$user = Admin::user();
|
|
$canAdmin = $this->canAdmin();
|
|
if (!$canAdmin) {
|
|
$stores = $user->stores->pluck('id');
|
|
$grid->model()->whereIn('store_id', $stores);
|
|
}
|
|
|
|
$grid->model()->orderBy('created_at', 'desc');
|
|
|
|
$grid->column('store.title', '门店');
|
|
$grid->column('productSku.name', '商品');
|
|
$grid->column('tag.name', '类目');
|
|
$grid->column('amount')->display(function ($value) {
|
|
return '<span class="text-'.($value > 0 ? 'success' : 'danger') .'">'.$value.'</span>';
|
|
});
|
|
$grid->column('balance');
|
|
$grid->column('operator', '操作人')->display(function ($v) {
|
|
if ($v instanceof Administrator) {
|
|
return $v->name . '<span class="label bg-primary">管理员</span>';
|
|
} else if ($v instanceof User) {
|
|
return $v->phone . '<span class="label bg-info">员工</span>';
|
|
}
|
|
|
|
return '未知身份';
|
|
});
|
|
$grid->column('remarks', '备注');
|
|
$grid->column('created_at', '操作时间');
|
|
|
|
$grid->showCreateButton($user->can('dcat.admin.store.stock.create'));
|
|
$grid->enableDialogCreate();
|
|
|
|
$grid->showViewButton($user->can('dcat.admin.store.stock.show'));
|
|
|
|
$grid->filter(function (Grid\Filter $filter) {
|
|
$filter->panel();
|
|
$filter->equal('store_id')->select(Store::pluck('title', 'id'))->width(3);
|
|
$filter->like('productSku.name', '商品')->width(3);
|
|
$filter->equal('tag_id', '类目')->select(StockLog::tags()->pluck('name', 'id'))->width(3);
|
|
$filter->where('operator', function ($q) {
|
|
$input = $this->input;
|
|
$condition = '%'.$input.'%';
|
|
$q->whereHasMorph('operator', [Administrator::class, User::class], function ($q1, $type) use ($condition) {
|
|
$column = $type === Administrator::class ? 'name' : 'phone';
|
|
|
|
$q1->where($column, 'like', $condition);
|
|
});
|
|
})->placeholder('管理员姓名/员工手机号')->width(3);
|
|
$filter->whereBetween('created_at', function ($q) {
|
|
$start = data_get($this->input, 'start');
|
|
$start = $start ? Carbon::createFromFormat('Y-m-d', $start) : null;
|
|
$end = data_get($this->input, 'end');
|
|
$end = $end ? Carbon::createFromFormat('Y-m-d', $end) : null;
|
|
if ($start) {
|
|
if ($end) {
|
|
$q->whereBetween('created_at', [$start, $end]);
|
|
}
|
|
$q->where('created_at', '>=', $start);
|
|
} elseif ($end) {
|
|
$q->where('created_at', '<=', $end);
|
|
}
|
|
}, '操作时间')->date()->width(3);
|
|
});
|
|
return $grid;
|
|
}
|
|
|
|
protected function form()
|
|
{
|
|
$form = Form::make(new StockLog());
|
|
$form->select('tag_id')->options(StockLog::tags()->pluck('name', 'id'))->required();
|
|
$form->select('store_id')->options(Store::pluck('title', 'id'))->required()->load('product_sku_id', 'api/product-by-store');
|
|
$form->select('product_sku_id')->required();
|
|
$form->number('amount')->help('正数为增加, 负数为减少')->default(0)->required();
|
|
$form->text('remarks');
|
|
$form->hidden('operator_type');
|
|
$form->hidden('operator_id');
|
|
$form->hidden('balance');
|
|
|
|
$form->saving(function (Form $form) {
|
|
if ($form->isCreating()) {
|
|
$store_id = $form->input('store_id');
|
|
$product_sku_id = $form->input('product_sku_id');
|
|
$amount = $form->input('amount');
|
|
if ($amount == 0) {
|
|
return $form->response()->error('数量不能为0');
|
|
}
|
|
$product = ProductSku::where(compact('store_id', 'product_sku_id'))->first();
|
|
if (!$product) {
|
|
return $form->response()->error('门店不存在该商品');
|
|
}
|
|
|
|
// 修改库存
|
|
$balance = $product->amount + $amount;
|
|
if ($balance < 0) {
|
|
return $form->response()->error('商品库存不能小于0');
|
|
}
|
|
$form->input('balance', $balance);
|
|
$product->update([
|
|
'amount' => $balance
|
|
]);
|
|
|
|
// 操作人
|
|
$administrator = Admin::user();
|
|
$form->input('operator_type', $administrator->getMorphClass());
|
|
$form->input('operator_id', $administrator->id);
|
|
}
|
|
});
|
|
return $form;
|
|
}
|
|
|
|
protected function detail($id)
|
|
{
|
|
$show = Show::make($id, StockLog::with(['store', 'productSku', 'tag']));
|
|
$show->field('store.title', '门店');
|
|
$show->field('product_sku.name', '商品');
|
|
$show->field('product_sku.specs', '商品规格')->label();
|
|
$show->field('tag.name', '类目');
|
|
$show->field('amount')->as(function ($value) {
|
|
return '<span class="text-'.($value > 0 ? 'success' : 'danger') .'">'.$value.'</span>';
|
|
})->escape(false);
|
|
$show->field('balance');
|
|
$show->field('operator', '操作人')->as(function () {
|
|
$v = $this->operator;
|
|
if ($v instanceof \App\Models\Admin\Administrator) {
|
|
return $v->name . '<span class="label bg-primary">管理员</span>';
|
|
} else if ($v instanceof \App\Models\User) {
|
|
return $v->phone . '<span class="label bg-info">员工</span>';
|
|
}
|
|
|
|
return '未知身份';
|
|
})->escape(false);
|
|
$show->field('remarks', '备注');
|
|
$show->field('created_at', '操作时间');
|
|
|
|
$show->panel()->tools(function ($tools) {
|
|
$tools->disableEdit();
|
|
$tools->disableDelete();
|
|
});
|
|
|
|
return $show;
|
|
}
|
|
|
|
protected function canAdmin()
|
|
{
|
|
return Admin::user()->isRole('administrator');
|
|
}
|
|
}
|