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">
refresh
重置
@@ -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();