From c7d7d40ef1574db4692d168e4d98d3f8d1b27893 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Thu, 11 Apr 2024 21:30:07 +0800 Subject: [PATCH] =?UTF-8?q?30=E5=A4=A9=E5=86=85=E7=9A=84=E8=B6=8B=E5=8A=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/StatsController.php | 63 ++++++++++++++++++++ app/Models/Employee.php | 9 +++ routes/api.php | 3 + 3 files changed, 75 insertions(+) create mode 100644 app/Http/Controllers/Api/StatsController.php diff --git a/app/Http/Controllers/Api/StatsController.php b/app/Http/Controllers/Api/StatsController.php new file mode 100644 index 0000000..fdbe8ba --- /dev/null +++ b/app/Http/Controllers/Api/StatsController.php @@ -0,0 +1,63 @@ +user(); + + $start = now()->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() + ->keyBy('date'); + + $data = []; + + do { + $ledger = $ledgers->get( + $date = $start->format('Y-m-d') + ); + + $data[] = [ + 'date' => $date, + 'sales' => trim_zeros($ledger->sales ?? 0), + 'expenditure' => trim_zeros($ledger->expenditure ?? 0), + ]; + + $start->addDay(); + } while ($start->lte($end)); + + return $data; + } +} diff --git a/app/Models/Employee.php b/app/Models/Employee.php index 6ebb567..7ace7ab 100644 --- a/app/Models/Employee.php +++ b/app/Models/Employee.php @@ -87,6 +87,15 @@ class Employee extends Model implements AuthenticatableContract return $this->employee_status === EmployeeStatus::Offline; } + /** + * 确认当前员工是否是管理员 + */ + public function isAdministrator(): bool + { + // @todo + return true; + } + protected function employeeStatusText(): Attribute { return new Attribute( diff --git a/routes/api.php b/routes/api.php index e88990b..b76b289 100644 --- a/routes/api.php +++ b/routes/api.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Api\Auth\AccessTokenController; use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; use App\Http\Controllers\Api\LotteryTypeController; +use App\Http\Controllers\Api\StatsController; use Illuminate\Support\Facades\Route; Route::post('/auth/login', [AccessTokenController::class, 'store']); @@ -12,6 +13,8 @@ Route::delete('/auth/logout', [AccessTokenController::class, 'destroy']); Route::group([ 'middleware' => ['auth:api'], ], function () { + Route::get('/stats/trends-over-30days', [StatsController::class, 'trendsOver30days']); + // 彩种类型 Route::get('lottery-types', [LotteryTypeController::class, 'index']); // 举报投诉