6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/Store/StockController.php

197 lines
8.0 KiB
PHP

<?php
namespace App\Admin\Controllers\Store;
use App\Models\Admin\Administrator;
use App\Models\Store\{Store, StockLog, ProductSku};
use App\Models\{User, ProductCategory};
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.category', '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('productSku.category.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('cost_price', '总成本价')->display(function () {
$amount = abs($this->amount);
$prcie = data_get($this->productSku, 'cost_price', 0);
return round($prcie * $amount / 100, 2, PHP_ROUND_HALF_DOWN);
});
$grid->column('sell_price', '总销售价')->display(function () {
$amount = abs($this->amount);
$prcie = data_get($this->productSku, 'sell_price', 0);
return round($prcie * $amount / 100, 2, PHP_ROUND_HALF_DOWN);
});
$grid->column('operator_name', '操作人');
$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->where('category_id', function ($q) {
$id = $this->input;
$q->whereHas('productSku', fn($q1) => $q1->filter(['category' => $id], \App\Endpoint\Api\Filters\ProductSkuFilter::class));
}, '分类')->select(ProductCategory::selectOptions())->width(3);
$filter->equal('tag_id', '类目')->select(StockLog::tags()->pluck('name', 'id'))->width(3);
$filter->like('operator_name', '操作人')->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(6);
});
$grid->footer(function ($collection) use ($grid) {
$query = StockLog::query();
$grid->model()->getQueries()->unique()->each(function ($value) use (&$query) {
if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) {
return;
}
$query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []);
});
$list = $query->get();
$sell = $list->sum(function ($item) {
$amount = abs($item->amount);
$prcie = data_get($item->productSku, 'sell_price', 0);
return round($prcie * $amount / 100, 2, PHP_ROUND_HALF_DOWN);
});
$cost = $list->sum(function ($item) {
$amount = abs($item->amount);
$prcie = data_get($item->productSku, 'cost_price', 0);
return round($prcie * $amount / 100, 2, PHP_ROUND_HALF_DOWN);
});
$amount = $list->sum(function ($item) {
return abs($item->amount);
});
$count = $list->count();
return <<<HTML
<table class="table table-bordered">
<tbody>
<tr>
<td>统计</td>
<td>记录数: $count</td>
<td>数量: $amount</td>
<td>总成本价: $cost</td>
<td>总销售价: $sell</td>
<tr>
</tbody>
</table>
HTML;
});
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('operator_name');
$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_name', $administrator->name);
$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_name', '操作人');
$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');
}
}