store-manage/app/Admin/Controllers/CockpitController.php

158 lines
4.3 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Employee;
use App\Models\Ledger;
use App\Models\Store;
use App\Models\TaskPerformance;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class CockpitController extends Controller
{
/**
* 基础数据统计
*/
public function basic(): array
{
// 门店总数
$storesCount = Store::onlyOpen()->count();
// 员工总数
$employeesCount = Employee::onlyOnline()->count();
return [
'stores_count' => $storesCount,
'employees_count' => $employeesCount,
];
}
/**
* 销售趋势
*/
public function salesTrend(Request $request): array
{
$request->validate(
rules: [
'last' => ['bail', 'required', Rule::in(['7days', '30days', '180days', '365days'])],
],
);
$data = collect();
$last = $request->input('last');
if (in_array($last, ['7days', '30days'])) {
// 按天
$days = match ($last) {
'7days' => 7,
'30days' => 30,
};
// 今天
$today = Carbon::today();
// 开始时间
$startAt = $today->copy()->subDays($days);
// 结束时间
$endAt = $today->copy()->subDay();
$ledgers = Ledger::select(['date', DB::raw('SUM(sales) as sales')])
->whereBetween('date', [$startAt->toDateString(), $endAt->toDateString()])
->groupBy('date')
->get()
->keyBy('date');
while ($startAt->lte($endAt)) {
$date = $startAt->toDateString();
$ledger = $ledgers->get($date);
$data->push([
'date' => $date,
'sales' => trim_zeros($ledger->sales ?? 0),
]);
$startAt->addDay();
}
}
elseif (in_array($last, ['180days', '365days'])) {
// 按月
$months = match ($last) {
'180days' => 6, // 6个月
'365days' => 12, // 12个月
};
// 今天
$today = Carbon::today();
// 开始时间
$startAt = $today->copy()->startOfMonth()->subMonths($months);
// 结束时间
$endAt = $today->copy()->startOfMonth()->subMonth()->endOfMonth();
$ledgers = Ledger::select([DB::raw("DATE_FORMAT(`date`, '%Y-%m') as month"), DB::raw('SUM(sales) as sales')])
->whereBetween('date', [$startAt->toDateString(), $endAt->toDateString()])
->groupBy('month')
->get()
->keyBy('month');
for ($i=0; $i < $months; $i++) {
$month = $startAt->format('Y-m');
$ledger = $ledgers->get($month);
$data->push([
'date' => $month,
'sales' => trim_zeros($ledger->sales ?? 0),
]);
$startAt->addMonth();
}
}
return $data->all();
}
/**
* 彩种销售趋势
*/
public function lotterySalesTrend(Request $request): array
{
return [];
}
/**
* 门店销量排名
*/
public function storeSalesRanking(Request $request): array
{
return [];
}
/**
* 年度目标
*/
public function yearlyGoals(Request $request): array
{
$request->validate(
rules: [
'year' => ['bail', 'required', 'int'],
],
);
$aggregates = TaskPerformance::select([
DB::raw('SUM(`expected_performance`) as expected_performance'),
DB::raw('SUM(`actual_performance`) as actual_performance'),
])->whereYear(DB::raw("STR_TO_DATE(CONCAT(`month`, '-01'), '%Y-%m-%d')"), $request->input('year'))->first();
return [
// 目标业绩
'expected_performance' => trim_zeros($aggregates['expected_performance'] ?? 0),
// 实际业绩
'actual_performance' => trim_zeros($aggregates['actual_performance'] ?? 0),
];
}
}