feat: 添加 PHPSpreadsheet 支持以增强报表导出功能
- 在 `composer.json` 中新增 `phpoffice/phpspreadsheet` 依赖。 - 更新 `ReportJobDownloadController` 以使用 `AdminReportSpreadsheetExporter` 进行 XLSX 格式的报表导出,简化导出逻辑并确保文件名包含动态生成的输出路径后缀。 - 更新 `AdminAuthorizationRegistry` 中的权限定义,扩展相关权限以支持新的设置管理功能。
This commit is contained in:
@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api\V1\Admin\Reports;
|
||||
use App\Models\ReportJob;
|
||||
use App\Services\Admin\AdminReportJobService;
|
||||
use App\Services\Admin\AdminReportQueryService;
|
||||
use App\Services\Admin\AdminReportSpreadsheetExporter;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
|
||||
/** GET /api/v1/admin/report-jobs/{report_job}/download */
|
||||
@@ -14,20 +15,24 @@ final class ReportJobDownloadController
|
||||
ReportJob $report_job,
|
||||
AdminReportJobService $service,
|
||||
AdminReportQueryService $queryService,
|
||||
AdminReportSpreadsheetExporter $spreadsheetExporter,
|
||||
): StreamedResponse {
|
||||
$filterJson = is_array($report_job->filter_json) ? $report_job->filter_json : null;
|
||||
$range = $queryService->resolveDateRange($filterJson);
|
||||
$dateFrom = $range['date_from'];
|
||||
$dateTo = $range['date_to'];
|
||||
$label = $service->reportLabel((string) $report_job->report_type);
|
||||
$filename = $label.'_'.$dateFrom.'_'.$dateTo.'.'.$report_job->export_format;
|
||||
$pathSuffix = $queryService->resolveOutputPathSuffix(
|
||||
(string) $report_job->report_type,
|
||||
$filterJson,
|
||||
$dateFrom,
|
||||
$dateTo,
|
||||
);
|
||||
$filename = $label.'_'.$pathSuffix.'.'.$report_job->export_format;
|
||||
$rows = $service->reportRows((string) $report_job->report_type, $filterJson);
|
||||
|
||||
if ((string) $report_job->export_format === 'xlsx') {
|
||||
return response()->streamDownload(function () use ($rows): void {
|
||||
echo "PK\x03\x04";
|
||||
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
|
||||
}, $filename, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']);
|
||||
return $spreadsheetExporter->streamDownload($rows, $filename);
|
||||
}
|
||||
|
||||
return response()->streamDownload(function () use ($rows): void {
|
||||
|
||||
Reference in New Issue
Block a user