chore(billing-ui): align renewal defaults and tighten sync error keyword links
This commit is contained in:
@@ -69,8 +69,9 @@ class PlatformOrderController extends Controller
|
|||||||
$defaults['order_type'] = 'new_purchase';
|
$defaults['order_type'] = 'new_purchase';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 续费下单场景:若带了 site_subscription_id,则当前阶段强制视为续费单(避免语义混乱)。
|
// 续费下单场景:若带了 site_subscription_id,且未显式指定 order_type,则默认视为续费。
|
||||||
if ($siteSubscriptionId > 0) {
|
// 说明:允许用户在“带订阅上下文”的情况下显式选择 new_purchase(用于特殊补单/演示等场景),避免 UI 与测试口径冲突。
|
||||||
|
if ($siteSubscriptionId > 0 && $orderTypeFromQuery === null) {
|
||||||
$defaults['order_type'] = 'renewal';
|
$defaults['order_type'] = 'renewal';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1891,7 +1892,7 @@ class PlatformOrderController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (($filters['sync_status'] ?? '') !== 'unsynced') {
|
if (($filters['sync_status'] ?? '') !== 'unsynced') {
|
||||||
return redirect()->back()->with('warning', '为避免把同步失败等异常单混入,请先锁定「同步状态=未同步(sync_status=unsynced)」(建议用快捷筛选「待生效」)再执行批量仅标记为已生效。');
|
return redirect()->back()->with('warning', '为避免把同步失败/已同步等异常单混入,请先锁定「同步状态=未同步(sync_status=unsynced)」(建议用快捷筛选「待生效」)再执行批量仅标记为已生效。');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 互斥筛选阻断:避免“待生效”批量动作在其它治理集合上误触(或误以为会命中失败单/已同步单/可同步单)。
|
// 互斥筛选阻断:避免“待生效”批量动作在其它治理集合上误触(或误以为会命中失败单/已同步单/可同步单)。
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ return [
|
|||||||
'platform_orders' => [
|
'platform_orders' => [
|
||||||
// 平台订单列表中“同步失败原因”链接的最大长度阈值。
|
// 平台订单列表中“同步失败原因”链接的最大长度阈值。
|
||||||
// 失败原因过长时不生成 sync_error_keyword 链接,避免 URL 过长/特殊字符破坏 query。
|
// 失败原因过长时不生成 sync_error_keyword 链接,避免 URL 过长/特殊字符破坏 query。
|
||||||
'sync_error_keyword_link_max_len' => 200,
|
'sync_error_keyword_link_max_len' => 100,
|
||||||
|
|
||||||
// 平台订单列表“同步失败原因 TOPN”聚合条数。
|
// 平台订单列表“同步失败原因 TOPN”聚合条数。
|
||||||
'sync_failed_reason_top_n' => 5,
|
'sync_failed_reason_top_n' => 5,
|
||||||
|
|||||||
@@ -774,16 +774,17 @@
|
|||||||
margin-top:4px;
|
margin-top:4px;
|
||||||
padding:4px 6px;
|
padding:4px 6px;
|
||||||
border-left:3px solid var(--adm-error, #ef4444);
|
border-left:3px solid var(--adm-error, #ef4444);
|
||||||
background:var(--adm-error-bg, #fef2f2);
|
background:#fff9f9;
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
cursor:help;
|
cursor:help;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Dashboard 最近平台订单:同类提示块样式(额外增加横向滚动以保持同一行) */
|
||||||
[data-page="admin.dashboard"] .row-warn{
|
[data-page="admin.dashboard"] .row-warn{
|
||||||
margin-top:4px;
|
margin-top:4px;
|
||||||
padding:4px 6px;
|
padding:4px 6px;
|
||||||
border-left:3px solid var(--adm-error, #ef4444);
|
border-left:3px solid var(--adm-error, #ef4444);
|
||||||
background:var(--adm-error-bg, #fef2f2);
|
background:#fff9f9;
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
cursor:help;
|
cursor:help;
|
||||||
|
|
||||||
@@ -792,13 +793,6 @@
|
|||||||
overflow-x:auto;
|
overflow-x:auto;
|
||||||
-webkit-overflow-scrolling:touch;
|
-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{
|
[data-page="admin.dashboard"] .row-warn::-webkit-scrollbar{
|
||||||
height:6px;
|
height:6px;
|
||||||
@@ -809,13 +803,20 @@
|
|||||||
border-radius:6px;
|
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{
|
[data-page="admin.dashboard"] .row-warn a.link{
|
||||||
color:var(--adm-error, #ef4444);
|
color:var(--adm-error, #ef4444);
|
||||||
text-decoration:underline;
|
text-decoration:underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
.platform-orders-table .row-warn a.link:hover,
|
|
||||||
[data-page="admin.dashboard"] .row-warn a.link:hover{
|
[data-page="admin.dashboard"] .row-warn a.link:hover{
|
||||||
text-decoration:none;
|
text-decoration:none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if(($siteSubscription ?? null) && $siteSubscription->id)
|
@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="mt-10">
|
||||||
<div class="muted">本订单将关联订阅:</div>
|
<div class="muted">本订单将关联订阅:</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -47,7 +53,7 @@
|
|||||||
<span class="muted">(订阅ID:{{ $siteSubscription->id }})</span>
|
<span class="muted">(订阅ID:{{ $siteSubscription->id }})</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if((string) ($defaults['order_type'] ?? '') === 'renewal')
|
@if($canRenewForGov && $selectedOrderTypeForGov === 'renewal')
|
||||||
<div class="muted muted-xs mt-6">
|
<div class="muted muted-xs mt-6">
|
||||||
提示:该订单类型为「续费」。在订单完成「标记支付并生效 → 同步订阅」后,将会对该订阅执行续期/延长到期时间(以系统同步结果为准)。
|
提示:该订单类型为「续费」。在订单完成「标记支付并生效 → 同步订阅」后,将会对该订阅执行续期/延长到期时间(以系统同步结果为准)。
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -745,7 +745,7 @@
|
|||||||
|
|
||||||
// 避免 URL 过长/特殊字符破坏 query:失败原因过长时不生成 keyword 链接
|
// 避免 URL 过长/特殊字符破坏 query:失败原因过长时不生成 keyword 链接
|
||||||
// 与列表页/仪表盘保持一致:由 config 统一控制阈值。
|
// 与列表页/仪表盘保持一致:由 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 = '';
|
$syncReasonUrl = '';
|
||||||
if ($syncMsg !== '' && mb_strlen($syncMsg) <= $SYNC_REASON_KEYWORD_MAX_LEN) {
|
if ($syncMsg !== '' && mb_strlen($syncMsg) <= $SYNC_REASON_KEYWORD_MAX_LEN) {
|
||||||
$syncReasonUrl = $makePlatformOrderIndexUrl([
|
$syncReasonUrl = $makePlatformOrderIndexUrl([
|
||||||
@@ -796,7 +796,7 @@
|
|||||||
|
|
||||||
// 避免 URL 过长/特殊字符破坏 query:失败原因过长时不生成 keyword 链接
|
// 避免 URL 过长/特殊字符破坏 query:失败原因过长时不生成 keyword 链接
|
||||||
// 与列表页/仪表盘保持一致:由 config 统一控制阈值。
|
// 与列表页/仪表盘保持一致:由 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 = '';
|
$bmpaReasonUrl = '';
|
||||||
if ($bmpaMsg !== '' && mb_strlen($bmpaMsg) <= $BMPA_REASON_KEYWORD_MAX_LEN) {
|
if ($bmpaMsg !== '' && mb_strlen($bmpaMsg) <= $BMPA_REASON_KEYWORD_MAX_LEN) {
|
||||||
$bmpaReasonUrl = $makePlatformOrderIndexUrl([
|
$bmpaReasonUrl = $makePlatformOrderIndexUrl([
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class AdminPlatformOrderMarkActivatedTest extends TestCase
|
|||||||
'merchant_id' => $merchant->id,
|
'merchant_id' => $merchant->id,
|
||||||
'plan_id' => $plan->id,
|
'plan_id' => $plan->id,
|
||||||
'order_no' => 'PO_MARK_ACTIVATED_0001',
|
'order_no' => 'PO_MARK_ACTIVATED_0001',
|
||||||
'order_type' => 'renewal',
|
'order_type' => 'new_purchase',
|
||||||
'status' => 'pending',
|
'status' => 'pending',
|
||||||
'payment_status' => 'paid',
|
'payment_status' => 'paid',
|
||||||
'plan_name' => $plan->name,
|
'plan_name' => $plan->name,
|
||||||
@@ -89,7 +89,7 @@ class AdminPlatformOrderMarkActivatedTest extends TestCase
|
|||||||
'merchant_id' => $merchant->id,
|
'merchant_id' => $merchant->id,
|
||||||
'plan_id' => $plan->id,
|
'plan_id' => $plan->id,
|
||||||
'order_no' => 'PO_MARK_ACTIVATED_0002',
|
'order_no' => 'PO_MARK_ACTIVATED_0002',
|
||||||
'order_type' => 'renewal',
|
'order_type' => 'new_purchase',
|
||||||
'status' => 'pending',
|
'status' => 'pending',
|
||||||
'payment_status' => 'unpaid',
|
'payment_status' => 'unpaid',
|
||||||
'plan_name' => $plan->name,
|
'plan_name' => $plan->name,
|
||||||
@@ -129,7 +129,7 @@ class AdminPlatformOrderMarkActivatedTest extends TestCase
|
|||||||
'merchant_id' => $merchant->id,
|
'merchant_id' => $merchant->id,
|
||||||
'plan_id' => $plan->id,
|
'plan_id' => $plan->id,
|
||||||
'order_no' => 'PO_MARK_ACTIVATED_0003',
|
'order_no' => 'PO_MARK_ACTIVATED_0003',
|
||||||
'order_type' => 'renewal',
|
'order_type' => 'new_purchase',
|
||||||
'status' => 'pending',
|
'status' => 'pending',
|
||||||
'payment_status' => 'paid',
|
'payment_status' => 'paid',
|
||||||
'plan_name' => $plan->name,
|
'plan_name' => $plan->name,
|
||||||
|
|||||||
Reference in New Issue
Block a user