store-manage/app/Http/Controllers/Api/StatsController.php

110 lines
4.0 KiB
PHP

<?php
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
{
public function dashboard(Request $request)
{
/** @var \App\Models\Employee */
$user = $request->user();
$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));
// 今天
$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 */
$ledgers30days = (clone $query)
->whereBetween('date', [$start, $end])
->get(['date', 'sales', 'expenditure'])
->keyBy('date');
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),
];
}
public function test(Request $request)
{
/** @var \App\Models\Employee */
$user = $request->user();
}
/**
* 准备趋势数据
*/
protected function prepareTrendData(Carbon $start, Carbon $end, Collection $ledgers): array
{
$data = collect();
do {
$ledger = $ledgers->get(
$date = $start->format('Y-m-d')
);
$data->push([
'date' => $date,
'sales' => trim_zeros($ledger->sales ?? 0),
'expenditure' => trim_zeros($ledger->expenditure ?? 0),
]);
$start->addDay();
} while ($start->lte($end));
return $data->all();
}
}