From a8deaf4b4d6bfcb996b9e7ff72ad8c739c24dcab Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Mon, 27 Feb 2023 13:09:40 +0800 Subject: [PATCH] stock --- .../Controllers/Store/ProductController.php | 4 --- .../Store/StockBatchController.php | 31 ++++++++++++---- .../Controllers/Store/StockController.php | 22 ++---------- .../Api/Http/Resources/OrderResource.php | 4 +++ app/Listeners/OrderAutoComplete.php | 11 ++++-- app/Listeners/OrderPrint.php | 4 +-- app/Models/Store/StockLog.php | 2 +- app/Services/OrderService.php | 11 +++--- ...123916_add_operator_name_to_stock_logs.php | 35 +++++++++++++++++++ 9 files changed, 83 insertions(+), 41 deletions(-) create mode 100644 database/migrations/2023_02_27_123916_add_operator_name_to_stock_logs.php diff --git a/app/Admin/Controllers/Store/ProductController.php b/app/Admin/Controllers/Store/ProductController.php index 4d5be926..3eccdf38 100644 --- a/app/Admin/Controllers/Store/ProductController.php +++ b/app/Admin/Controllers/Store/ProductController.php @@ -102,8 +102,6 @@ class ProductController extends AdminController $query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []); }); $count = $query->count(); - $sell_price = round($query->sum('product_skus.sell_price') / 100, 2, PHP_ROUND_HALF_DOWN); - $cost_price = round($query->sum('product_skus.cost_price') / 100, 2, PHP_ROUND_HALF_DOWN); $stock = round($query->sum('store_product_skus.amount'), 2, PHP_ROUND_HALF_DOWN); $cost = round($query->sum(DB::raw('product_skus.cost_price * amount')) / 100, 2, PHP_ROUND_HALF_DOWN); $sell = round($query->sum(DB::raw('product_skus.sell_price * amount')) / 100, 2, PHP_ROUND_HALF_DOWN); @@ -113,8 +111,6 @@ class ProductController extends AdminController 统计 总数: $count - 销售价: $sell_price - 成本价: $cost_price 库存: $stock 总销售: $sell 总成本: $cost diff --git a/app/Admin/Controllers/Store/StockBatchController.php b/app/Admin/Controllers/Store/StockBatchController.php index 23b7341f..ce5bdae5 100644 --- a/app/Admin/Controllers/Store/StockBatchController.php +++ b/app/Admin/Controllers/Store/StockBatchController.php @@ -7,6 +7,7 @@ use Dcat\Admin\{Form, Grid, Admin, Show}; use App\Models\Store\{Store, StockBatch, StockLog}; use App\Models\{ProductSku}; use Dcat\Admin\Widgets\Table; +use Carbon\Carbon; use App\Models\Admin\Administrator; class StockBatchController extends AdminController @@ -25,13 +26,16 @@ class StockBatchController extends AdminController $grid->column('status')->using([0 => '未确认', 1 => '已确认'])->label([0 => 'danger', 1 => 'success']); $grid->column('product_sku_id')->display(fn() => '共'.$this->productSkus->count().'件')->modal(function ($modal) { $modal->title('商品记录'); - $data = $this->productSkus->map(fn($item) => [ - $item->name, - round($item->sell_price / 100, 2, PHP_ROUND_HALF_DOWN), - round($item->cost_price / 100, 2, PHP_ROUND_HALF_DOWN), - $item->pivot?->amount - ])->all(); - return Table::make(['名称', '售价', '成本价', '数量'], $data); + $data = $this->productSkus->map(function($item) { + $sell_price = round($item->sell_price / 100, 2, PHP_ROUND_HALF_DOWN); + $cost_price = round($item->cost_price / 100, 2, PHP_ROUND_HALF_DOWN); + $amount = data_get($item->pivot, 'amount', 0); + $profit_price = round($sell_price - $cost_price, 2, PHP_ROUND_HALF_DOWN); + $sell = abs(round($sell_price * $amount, 2, PHP_ROUND_HALF_DOWN)); + $cost = abs(round($cost_price * $amount, 2, PHP_ROUND_HALF_DOWN)); + return [$item->name, $sell_price, $cost_price, $profit_price, $amount, $sell, $cost]; + })->all(); + return Table::make(['名称', '售价', '成本价', '毛利', '数量', '总销售', '总成本'], $data); }); $grid->column('sell_price', '总销售价')->display(fn () => round($this->productSkus->sum(fn ($item) => abs(data_get($item->pivot, 'amount', 0)) * $item->sell_price) / 100, 2, PHP_ROUND_HALF_DOWN)); $grid->column('cost_price', '总成本价')->display(fn () => round($this->productSkus->sum(fn ($item) => abs(data_get($item->pivot, 'amount', 0)) * $item->cost_price) / 100, 2, PHP_ROUND_HALF_DOWN)); @@ -40,10 +44,23 @@ class StockBatchController extends AdminController $grid->filter(function (Grid\Filter $filter) { $filter->panel(); + $filter->like('sn')->width(3); $filter->equal('store_id')->select('api/store')->width(3); $filter->equal('tag_id', '类目')->select(StockLog::tags()->pluck('name', 'id'))->width(3); $filter->equal('admin_user_id')->select()->model(Administrator::class)->ajax('api/administrators?_paginate=1')->width(3); $filter->equal('status')->select([0 => '未确认', 1 => '已确认'])->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) { + $q->where('created_at', '>=', $start); + } + if ($end) { + $q->where('created_at', '<=', $end); + } + })->date()->width(6); }); $user = Admin::user(); diff --git a/app/Admin/Controllers/Store/StockController.php b/app/Admin/Controllers/Store/StockController.php index bcf5c182..2b7cd69e 100644 --- a/app/Admin/Controllers/Store/StockController.php +++ b/app/Admin/Controllers/Store/StockController.php @@ -33,15 +33,7 @@ class StockController extends AdminController 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('operator_name', '操作人'); $grid->column('remarks', '备注'); $grid->column('created_at', '操作时间'); @@ -55,15 +47,7 @@ class StockController extends AdminController $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->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; @@ -77,7 +61,7 @@ class StockController extends AdminController } elseif ($end) { $q->where('created_at', '<=', $end); } - }, '操作时间')->date()->width(3); + }, '操作时间')->date()->width(6); }); return $grid; } diff --git a/app/Endpoint/Api/Http/Resources/OrderResource.php b/app/Endpoint/Api/Http/Resources/OrderResource.php index 42da778e..4694fb95 100644 --- a/app/Endpoint/Api/Http/Resources/OrderResource.php +++ b/app/Endpoint/Api/Http/Resources/OrderResource.php @@ -44,6 +44,10 @@ class OrderResource extends JsonResource 'expires_at' => $this->expires_at, 'packages' => OrderPackageResource::make($this->whenLoaded('lastPackage')), + + 'source_type' => $this->source_type, + 'source_id' => $this->source_id, + 'store_id' => $this->store_id, ]; } } diff --git a/app/Listeners/OrderAutoComplete.php b/app/Listeners/OrderAutoComplete.php index 14edd27b..df7d755a 100644 --- a/app/Listeners/OrderAutoComplete.php +++ b/app/Listeners/OrderAutoComplete.php @@ -5,7 +5,7 @@ namespace App\Listeners; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use App\Models\Store\{Desk, ProductSku}; -use App\Models\Order; +use App\Models\{Tag, Order}; /** * 自动完成订单 @@ -27,16 +27,21 @@ class OrderAutoComplete foreach($package->orderProducts as $item) { $sku = ProductSku::where('store_id', $store->id)->where('product_sku_id', $item->sku_id)->first(); if ($sku) { + $tag = Tag::firstOrCreate([ + 'type' => Tag::TYPE_STORE_STOCK, + 'name' => '提货' + ]); $amount = $item->pivot->quantity; $balance = $sku->amount - $amount; $store->stockLogs()->create([ 'amount' => 0 - $amount, 'product_sku_id' => $item->sku_id, - 'remarks' => '桌号订自动提货', + 'remarks' => '桌号订单自动提货', 'balance' => $balance, 'source_id' => $order->id, 'source_type' => $order->getMorphClass(), - 'tag_id' => 3 + 'tag_id' => $tag->id, + 'operator_name' => '积趣吧台', ]); $sku->update(['amount' => $balance]); diff --git a/app/Listeners/OrderPrint.php b/app/Listeners/OrderPrint.php index 2286371d..986bcdfb 100644 --- a/app/Listeners/OrderPrint.php +++ b/app/Listeners/OrderPrint.php @@ -16,8 +16,8 @@ class OrderPrint public function handle($event) { $order = $event->order; - // 门店订单, 桌号信息 - if ($order->store_id && $order->source_type == Desk::class) { + // 门店订单 + if ($order->store_id) { try { (new OrderService())->print($order); } catch (BizException $e) { diff --git a/app/Models/Store/StockLog.php b/app/Models/Store/StockLog.php index f51f0fab..51149609 100644 --- a/app/Models/Store/StockLog.php +++ b/app/Models/Store/StockLog.php @@ -13,7 +13,7 @@ class StockLog extends Model protected $table = 'store_stock_logs'; - protected $fillable = ['operator_type', 'operator_id', 'amount', 'product_sku_id', 'remarks', 'balance', 'source_id', 'source_type', 'store_id', 'tag_id']; + protected $fillable = ['operator_type', 'operator_id', 'operator_name', 'amount', 'product_sku_id', 'remarks', 'balance', 'source_id', 'source_type', 'store_id', 'tag_id']; public static function tags() { diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 7ae2528f..e2224f6e 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -1368,16 +1368,17 @@ class OrderService */ public function print(Order $order) { - if (!$order->store_id || $order->source_type !== Desk::class) { + if (!$order->store_id) { throw new BizException('不是门店订单'); } $store = $order->store; if (!$store) { throw new BizException('未找到门店'); } - $desk = $order->source; - if (!$desk) { - throw new BizException('未找到桌号'); + $desk = ''; + if ($order->source_type === Desk::class) { + $desk = $order->source; + $desk = data_get($order->source, 'name', ''); } $devices = $store->devices()->where('status', 1)->get(); @@ -1403,7 +1404,7 @@ class OrderService 'name' => $store->title, 'sn' => $order->sn, 'time' => $order->created_at->format('Y-m-d H:i:s'), - 'desk' => $desk->name, + 'desk' => $desk, 'products' => $products, 'total' => round($order->total_amount / 100, 2, PHP_ROUND_HALF_DOWN), 'remarks' => $order->note ?: '', diff --git a/database/migrations/2023_02_27_123916_add_operator_name_to_stock_logs.php b/database/migrations/2023_02_27_123916_add_operator_name_to_stock_logs.php new file mode 100644 index 00000000..0147b06e --- /dev/null +++ b/database/migrations/2023_02_27_123916_add_operator_name_to_stock_logs.php @@ -0,0 +1,35 @@ +string('operator_name'); + }); + DB::update("update `store_stock_logs` set `operator_name` = (select `name` from `admin_users` where `store_stock_logs`.`operator_id` = `admin_users`.`id`) where `store_stock_logs`.`operator_type` in ('App\Models\Admin\Administrator', 'admin_users');"); + DB::update("update `store_stock_logs` set `operator_name` = (select `phone` from `users` where `store_stock_logs`.`operator_id` = `users`.`id`) where `store_stock_logs`.`operator_type` in ('App\Models\User');"); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('store_stock_logs', function (Blueprint $table) { + $table->dropColumn(['operator_name']); + }); + } +}