From afba266c0e1fc95fd93425422f9ce948d4ff602a Mon Sep 17 00:00:00 2001 From: yueyang <2495544247@qq.com> Date: Mon, 19 Oct 2026 15:12:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1688=E5=A4=9A=E5=BA=97?= =?UTF-8?q?=E9=93=BA=E5=89=8D=E7=BC=80=E6=94=B6=E5=85=A5=E6=BC=8F=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同一平台多个店铺名前缀应使用 OR 命中;原实现把阿里巴巴、1688、新佰广三个 LIKE 用 AND 连接,导致1688店铺的订单收入账单行被排除。新增多前缀回归测试。 --- .../Services/LedgerRemarkFilter.php | 7 ++-- .../LedgerRemarkFilterTest.php | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) 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'); + } + } }