From 92293095004b2bf446057d3f1b81386ad927031e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=BB=BA=E7=82=8A?= <924182103@qq.com> Date: Fri, 1 Nov 2024 15:42:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/DailyStockRecordReport.php | 1 + app/Console/Kernel.php | 2 + app/Services/Statistic/SaleDataService.php | 87 +++++++++++++++---- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/app/Console/Commands/DailyStockRecordReport.php b/app/Console/Commands/DailyStockRecordReport.php index 0e8d625..e592591 100644 --- a/app/Console/Commands/DailyStockRecordReport.php +++ b/app/Console/Commands/DailyStockRecordReport.php @@ -80,6 +80,7 @@ class DailyStockRecordReport extends Command //开始更新数据 if (!empty($needUpdateExternalSkuIds)) { $needUpdateSkuIdsMap = GoodsSku::query()->whereIn("external_sku_id", $needUpdateExternalSkuIds)->pluck("external_sku_id", 'id')->toArray(); + collect($needUpdateSkuIdsMap)->each(function ($externalSkuId,$skuId) use ($date, $orderItems, $purchaseRecords, $lossRecords) { $record = DailyStockRecord::query()->firstOrNew([ 'sku_id' => $skuId, diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index e23b0f6..9ce6b35 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -54,6 +54,8 @@ class Kernel extends ConsoleKernel $schedule->command(CheckSkuQualityPeriod::class)->dailyAt('05:30'); //快团团售后单拉取 $schedule->command(KttOrderAfterSaleQuery::class)->everyFifteenMinutes(); + //同步售卖信息和报损相关数据 + $schedule->command(GoodsSkuDailyReport::class)->dailyAt('03:30'); } diff --git a/app/Services/Statistic/SaleDataService.php b/app/Services/Statistic/SaleDataService.php index 6a6e64c..baa9019 100644 --- a/app/Services/Statistic/SaleDataService.php +++ b/app/Services/Statistic/SaleDataService.php @@ -123,11 +123,11 @@ class SaleDataService Log::info("dailyRecordGroupBySkuId", $dailyRecordGroupBySkuId); $combineGoodsSkus = collect($goodsSku)->map(function ($v) use ($dailyRecordGroupBySkuId, $orderItems) { $v['yesterday_avg_num'] = round(collect($dailyRecordGroupBySkuId[$v['id']] ?? [])->sortByDesc("day") - ->take(1)->avg("order_goods_num") ?? 0, 2); + ->take(1)->avg("order_goods_num") ?? 0, 2); $v['three_day_avg_num'] = round(collect($dailyRecordGroupBySkuId[$v['id']] ?? [])->sortByDesc("day") - ->take(3)->avg("order_goods_num") ?? 0, 2); + ->take(3)->avg("order_goods_num") ?? 0, 2); $v['seven_day_avg_num'] = round(collect($dailyRecordGroupBySkuId[$v['id']] ?? [])->sortByDesc("day") - ->take(7)->avg("order_goods_num") ?? 0, 2); + ->take(7)->avg("order_goods_num") ?? 0, 2); return $v; })->pluck(null, "external_sku_id")->toArray(); Log::info("combineGoodsSkus", $combineGoodsSkus); @@ -191,18 +191,47 @@ class SaleDataService ->where("external_sku_id", "!=", "") ->where("business_order_items.cancel_status", "=", 0) ->groupBy('external_sku_id')->get()->toArray(); + $externalSkuIds = collect($orderItems)->pluck("external_sku_id")->toArray(); - $orderItemsKeyByExternalSkuId = collect($orderItems)->pluck(null, "external_sku_id")->toArray(); + $goodsSkus = GoodsSku::query() + ->with([ + 'combinationGoods:id,goods_sku_id,item_id,item_num', + 'combinationGoods.goodsSkuItem:id,name,goods_id,title,stock,sale_stock,external_sku_id,updated_at,yesterday_num,reference_price,status', + ]) + ->whereIn("external_sku_id", $externalSkuIds)->get()->pluck(null, "external_sku_id") + ->toArray(); + $skus = []; + //组合商品 + foreach ($orderItems as $orderItem) { + $sku = $goodsSkus[$orderItem['external_sku_id']] ?? []; + if (!empty($sku['is_combination'])) { + foreach ($sku['combination_goods'] as $combinationGood) { + $skuItem = $goodsSkus[$combinationGood['goods_sku_item']['external_sku_id']] ?? []; + $skuItem['shipping_num'] = $skuItem['shipping_num'] ?? 0 + $orderItem['shipping_num'] * $combinationGood['item_num']; + $skuItem['unshipping_num'] = $skuItem['unshipping_num'] ?? 0 + $orderItem['unshipping_num'] * $combinationGood['item_num']; + $skuItem['goods_total'] = $skuItem['goods_total'] ?? 0 + $orderItem['goods_total'] * $combinationGood['item_num']; + $skuItem['goods_total_amount'] = $skuItem['goods_total_amount'] ?? 0 + $orderItem['goods_total_amount'] * $combinationGood['item_num']; + $skus[$combinationGood['goods_sku_item']['external_sku_id']] = $skuItem; + } + } else { + $skuItem = $skus[$orderItem['external_sku_id']] ?? []; + $skuItem['shipping_num'] = $skuItem['shipping_num'] ?? 0 + $orderItem['shipping_num']; + $skuItem['unshipping_num'] = $skuItem['unshipping_num'] ?? 0 + $orderItem['unshipping_num']; + $skuItem['goods_total'] = $skuItem['goods_total'] ?? 0 + $orderItem['goods_total']; + $skuItem['goods_total_amount'] = $skuItem['goods_total_amount'] ?? 0 + $orderItem['goods_total_amount']; + $skus[$orderItem['external_sku_id']] = $skuItem; + } + } $goodsSkuWithTypes = GoodsSku::query() ->Join("goods", "goods_id", "=", "goods.id") ->Join("goods_types", "goods.type_id", "=", "goods_types.id") - ->whereIn("external_sku_id", $externalSkuIds) - ->select("goods_skus.id", "goods_types.id as type_id", "goods_types.name", "external_sku_id", "stock", "sale_stock")->get() - ->toArray(); + ->whereIn("external_sku_id", array_keys($skus)) + ->select("goods_skus.id", "goods_types.id as type_id", "goods_types.name", "external_sku_id", "stock", "sale_stock") + ->get()->toArray(); - return collect($goodsSkuWithTypes)->map(function ($v) use ($orderItemsKeyByExternalSkuId) { - if (!empty($orderItemsKeyByExternalSkuId[$v['external_sku_id']])) { - return array_merge($v, $orderItemsKeyByExternalSkuId[$v['external_sku_id']]); + return collect($goodsSkuWithTypes)->map(function ($v) use ($skus) { + if (!empty($skus[$v['external_sku_id']])) { + return array_merge($v, $skus[$v['external_sku_id']]); } })->filter()->values()->groupBy('type_id')->map(function ($v, $key) { return [ @@ -215,7 +244,7 @@ class SaleDataService "goods_total" => $v->sum("goods_total"), "goods_total_amount" => $v->sum("goods_total_amount"), ]; - })->values()->toArray(); + })->values()->sortByDesc('goods_total')->toArray(); } /** @@ -250,16 +279,40 @@ class SaleDataService ->having(DB::raw("sum(order_goods_num)"), ">", 0) ->get()->toArray(); $skuIds = collect($dailyAllRecord)->pluck('sku_id')->toArray(); - $dailyRecordMapKeyBySkuId = collect($dailyAllRecord)->pluck(null, 'sku_id')->toArray(); + $goodsSkus = GoodsSku::query() + ->with([ + 'combinationGoods:id,goods_sku_id,item_id,item_num' + ]) + ->whereIn("id", $skuIds)->get()->pluck(null, "id") + ->toArray(); + $skus = []; + //组合商品需要分散到sku维度进行统计 + foreach ($dailyAllRecord as $skuRecord) { + $sku = $goodsSkus[$skuRecord['sku_id']] ?? []; + if (!empty($sku['is_combination'])) { + foreach ($sku['combination_goods'] as $combinationGood) { + $skuItem = $goodsSkus[$combinationGood['item_id']] ?? []; + $skuItem['goods_total'] = $skuItem['goods_total'] ?? 0 + $skuRecord['goods_total'] * $combinationGood['item_num']; + $skuItem['goods_total_amount'] = $skuItem['goods_total_amount'] ?? 0 + $skuRecord['goods_total_amount'] * $combinationGood['item_num']; + $skus[$combinationGood['item_id']] = $skuItem; + } + } else { + $skuItem = $skus[$skuRecord['sku_id']] ?? []; + $skuItem['goods_total'] = $skuItem['goods_total'] ?? 0 + $skuRecord['goods_total']; + $skuItem['goods_total_amount'] = $skuItem['goods_total_amount'] ?? 0 + $skuRecord['goods_total_amount']; + $skus[$skuRecord['sku_id']] = $skuItem; + } + } $goodsSkuWithTypes = GoodsSku::query() ->Join("goods", "goods_id", "=", "goods.id") ->Join("goods_types", "goods.type_id", "=", "goods_types.id") ->select("goods_skus.id", "goods_types.id as type_id", "goods_types.name", "external_sku_id", "stock", "sale_stock") - ->whereIn("goods_skus.id", $skuIds) + ->whereIn("goods_skus.id", array_keys($skus)) ->get()->toArray(); - return collect($goodsSkuWithTypes)->map(function ($v) use ($dailyRecordMapKeyBySkuId) { - if (!empty($dailyRecordMapKeyBySkuId[$v['id']])) { - return array_merge($v, $dailyRecordMapKeyBySkuId[$v['id']]); + + return collect($goodsSkuWithTypes)->map(function ($v) use ($skus) { + if (!empty($skus[$v['id']])) { + return array_merge($v, $skus[$v['id']]); } })->filter()->values()->groupBy('type_id')->map(function ($v, $key) { return [ @@ -270,7 +323,7 @@ class SaleDataService "goods_total" => $v->sum("goods_total"), "goods_total_amount" => $v->sum("goods_total_amount"), ]; - })->values()->toArray(); + })->values()->sortByDesc('goods_total')->toArray(); } /**