From a96cc3b51843db7bfa3154aac8f59f255e985002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B8=96=E7=95=8C?= <642747453@qq.com> Date: Fri, 19 Jan 2024 17:04:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=80=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Goods/GoodsSkusController.php | 94 +++++++++++++------ app/Models/BusinessOrderItem.php | 5 + 2 files changed, 68 insertions(+), 31 deletions(-) diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index c34032f..09bfc87 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -41,46 +41,78 @@ class GoodsSkusController extends Controller public function index(Request $request) { - $builder = GoodsSku::query(); - $this->preparQueryGoodsSkus($request, $builder); - $day = DateTimeUtils::getToday(); - $goodsSkus = $builder->filter() - ->with(['goods' => function ($query) { - $query->with(['type:id,name', 'brand:id,name']); - }]) - ->with(['daily' => function ($query) use ($day) { - $query->where('day', $day); - }]) - ->where('is_combination', 0) - ->orderBy('stock', 'desc') - ->paginate($request->get('per_page')); $fields = implode(',', [ 'shop_id', 'external_sku_id', - 'sum(goods_number) as number', - 'sum(already_cancel_number) as cancel_number', + 'SUM(goods_number) - SUM(already_cancel_number) as number', ]); + $businessOrderItems = BusinessOrderItem::query() + ->select(DB::raw($fields)) + ->with([ + 'shop:id,name', + 'goodsSku:id,external_sku_id' + ]) + ->where('created_at', '>', date('Y-m-d 07:00:00')) + ->where('external_sku_id', '<>', '') + ->groupBy(['shop_id', 'external_sku_id']) + ->orderByDesc('number') + ->get() + ->toArray(); + $ids = $externals = []; + foreach ($businessOrderItems as $businessOrderItem) { + if (is_null($businessOrderItem['goods_sku'])) { + continue; + } + $id = $businessOrderItem['goods_sku']['id']; + if (isset($ids[$id])) { + $ids[$id] += (int)$businessOrderItem['number']; + } else { + $ids[$id] = (int)$businessOrderItem['number']; + } + + $externals[$businessOrderItem['external_sku_id']][] = $businessOrderItem; + } + arsort($ids); + + $builder = GoodsSku::query(); + $this->preparQueryGoodsSkus($request, $builder); + $day = DateTimeUtils::getToday(); + $goodsSkus = (clone $builder)->filter() + ->where('is_combination', 0) + ->orderByDesc('stock') + ->pluck('stock', 'id') + ->toArray(); + $finalIds = []; + foreach ($ids as $id => $number) { + if (isset($goodsSkus[$id])) { + $finalIds[] = $id; + unset($goodsSkus[$id]); + } + } + $finalIds = array_merge($finalIds, array_keys($goodsSkus)); + $idField = implode(',', $finalIds); + + $goodsSkus = (clone $builder)->with(['goods' => function ($query) { + $query->with(['type:id,name', 'brand:id,name']); + }]) + ->with(['daily' => function ($query) use ($day) { + $query->where('day', $day); + }]) + ->whereIn('id', $finalIds) + ->orderByRaw("FIELD(id, {$idField})") + ->paginate($request->get('per_page')); + $rolesName = $request->user()->getRoleNames()->toArray(); foreach ($goodsSkus as &$sku) { $lastInventoryTime = $sku['daily']['inventory_time'] ?: date('Y-m-d 07:00:00'); - $orderDetail = BusinessOrderItem::query() - ->select(DB::raw($fields)) - ->with(['shop:id,name']) - ->where('external_sku_id', $sku['external_sku_id']) - ->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { - $query->where('created_at', '>', $lastInventoryTime); - }) - ->groupBy(['shop_id', 'external_sku_id']) - ->get() - ->toArray(); - $addOrderGoodsNum = $reduceOrderGoodsNum = 0; - if ($orderDetail) { - $addOrderGoodsNum = array_sum(array_column($orderDetail, 'number')); - $reduceOrderGoodsNum = array_sum(array_column($orderDetail, 'cancel_number')); + if (isset($externals[$sku['external_sku_id']])) { + $sku['order_detail'] = $externals[$sku['external_sku_id']]; + $sku['order_goods_num'] = array_sum(array_column($externals[$sku['external_sku_id']], 'number')); + } else { + $sku['order_detail'] = []; + $sku['order_goods_num'] = 0; } $sku['inventory_time'] = $lastInventoryTime; - $sku['order_goods_num'] = $addOrderGoodsNum - $reduceOrderGoodsNum; - $sku['order_detail'] = $orderDetail; if ('销售' === $rolesName[0]) { $sku['cost'] = 0; } diff --git a/app/Models/BusinessOrderItem.php b/app/Models/BusinessOrderItem.php index 20bc1f3..e54fd9d 100644 --- a/app/Models/BusinessOrderItem.php +++ b/app/Models/BusinessOrderItem.php @@ -44,4 +44,9 @@ class BusinessOrderItem extends Model { return $this->hasOne(GoodsSkuLocation::class, 'external_sku_id', 'external_sku_id'); } + + public function goodsSku() + { + return $this->hasOne(GoodsSku::class, 'external_sku_id', 'external_sku_id'); + } }