Compare commits

...

1 Commits

Author SHA1 Message Date
afba266c0e 修复1688多店铺前缀收入漏取
同一平台多个店铺名前缀应使用 OR 命中;原实现把阿里巴巴、1688、新佰广三个 LIKE 用 AND 连接,导致1688店铺的订单收入账单行被排除。新增多前缀回归测试。
2026-10-19 15:12:21 +08:00
2 changed files with 41 additions and 2 deletions

View File

@ -76,10 +76,13 @@ final class LedgerRemarkFilter
if ($plan['prefixes'] !== [] || $plan['excludes'] !== []) {
$sub->where(function (Builder $scope) use ($plan, $storeLike, $storeNotLike): void {
if ($plan['prefixes'] !== []) {
// 本平台前缀的店铺
// 同平台可能有多个店铺名前缀(如阿里巴巴 = 阿里巴巴 / 1688 / 新佰广),
// 任意一个前缀命中即可,不能把多个 LIKE 条件用 AND 串起来。
$scope->orWhere(function (Builder $own) use ($plan, $storeLike): void {
foreach ($plan['prefixes'] as $prefix) {
$storeLike($own, $prefix);
$own->orWhere(function (Builder $one) use ($storeLike, $prefix): void {
$storeLike($one, $prefix);
});
}
});
}

View File

@ -3,7 +3,9 @@
namespace Tests\Unit\EcommerceFinance;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Modules\EcommerceFinance\Services\LedgerRemarkFilter;
use Tests\TestCase;
@ -59,4 +61,38 @@ class LedgerRemarkFilterTest extends TestCase
$this->assertSame($before, $query->toSql());
$this->assertSame([], $query->getBindings());
}
public function test_multiple_store_prefixes_for_the_same_platform_match_with_or(): void
{
Schema::create('ledger_filter_regression_rows', function (Blueprint $table): void {
$table->increments('id');
$table->string('store_name');
$table->string('bill_item');
});
try {
DB::table('ledger_filter_regression_rows')->insert([
['store_name' => '新佰广1688', 'bill_item' => '订单收入'],
['store_name' => '天猫-测试店', 'bill_item' => '订单收入'],
]);
$query = DB::connection()->table('ledger_filter_regression_rows');
LedgerRemarkFilter::applyGroups(
$query,
[[
'platform' => '阿里巴巴',
'prefixes' => ['阿里巴巴', '1688', '新佰广'],
'excludePrefixes' => [],
'items' => ['订单收入'],
]],
'bill_item',
static fn (Builder $sub, string $prefix) => $sub->where('store_name', 'like', $prefix . '%'),
static fn (Builder $sub, string $prefix) => $sub->where('store_name', 'not like', $prefix . '%'),
);
$this->assertSame(['新佰广1688'], $query->pluck('store_name')->all());
} finally {
Schema::dropIfExists('ledger_filter_regression_rows');
}
}
}