From 4e0dcc7f2be477b49eea08457b3bef75dd4d413a Mon Sep 17 00:00:00 2001 From: chenxi Date: Sun, 20 Sep 2026 17:48:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=BF=9B=E9=94=80=E5=AD=98?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=95=86=E5=93=81=E7=BC=96=E7=A0=81=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=20(#218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...dPartyWarehouseStorageMirrorRepository.php | 11 +++-------- ...tyWarehouseStorageMirrorRepositoryTest.php | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/modules/EcommerceFinance/Repositories/ThirdPartyWarehouseStorageMirrorRepository.php b/modules/EcommerceFinance/Repositories/ThirdPartyWarehouseStorageMirrorRepository.php index 48ff2aa6..25eed583 100644 --- a/modules/EcommerceFinance/Repositories/ThirdPartyWarehouseStorageMirrorRepository.php +++ b/modules/EcommerceFinance/Repositories/ThirdPartyWarehouseStorageMirrorRepository.php @@ -268,6 +268,7 @@ class ThirdPartyWarehouseStorageMirrorRepository ->select('wms_co_id')->selectRaw('MAX(Id) AS Id'); $inventoryPairs = $this->connection->table(self::INVENTORY_TABLE) ->where('generation', $inventoryGeneration) + ->where('qty', '!=', 0) ->whereNotNull('sku_code')->where('sku_code', '!=', '') ->select(['wms_co_id', 'sku_code']); $candidates = $this->connection->query()->fromSub($inventoryPairs, 'pairs') @@ -334,14 +335,8 @@ class ThirdPartyWarehouseStorageMirrorRepository $movements = $this->confirmedMovements($headerGeneration, $itemGeneration, null) ->where('h.occurred_at', '>=', $rangeStart) ->where('h.occurred_at', '<', $rangeEnd) - ->where(function (Builder $pairs) use ($pairRows): void { - foreach ($pairRows as $pair) { - $pairs->orWhere(function (Builder $candidate) use ($pair): void { - $candidate->where('h.wms_co_id', (int) $pair->wms_co_id) - ->where('i.sku_code', (string) $pair->sku_code); - }); - } - }) + ->whereIn('h.wms_co_id', $pairRows->pluck('wms_co_id')->unique()->values()->all()) + ->whereIn('i.sku_code', $pairRows->pluck('sku_code')->unique()->values()->all()) ->select([ 'h.wms_co_id', 'h.io_type', 'h.occurred_at', 'i.sku_code', 'i.qty as movement_qty', 'i.qty_type as movement_qty_type', diff --git a/tests/Unit/EcommerceFinance/ThirdPartyWarehouseStorageMirrorRepositoryTest.php b/tests/Unit/EcommerceFinance/ThirdPartyWarehouseStorageMirrorRepositoryTest.php index 77c55abd..e86968a4 100644 --- a/tests/Unit/EcommerceFinance/ThirdPartyWarehouseStorageMirrorRepositoryTest.php +++ b/tests/Unit/EcommerceFinance/ThirdPartyWarehouseStorageMirrorRepositoryTest.php @@ -194,6 +194,25 @@ class ThirdPartyWarehouseStorageMirrorRepositoryTest extends TestCase $this->assertSame(-20.0, (float) $result['data'][0]->sales_out); } + public function test_inventory_report_excludes_zero_only_dirty_product_codes(): void + { + $this->markReady(); + $this->insertInventory('SKU-STOCK', 2, '2026-09-01 00:00:00'); + $this->insertInventory('【商品描述不是商品编码】', 0, '2026-09-01 00:00:00'); + + $result = $this->repository->paginateMonthlyInventoryReport([ + 'month' => '2026-08', + 'product_code' => '', + 'warehouse_provider' => '', + 'category' => '', + ], 1, 25); + $codes = collect($result['data'])->pluck('product_code')->all(); + + $this->assertSame(1, $result['total']); + $this->assertSame(['SKU-STOCK'], $codes); + $this->assertNotContains('【商品描述不是商品编码】', $codes); + } + public function test_third_party_page_remains_ready_when_only_the_all_warehouse_dimension_is_missing(): void { $this->markReady();