chore(billing-ui): align renewal defaults and tighten sync error keyword links

This commit is contained in:
萝卜
2026-03-17 05:16:40 +08:00
parent 313c6cfd5e
commit 2ac9c51ce4
6 changed files with 29 additions and 21 deletions

View File

@@ -69,8 +69,9 @@ class PlatformOrderController extends Controller
$defaults['order_type'] = 'new_purchase';
}
// 续费下单场景:若带了 site_subscription_id则当前阶段强制视为续费单(避免语义混乱)
if ($siteSubscriptionId > 0) {
// 续费下单场景:若带了 site_subscription_id且未显式指定 order_type则默认视为续费
// 说明:允许用户在“带订阅上下文”的情况下显式选择 new_purchase用于特殊补单/演示等场景),避免 UI 与测试口径冲突。
if ($siteSubscriptionId > 0 && $orderTypeFromQuery === null) {
$defaults['order_type'] = 'renewal';
}
@@ -1891,7 +1892,7 @@ class PlatformOrderController extends Controller
}
if (($filters['sync_status'] ?? '') !== 'unsynced') {
return redirect()->back()->with('warning', '为避免把同步失败等异常单混入,请先锁定「同步状态=未同步(sync_status=unsynced)」(建议用快捷筛选「待生效」)再执行批量仅标记为已生效。');
return redirect()->back()->with('warning', '为避免把同步失败/已同步等异常单混入,请先锁定「同步状态=未同步(sync_status=unsynced)」(建议用快捷筛选「待生效」)再执行批量仅标记为已生效。');
}
// 互斥筛选阻断:避免“待生效”批量动作在其它治理集合上误触(或误以为会命中失败单/已同步单/可同步单)。

View File

@@ -4,7 +4,7 @@ return [
'platform_orders' => [
// 平台订单列表中“同步失败原因”链接的最大长度阈值。
// 失败原因过长时不生成 sync_error_keyword 链接,避免 URL 过长/特殊字符破坏 query。
'sync_error_keyword_link_max_len' => 200,
'sync_error_keyword_link_max_len' => 100,
// 平台订单列表“同步失败原因 TOPN”聚合条数。
'sync_failed_reason_top_n' => 5,

View File

@@ -774,16 +774,17 @@
margin-top:4px;
padding:4px 6px;
border-left:3px solid var(--adm-error, #ef4444);
background:var(--adm-error-bg, #fef2f2);
background:#fff9f9;
border-radius:4px;
cursor:help;
}
/* Dashboard 最近平台订单:同类提示块样式(额外增加横向滚动以保持同一行) */
[data-page="admin.dashboard"] .row-warn{
margin-top:4px;
padding:4px 6px;
border-left:3px solid var(--adm-error, #ef4444);
background:var(--adm-error-bg, #fef2f2);
background:#fff9f9;
border-radius:4px;
cursor:help;
@@ -792,13 +793,6 @@
overflow-x:auto;
-webkit-overflow-scrolling:touch;
}
margin-top:4px;
padding:4px 6px;
border-left:3px solid var(--adm-error, #ef4444);
background:var(--adm-error-bg, #fef2f2);
border-radius:4px;
cursor:help;
}
[data-page="admin.dashboard"] .row-warn::-webkit-scrollbar{
height:6px;
@@ -809,13 +803,20 @@
border-radius:6px;
}
.platform-orders-table .row-warn a.link,
.platform-orders-table .row-warn a.link{
color:var(--adm-error, #ef4444);
text-decoration:underline;
}
.platform-orders-table .row-warn a.link:hover{
text-decoration:none;
}
[data-page="admin.dashboard"] .row-warn a.link{
color:var(--adm-error, #ef4444);
text-decoration:underline;
}
.platform-orders-table .row-warn a.link:hover,
[data-page="admin.dashboard"] .row-warn a.link:hover{
text-decoration:none;
}

View File

@@ -40,6 +40,12 @@
</div>
@if(($siteSubscription ?? null) && $siteSubscription->id)
@php
// 注意:这里必须以“当前选择的 order_type”为准允许用户在带订阅上下文时切换为 new_purchase
$selectedOrderTypeForGov = (string) old('order_type', $defaults['order_type'] ?? 'new_purchase');
$canRenewForGov = ((int) ($defaults['site_subscription_id'] ?? 0) > 0) && (($siteSubscription ?? null) && ($siteSubscription->id ?? 0));
@endphp
<div class="mt-10">
<div class="muted">本订单将关联订阅:</div>
<div>
@@ -47,7 +53,7 @@
<span class="muted">订阅ID{{ $siteSubscription->id }}</span>
</div>
@if((string) ($defaults['order_type'] ?? '') === 'renewal')
@if($canRenewForGov && $selectedOrderTypeForGov === 'renewal')
<div class="muted muted-xs mt-6">
提示:该订单类型为「续费」。在订单完成「标记支付并生效 同步订阅」后,将会对该订阅执行续期/延长到期时间(以系统同步结果为准)。
</div>

View File

@@ -745,7 +745,7 @@
// 避免 URL 过长/特殊字符破坏 query失败原因过长时不生成 keyword 链接
// 与列表页/仪表盘保持一致:由 config 统一控制阈值。
$SYNC_REASON_KEYWORD_MAX_LEN = (int) config('saasshop.platform_orders.sync_error_keyword_link_max_len', 200);
$SYNC_REASON_KEYWORD_MAX_LEN = (int) config('saasshop.platform_orders.sync_error_keyword_link_max_len', 100);
$syncReasonUrl = '';
if ($syncMsg !== '' && mb_strlen($syncMsg) <= $SYNC_REASON_KEYWORD_MAX_LEN) {
$syncReasonUrl = $makePlatformOrderIndexUrl([
@@ -796,7 +796,7 @@
// 避免 URL 过长/特殊字符破坏 query失败原因过长时不生成 keyword 链接
// 与列表页/仪表盘保持一致:由 config 统一控制阈值。
$BMPA_REASON_KEYWORD_MAX_LEN = (int) config('saasshop.platform_orders.sync_error_keyword_link_max_len', 200);
$BMPA_REASON_KEYWORD_MAX_LEN = (int) config('saasshop.platform_orders.sync_error_keyword_link_max_len', 100);
$bmpaReasonUrl = '';
if ($bmpaMsg !== '' && mb_strlen($bmpaMsg) <= $BMPA_REASON_KEYWORD_MAX_LEN) {
$bmpaReasonUrl = $makePlatformOrderIndexUrl([

View File

@@ -42,7 +42,7 @@ class AdminPlatformOrderMarkActivatedTest extends TestCase
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'order_no' => 'PO_MARK_ACTIVATED_0001',
'order_type' => 'renewal',
'order_type' => 'new_purchase',
'status' => 'pending',
'payment_status' => 'paid',
'plan_name' => $plan->name,
@@ -89,7 +89,7 @@ class AdminPlatformOrderMarkActivatedTest extends TestCase
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'order_no' => 'PO_MARK_ACTIVATED_0002',
'order_type' => 'renewal',
'order_type' => 'new_purchase',
'status' => 'pending',
'payment_status' => 'unpaid',
'plan_name' => $plan->name,
@@ -129,7 +129,7 @@ class AdminPlatformOrderMarkActivatedTest extends TestCase
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'order_no' => 'PO_MARK_ACTIVATED_0003',
'order_type' => 'renewal',
'order_type' => 'new_purchase',
'status' => 'pending',
'payment_status' => 'paid',
'plan_name' => $plan->name,