平台订单:单笔对账明细CSV导出(支付回执+退款记录)

This commit is contained in:
萝卜
2026-03-13 20:47:12 +00:00
parent 9f89536933
commit 470f8fe2f5
4 changed files with 200 additions and 1 deletions

View File

@@ -413,6 +413,65 @@ class PlatformOrderController extends Controller
]);
}
/**
* 导出单笔订单的“对账明细”(支付回执 + 退款记录CSV。
* 用于运营线下对账沟通/留档,不依赖订单列表的筛选口径。
*/
public function exportLedger(Request $request, PlatformOrder $order): StreamedResponse
{
$this->ensurePlatformAdmin($request);
$order->loadMissing(['merchant', 'plan', 'siteSubscription']);
$paymentReceipts = (array) (data_get($order->meta, 'payment_receipts', []) ?? []);
$refundReceipts = (array) (data_get($order->meta, 'refund_receipts', []) ?? []);
$filename = 'platform_order_' . $order->id . '_ledger_' . now()->format('Ymd_His') . '.csv';
return response()->streamDownload(function () use ($order, $paymentReceipts, $refundReceipts) {
$out = fopen('php://output', 'w');
// UTF-8 BOM避免 Excel 打开中文乱码
fwrite($out, "\xEF\xBB\xBF");
// 订单摘要(两行)
fputcsv($out, ['order_id', (string) $order->id]);
fputcsv($out, ['order_no', (string) $order->order_no]);
fputcsv($out, []);
// 明细表头
fputcsv($out, ['record_type', 'channel', 'amount', 'biz_time', 'created_at', 'admin_id', 'note']);
foreach ($paymentReceipts as $r) {
fputcsv($out, [
'payment',
(string) (data_get($r, 'channel') ?? ''),
(string) (data_get($r, 'amount') ?? ''),
(string) (data_get($r, 'paid_at') ?? ''),
(string) (data_get($r, 'created_at') ?? ''),
(string) (data_get($r, 'admin_id') ?? ''),
(string) (data_get($r, 'note') ?? ''),
]);
}
foreach ($refundReceipts as $r) {
fputcsv($out, [
'refund',
(string) (data_get($r, 'channel') ?? ''),
(string) (data_get($r, 'amount') ?? ''),
(string) (data_get($r, 'refunded_at') ?? ''),
(string) (data_get($r, 'created_at') ?? ''),
(string) (data_get($r, 'admin_id') ?? ''),
(string) (data_get($r, 'note') ?? ''),
]);
}
fclose($out);
}, $filename, [
'Content-Type' => 'text/csv; charset=UTF-8',
]);
}
public function activateSubscription(Request $request, PlatformOrder $order, SubscriptionActivationService $service): RedirectResponse
{
$admin = $this->ensurePlatformAdmin($request);