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(); } }