actionOfGetData()) { return $this->response()->success([ 'items' => [$this->getCommissionIncomeStatistics()], ]); } if ($this->actionOfExport()) { return $this->export(); } return $this->response()->success( $this->baseList( $this->baseCRUD() ->headerToolbar( collect($this->baseHeaderToolBar()) ->when(Admin::user()->can('admin.finance.commission_incomes.export'), fn ($collection) => $collection->push($this->exportAction(true))) ) ->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), amis()->SelectControl('store_id', __('finance.ledger.store')) ->source(admin_url('api/stores?region=${region}')) ->labelField('title') ->valueField('id') ->clearable(), ]), ])) ->filterDefaultVisible() ->columns([ amis()->TableColumn('expected_commission', '预期佣金'), amis()->TableColumn('actual_commission', '实际佣金'), amis()->TableColumn('diff_commission', '佣金差异'), amis()->TableColumn('expected_income', '预期收益'), amis()->TableColumn('actual_income', '实际收益'), amis()->TableColumn('diff_income', '收益差异'), ]) ) ); } protected function getCommissionIncomeStatistics(): array { $aggregate = Ledger::select([ DB::raw('SUM(expenditure) as expenditure'), DB::raw('SUM(expected_commission) as expected_commission'), DB::raw('SUM(actual_commission) as actual_commission'), DB::raw('SUM(expected_income) as expected_income'), DB::raw('SUM(actual_income) as actual_income'), ]) ->filter(request()->input(), LedgerFilter::class) ->first(); $expectedCommission = $aggregate->expected_commission ?? '0'; $actualCommission = $aggregate->actual_commission ?? '0'; $expectedIncome = $aggregate->expected_income ?? '0'; $actualIncome = $aggregate->actual_income ?? '0'; return [ 'expected_commission' => trim_zeros($expectedCommission), 'actual_commission' => trim_zeros($actualCommission), 'diff_commission' => trim_zeros(bcsub($actualCommission, $expectedCommission, 2)), 'expected_income' => trim_zeros($expectedIncome), 'actual_income' => trim_zeros($actualIncome), 'diff_income' => trim_zeros(bcsub($actualIncome, $expectedIncome, 2)), ]; } /** * 导出按钮 * * @param bool $disableSelectedItem * @return \Slowlyo\OwlAdmin\Renderers\Service */ protected function exportAction($disableSelectedItem = false) { // 下载路径 $downloadPath = admin_url('_download_export', true); // 导出接口地址 $exportPath = $this->getExportPath(); // 按钮点击事件 $event = fn ($script) => ['click' => ['actions' => [['actionType' => 'custom', 'script' => $script]]]]; // 导出处理动作 $doAction = "doAction([{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:true}}},{actionType:'ajax',args:{api:{url:url.toString(),method:'get'}}},{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:false}}},{actionType:'custom',expression:'\${event.data.responseResult.responseStatus===0}',script:'window.open(\'{$downloadPath}?path=\'+event.data.responseResult.responseData.path)'}])"; // 按钮 $button = amis()->Button() ->label(__('admin.export.title')) ->icon('fa-solid fa-download') ->onEvent( $event("let data=event.data;let params=Object.keys(data).filter(key=>key!=='page' && key!=='__super').reduce((obj,key)=>{obj[key]=data[key];return obj;},{});let url=new URL('{$exportPath}',window.location.origin);Object.keys(params).forEach(key=>url.searchParams.append(key,params[key]));{$doAction}") ); return amis()->Service() ->id('export-action') ->set('align', 'right') ->set('data', ['showExportLoading' => false]) ->body( amis()->Spinner()->set('showOn', '${showExportLoading}')->overlay()->body($button) ); } /** * 导出 * * @return JsonResponse|JsonResource */ protected function export() { admin_abort_if(! class_exists('\Rap2hpoutre\FastExcel\FastExcel'), __('admin.export.please_install_laravel_excel')); // 默认在 storage/app/ 下 $path = sprintf('佣金收入-%s.xlsx', date('YmdHis')); $data = [$this->getCommissionIncomeStatistics()]; try { fastexcel($data)->export(storage_path('app/'.$path), fn ($row) => [ '预期佣金' => $row['expected_commission'], '实际佣金' => $row['actual_commission'], '佣金差异' => $row['diff_commission'], '预期收益' => $row['expected_income'], '实际收益' => $row['actual_income'], '收益差异' => $row['diff_income'], ]); } catch (\Throwable $e) { report($e); admin_abort(__('admin.action_failed')); } return $this->response()->success(compact('path')); } }