订单售后费用导入:只有完整覆盖所选日期时才使用导入数据 #424

Merged
renshen merged 1 commits from fix/renshen-import-coverage into main 2026-10-21 13:53:39 +08:00
2 changed files with 49 additions and 4 deletions

View File

@ -43,7 +43,30 @@ class AfterSalesCostRowRepository
return false;
}
return $this->filtered($filters)->limit(1)->exists();
// 指定单号时,导入表里命中该单就完整(同单的所有明细行都在导入数据里)。
if (trim((string) ($filters['order_no'] ?? '')) !== '') {
return $this->filtered($filters)->limit(1)->exists();
}
$from = trim((string) ($filters['from'] ?? ''));
$to = trim((string) ($filters['to'] ?? ''));
// 不限日期时无法保证覆盖范围,回退镜像,避免把导入数据当成全量。
if ($from === '' || $to === '') {
return false;
}
$range = $this->filtered(['shop_names' => $filters['shop_names'] ?? []])
->selectRaw('MIN(order_time) as min_time, MAX(order_time) as max_time')
->first();
if (! $range || $range->min_time === null) {
return false;
}
// 只有导入范围完整覆盖所选日期时才使用导入数据,避免跨月时数据不全。
return substr((string) $range->min_time, 0, 10) <= $from
&& substr((string) $range->max_time, 0, 10) >= $to;
}
/**

View File

@ -27,6 +27,26 @@ class AfterSalesCostImportTest extends FeatureTestCase
'combine_type' => '组合单品',
]));
DB::table('ops_after_sales_cost_rows')->insert(AfterSalesCostRowRepository::toRecord([
'shop_name' => '天猫-亿家达旗舰店',
'online_order_no' => '5120748758529014000',
'product_code' => 'SJ038999N1410V01',
'order_time' => '2026-06-01 00:00:00',
'product_quantity' => 1,
'product_amount' => 10,
'product_cost' => 5,
]));
DB::table('ops_after_sales_cost_rows')->insert(AfterSalesCostRowRepository::toRecord([
'shop_name' => '天猫-亿家达旗舰店',
'online_order_no' => '5120748758529014001',
'product_code' => 'SJ038998N1410V01',
'order_time' => '2026-06-30 23:00:00',
'product_quantity' => 1,
'product_amount' => 10,
'product_cost' => 5,
]));
$result = app(OrderDataPageData::class)->afterSalesRows([
'from' => '2026-06-01',
'to' => '2026-06-30',
@ -36,9 +56,11 @@ class AfterSalesCostImportTest extends FeatureTestCase
], 1, 20);
$this->assertSame('imported', $result['status']['X-Caiwu-Data-Status']);
$this->assertCount(1, $result['rows']);
$this->assertSame('SJ038020N1410V02', $result['rows'][0]['product_code']);
$this->assertEquals(110.53, $result['rows'][0]['product_cost']);
$this->assertCount(3, $result['rows']);
$target = collect($result['rows'])->firstWhere('product_code', 'SJ038020N1410V02');
$this->assertNotNull($target);
$this->assertEquals(110.53, $target['product_cost']);
}
public function test_import_command_reads_the_jst_export_file(): void