From ca091525cdab0e4a28180a29bab8d6263fc2d7e0 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Thu, 11 Apr 2024 22:48:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE=20-=20?= =?UTF-8?q?=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/StatsController.php | 104 +++++++++++++------ routes/api.php | 2 +- 2 files changed, 73 insertions(+), 33 deletions(-) diff --git a/app/Http/Controllers/Api/StatsController.php b/app/Http/Controllers/Api/StatsController.php index fdbe8ba..0aa28f4 100644 --- a/app/Http/Controllers/Api/StatsController.php +++ b/app/Http/Controllers/Api/StatsController.php @@ -3,61 +3,101 @@ namespace App\Http\Controllers\Api; use App\Models\Ledger; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Request; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\DB; class StatsController extends Controller { - /** - * 30天内的销售金额和支出金额趋势图(不含当日) - */ - public function trendsOver30days(Request $request) + public function dashboard(Request $request) { /** @var \App\Models\Employee */ - $employee = $request->user(); + $user = $request->user(); - $start = now()->subDays(30); + $query = Ledger::when($user->isAdministrator(), function ($query) use ($request) { + if ($request->filled('store_id')) { + return $query->where('store_id', $request->input('store_id')); + } + + if (! $request->anyFilled(['province_code', 'city_code'])) { + return; + } + + $query->whereHas('store', function ($query) use ($request) { + $request->whenFilled('province_code', fn ($code) => $query->where('region->provinceCode', $code)); + $request->whenFilled('city_code', fn ($code) => $query->where('region->cityCode', $code)); + }); + }, fn ($query) => $query->where('store_id', $user->store_id ?: 0)); + + // 今天 + $today = Carbon::today(); + + //-------------------------------------------------------------------------- + // 本月总账录入 + //-------------------------------------------------------------------------- + $currentMonthLedger = (clone $query) + ->select([Db::raw('SUM(sales) as sales'), Db::raw('SUM(expenditure) as expenditure')]) + ->whereBetween('date', [$today->copy()->startOfMonth()->format('Y-m-d'), $today->format('Y-m-d')]) + ->first(); + + //-------------------------------------------------------------------------- + // 昨日总账录入 + //-------------------------------------------------------------------------- + $yesterday = $today->copy()->subDay(); + $yesterdayLedger = (clone $query)->where('date', $yesterday->format('Y-m-d'))->first(); + + //-------------------------------------------------------------------------- + // 近 30 天趋势数据 + //-------------------------------------------------------------------------- + $start = $today->copy()->subDays(30); $end = $start->copy()->addDays(29); - /** @var \Illuminate\Database\Eloquent\Collection */ - $ledgers = Ledger::select(['date', 'sales', 'expenditure']) - ->whereBetween('date', [$start->format('Y-m-d'), $end->format('Y-m-d')]) - ->when( - $employee->isAdministrator(), - function ($query) use ($request) { - if ($request->filled('store_id')) { - return $query->where('store_id', $request->input('store_id')); - } - - if (! $request->anyFilled(['province_code', 'city_code'])) { - return; - } - - $query->whereHas('store', function ($query) use ($request) { - $request->whenFilled('province_code', fn ($code) => $query->where('region->provinceCode', $code)); - $request->whenFilled('city_code', fn ($code) => $query->where('region->cityCode', $code)); - }); - }, - fn ($query) => $query->where('store_id', $employee->store_id ?: 0), - ) - ->get() + $ledgers30days = (clone $query) + ->whereBetween('date', [$start, $end]) + ->get(['date', 'sales', 'expenditure']) ->keyBy('date'); - $data = []; + return [ + // 本月总账录入 + 'current_month_ledger' => [ + // 截止日期 + 'deadline' => $today->format('Y-m-d'), + 'sales' => trim_zeros($currentMonthLedger->sales ?? 0), + 'expenditure' => trim_zeros($currentMonthLedger->expenditure ?? 0), + ], + // 昨日累计金额 + 'yesterday_ledger' => [ + 'date' => $yesterday->format('Y-m-d'), + 'sales' => trim_zeros($yesterdayLedger->sales ?? 0), + 'expenditure' => trim_zeros($yesterdayLedger->expenditure ?? 0), + ], + // 近30天趋势数据 + 'trend_data_of_30days' => $this->prepareTrendData($start->copy(), $end->copy(), $ledgers30days), + ]; + } + + /** + * 准备趋势数据 + */ + protected function prepareTrendData(Carbon $start, Carbon $end, Collection $ledgers): array + { + $data = collect(); do { $ledger = $ledgers->get( $date = $start->format('Y-m-d') ); - $data[] = [ + $data->push([ 'date' => $date, 'sales' => trim_zeros($ledger->sales ?? 0), 'expenditure' => trim_zeros($ledger->expenditure ?? 0), - ]; + ]); $start->addDay(); } while ($start->lte($end)); - return $data; + return $data->all(); } } diff --git a/routes/api.php b/routes/api.php index b76b289..0e01edd 100644 --- a/routes/api.php +++ b/routes/api.php @@ -13,7 +13,7 @@ Route::delete('/auth/logout', [AccessTokenController::class, 'destroy']); Route::group([ 'middleware' => ['auth:api'], ], function () { - Route::get('/stats/trends-over-30days', [StatsController::class, 'trendsOver30days']); + Route::get('/stats/dashboard', [StatsController::class, 'dashboard']); // 彩种类型 Route::get('lottery-types', [LotteryTypeController::class, 'index']);