Files
xin-procurement/app/Services/ExportService.php
T
2026-07-23 20:41:25 +08:00

112 lines
4.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Services;
use App\Exceptions\RepositoryException;
use App\Exports\PurchaseOrderExport;
use App\Exports\SettlementExport;
use App\Exports\StatementExport;
use App\Models\PurchaseOrderModel;
use App\Models\SettlementModel;
use App\Models\StatementModel;
use Barryvdh\DomPDF\Facade\Pdf;
use Maatwebsite\Excel\Facades\Excel;
use Symfony\Component\HttpFoundation\Response;
/**
* 导出统一入口:按业务类型 + format 分发到 app/Exports 导出类 / PDF 模板
*
* - Excel 分支:Excel::download(new XxxExport(...))
* - PDF 分支:Pdf::loadView('exports.xxx', ...)->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);
}
}