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'); } }