diff --git a/app/Admin/Controllers/CockpitController.php b/app/Admin/Controllers/CockpitController.php index b60b13c..b2177d6 100644 --- a/app/Admin/Controllers/CockpitController.php +++ b/app/Admin/Controllers/CockpitController.php @@ -242,7 +242,56 @@ class CockpitController extends Controller */ public function storeSalesRanking(Request $request): array { - return []; + $request->validate( + rules: [ + 'last' => ['bail', 'required', Rule::in(['7days', '30days', '180days', '365days'])], + ], + ); + + $last = $request->input('last'); + + $storeSales = Ledger::select(['store_id', DB::raw('SUM(sales) as sales')]) + ->when($last, function ($query, $last) { + $today = Carbon::today(); + + if (in_array($last, ['7days', '30days'])) { + $days = match ($last) { + '7days' => 7, + '30days' => 30, + }; + + $query->whereBetween('date', [ + $today->copy()->subDays($days)->toDateString(), + $today->copy()->subDay()->toDateString(), + ]); + } elseif (in_array($last, ['180days', '365days'])) { + $months = match ($last) { + '180days' => 6, // 6个月 + '365days' => 12, // 12个月 + }; + + $query->whereBetween('date', [ + $today->copy()->startOfMonth()->subMonths($months)->toDateString(), + $today->copy()->startOfMonth()->subMonth()->endOfMonth()->toDateString(), + ]); + } + }) + ->groupBy('store_id'); + + $stores = Store::leftJoinSub($storeSales, 'store_sales', fn ($join) => $join->on('stores.id', '=', 'store_sales.store_id')) + ->orderBy('store_sales.sales', 'DESC') + ->limit(30) + ->get(); + + return $stores->map(function (Store $store) { + return [ + 'store' => [ + 'id' => $store->id, + 'title' => $store->title, + ], + 'sales' => trim_zeros($store->sales ?: 0), + ]; + })->all(); } /**