fix(firstleg): update submitted outer dimensions safely

This commit is contained in:
2026-09-10 11:42:05 +08:00
parent e8890389ff
commit 2821c5e9c7
9 changed files with 235 additions and 23 deletions
@@ -68,6 +68,15 @@ class InboundMeasurementEvidenceOpenApiContractTest {
.contains("不覆盖整批测量数据", "不改变测量提交或审核状态", "客户已确认费用且该票已装柜完成");
assertThat(properties(schemas, "InboundMeasurementCalculationStrategyRequest"))
.containsKeys("measurementId", "version", "coefficientMode", "chargeRuleId");
String outerDimensionsPath = "/api/platform/v1/first-leg/inbounds/{inboundId}"
+ "/measurement/items/{itemId}/outer-dimensions";
assertThat(paths).containsKey(outerDimensionsPath);
Map<String, Object> outerDimensionsOperation = stringMap(
stringMap(paths.get(outerDimensionsPath)).get("put"));
assertThat(outerDimensionsOperation.get("description").toString())
.contains("不覆盖整批测量数据", "不改变测量提交或审核状态", "客户已确认费用且该票已装柜完成");
assertThat(properties(schemas, "InboundMeasurementOuterDimensionsRequest"))
.containsKeys("measurementId", "version", "outerLengthCm", "outerWidthCm", "outerHeightCm");
Map<String, Object> itemProperties = properties(schemas, "InboundMeasurementItem");
assertThat(itemProperties).containsKeys(
@@ -139,6 +139,39 @@ class InboundMeasurementServiceTest {
verify(repository, never()).lockMeasurement(anyLong(), anyLong(), anyLong());
}
@Test
void updatesSubmittedWarehouseOuterDimensionsWithoutReplacingMeasurementBatch() {
InboundOrderEntity inbound = inbound("MEASURE_PENDING");
InboundMeasurementEntity measurement = new InboundMeasurementEntity();
measurement.setId(30L);
measurement.setTenantId(1L);
measurement.setInboundId(10L);
measurement.setStatus("SUBMITTED");
measurement.setVersion(5);
measurement.setTotalVolumeCbm(new BigDecimal("1.8000"));
measurement.setVolumeWeightKg(new BigDecimal("300.600"));
InboundMeasurementItemEntity item = new InboundMeasurementItemEntity();
item.setId(31L);
item.setTenantId(1L);
item.setMeasurementId(30L);
when(repository.lockInbound(1L, 10L)).thenReturn(inbound);
when(repository.lockMeasurement(1L, 10L, 30L)).thenReturn(measurement);
when(repository.listItems(1L, 30L)).thenReturn(List.of(item));
when(repository.updateMeasurement(measurement)).thenReturn(true);
when(repository.updateInbound(inbound)).thenReturn(true);
var response = service.updateOuterDimensions(1L, 10L, 31L,
new InboundMeasurementRequests.UpdateOuterDimensionsRequest(
30L, 5, new BigDecimal("30"), new BigDecimal("20"), new BigDecimal("20")));
assertThat(response.status()).isEqualTo("SUBMITTED");
assertThat(response.itemId()).isEqualTo(31L);
verify(batchService).recalculateOuterDimensions(1L, measurement, List.of(item), 31L,
new BigDecimal("30"), new BigDecimal("20"), new BigDecimal("20"));
verify(repository, never()).replaceItems(anyLong(), anyLong(), any());
assertThat(inbound.getActualVolumeCbm()).isEqualByComparingTo("1.8000");
}
@Test
void correctingWeightKeepsOcrOriginalAndWritesImmutableRevision() {
InboundOrderEntity inbound = inbound("MEASURING");
@@ -133,6 +133,46 @@ class MeasurementBatchServiceTest {
verify(repository, never()).replaceItems(anyLong(), anyLong(), any());
}
@Test
void recalculatesOneSubmittedWarehouseOuterDimensionRowInPlace() {
InboundMeasurementEntity measurement = new InboundMeasurementEntity();
measurement.setId(100L);
measurement.setTenantId(1L);
measurement.setInboundId(10L);
measurement.setSourceType("MANUAL");
measurement.setStatus("SUBMITTED");
measurement.setVersion(4);
measurement.setCreatedBy(9L);
InboundMeasurementItemEntity existing = new InboundMeasurementItemEntity();
existing.setId(200L);
existing.setTenantId(1L);
existing.setMeasurementId(100L);
existing.setInboundDetailId(80001L);
existing.setBoxCode("RK-001#1");
existing.setItemNo("001");
existing.setBoxSpecification("40x30x20cm");
existing.setPackageCount(2);
existing.setLengthCm(new BigDecimal("40"));
existing.setWidthCm(new BigDecimal("30"));
existing.setHeightCm(new BigDecimal("20"));
when(repository.updateItem(existing)).thenReturn(true);
service.recalculateOuterDimensions(1L, measurement, List.of(existing), 200L,
new BigDecimal("30"), new BigDecimal("20"), new BigDecimal("20"));
assertThat(existing.getId()).isEqualTo(200L);
assertThat(existing.getBoxCode()).isEqualTo("RK-001#1");
assertThat(existing.getManualOuterLengthCm()).isEqualByComparingTo("30");
assertThat(existing.getManualOuterWidthCm()).isEqualByComparingTo("20");
assertThat(existing.getManualOuterHeightCm()).isEqualByComparingTo("20");
assertThat(existing.getOuterLengthCm()).isEqualByComparingTo("30.000");
assertThat(existing.getUnitVolumeCbm()).isEqualByComparingTo("0.0120");
assertThat(measurement.getStatus()).isEqualTo("SUBMITTED");
assertThat(measurement.getTotalVolumeCbm()).isEqualByComparingTo("0.0240");
verify(repository).updateItem(existing);
verify(repository, never()).replaceItems(anyLong(), anyLong(), any());
}
@Test
void automaticallyAppliesCustomerDefaultRuleToActualMeasurement() {
CustomerChargeRuleEntity rule = new CustomerChargeRuleEntity();