generated from liutk/owl-admin-base
87 lines
3.0 KiB
PHP
87 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers\Finance;
|
|
|
|
use App\Admin\Controllers\AdminController;
|
|
use App\Admin\Filters\LedgerFilter;
|
|
use App\Admin\Filters\LedgerItemFilter;
|
|
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
|
|
{
|
|
$stores = Store::filter($request->only(['region']), StoreFilter::class)
|
|
->get(['id', 'title']);
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection */
|
|
$statistics = Ledger::select([
|
|
'store_id',
|
|
DB::raw('SUM(sales) as sales'),
|
|
DB::raw('SUM(expenditure) as expenditure'),
|
|
])
|
|
->filter($request->input(), LedgerItemFilter::class)
|
|
->groupBy('store_id')
|
|
->get()
|
|
->keyBy('store_id');
|
|
|
|
// 排序规则
|
|
$sortBy = [
|
|
[$request->input('orderBy') ?: 'sales', $request->input('orderDir') ?: 'desc'],
|
|
];
|
|
|
|
return $stores->map(function ($store) use ($statistics) {
|
|
$statistic = $statistics->get($store->id);
|
|
return [
|
|
'title' => $store->title,
|
|
'sales' => trim_zeros($statistic->sales ?? '0'),
|
|
'expenditure' => trim_zeros($statistic->expenditure ?? '0'),
|
|
];
|
|
})
|
|
->sortBy($sortBy)
|
|
->values()
|
|
->map(fn ($statistic, $key) => array_merge($statistic, ['ranking' => $key + 1]))
|
|
->all();
|
|
}
|
|
}
|