From f4c3a95772e64087e5a7b15562bf3e31225f0b6f Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 7 Aug 2026 16:16:59 +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 --- .../service/CartonMeasurementService.java | 24 ++++++++++++++++- .../service/CartonMeasurementServiceTest.java | 26 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/CartonMeasurementService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/CartonMeasurementService.java index cafee26c2..16b515f84 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/CartonMeasurementService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/CartonMeasurementService.java @@ -33,6 +33,8 @@ import java.util.Set; public class CartonMeasurementService { private static final Logger log = LoggerFactory.getLogger(CartonMeasurementService.class); private static final Set DEVICE_WRITABLE_STATUSES = Set.of("WAIT_MEASURE", "MEASURE_REJECTED"); + private static final Set MANUAL_COUNT_EDITABLE_STATUSES = Set.of( + "WAIT_MEASURE", "MEASURING", "MEASURE_PENDING", "MEASURE_REJECTED"); private static final BigDecimal CUBIC_CENTIMETERS_PER_CBM = new BigDecimal("1000000"); private static final BigDecimal VOLUME_WEIGHT_FACTOR = new BigDecimal("167"); private static final String CALCULATION_RULE_VERSION = "V1_CBM_CEILING_4_GIRTH_L2WH"; @@ -88,7 +90,7 @@ public class CartonMeasurementService { if (confirmedPackageCount < 1 || confirmedPackageCount > 1_000_000) { throw new BizException(ResultCode.VALIDATION_FAILED, "确认箱数必须是1至1000000的整数"); } - requireDeviceWritableInbound(tenantId, inboundId); + InboundOrderEntity inbound = requireManualCountEditableInbound(tenantId, inboundId); InboundMeasurementItemEntity item = repository.findItem(tenantId, itemId); if (item == null) { throw new BizException(ResultCode.NOT_FOUND, "单箱测量记录不存在"); @@ -109,6 +111,15 @@ public class CartonMeasurementService { if (!repository.updateMeasurement(measurement)) { throw concurrentModification(); } + // 提交审核后仍允许平台人工修正代表箱数,入库单快照必须随当前批次同步。 + if ("MEASURE_PENDING".equals(inbound.getProcessStatus())) { + inbound.setTotalPackageCount(measurement.getTotalPackageCount()); + inbound.setActualVolumeCbm(measurement.getTotalVolumeCbm()); + inbound.setVolumeWeightKg(measurement.getVolumeWeightKg()); + if (!repository.updateInbound(inbound)) { + throw concurrentModification(); + } + } return result(measurement, item, false); } @@ -251,6 +262,17 @@ public class CartonMeasurementService { return inbound; } + private InboundOrderEntity requireManualCountEditableInbound(long tenantId, long inboundId) { + InboundOrderEntity inbound = repository.findInbound(tenantId, inboundId); + if (inbound == null) { + throw new BizException(ResultCode.NOT_FOUND, "入库单不存在"); + } + if (!MANUAL_COUNT_EDITABLE_STATUSES.contains(inbound.getProcessStatus())) { + throw new BizException(ResultCode.CONFLICT, "当前入库单状态不允许修改确认箱数"); + } + return inbound; + } + private MeasurementImageClient.UploadResult uploadImage(long tenantId, long operatorId, long inboundId, MultipartFile image) { try { diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java index 05ccd9c76..21643995f 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java @@ -78,7 +78,7 @@ class CartonMeasurementServiceTest { assertThat(result.confirmedPackageCount()).isEqualTo(1); assertThat(result.boxCode()).isEqualTo("RK-001#5-1"); assertThat(insertedItem.get().getMeasurementId()).isEqualTo(30001L); - assertThat(insertedItem.get().getTotalVolumeCbm()).isEqualByComparingTo("0.0600"); + assertThat(insertedItem.get().getTotalVolumeCbm()).isEqualByComparingTo("0.0733"); } @Test @@ -129,6 +129,30 @@ class CartonMeasurementServiceTest { verify(repository).updateMeasurement(measurement); } + @Test + void confirmedPackageCountCanBeCorrectedAfterSubmissionAndSyncsInboundSnapshot() { + InboundOrderEntity inbound = inbound("MEASURE_PENDING"); + InboundMeasurementEntity measurement = measurement(30001L, "SUBMITTED", 2); + measurement.setTotalPackageCount(1); + measurement.setTotalVolumeCbm(new BigDecimal("0.0600")); + measurement.setVolumeWeightKg(new BigDecimal("10.020")); + InboundMeasurementItemEntity item = item(40001L, 30001L, 1, 99001L); + when(repository.findInbound(10001L, 70001L)).thenReturn(inbound); + when(repository.findItem(10001L, 40001L)).thenReturn(item); + when(repository.findMeasurement(10001L, 70001L, 30001L)).thenReturn(measurement); + when(repository.updateItem(item)).thenReturn(true); + when(repository.listItems(10001L, 30001L)).thenReturn(List.of(item)); + when(repository.updateMeasurement(measurement)).thenReturn(true); + when(repository.updateInbound(inbound)).thenReturn(true); + + service.updateConfirmedPackageCount(10001L, 70001L, 40001L, 2, 5); + + assertThat(inbound.getTotalPackageCount()).isEqualTo(5); + assertThat(inbound.getActualVolumeCbm()).isEqualByComparingTo("0.3000"); + assertThat(inbound.getVolumeWeightKg()).isEqualByComparingTo("50.100"); + verify(repository).updateInbound(inbound); + } + private CartonMeasurementCommand command() { return new CartonMeasurementCommand("RK-001#5-1", new BigDecimal("60.100"), new BigDecimal("40.200"), new BigDecimal("30.300"), new BigDecimal("12.500"),