移除旧版导出
This commit is contained in:
@@ -83,23 +83,4 @@ class StatementController extends BaseMiniController
|
||||
|
||||
return $this->success($statement->toArray());
|
||||
}
|
||||
|
||||
/** 导出对账单:?format=xlsx|pdf */
|
||||
#[GetRoute('/statement/{id}/export', authorize: true, where: ['id' => '[0-9]+'])]
|
||||
public function export(int $id, Request $request): Response
|
||||
{
|
||||
$user = $this->currentUser($request);
|
||||
$store = $this->ensureStoreBound($user);
|
||||
|
||||
$statement = StatementModel::where('store_id', $store->id)->find($id);
|
||||
if ($statement === null) {
|
||||
throw new RepositoryException('对账单不存在');
|
||||
}
|
||||
|
||||
return app(ExportService::class)->download(
|
||||
'statement',
|
||||
$statement,
|
||||
(string) $request->query('format', ExportService::FORMAT_XLSX),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,13 +4,11 @@ namespace App\Http\Controllers\Recon;
|
||||
|
||||
use App\Exceptions\RepositoryException;
|
||||
use App\Models\SettlementModel;
|
||||
use App\Services\ExportService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
/**
|
||||
* 结算表管理(D9 生成于对账结算,D10 导出下载存档)
|
||||
@@ -52,26 +50,4 @@ class SettlementController extends BaseController
|
||||
}
|
||||
return $this->success($settlement->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* D10 导出下载:?format=xlsx|pdf,成功后回写 file_path 存档标记
|
||||
*/
|
||||
#[GetRoute(route: '/{id}/download', authorize: 'download', where: ['id' => '[0-9]+'])]
|
||||
public function download(int $id, Request $request): Response
|
||||
{
|
||||
$settlement = SettlementModel::find($id);
|
||||
if (empty($settlement)) {
|
||||
throw new RepositoryException('结算表不存在');
|
||||
}
|
||||
$format = (string) $request->query('format', ExportService::FORMAT_XLSX);
|
||||
|
||||
$response = app(ExportService::class)->download('settlement', $settlement, $format);
|
||||
|
||||
// 同步流式下载不落盘,file_path 仅作存档标记(后续切队列导出时替换为真实文件路径)
|
||||
$extension = $format === ExportService::FORMAT_PDF ? 'pdf' : 'xlsx';
|
||||
$settlement->file_path = 'exports/settlement/' . $settlement->settlement_no . '.' . $extension;
|
||||
$settlement->save();
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user