generated from liutk/owl-admin-base
统计数据 - 首页
parent
c7d7d40ef1
commit
ca091525cd
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
Loading…
Reference in New Issue