This commit is contained in:
2026-08-12 14:37:45 +08:00
parent d183ad6330
commit fcb7c11af4
7 changed files with 162 additions and 13 deletions
@@ -76,6 +76,39 @@ class PlatformCartonScanControllerTest {
assertThat(command.getValue().image().getOriginalFilename()).isEqualTo("carton.jpg");
}
@Test
void manualCartonRouteUsesTheDedicatedManualServiceMethod() throws Exception {
CartonMeasurementService cartonMeasurements = mock(CartonMeasurementService.class);
PlatformInboundMeasurementController controller = new PlatformInboundMeasurementController();
ReflectionTestUtils.setField(controller, "service", mock(InboundMeasurementService.class));
ReflectionTestUtils.setField(controller, "submission", mock(MeasurementSubmissionService.class));
ReflectionTestUtils.setField(controller, "cartonMeasurements", cartonMeasurements);
AuthenticatedUser user = new AuthenticatedUser(90001L, 0L, 0L, null,
"platform_admin", "PLATFORM", "WEB", Set.of("platform:firstleg:inbound:measure:edit"));
MockMvc mvc = MockMvcBuilders.standaloneSetup(controller)
.setCustomArgumentResolvers(authenticationPrincipal(user))
.build();
when(cartonMeasurements.upsertManualForInbound(eq(10001L), eq(90001L), eq(70001L), any()))
.thenReturn(new CartonMeasurementResult(30001L, 1, 40001L, "RK-001#5-1",
null, 1, new BigDecimal("60.1"), new BigDecimal("40.2"), new BigDecimal("30.3"),
new BigDecimal("12.5"), 99001L, "MANUAL-ADMIN",
LocalDateTime.parse("2026-08-12T14:00:00"), true));
MockPart data = new MockPart("data", "data", ("""
{"boxCode":"RK-001#5-1","length":60.1,"width":40.2,"height":30.3,
"weight":12.5,"machineNo":"MANUAL-ADMIN","measuredAt":"2026-08-12T14:00:00"}
""").getBytes(java.nio.charset.StandardCharsets.UTF_8));
data.getHeaders().setContentType(MediaType.APPLICATION_JSON);
MockMultipartFile image = new MockMultipartFile(
"image", "carton.jpg", MediaType.IMAGE_JPEG_VALUE, new byte[] {1, 2, 3});
mvc.perform(multipart("/api/platform/v1/first-leg/inbounds/{inboundId}/measurement/manual-cartons", 70001L)
.file(image).part(data).param("tenantId", "10001"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value("200"));
verify(cartonMeasurements).upsertManualForInbound(eq(10001L), eq(90001L), eq(70001L), any());
}
private HandlerMethodArgumentResolver authenticationPrincipal(AuthenticatedUser user) {
return new HandlerMethodArgumentResolver() {
@Override
@@ -93,6 +93,24 @@ class CartonMeasurementServiceTest {
assertThat(insertedItem.get().getOuterLengthCm()).isEqualByComparingTo("64.000");
assertThat(insertedItem.get().getOuterWidthCm()).isEqualByComparingTo("54.000");
assertThat(insertedItem.get().getOuterHeightCm()).isEqualByComparingTo("54.000");
assertThat(measurement.getSourceType()).isEqualTo(MeasurementBatchService.SOURCE_THIRD_PARTY);
assertThat(measurement.getSourceCode()).isEqualTo("DEVICE");
}
@Test
void manualEntryCreatesManualMeasurementWithoutChangingDeviceEntrySemantics() {
InboundMeasurementEntity measurement = measurement(30001L, "RECEIVED", 0);
when(repository.findItemByBoxCode(10001L, "RK-001#5-1")).thenReturn(null);
when(repository.findLatestEditableMeasurement(10001L, 70001L)).thenReturn(measurement);
when(repository.listItems(10001L, 30001L)).thenAnswer(invocation -> List.of(insertedItem.get()));
when(repository.updateMeasurement(measurement)).thenReturn(true);
CartonMeasurementResult result = service.upsertManualForInbound(
10001L, 90001L, 70001L, acceptanceCommand());
assertThat(result.created()).isTrue();
assertThat(measurement.getSourceType()).isEqualTo(MeasurementBatchService.SOURCE_MANUAL);
assertThat(measurement.getSourceCode()).isEqualTo("PLATFORM");
}
@Test