store-manage/app/Admin/Controllers/Finance/StoreStatisticController.php

76 lines
2.7 KiB
PHP

<?php
namespace App\Admin\Controllers\Finance;
use App\Admin\Controllers\AdminController;
use App\Admin\Filters\LedgerFilter;
use App\Admin\Filters\StoreFilter;
use App\Models\Ledger;
use App\Models\Store;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class StoreStatisticController extends AdminController
{
public function index()
{
if ($this->actionOfGetData()) {
return $this->response()->success([
'items' => $this->getStoreStatistics(request()),
]);
}
return $this->response()->success(
$this->baseList(
$this->baseCRUD()
->headerToolbar([
amis('filter-toggler')->align('right'),
])
->footerToolbar([])
->bulkActions([])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->DateRangeControl('date_range', '日期')
->valueFormat('YYYY-MM-DD')
->columnRatio(6),
amis()->InputCityControl('region', '区域')
->allowDistrict(false)
->extractValue(false),
]),
]))
->columns([
amis()->TableColumn('ranking', '排序'),
amis()->TableColumn('title', '门店'),
amis()->TableColumn('sales', '收入')->sortable(),
amis()->TableColumn('expenditure', '支出')->sortable(),
])
)
);
}
protected function getStoreStatistics(Request $request): array
{
/** @var \Illuminate\Database\Eloquent\Collection */
$stats = Ledger::with(['store'])
->select(['store_id', DB::raw('SUM(sales) as sales'), DB::raw('SUM(expenditure) as expenditure')])
->filter($request->input(), LedgerFilter::class)
->groupBy('store_id')
->get();
// 排序规则
$sortBy = [
[$request->input('orderBy') ?: 'sales', $request->input('orderDir') ?: 'desc'],
];
return $stats->map(fn ($item) => [
'title' => $item->store->title,
'sales' => trim_zeros($item->sales ?? '0'),
'expenditure' => trim_zeros($item->expenditure ?? '0'),
])
->sortBy($sortBy)
->values()
->map(fn ($item, $key) => array_merge($item, ['ranking' => $key + 1]))
->all();
}
}