feat(platform-orders): 支付回执扁平统计与列表摘要回执总览

This commit is contained in:
萝卜
2026-03-10 17:19:49 +00:00
parent 565a451ca8
commit 5bdcaa561f
3 changed files with 51 additions and 0 deletions

View File

@@ -260,6 +260,21 @@ class PlatformOrderController extends Controller
} }
return $sum; return $sum;
}), }),
'receipt_orders' => (clone $baseQuery)->whereRaw("JSON_EXTRACT(meta, '$.payment_receipts[0].amount') IS NOT NULL")->count(),
'total_receipt_amount' => (clone $baseQuery)->get()->sum(function ($o) {
// 优先读 meta.payment_summary.total_amount回退汇总 meta.payment_receipts[].amount
$total = (float) (data_get($o->meta, 'payment_summary.total_amount') ?? 0);
if ($total > 0) {
return $total;
}
$receipts = (array) (data_get($o->meta, 'payment_receipts', []) ?? []);
$sum = 0.0;
foreach ($receipts as $r) {
$sum += (float) (data_get($r, 'amount') ?? 0);
}
return $sum;
}),
], ],
'failedReasonStats' => $failedReasonStats, 'failedReasonStats' => $failedReasonStats,
]); ]);
@@ -333,6 +348,21 @@ class PlatformOrderController extends Controller
'admin_id' => $admin->id, 'admin_id' => $admin->id,
]; ];
data_set($meta, 'payment_receipts', $receipts); data_set($meta, 'payment_receipts', $receipts);
// 扁平统计:避免在列表/汇总处频繁遍历支付回执数组(可治理)
$totalPaid = 0.0;
foreach ($receipts as $r) {
$totalPaid += (float) (data_get($r, 'amount') ?? 0);
}
$latest = count($receipts) > 0 ? end($receipts) : null;
data_set($meta, 'payment_summary', [
'count' => count($receipts),
'total_amount' => $totalPaid,
'last_at' => (string) (data_get($latest, 'paid_at') ?? ''),
'last_amount' => (float) (data_get($latest, 'amount') ?? 0),
'last_channel' => (string) (data_get($latest, 'channel') ?? ''),
]);
$order->meta = $meta; $order->meta = $meta;
} }
@@ -390,6 +420,21 @@ class PlatformOrderController extends Controller
]; ];
data_set($meta, 'payment_receipts', $receipts); data_set($meta, 'payment_receipts', $receipts);
// 扁平统计:避免在列表/汇总处频繁遍历支付回执数组(可治理)
$totalPaid = 0.0;
foreach ($receipts as $r) {
$totalPaid += (float) (data_get($r, 'amount') ?? 0);
}
$latest = count($receipts) > 0 ? end($receipts) : null;
data_set($meta, 'payment_summary', [
'count' => count($receipts),
'total_amount' => $totalPaid,
'last_at' => (string) (data_get($latest, 'paid_at') ?? ''),
'last_amount' => (float) (data_get($latest, 'amount') ?? 0),
'last_channel' => (string) (data_get($latest, 'channel') ?? ''),
]);
$order->meta = $meta; $order->meta = $meta;
$order->save(); $order->save();

View File

@@ -130,6 +130,11 @@
<div class="metric-number">¥{{ number_format((float) ($summaryStats['total_refunded_amount'] ?? 0), 2) }}</div> <div class="metric-number">¥{{ number_format((float) ($summaryStats['total_refunded_amount'] ?? 0), 2) }}</div>
<div class="muted muted-xs">基于 meta.refund_summary.total_amount缺省回退汇总</div> <div class="muted muted-xs">基于 meta.refund_summary.total_amount缺省回退汇总</div>
</div> </div>
<div class="card">
<h3>有回执订单 / 回执总额</h3>
<div class="metric-number">{{ $summaryStats['receipt_orders'] ?? 0 }} / ¥{{ number_format((float) ($summaryStats['total_receipt_amount'] ?? 0), 2) }}</div>
<div class="muted muted-xs">基于 meta.payment_summary.total_amount缺省回退汇总</div>
</div>
<div class="card"> <div class="card">
<h3>同步失败原因 TOP5</h3> <h3>同步失败原因 TOP5</h3>
@php $failedReasonStats = $failedReasonStats ?? []; @endphp @php $failedReasonStats = $failedReasonStats ?? []; @endphp

View File

@@ -39,6 +39,7 @@ class AdminPlatformOrderTest extends TestCase
->assertSee('近24小时批量同步') ->assertSee('近24小时批量同步')
->assertSee('部分退款 / 已退款') ->assertSee('部分退款 / 已退款')
->assertSee('退款总额') ->assertSee('退款总额')
->assertSee('有回执订单 / 回执总额')
->assertSee('快捷筛选') ->assertSee('快捷筛选')
->assertSee('待支付') ->assertSee('待支付')
->assertSee('待生效') ->assertSee('待生效')