setPaper('a4')->download(...),模板统一 font-family: SimHei * - 文件名规范:{单号}_{业务名}.{ext},中文文件名由响应自动做 RFC 5987 编码 */ class ExportService { /** 导出格式:Excel */ public const FORMAT_XLSX = 'xlsx'; /** 导出格式:PDF */ public const FORMAT_PDF = 'pdf'; /** * 导出下载 * * @param string $business 业务类型:purchase 采购单 / statement 门店对账单 / settlement 结算表 * @param mixed $subject 业务主体(如 PurchaseOrderModel / StatementModel / SettlementModel 实例) * @param string $format 导出格式 xlsx|pdf,默认 xlsx,非法值报错 * @param string|null $type 业务子类型(purchase 专用:all 全品类 / category 仅蔬果分类) * @return Response 文件流响应(blob) */ public function download( string $business, mixed $subject, string $format = self::FORMAT_XLSX, ?string $type = null, ): Response { if (! in_array($format, [self::FORMAT_XLSX, self::FORMAT_PDF], true)) { throw new RepositoryException('导出格式参数不正确(仅支持 xlsx / pdf)'); } return match ($business) { 'purchase' => $this->exportPurchase($subject, $format, $type), 'statement' => $this->exportStatement($subject, $format), 'settlement' => $this->exportSettlement($subject, $format), default => throw new RepositoryException('不支持的导出业务类型:' . $business), }; } /** * C2/C3 采购单导出 */ private function exportPurchase(PurchaseOrderModel $purchase, string $format, ?string $type): Response { $type = in_array($type, ['all', 'category'], true) ? $type : 'all'; $extension = $format === self::FORMAT_PDF ? 'pdf' : 'xlsx'; $filename = $purchase->purchase_no . '_采购单.' . $extension; $export = new PurchaseOrderExport($purchase, $type); if ($format === self::FORMAT_PDF) { return Pdf::loadView('exports.purchase', $export->viewData()) ->setPaper('a4') ->download($filename); } return Excel::download($export, $filename); } /** * 门店对账单导出 */ private function exportStatement(StatementModel $statement, string $format): Response { $extension = $format === self::FORMAT_PDF ? 'pdf' : 'xlsx'; $filename = $statement->statement_no . '_对账单.' . $extension; $export = new StatementExport($statement); if ($format === self::FORMAT_PDF) { return Pdf::loadView('exports.statement', $export->viewData()) ->setPaper('a4') ->download($filename); } return Excel::download($export, $filename); } /** * D10 结算表导出 */ private function exportSettlement(SettlementModel $settlement, string $format): Response { $extension = $format === self::FORMAT_PDF ? 'pdf' : 'xlsx'; $filename = $settlement->settlement_no . '_结算表.' . $extension; $export = new SettlementExport($settlement); if ($format === self::FORMAT_PDF) { return Pdf::loadView('exports.settlement', $export->viewData()) ->setPaper('a4') ->download($filename); } return Excel::download($export, $filename); } }