feat(governance): 批次页跳转列表自动定位到筛选区(anchor)

This commit is contained in:
萝卜
2026-03-17 16:30:15 +08:00
parent 38ac28ada2
commit 408050666f
4 changed files with 54 additions and 21 deletions

View File

@@ -97,58 +97,58 @@ class PlatformBatchController extends Controller
$governanceLinks = [];
if ($type === 'bas') {
$governanceLinks['all'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['all'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_activation_run_id' => $runId,
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
$governanceLinks['failed'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['failed'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_activation_run_id' => $runId,
'sync_status' => 'failed',
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
$governanceLinks['retry_syncable'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['retry_syncable'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_activation_run_id' => $runId,
'sync_status' => 'unsynced',
'syncable_only' => '1',
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
$topReason = (string) (data_get($summary, 'top_reasons.0.reason') ?? '');
$maxLen = (int) config('saasshop.platform_orders.sync_error_keyword_link_max_len', 200);
$maxLen = max(50, min(1000, $maxLen));
if ($topReason !== '' && mb_strlen($topReason) <= $maxLen) {
$governanceLinks['top_reason'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['top_reason'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_activation_run_id' => $runId,
'sync_status' => 'failed',
'sync_error_keyword' => $topReason,
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
}
}
if ($type === 'bmpa') {
$governanceLinks['all'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['all'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_bmpa_run_id' => $runId,
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
$governanceLinks['failed'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['failed'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_bmpa_run_id' => $runId,
'bmpa_failed_only' => '1',
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
$governanceLinks['retry_processable'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['retry_processable'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_bmpa_run_id' => $runId,
'status' => 'pending',
'payment_status' => 'unpaid',
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
$topReason = (string) (data_get($summary, 'top_reasons.0.reason') ?? '');
$maxLen = (int) config('saasshop.platform_orders.sync_error_keyword_link_max_len', 200);
$maxLen = max(50, min(1000, $maxLen));
if ($topReason !== '' && mb_strlen($topReason) <= $maxLen) {
$governanceLinks['top_reason'] = BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$governanceLinks['top_reason'] = BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_bmpa_run_id' => $runId,
'bmpa_failed_only' => '1',
'bmpa_error_keyword' => $topReason,
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
}
}

View File

@@ -124,18 +124,18 @@
$reasonGovUrl = '';
if (! $reasonTooLong && $reason !== '') {
if ($type === 'bas') {
$reasonGovUrl = \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$reasonGovUrl = \App\Support\BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_activation_run_id' => $runId,
'sync_status' => 'failed',
'sync_error_keyword' => $reason,
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
}
if ($type === 'bmpa') {
$reasonGovUrl = \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
$reasonGovUrl = \App\Support\BackUrl::withBackAndFragment('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'batch_bmpa_run_id' => $runId,
'bmpa_failed_only' => '1',
'bmpa_error_keyword' => $reason,
]), $safeBackForLinks);
]), $safeBackForLinks, 'filters');
}
}
@endphp

View File

@@ -353,7 +353,7 @@
</div>
</div>
<details class="card mb-20 collapsible filters-card" data-role="collapsible" data-storage-key="admin.platform_orders.filters" open>
<details id="filters" class="card mb-20 collapsible filters-card" data-role="collapsible" data-storage-key="admin.platform_orders.filters" open>
<summary class="collapsible-summary filters-summary">
<div class="flex-between items-center">
<h3 class="mb-0">筛选条件</h3>

View File

@@ -0,0 +1,33 @@
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminPlatformOrderIndexFiltersShouldHaveAnchorIdTest extends TestCase
{
use RefreshDatabase;
protected function loginAsPlatformAdmin(): void
{
$this->seed();
$this->post('/admin/login', [
'email' => 'platform.admin@demo.local',
'password' => 'Platform@123456',
])->assertRedirect('/admin');
}
public function test_platform_orders_filters_panel_should_have_anchor_id_filters(): void
{
$this->loginAsPlatformAdmin();
$html = $this->get('/admin/platform-orders')
->assertOk()
->getContent();
$this->assertStringContainsString('id="filters"', $html);
$this->assertStringContainsString('data-storage-key="admin.platform_orders.filters"', $html);
}
}