From 2aec157a1968f5fcbb0d8a7d78a207b4c37f1a3a Mon Sep 17 00:00:00 2001 From: renshen <1005457301@qq.com> Date: Mon, 17 Aug 2026 16:48:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=94=AE=E5=90=8E=E8=B4=B9?= =?UTF-8?q?=E7=94=A8=E6=98=8E=E7=BB=86=E5=BD=93=E5=89=8D=E9=A1=B5=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在订单售后费用明细筛选区增加当前页 CSV 导出,并覆盖空数据和 CSV 安全处理。 --- .../order-data/after-sales-expenses.blade.php | 70 ++++++++++++++++++- .../Business/OrderDataPagesUpstreamTest.php | 41 ++++++++++- 2 files changed, 106 insertions(+), 5 deletions(-) diff --git a/resources/views/business/pages/order-data/after-sales-expenses.blade.php b/resources/views/business/pages/order-data/after-sales-expenses.blade.php index 79706d7f..623275c9 100644 --- a/resources/views/business/pages/order-data/after-sales-expenses.blade.php +++ b/resources/views/business/pages/order-data/after-sales-expenses.blade.php @@ -167,6 +167,20 @@ 重置 + @@ -179,7 +193,7 @@
- +
@foreach ($columns as $field => $header) @@ -192,7 +206,11 @@ @foreach ($columns as $field => $header) @php $value = data_get($row, $field); @endphp -
isset($numberFields[$field])])> + isset($numberFields[$field])]) + > @if ($field === 'product_link' && $value) @@ -236,3 +254,51 @@ + + diff --git a/tests/Feature/Business/OrderDataPagesUpstreamTest.php b/tests/Feature/Business/OrderDataPagesUpstreamTest.php index adbe7833..d2d03913 100644 --- a/tests/Feature/Business/OrderDataPagesUpstreamTest.php +++ b/tests/Feature/Business/OrderDataPagesUpstreamTest.php @@ -46,19 +46,31 @@ class OrderDataPagesUpstreamTest extends FeatureTestCase $factory->shouldReceive('forSource')->twice()->with('operations_replica')->andReturn($cache); $this->app->instance(UpstreamQueryCacheFactory::class, $factory); - $this->loginAs() + $afterSalesResponse = $this->loginAs() ->get(route('business.pages.show', [ 'section' => 'order-data', 'page' => 'after-sales-expenses', 'order_no' => 'ORDER-1', 'from' => '2026-08-01', 'to' => '2026-08-09', - ])) + ])); + + $afterSalesResponse ->assertOk() ->assertSeeText('ORDER-1') ->assertSeeText('测试店铺') ->assertSeeText('123.45') - ->assertSeeText('DIRECT'); + ->assertSeeText('DIRECT') + ->assertSeeText('导出当前页') + ->assertSee('id="order-data-after-sales-export-button"', false) + ->assertSee('data-export-contract="order-data.after-sales.current-page-export"', false) + ->assertSee('data-export-table="order-data-after-sales-table"', false) + ->assertSee('data-export-value="ORDER-1"', false) + ->assertSee('data-export-value="123.45"', false) + ->assertSee('data-export-number="true"', false) + ->assertSee('window.setTimeout(() => {', false) + ->assertSee('URL.revokeObjectURL(url);', false) + ->assertSee('订单售后费用明细_2026-08-01_2026-08-09_第1页.csv', false); $this->get(route('business.pages.show', [ 'section' => 'order-data', @@ -92,6 +104,29 @@ class OrderDataPagesUpstreamTest extends FeatureTestCase ->assertSeeText('暂无数据'); } + public function test_after_sales_export_is_disabled_when_the_current_page_has_no_rows(): void + { + $this->allowOrderDataPages(); + $cache = Mockery::mock(UpstreamQueryCache::class); + $cache->shouldReceive('remember')->once()->andReturn(['rows' => []]); + $cache->shouldReceive('responseHeaders')->once()->andReturn([ + 'X-Caiwu-Data-Status' => 'direct', + ]); + $factory = Mockery::mock(UpstreamQueryCacheFactory::class); + $factory->shouldReceive('forSource')->once()->with('operations_replica')->andReturn($cache); + $this->app->instance(UpstreamQueryCacheFactory::class, $factory); + + $this->loginAs() + ->get(route('business.pages.show', [ + 'section' => 'order-data', + 'page' => 'after-sales-expenses', + ])) + ->assertOk() + ->assertSeeText('导出当前页') + ->assertSee('id="order-data-after-sales-export-button"', false) + ->assertSee('disabled="disabled"', false); + } + private function allowOrderDataPages(): void { $this->user->update(['locale' => 'zh-CN']);