From 83e5108ce628846afee672aa82fa080bc39a4d49 Mon Sep 17 00:00:00 2001 From: renshen <1005457301@qq.com> Date: Tue, 6 Oct 2026 18:12:16 +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=EF=BC=9A=E9=87=8D=E7=BD=AE=E5=90=8E?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E8=87=AA=E5=8A=A8=E5=B8=A6=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 点“重置”或提交空日期时,不再回填近 7 天默认区间,日期框保持为空并做不限日期查询 - 首次进入页面仍保留近 7 天默认区间;导出文件名在无日期时显示“不限日期” - 补充过滤归一化与页面渲染用例 --- .../View/OrderDataPageData.php | 10 +++- .../order-data/after-sales-expenses.blade.php | 6 ++- .../Business/OrderDataPagesUpstreamTest.php | 52 +++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/modules/EcommerceFinance/View/OrderDataPageData.php b/modules/EcommerceFinance/View/OrderDataPageData.php index 13dce4ef..f7a62620 100644 --- a/modules/EcommerceFinance/View/OrderDataPageData.php +++ b/modules/EcommerceFinance/View/OrderDataPageData.php @@ -68,10 +68,16 @@ class OrderDataPageData { $input ??= request()->query(); $shopNames = $this->shopNames($input['shop_name'] ?? $input['shop_names'] ?? null); + $from = $this->date($input['from'] ?? null); + $to = $this->date($input['to'] ?? null); + + // 首次进入页面时给一个近 7 天的默认区间;点了“重置”或提交了空日期后, + // 明确不加日期条件(页面上的日期框保持为空),由用户自己决定下一步再看什么。 + $cleared = ! empty($input['reset']) || array_key_exists('from', $input) || array_key_exists('to', $input); return [ - 'from' => $this->date($input['from'] ?? null) ?: now()->subDays(6)->toDateString(), - 'to' => $this->date($input['to'] ?? null) ?: now()->toDateString(), + 'from' => $from !== '' ? $from : ($cleared ? '' : now()->subDays(6)->toDateString()), + 'to' => $to !== '' ? $to : ($cleared ? '' : now()->toDateString()), 'order_no' => $this->text($input['order_no'] ?? null), // shop_name 保留单值形态,兼容只认单值的调用方;多选统一用 shop_names。 'shop_name' => $shopNames[0] ?? '', 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 777235e1..e330161f 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 @@ -124,6 +124,9 @@ ]); $rows = $orderData['orderDataRows']; $filters = $orderData['orderDataFilters']; + $exportRangeLabel = ($filters['from'] ?? '') === '' && ($filters['to'] ?? '') === '' + ? '不限日期' + : (($filters['from'] ?: '不限') . '_' . ($filters['to'] ?: '不限')); $status = data_get($orderData, 'orderDataStatus.X-Caiwu-Data-Status'); $orderDataError = $orderData['orderDataError']; $afterSalesWorkOrders = $orderData['afterSalesWorkOrders'] ?? [ @@ -396,6 +399,7 @@ 'section' => $section['slug'], 'page' => $page['slug'], 'tab' => $activeTab['slug'] ?? null, + 'reset' => 1, ]) }}" class="upstream-data-button"> 重置 @@ -405,7 +409,7 @@ id="order-data-after-sales-export-button" data-export-contract="order-data.after-sales.current-page-export" data-export-table="order-data-after-sales-table" - data-export-filename="订单售后费用明细_{{ $filters['from'] ?? '开始' }}_{{ $filters['to'] ?? '结束' }}_第{{ $rows?->currentPage() ?? 1 }}页.csv" + data-export-filename="订单售后费用明细_{{ $exportRangeLabel }}_第{{ $rows?->currentPage() ?? 1 }}页.csv" @class(['upstream-data-button', 'is-disabled' => !$rows || $rows->isEmpty()]) @if (!$rows || $rows->isEmpty()) disabled="disabled" aria-disabled="true" @endif aria-label="导出当前页" diff --git a/tests/Feature/Business/OrderDataPagesUpstreamTest.php b/tests/Feature/Business/OrderDataPagesUpstreamTest.php index 2abafd30..615e5da0 100644 --- a/tests/Feature/Business/OrderDataPagesUpstreamTest.php +++ b/tests/Feature/Business/OrderDataPagesUpstreamTest.php @@ -97,6 +97,58 @@ class OrderDataPagesUpstreamTest extends FeatureTestCase ->assertSeeText('ORDER-MULTI-1'); } + public function test_after_sales_filter_normalization_keeps_defaults_and_clears_on_reset(): void + { + $data = app(\Modules\EcommerceFinance\View\OrderDataPageData::class); + + // 首次进入(没有任何参数)仍给近 7 天的默认区间。 + $default = $data->afterSalesFilters([]); + $this->assertSame(now()->subDays(6)->toDateString(), $default['from']); + $this->assertSame(now()->toDateString(), $default['to']); + + // 点“重置”后不再带日期条件,页面上日期框保持为空。 + $cleared = $data->afterSalesFilters(['reset' => 1]); + $this->assertSame('', $cleared['from']); + $this->assertSame('', $cleared['to']); + + $blank = $data->afterSalesFilters(['from' => '', 'to' => '']); + $this->assertSame('', $blank['from']); + $this->assertSame('', $blank['to']); + + $explicit = $data->afterSalesFilters(['from' => '2026-08-01', 'to' => '2026-08-31']); + $this->assertSame('2026-08-01', $explicit['from']); + $this->assertSame('2026-08-31', $explicit['to']); + } + + public function test_after_sales_reset_renders_empty_date_inputs(): void + { + $this->allowOrderDataPages(); + $mirror = Mockery::mock(OrderDataMirrorRepository::class); + $mirror->shouldReceive('ready')->zeroOrMoreTimes()->andReturnTrue(); + $mirror->shouldReceive('shopNames')->zeroOrMoreTimes()->andReturn([]); + $mirror->shouldReceive('afterSales')->once() + ->with( + Mockery::on(static fn (array $filters): bool => $filters['from'] === '' && $filters['to'] === ''), + 1, + 25, + ) + ->andReturn(['rows' => []]); + $this->app->instance(OrderDataMirrorRepository::class, $mirror); + $factory = Mockery::mock(UpstreamQueryCacheFactory::class); + $factory->shouldNotReceive('forSource'); + $this->app->instance(UpstreamQueryCacheFactory::class, $factory); + + $this->loginAs()->get(route('business.pages.show', [ + 'section' => 'order-data', + 'page' => 'raw-data', + 'tab' => 'after-sales-expenses', + 'reset' => 1, + ])) + ->assertOk() + ->assertSee('name="from" type="date" value=""', false) + ->assertSee('name="to" type="date" value=""', false); + } + public function test_order_data_pages_render_cached_upstream_rows_and_filters(): void { $this->allowOrderDataPages();