fix(firstleg): isolate declarations from measurement facts
This commit is contained in:
+8
-1
@@ -24,7 +24,14 @@ class InboundMeasurementEvidenceOpenApiContractTest {
|
||||
Map<String, Object> schemas = stringMap(stringMap(document.get("components")).get("schemas"));
|
||||
Map<String, Object> detailProperties = properties(schemas, "InboundMeasurementDetail");
|
||||
assertThat(detailProperties).containsKeys(
|
||||
"actualGrossWeightKg", "actualNetWeightKg", "items", "weightResults");
|
||||
"actualGrossWeightKg", "actualNetWeightKg", "latestDeclaration", "items", "weightResults");
|
||||
assertThat(stringMap(detailProperties.get("latestDeclaration")))
|
||||
.containsEntry("$ref", "#/components/schemas/InboundMeasurementLatestDeclaration");
|
||||
assertThat(properties(schemas, "InboundMeasurementLatestDeclaration"))
|
||||
.containsKeys("referenceId", "totalPackageCount", "grossWeightKg", "volumeCbm", "goodsName", "items");
|
||||
assertThat(properties(schemas, "InboundMeasurementDeclarationItem"))
|
||||
.containsKeys("inboundDetailId", "itemNo", "cargoName", "packageCount",
|
||||
"lengthCm", "widthCm", "heightCm");
|
||||
assertThat(stringMap(detailProperties.get("items")))
|
||||
.containsEntry("description", "DIMENSION 尺寸测量明细及其图片证据");
|
||||
assertThat(stringMap(detailProperties.get("weightResults")))
|
||||
|
||||
@@ -65,6 +65,10 @@ class InboundMeasurementServiceTest {
|
||||
when(orderCargoClient.measurementDeclaration("internal-token", 1L, 80L)).thenReturn(
|
||||
ApiResponse.success(new OrderCargoClient.MeasurementDeclarationSnapshot(
|
||||
"REF-50", new BigDecimal("2000"), new BigDecimal("20"), "123123")));
|
||||
when(orderCargoClient.listForCartonLabels("internal-token", 1L, 80L)).thenReturn(
|
||||
ApiResponse.success(List.of(new OrderCargoClient.CargoLabelBinding(
|
||||
80001L, 80L, 1, "123123", 3, new BigDecimal("40"),
|
||||
new BigDecimal("30"), new BigDecimal("20")))));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -213,6 +217,71 @@ class InboundMeasurementServiceTest {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void detailComparesLatestDeclarationWithoutMutatingFrozenMeasurementFacts() {
|
||||
InboundOrderEntity inbound = inbound("WAIT_SPLIT");
|
||||
inbound.setMeasureReviewStatus("APPROVED");
|
||||
inbound.setActualGrossWeightKg(new BigDecimal("30.000"));
|
||||
inbound.setActualNetWeightKg(new BigDecimal("11.500"));
|
||||
InboundMeasurementEntity measurement = new InboundMeasurementEntity();
|
||||
measurement.setId(30L);
|
||||
measurement.setStatus("APPROVED");
|
||||
measurement.setOriginalDocumentNo("OLD-REF");
|
||||
measurement.setOriginalGrossWeightKg(new BigDecimal("25.000"));
|
||||
measurement.setOriginalVolumeCbm(new BigDecimal("0.5000"));
|
||||
measurement.setTotalPackageCount(2);
|
||||
measurement.setTotalVolumeCbm(new BigDecimal("0.6000"));
|
||||
InboundMeasurementItemEntity item = new InboundMeasurementItemEntity();
|
||||
item.setId(40L);
|
||||
item.setTenantId(1L);
|
||||
item.setMeasurementId(30L);
|
||||
item.setInboundDetailId(80001L);
|
||||
item.setBoxCode("RK-001#2-1");
|
||||
item.setPackageCount(2);
|
||||
item.setLengthCm(new BigDecimal("45"));
|
||||
item.setWidthCm(new BigDecimal("35"));
|
||||
item.setHeightCm(new BigDecimal("25"));
|
||||
when(repository.findInbound(1L, 10L)).thenReturn(inbound);
|
||||
when(repository.findLatestMeasurement(1L, 10L)).thenReturn(measurement);
|
||||
when(repository.listItems(1L, 30L)).thenReturn(List.of(item));
|
||||
when(repository.listWeights(1L, 10L)).thenReturn(List.of());
|
||||
when(orderCargoClient.measurementDeclaration("internal-token", 1L, 80L)).thenReturn(
|
||||
ApiResponse.success(new OrderCargoClient.MeasurementDeclarationSnapshot(
|
||||
"NEW-REF", new BigDecimal("40.000"), new BigDecimal("0.8000"), "最新申报品名")));
|
||||
when(orderCargoClient.listForCartonLabels("internal-token", 1L, 80L)).thenReturn(
|
||||
ApiResponse.success(List.of(new OrderCargoClient.CargoLabelBinding(
|
||||
80001L, 80L, 1, "最新申报品名", 4, new BigDecimal("50"),
|
||||
new BigDecimal("40"), new BigDecimal("30")))));
|
||||
|
||||
InboundMeasurementResponses.Detail result = service.detail(1L, 10L);
|
||||
|
||||
assertThat(result.originalDocumentNo()).isEqualTo("OLD-REF");
|
||||
assertThat(result.originalGrossWeightKg()).isEqualByComparingTo("25.000");
|
||||
assertThat(result.originalVolumeCbm()).isEqualByComparingTo("0.5000");
|
||||
assertThat(result.actualPackageCount()).isEqualTo(2);
|
||||
assertThat(result.latestDeclaration()).satisfies(latest -> {
|
||||
assertThat(latest.referenceId()).isEqualTo("NEW-REF");
|
||||
assertThat(latest.totalPackageCount()).isEqualTo(4);
|
||||
assertThat(latest.grossWeightKg()).isEqualByComparingTo("40.000");
|
||||
assertThat(latest.volumeCbm()).isEqualByComparingTo("0.8000");
|
||||
assertThat(latest.items()).singleElement().satisfies(declared -> {
|
||||
assertThat(declared.inboundDetailId()).isEqualTo(80001L);
|
||||
assertThat(declared.packageCount()).isEqualTo(4);
|
||||
assertThat(declared.lengthCm()).isEqualByComparingTo("50");
|
||||
});
|
||||
});
|
||||
assertThat(result.items()).singleElement().satisfies(measured -> {
|
||||
assertThat(measured.id()).isEqualTo(40L);
|
||||
assertThat(measured.boxCode()).isEqualTo("RK-001#2-1");
|
||||
assertThat(measured.packageCount()).isEqualTo(2);
|
||||
assertThat(measured.lengthCm()).isEqualByComparingTo("45");
|
||||
});
|
||||
verify(repository, never()).updateInbound(any());
|
||||
verify(repository, never()).updateMeasurement(any());
|
||||
verify(repository, never()).updateItem(any());
|
||||
verify(repository, never()).deleteWeight(anyLong(), anyLong(), anyLong(), anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
void creatingWeightResultNormalizesProviderConfidenceAtBusinessBoundary() {
|
||||
InboundOrderEntity inbound = inbound("WAIT_MEASURE");
|
||||
|
||||
Reference in New Issue
Block a user