diff --git a/modules/EcommerceFinance/Services/LedgerRemarkFilter.php b/modules/EcommerceFinance/Services/LedgerRemarkFilter.php index f65c012d..613a6115 100644 --- a/modules/EcommerceFinance/Services/LedgerRemarkFilter.php +++ b/modules/EcommerceFinance/Services/LedgerRemarkFilter.php @@ -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); + }); } }); } diff --git a/tests/Unit/EcommerceFinance/LedgerRemarkFilterTest.php b/tests/Unit/EcommerceFinance/LedgerRemarkFilterTest.php index b90abb5a..9da44b38 100644 --- a/tests/Unit/EcommerceFinance/LedgerRemarkFilterTest.php +++ b/tests/Unit/EcommerceFinance/LedgerRemarkFilterTest.php @@ -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'); + } + } }