diff --git a/app/Admin/Controllers/Finance/LedgerController.php b/app/Admin/Controllers/Finance/LedgerController.php index ad478ee..ef49128 100644 --- a/app/Admin/Controllers/Finance/LedgerController.php +++ b/app/Admin/Controllers/Finance/LedgerController.php @@ -5,6 +5,7 @@ namespace App\Admin\Controllers\Finance; use App\Admin\Controllers\AdminController; use App\Admin\Services\Finance\LedgerService; use App\Enums\CheckStatus; +use App\Models\Keyword; use App\Models\Ledger; use App\Traits\HasCheckActions; use Illuminate\Http\Request; @@ -228,23 +229,61 @@ class LedgerController extends AdminController return '上报数据'; } - protected function exportMap($row) + protected function export() { - return [ - __('finance.ledger.date') => $row['date'], - __('finance.ledger.store') => Arr::get($row, 'store.title'), - __('finance.ledger.sales') => $row['sales'], - __('finance.ledger.expenditure') => $row['expenditure'], - __('finance.ledger.new_customers') => $row['new_customers'], - __('finance.ledger.handover_amount') => $row['handover_amount'], - __('finance.ledger.ledger_amount') => $row['ledger_amount'], - __('finance.ledger.ledger_difference') => $row['ledger_difference'], - __('finance.ledger.expected_commission') => $row['expected_commission'], - __('finance.ledger.actual_commission') => $row['actual_commission'], - __('finance.ledger.expected_income') => $row['expected_income'], - __('finance.ledger.actual_income') => $row['actual_income'], - __('workflow_log.check_status') => CheckStatus::tryFrom(Arr::get($row, 'workflow.check_status'))?->text(), - __('finance.ledger.created_at') => $row['created_at'], - ]; + admin_abort_if(!class_exists('\Rap2hpoutre\FastExcel\FastExcel'), __('admin.export.please_install_laravel_excel')); + + // 默认在 storage/app/ 下 + $path = sprintf('%s-%s.xlsx', $this->exportFileName(), date('YmdHis')); + + // 导出本页和导出选中项都是通过 _ids 查询 + $ids = request()->input('_ids'); + + // listQuery() 为列表查询条件,与获取列表数据一致 + $data = $this->service->listQuery() + ->with(['items']) + ->when($ids, fn($query) => $query->whereIn($this->service->primaryKey(), explode(',', $ids))) + ->get(); + + /** @var \Illuminate\Database\Eloquent\Collection */ + $lotteryTypes = Keyword::where('parent_key', 'lottery_type')->oldest('sort')->get(); + + try { + fastexcel($data->loadMissing(['items']))->export(storage_path('app/' . $path), function($row) use ($lotteryTypes) { + $ledgerItems = collect($row['items'])->keyBy('ledger_item_type_id'); + + $data = [ + __('finance.ledger.date') => $row['date'], + __('finance.ledger.store') => Arr::get($row, 'store.title'), + __('finance.ledger.sales') => $row['sales'], + __('finance.ledger.expenditure') => $row['expenditure'], + __('finance.ledger.new_customers') => $row['new_customers'], + __('finance.ledger.handover_amount') => $row['handover_amount'], + __('finance.ledger.ledger_amount') => $row['ledger_amount'], + __('finance.ledger.ledger_difference') => $row['ledger_difference'], + __('finance.ledger.expected_commission') => $row['expected_commission'], + __('finance.ledger.actual_commission') => $row['actual_commission'], + __('finance.ledger.expected_income') => $row['expected_income'], + __('finance.ledger.actual_income') => $row['actual_income'], + __('workflow_log.check_status') => CheckStatus::tryFrom(Arr::get($row, 'workflow.check_status'))?->text(), + __('finance.ledger.created_at') => $row['created_at'], + ]; + + foreach ($lotteryTypes as $lotteryType) { + $ledgerItem = $ledgerItems->get($lotteryType->key); + + $data = array_merge($data, [ + "{$lotteryType->name}-销售" => trim_zeros($ledgerItem->sales ?? 0), + "{$lotteryType->name}-兑奖" => trim_zeros($ledgerItem->expenditure ?? 0), + ]); + } + + return $data; + }); + } catch (\Throwable $e) { + admin_abort(__('admin.action_failed')); + } + + return $this->response()->success(compact('path')); } }