fix: retain scanned carton traceability in measurement drafts

This commit is contained in:
2026-09-02 17:57:35 +08:00
parent 2a0f942234
commit 6296f032f0
6 changed files with 155 additions and 12 deletions
@@ -138,6 +138,41 @@ class MeasurementBatchServiceTest {
org.mockito.ArgumentMatchers.eq(100L), any());
}
@Test
void manualDraftKeepsExactScannedCartonTraceability() {
InboundMeasurementEntity existing = new InboundMeasurementEntity();
existing.setId(100L);
existing.setTenantId(1L);
existing.setInboundId(10L);
existing.setStatus("RECEIVED");
existing.setVersion(3);
InboundMeasurementItemEntity scanned = new InboundMeasurementItemEntity();
scanned.setInboundDetailId(80001L);
scanned.setItemNo("001");
scanned.setExternalDetailNo("INB-001#1-1");
scanned.setBoxCode("INB-001#1-1");
scanned.setScannedShipmentId("FBA-001");
scanned.setMachineNo("MJ-01");
scanned.setDeviceMeasuredAt(LocalDateTime.of(2026, 9, 2, 10, 0));
when(repository.findMeasurement(1L, 10L, 100L)).thenReturn(existing);
when(repository.updateMeasurement(existing)).thenReturn(true);
when(repository.listItems(1L, 100L)).thenReturn(List.of(scanned));
service.saveBatch(new MeasurementBatchCommand(
1L, 10L, 100L, 3, "MANUAL", "PLATFORM", null, null, null,
LocalDateTime.now(), null, null, null, null, null, 9L, List.of(item(BigDecimal.ONE))));
ArgumentCaptor<List<InboundMeasurementItemEntity>> items = ArgumentCaptor.forClass(List.class);
verify(repository).replaceItems(org.mockito.ArgumentMatchers.eq(1L),
org.mockito.ArgumentMatchers.eq(100L), items.capture());
InboundMeasurementItemEntity saved = items.getValue().get(0);
assertThat(saved.getBoxCode()).isEqualTo("INB-001#1-1");
assertThat(saved.getExternalDetailNo()).isEqualTo("INB-001#1-1");
assertThat(saved.getScannedShipmentId()).isEqualTo("FBA-001");
assertThat(saved.getMachineNo()).isEqualTo("MJ-01");
assertThat(saved.getDeviceMeasuredAt()).isEqualTo(LocalDateTime.of(2026, 9, 2, 10, 0));
}
private MeasurementBatchCommand.Item item(BigDecimal unitWeight) {
return new MeasurementBatchCommand.Item(
80001L, "001", "A", 2, new BigDecimal("40"), new BigDecimal("30"),