From bcf44affd79ebfbf12c9ef030aee24f0d12d12c9 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Thu, 24 Sep 2026 14:42:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=B4=E6=A0=87=E7=94=B3=E8=AF=B7=EF=BC=8C?= =?UTF-8?q?=E4=BB=93=E5=82=A8=E8=BD=AC=E8=BF=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/WarehouseTransferService.java | 8 ++++++- .../service/WarehouseTransferServiceTest.java | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java index 8cf95b7d0..f4c8b71fe 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java @@ -758,10 +758,16 @@ public class WarehouseTransferService { && pallet.getPalletNo().equals(request.palletCode().trim())) return detail(transfer.getCustomerId(), transferNo); if (!"GENERATED".equals(pallet.getStatus())) throw conflict("Only a generated pallet can be scan-bound"); if (!pallet.getPalletNo().equals(request.palletCode().trim())) throw conflict("Scanned pallet code does not match this generated pallet"); - var physical = warehouseResources.resolvePallet(request.palletCode().trim()); + // Generation already persisted the warehouse pallet's immutable physical id. + // Resolve by that id during binding instead of relying on the warehouse code + // index, which can lag immediately after a new pallet is confirmed. + var physical = warehouseResources.resolvePallet(pallet.getWarehousePalletId()); if (physical.palletId() != pallet.getWarehousePalletId() || physical.warehouseId() != warehouseId) { throw conflict("Scanned pallet does not belong to this transfer and warehouse"); } + if (!pallet.getPalletNo().equals(physical.palletNo())) { + throw conflict("Generated pallet identity does not match the warehouse pallet"); + } pallet.setStatus("BOUND"); pallet.setBindIdempotencyKey(request.idempotencyKey()); pallet.setBoundAt(LocalDateTime.now()); pallet.setUpdatedAt(LocalDateTime.now()); transferPallets.updateById(pallet); return detail(transfer.getCustomerId(), transferNo); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java index b2262dfbf..864315768 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java @@ -229,6 +229,28 @@ class WarehouseTransferServiceTest { verify(warehouseResources, never()).resolvePallet(anyString()); } + @Test + void scanBindingResolvesNewlyGeneratedPalletByPersistedPhysicalId() { + WarehouseTransferOrder transfer = transfer(WarehouseTransferService.WAIT_PDA_RECEIVING); + transfer.setOperatingWarehouseId("77"); + WarehouseTransferPallet pallet = measuredPallet("GENERATED"); + when(transfers.lockForPda("WTR-1", "77")).thenReturn(transfer); + when(transferPallets.lockOne("TENANT-A", transfer.getId(), pallet.getId())).thenReturn(pallet); + when(warehouseResources.resolvePallet(701L)).thenReturn(new WarehouseResourceGateway.WarehousePalletReference( + 701L, "NEW-PALLET-1", 77L, 801L, "OCCUPIED", "ONT8", 0)); + when(transfers.findNo("TENANT-A", "WTR-1")).thenReturn(transfer); + when(transferItems.selectList(any())).thenReturn(List.of()); + when(sourceOrders.selectList(any())).thenReturn(List.of()); + when(transferPallets.listOrder("TENANT-A", transfer.getId())).thenReturn(List.of(pallet)); + + service.bindPallet(77L, "WTR-1", pallet.getId(), + new WarehouseTransferRequests.PalletBind("NEW-PALLET-1", "BIND-1")); + + assertEquals("BOUND", pallet.getStatus()); + verify(warehouseResources).resolvePallet(701L); + verify(warehouseResources, never()).resolvePallet(anyString()); + } + @Test void palletizeRejectsWhenAnyPersistedPalletIsNotBound() { WarehouseTransferOrder transfer = transfer(WarehouseTransferService.WAIT_PDA_RECEIVING);