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 ''.$value.'';
});
$grid->column('balance');
$grid->column('operator', '操作人')->display(function ($v) {
if ($v instanceof Administrator) {
return $v->name . '管理员';
} else if ($v instanceof User) {
return $v->phone . '员工';
}
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 ''.$value.'';
})->escape(false);
$show->field('balance');
$show->field('operator', '操作人')->as(function () {
$v = $this->operator;
if ($v instanceof \App\Models\Admin\Administrator) {
return $v->name . '管理员';
} else if ($v instanceof \App\Models\User) {
return $v->phone . '员工';
}
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');
}
}