chore: add safeFullUrlWithQuery helper for platform orders links
This commit is contained in:
@@ -17,6 +17,45 @@
|
||||
$selfWithoutBack .= '?' . \Illuminate\Support\Arr::query($currentQuery);
|
||||
}
|
||||
|
||||
// back 安全护栏(全页通用):
|
||||
// - 仅允许站内相对路径(/ 开头)
|
||||
// - 拒绝引号/尖括号(由于本页大量 href 采用 `{!! !!}` 原样输出,必须严控注入风险)
|
||||
// - 拒绝 nested back=(避免 URL 膨胀/绕过)
|
||||
$incomingBackForLinks = (string) request()->query('back', '');
|
||||
$safeBackForLinks = (str_starts_with($incomingBackForLinks, '/')
|
||||
&& !preg_match('/["\'<>]/', $incomingBackForLinks)
|
||||
&& !preg_match('/(?:^|[?&])back=/', $incomingBackForLinks))
|
||||
? $incomingBackForLinks
|
||||
: '';
|
||||
|
||||
// 安全版“保留当前 query 并覆盖字段”的链接构造器:
|
||||
// - 强制使用站内相对路径(不包含域名)
|
||||
// - back 仅保留安全值(否则移除),避免 `{!! !!}` 输出时发生属性注入
|
||||
$safeFullUrlWithQuery = function (array $overrides = []) use ($safeBackForLinks) {
|
||||
$q = request()->query();
|
||||
|
||||
if ($safeBackForLinks !== '') {
|
||||
$q['back'] = $safeBackForLinks;
|
||||
} else {
|
||||
unset($q['back']);
|
||||
}
|
||||
|
||||
foreach ($overrides as $k => $v) {
|
||||
if ($v === null) {
|
||||
unset($q[$k]);
|
||||
} else {
|
||||
$q[$k] = $v;
|
||||
}
|
||||
}
|
||||
|
||||
$url = '/' . ltrim(request()->path(), '/');
|
||||
if (count($q) > 0) {
|
||||
$url .= '?' . \Illuminate\Support\Arr::query($q);
|
||||
}
|
||||
|
||||
return $url;
|
||||
};
|
||||
|
||||
// 线索上下文(从开通线索跳转而来):用于提示“当前范围已锁定线索”,以及生成一键清除入口
|
||||
$incomingLeadId = (int) request()->query('lead_id', 0);
|
||||
$clearLeadQuery = $currentQuery;
|
||||
@@ -295,66 +334,66 @@
|
||||
<div class="card">
|
||||
<h3>已支付 / 已生效</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['payment_status' => 'paid', 'page' => null]) !!}">{{ $summaryStats['paid_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['payment_status' => 'paid', 'page' => null]) !!}">{{ $summaryStats['paid_orders'] ?? 0 }}</a>
|
||||
/
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['status' => 'activated', 'page' => null]) !!}">{{ $summaryStats['activated_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['status' => 'activated', 'page' => null]) !!}">{{ $summaryStats['activated_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>已同步 / 未同步</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['sync_status' => 'synced', 'page' => null]) !!}">{{ $summaryStats['synced_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['sync_status' => 'synced', 'page' => null]) !!}">{{ $summaryStats['synced_orders'] ?? 0 }}</a>
|
||||
/
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['sync_status' => 'unsynced', 'page' => null]) !!}">{{ $summaryStats['unsynced_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['sync_status' => 'unsynced', 'page' => null]) !!}">{{ $summaryStats['unsynced_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>同步失败数</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">{{ $summaryStats['failed_sync_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">{{ $summaryStats['failed_sync_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>BMPA 失败数</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['bmpa_failed_only' => '1', 'page' => null]) !!}">{{ $summaryStats['bmpa_failed_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['bmpa_failed_only' => '1', 'page' => null]) !!}">{{ $summaryStats['bmpa_failed_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">批量标记支付并生效失败(meta 失败标记)</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>可同步订单</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['syncable_only' => '1', 'page' => null]) !!}">{{ $summaryStats['syncable_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['syncable_only' => '1', 'page' => null]) !!}">{{ $summaryStats['syncable_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">已支付 + 已生效 + 未同步</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>近24小时批量同步</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['batch_synced_24h' => '1', 'page' => null]) !!}">{{ $summaryStats['batch_synced_24h_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['batch_synced_24h' => '1', 'page' => null]) !!}">{{ $summaryStats['batch_synced_24h_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">基于 meta.batch_activation.at</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>近24小时批量BMPA</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['batch_mark_paid_and_activate_24h' => '1', 'page' => null]) !!}">{{ $summaryStats['batch_mark_paid_and_activate_24h_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['batch_mark_paid_and_activate_24h' => '1', 'page' => null]) !!}">{{ $summaryStats['batch_mark_paid_and_activate_24h_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">基于 meta.batch_mark_paid_and_activate.at</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>近24小时批量生效</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['batch_mark_activated_24h' => '1', 'page' => null]) !!}">{{ $summaryStats['batch_mark_activated_24h_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['batch_mark_activated_24h' => '1', 'page' => null]) !!}">{{ $summaryStats['batch_mark_activated_24h_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">基于 meta.batch_mark_activated.at</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>部分退款 / 已退款</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['payment_status' => 'partially_refunded', 'page' => null]) !!}">{{ $summaryStats['partially_refunded_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['payment_status' => 'partially_refunded', 'page' => null]) !!}">{{ $summaryStats['partially_refunded_orders'] ?? 0 }}</a>
|
||||
/
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['payment_status' => 'refunded', 'page' => null]) !!}">{{ $summaryStats['refunded_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['payment_status' => 'refunded', 'page' => null]) !!}">{{ $summaryStats['refunded_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
@@ -365,16 +404,16 @@
|
||||
<div class="card">
|
||||
<h3>有退款订单 / 无退款订单</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['refund_status' => 'has', 'page' => null]) !!}">{{ $summaryStats['refund_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['refund_status' => 'has', 'page' => null]) !!}">{{ $summaryStats['refund_orders'] ?? 0 }}</a>
|
||||
/
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['refund_status' => 'none', 'page' => null]) !!}">{{ $summaryStats['no_refund_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['refund_status' => 'none', 'page' => null]) !!}">{{ $summaryStats['no_refund_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">口径:refund_summary.total_amount 存在或 refund_receipts 有记录</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>有回执订单 / 回执总额</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['receipt_status' => 'has', 'page' => null]) !!}">{{ $summaryStats['receipt_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['receipt_status' => 'has', 'page' => null]) !!}">{{ $summaryStats['receipt_orders'] ?? 0 }}</a>
|
||||
/ ¥{{ number_format((float) ($summaryStats['total_receipt_amount'] ?? 0), 2) }}
|
||||
</div>
|
||||
<div class="muted muted-xs">有回执口径:payment_summary.total_amount 存在或 payment_receipts 有记录</div>
|
||||
@@ -382,7 +421,7 @@
|
||||
<div class="card">
|
||||
<h3>无回执订单</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['receipt_status' => 'none', 'page' => null]) !!}">{{ $summaryStats['no_receipt_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['receipt_status' => 'none', 'page' => null]) !!}">{{ $summaryStats['no_receipt_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">无 payment_summary 且无 payment_receipts</div>
|
||||
</div>
|
||||
@@ -391,9 +430,9 @@
|
||||
<div class="muted muted-xs">
|
||||
建议按以下顺序治理当前筛选集合:
|
||||
<ol class="muted-muted-xs list-indent">
|
||||
<li>先处理 <a class="link" href="{!! request()->fullUrlWithQuery(['reconcile_mismatch' => '1', 'page' => null]) !!}">对账不一致</a>:优先补齐支付回执,并核对回执渠道/金额,确保回执总额与已付金额一致。</li>
|
||||
<li>再处理 <a class="link" href="{!! request()->fullUrlWithQuery(['refund_inconsistent' => '1', 'page' => null]) !!}">退款不一致</a>:优先补齐退款回执/核对退款轨迹/修正退款状态(带审计)。</li>
|
||||
<li>最后处理 <a class="link" href="{!! request()->fullUrlWithQuery(['syncable_only' => '1', 'page' => null]) !!}">可同步</a>:确认无对账/退款异常、无同步失败原因后,再批量同步订阅。</li>
|
||||
<li>先处理 <a class="link" href="{!! $safeFullUrlWithQuery(['reconcile_mismatch' => '1', 'page' => null]) !!}">对账不一致</a>:优先补齐支付回执,并核对回执渠道/金额,确保回执总额与已付金额一致。</li>
|
||||
<li>再处理 <a class="link" href="{!! $safeFullUrlWithQuery(['refund_inconsistent' => '1', 'page' => null]) !!}">退款不一致</a>:优先补齐退款回执/核对退款轨迹/修正退款状态(带审计)。</li>
|
||||
<li>最后处理 <a class="link" href="{!! $safeFullUrlWithQuery(['syncable_only' => '1', 'page' => null]) !!}">可同步</a>:确认无对账/退款异常、无同步失败原因后,再批量同步订阅。</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="muted governance-block-footnote">说明:本页“批量同步/批量生效/清理失败标记”等工具动作会透传当前筛选条件;建议先缩小到明确集合再操作。</div>
|
||||
@@ -406,7 +445,7 @@
|
||||
<div class="metric-number">¥{{ number_format($delta, 2) }}</div>
|
||||
<div class="muted muted-xs">{{ $summaryStats['reconciliation_delta_note'] ?? '回执总额 - 订单已付总额' }}(当前筛选范围)</div>
|
||||
<div class="muted muted-xs">对账不一致订单:
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['reconcile_mismatch' => '1', 'page' => null]) !!}">{{ $summaryStats['reconcile_mismatch_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['reconcile_mismatch' => '1', 'page' => null]) !!}">{{ $summaryStats['reconcile_mismatch_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
@php $tol = (float) config('saasshop.amounts.tolerance', 0.01); @endphp
|
||||
<div class="muted muted-xs">当前容差:¥{{ number_format($tol, 2) }}</div>
|
||||
@@ -417,7 +456,7 @@
|
||||
<div class="card">
|
||||
<h3>退款不一致订单</h3>
|
||||
<div class="metric-number">
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['refund_inconsistent' => '1', 'page' => null]) !!}">{{ $summaryStats['refund_inconsistent_orders'] ?? 0 }}</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['refund_inconsistent' => '1', 'page' => null]) !!}">{{ $summaryStats['refund_inconsistent_orders'] ?? 0 }}</a>
|
||||
</div>
|
||||
@php $refundTol = (float) config('saasshop.amounts.tolerance', 0.01); @endphp
|
||||
<div class="muted muted-xs">口径:状态=refunded 但退款总额 + 容差 < 已付;或状态!=refunded 且退款总额 >= 已付 + 容差</div>
|
||||
@@ -446,12 +485,12 @@
|
||||
<span class="muted">|</span>
|
||||
<span class="muted">原因过长,请复制到筛选框</span>
|
||||
<span class="muted">|</span>
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">进入同步失败集合</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">进入同步失败集合</a>
|
||||
@else
|
||||
<a class="link" title="{{ $reason }}" href="{!! request()->fullUrlWithQuery(['sync_error_keyword' => $reason, 'sync_status' => 'failed', 'page' => null]) !!}">{{ $reasonText }}</a>
|
||||
<a class="link" title="{{ $reason }}" href="{!! $safeFullUrlWithQuery(['sync_error_keyword' => $reason, 'sync_status' => 'failed', 'page' => null]) !!}">{{ $reasonText }}</a>
|
||||
<span class="muted">({{ $count }})</span>
|
||||
<span class="muted">|</span>
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['sync_error_keyword' => $reason, 'sync_status' => null, 'syncable_only' => '1', 'page' => null]) !!}">切到可同步重试</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['sync_error_keyword' => $reason, 'sync_status' => null, 'syncable_only' => '1', 'page' => null]) !!}">切到可同步重试</a>
|
||||
@endif
|
||||
@else
|
||||
<span class="muted">(空原因)</span>
|
||||
@@ -488,12 +527,12 @@
|
||||
<span class="muted">|</span>
|
||||
<span class="muted">原因过长,请复制到筛选框</span>
|
||||
<span class="muted">|</span>
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['bmpa_error_keyword' => null, 'page' => null]) !!}">进入失败集合</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['bmpa_error_keyword' => null, 'page' => null]) !!}">进入失败集合</a>
|
||||
@else
|
||||
<a class="link" title="{{ $reason }}" href="{!! request()->fullUrlWithQuery(['bmpa_error_keyword' => $reason, 'page' => null]) !!}">{{ $reasonText }}</a>
|
||||
<a class="link" title="{{ $reason }}" href="{!! $safeFullUrlWithQuery(['bmpa_error_keyword' => $reason, 'page' => null]) !!}">{{ $reasonText }}</a>
|
||||
<span class="muted">({{ $count }})</span>
|
||||
<span class="muted">|</span>
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['bmpa_error_keyword' => $reason, 'status' => 'pending', 'payment_status' => 'unpaid', 'page' => null]) !!}">切到可处理集合重试</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['bmpa_error_keyword' => $reason, 'status' => 'pending', 'payment_status' => 'unpaid', 'page' => null]) !!}">切到可处理集合重试</a>
|
||||
@endif
|
||||
@else
|
||||
<span class="muted">(空原因)</span>
|
||||
@@ -538,13 +577,13 @@
|
||||
<div class="muted governance-block-body">
|
||||
当前筛选包含
|
||||
@if($hasReconcileMismatchFilter)
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['reconcile_mismatch' => '1', 'page' => null]) !!}">对账不一致</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['reconcile_mismatch' => '1', 'page' => null]) !!}">对账不一致</a>
|
||||
@endif
|
||||
@if($hasReconcileMismatchFilter && $hasRefundInconsistentFilter)
|
||||
<span class="muted">与</span>
|
||||
@endif
|
||||
@if($hasRefundInconsistentFilter)
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['refund_inconsistent' => '1', 'page' => null]) !!}">退款不一致</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['refund_inconsistent' => '1', 'page' => null]) !!}">退款不一致</a>
|
||||
@endif
|
||||
。建议先完成金额/状态治理(补回执/核对退款/修正状态)后,再执行批量同步订阅等工具动作。
|
||||
</div>
|
||||
@@ -556,7 +595,7 @@
|
||||
<div class="muted governance-block-body">
|
||||
注意:当前同时勾选了「只看可同步」—— 这类订单会被批量同步订阅命中。若仍存在对账/退款异常,建议先进入治理集合处理完毕,再回到可同步集合执行批量同步。
|
||||
<div class="mt-6 actions gap-10">
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['syncable_only' => null, 'page' => null]) !!}">先去治理(取消只看可同步)</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['syncable_only' => null, 'page' => null]) !!}">先去治理(取消只看可同步)</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -569,8 +608,8 @@
|
||||
<div class="muted governance-block-body">
|
||||
当前集合为「无回执」且已勾选「只看可同步」。为保证收费闭环可治理,建议先补齐支付回执留痕,再执行批量同步订阅。
|
||||
<div class="mt-6 actions gap-10">
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['receipt_status' => 'has', 'page' => null]) !!}">切到有回执集合</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['syncable_only' => null, 'page' => null]) !!}">取消只看可同步(先治理)</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['receipt_status' => 'has', 'page' => null]) !!}">切到有回执集合</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['syncable_only' => null, 'page' => null]) !!}">取消只看可同步(先治理)</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -582,8 +621,8 @@
|
||||
<div class="muted governance-block-body">
|
||||
当前筛选包含「同步失败/失败原因」范围。建议先治理失败原因(修复数据或重试同步),再执行批量同步订阅等工具动作。
|
||||
<div class="mt-6 actions gap-10">
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">进入同步失败集合</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['syncable_only' => '1', 'page' => null]) !!}">切到只看可同步(用于批量重试同步)</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">进入同步失败集合</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['syncable_only' => '1', 'page' => null]) !!}">切到只看可同步(用于批量重试同步)</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -595,8 +634,8 @@
|
||||
<div class="muted governance-block-body">
|
||||
当前筛选包含「批量标记支付并生效失败/失败原因」范围。建议先补齐回执/核对退款/修正状态后,再切到 pending+unpaid 集合重试批量标记支付。
|
||||
<div class="mt-6 actions gap-10">
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['bmpa_failed_only' => '1', 'page' => null]) !!}">进入批量标记支付失败集合</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! request()->fullUrlWithQuery(['status' => 'pending', 'payment_status' => 'unpaid', 'page' => null]) !!}">切到 pending+unpaid(用于重试)</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['bmpa_failed_only' => '1', 'page' => null]) !!}">进入批量标记支付失败集合</a>
|
||||
<a class="btn btn-secondary btn-sm" href="{!! $safeFullUrlWithQuery(['status' => 'pending', 'payment_status' => 'unpaid', 'page' => null]) !!}">切到 pending+unpaid(用于重试)</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -987,7 +1026,7 @@
|
||||
</td>
|
||||
<td>
|
||||
@if($order->merchant)
|
||||
<a href="{!! request()->fullUrlWithQuery(['merchant_id' => $order->merchant->id, 'page' => null]) !!}" class="link">{{ $order->merchant->name }}</a>
|
||||
<a href="{!! $safeFullUrlWithQuery(['merchant_id' => $order->merchant->id, 'page' => null]) !!}" class="link">{{ $order->merchant->name }}</a>
|
||||
@else
|
||||
<span class="muted">未关联站点</span>
|
||||
@endif
|
||||
@@ -995,7 +1034,7 @@
|
||||
<td>
|
||||
@php $planName = $order->plan_name ?: ($order->plan?->name ?? '未设置'); @endphp
|
||||
@if($order->plan)
|
||||
<a href="{!! request()->fullUrlWithQuery(['plan_id' => $order->plan->id, 'page' => null]) !!}" class="link">{{ $planName }}</a>
|
||||
<a href="{!! $safeFullUrlWithQuery(['plan_id' => $order->plan->id, 'page' => null]) !!}" class="link">{{ $planName }}</a>
|
||||
@else
|
||||
{{ $planName }}
|
||||
@endif
|
||||
@@ -1019,11 +1058,11 @@
|
||||
$syncErr = (string) (data_get($order->meta, 'subscription_activation_error.message') ?? '');
|
||||
@endphp
|
||||
@if($syncedId > 0)
|
||||
<a href="{!! request()->fullUrlWithQuery(['sync_status' => 'synced', 'page' => null]) !!}" class="link">已同步</a>
|
||||
<a href="{!! $safeFullUrlWithQuery(['sync_status' => 'synced', 'page' => null]) !!}" class="link">已同步</a>
|
||||
@elseif($syncErr !== '')
|
||||
<a href="{!! request()->fullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}" class="link text-danger">同步失败</a>
|
||||
<a href="{!! $safeFullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}" class="link text-danger">同步失败</a>
|
||||
@else
|
||||
<a href="{!! request()->fullUrlWithQuery(['sync_status' => 'unsynced', 'page' => null]) !!}" class="muted">未同步</a>
|
||||
<a href="{!! $safeFullUrlWithQuery(['sync_status' => 'unsynced', 'page' => null]) !!}" class="muted">未同步</a>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@@ -1037,7 +1076,7 @@
|
||||
<a href="{!! $subLink !!}">{{ $order->siteSubscription->subscription_no }}</a>
|
||||
</div>
|
||||
<div class="muted muted-xs">
|
||||
订阅ID:<a href="{!! request()->fullUrlWithQuery(['site_subscription_id' => $order->siteSubscription->id, 'page' => null]) !!}" class="muted">{{ $order->siteSubscription->id }}</a>
|
||||
订阅ID:<a href="{!! $safeFullUrlWithQuery(['site_subscription_id' => $order->siteSubscription->id, 'page' => null]) !!}" class="muted">{{ $order->siteSubscription->id }}</a>
|
||||
</div>
|
||||
@else
|
||||
<span class="muted">-</span>
|
||||
@@ -1065,9 +1104,9 @@
|
||||
@if($syncErrTooLong)
|
||||
<span class="muted text-danger" title="{{ $syncErrMsg }}">{{ mb_substr($syncErrMsg, 0, $SYNC_FAILED_REASON_TRUNCATE_LEN) }}</span>
|
||||
<div class="muted text-danger muted-xs">原因过长,请复制到筛选框</div>
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">进入同步失败集合</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['sync_status' => 'failed', 'page' => null]) !!}">进入同步失败集合</a>
|
||||
@else
|
||||
<a class="link text-danger" href="{!! request()->fullUrlWithQuery(['sync_error_keyword' => $syncErrMsg, 'sync_status' => 'failed', 'page' => null]) !!}">{{ mb_substr($syncErrMsg, 0, $SYNC_FAILED_REASON_TRUNCATE_LEN) }}</a>
|
||||
<a class="link text-danger" href="{!! $safeFullUrlWithQuery(['sync_error_keyword' => $syncErrMsg, 'sync_status' => 'failed', 'page' => null]) !!}">{{ mb_substr($syncErrMsg, 0, $SYNC_FAILED_REASON_TRUNCATE_LEN) }}</a>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
@@ -1078,9 +1117,9 @@
|
||||
@if($bmpaErrTooLong)
|
||||
<span class="muted text-danger" title="{{ $bmpaErrMsg }}">{{ mb_substr($bmpaErrMsg, 0, $SYNC_FAILED_REASON_TRUNCATE_LEN) }}</span>
|
||||
<div class="muted text-danger muted-xs">原因过长,请复制到筛选框</div>
|
||||
<a class="link" href="{!! request()->fullUrlWithQuery(['bmpa_failed_only' => '1', 'page' => null]) !!}">进入批量标记支付失败集合</a>
|
||||
<a class="link" href="{!! $safeFullUrlWithQuery(['bmpa_failed_only' => '1', 'page' => null]) !!}">进入批量标记支付失败集合</a>
|
||||
@else
|
||||
<a class="link text-danger" href="{!! request()->fullUrlWithQuery(['bmpa_error_keyword' => $bmpaErrMsg, 'page' => null]) !!}">{{ mb_substr($bmpaErrMsg, 0, $SYNC_FAILED_REASON_TRUNCATE_LEN) }}</a>
|
||||
<a class="link text-danger" href="{!! $safeFullUrlWithQuery(['bmpa_error_keyword' => $bmpaErrMsg, 'page' => null]) !!}">{{ mb_substr($bmpaErrMsg, 0, $SYNC_FAILED_REASON_TRUNCATE_LEN) }}</a>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
Reference in New Issue
Block a user