From 86632ef3834eee42c479bd2c61fcb77a5e31b387 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 10 Aug 2026 18:40:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../firstleg/client/WarehousePalletLocationClient.java | 3 ++- .../service/MeasurementLocationOccupationService.java | 2 +- .../service/MeasurementLocationOccupationServiceTest.java | 2 ++ .../java/com/baiyue/warehouse/dto/PalletAllocationDtos.java | 3 ++- .../warehouse/service/PalletLocationAllocationService.java | 6 +++++- .../warehouse/dto/PalletAllocationDtosValidationTest.java | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/client/WarehousePalletLocationClient.java b/firstleg/src/main/java/com/baiyue/firstleg/client/WarehousePalletLocationClient.java index ef0f51e13..7e72bf142 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/client/WarehousePalletLocationClient.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/client/WarehousePalletLocationClient.java @@ -43,7 +43,8 @@ public interface WarehousePalletLocationClient { BigDecimal totalVolumeCbm, BigDecimal palletCapacityCbm, String palletType, LocalDateTime expiresAt, boolean measurementCompleted) {} record ConfirmRequest(long tenantId, long warehouseId, String sourceService, long businessId, - long operatorId, BigDecimal totalVolumeCbm, BigDecimal palletCapacityCbm) {} + long operatorId, BigDecimal totalVolumeCbm, BigDecimal palletCapacityCbm, + int packageCount) {} record ReleaseRequest(long tenantId, String sourceService, long businessId, long operatorId, String reason) {} record SelectiveReleaseRequest(long tenantId, String sourceService, long businessId, diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementLocationOccupationService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementLocationOccupationService.java index 25b884bce..e3cba658e 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementLocationOccupationService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementLocationOccupationService.java @@ -52,7 +52,7 @@ public class MeasurementLocationOccupationService { WarehousePalletLocationClient.BatchResult occupied = requireSuccess(call(() -> warehouse.confirm( internalToken, new WarehousePalletLocationClient.ConfirmRequest(resourceTenantId, warehouseId, SOURCE_SERVICE, inboundId, operatorId, volume, - properties.getDefaultPalletCapacityCbm()))), "测量完成后库位占用失败"); + properties.getDefaultPalletCapacityCbm(), packageCount))), "测量完成后库位占用失败"); allocations.replace(tenantId, inboundId, warehouseId, resourceTenantId, properties.getDefaultPalletCapacityCbm(), packageCount, occupied); } catch (RuntimeException failure) { diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/MeasurementLocationOccupationServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/MeasurementLocationOccupationServiceTest.java index a916ec621..3376805ad 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/MeasurementLocationOccupationServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/MeasurementLocationOccupationServiceTest.java @@ -65,6 +65,7 @@ class MeasurementLocationOccupationServiceTest { verify(warehouse).confirm(org.mockito.ArgumentMatchers.eq("internal-token"), confirm.capture()); assertThat(confirm.getValue().tenantId()).isEqualTo(PLATFORM_RESOURCE_TENANT); assertThat(confirm.getValue().businessId()).isEqualTo(INBOUND); + assertThat(confirm.getValue().packageCount()).isEqualTo(20); verify(allocations, times(2)).replace( org.mockito.ArgumentMatchers.eq(BUSINESS_TENANT), @@ -96,6 +97,7 @@ class MeasurementLocationOccupationServiceTest { ArgumentCaptor.forClass(WarehousePalletLocationClient.ConfirmRequest.class); verify(warehouse).confirm(org.mockito.ArgumentMatchers.eq("internal-token"), confirm.capture()); assertThat(confirm.getValue().tenantId()).isEqualTo(PLATFORM_RESOURCE_TENANT); + assertThat(confirm.getValue().packageCount()).isEqualTo(20); verify(allocations, times(2)).replace( org.mockito.ArgumentMatchers.eq(BUSINESS_TENANT), diff --git a/warehouse/src/main/java/com/baiyue/warehouse/dto/PalletAllocationDtos.java b/warehouse/src/main/java/com/baiyue/warehouse/dto/PalletAllocationDtos.java index 44c7e085f..050da95d7 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/dto/PalletAllocationDtos.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/dto/PalletAllocationDtos.java @@ -39,7 +39,8 @@ public final class PalletAllocationDtos { @Min(1) long businessId, @Min(1) long operatorId, @NotNull @DecimalMin(value = "0", inclusive = false) @Digits(integer = 12, fraction = 6) BigDecimal totalVolumeCbm, - @NotNull @DecimalMin(value = "0", inclusive = false) @Digits(integer = 12, fraction = 6) BigDecimal palletCapacityCbm + @NotNull @DecimalMin(value = "0", inclusive = false) @Digits(integer = 12, fraction = 6) BigDecimal palletCapacityCbm, + @Min(1) int packageCount ) { } diff --git a/warehouse/src/main/java/com/baiyue/warehouse/service/PalletLocationAllocationService.java b/warehouse/src/main/java/com/baiyue/warehouse/service/PalletLocationAllocationService.java index 57123741f..beed201f1 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/service/PalletLocationAllocationService.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/service/PalletLocationAllocationService.java @@ -110,9 +110,13 @@ public class PalletLocationAllocationService { } active.sort(Comparator.comparingLong(LocationDtos.ActiveResource::reservationId)); List targets = new ArrayList<>(active.size()); + int perAllocation = (int) Math.ceil((double) request.packageCount() / active.size()); + int remainingPackages = request.packageCount(); for (int index = 0; index < active.size(); index++) { + int allocatedPackages = Math.min(perAllocation, remainingPackages); + remainingPackages -= allocatedPackages; targets.add(new LocationDtos.OccupancyTarget(active.get(index).reservationId(), - split.allocations().get(index).allocatedVolumeCbm(), null)); + split.allocations().get(index).allocatedVolumeCbm(), allocatedPackages)); } List occupied = locationResourceService.confirmOccupied( new LocationDtos.ConfirmCommand(request.tenantId(), request.warehouseId(), request.sourceService(), diff --git a/warehouse/src/test/java/com/baiyue/warehouse/dto/PalletAllocationDtosValidationTest.java b/warehouse/src/test/java/com/baiyue/warehouse/dto/PalletAllocationDtosValidationTest.java index 8f4edcc50..5d6a0b88e 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/dto/PalletAllocationDtosValidationTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/dto/PalletAllocationDtosValidationTest.java @@ -20,7 +20,7 @@ class PalletAllocationDtosValidationTest { assertThat(validator.validate(new PalletAllocationDtos.ReserveRequest(0L, 20L, "FIRSTLEG", 88L, "RK-001", "measure-88", 9L, BigDecimal.ONE, BigDecimal.ONE, "STANDARD", expiresAt, true))).isEmpty(); assertThat(validator.validate(new PalletAllocationDtos.ConfirmRequest(0L, 20L, "FIRSTLEG", 88L, - 9L, BigDecimal.ONE, BigDecimal.ONE))).isEmpty(); + 9L, BigDecimal.ONE, BigDecimal.ONE, 20))).isEmpty(); assertThat(validator.validate(new PalletAllocationDtos.ReleaseRequest(0L, "FIRSTLEG", 88L, 9L, "入库补偿"))).isEmpty(); assertThat(validator.validate(new PalletAllocationDtos.SelectiveReleaseRequest(0L, "FIRSTLEG", 88L,