diff --git a/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java index 8bc8cf9f3..8ae36d4cb 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java @@ -60,7 +60,8 @@ public class InboundMeasurementRepository { .eq(InboundOrderEntity::getTenantId, inbound.getTenantId()) .eq(InboundOrderEntity::getId, inbound.getId()) .set(InboundOrderEntity::getActualGrossWeightKg, inbound.getActualGrossWeightKg()) - .set(InboundOrderEntity::getActualNetWeightKg, inbound.getActualNetWeightKg())) == 1; + .set(InboundOrderEntity::getActualNetWeightKg, inbound.getActualNetWeightKg()) + .set(InboundOrderEntity::getPalletCount, inbound.getPalletCount())) == 1; } public InboundMeasurementEntity findMeasurement(long tenantId, long inboundId, long measurementId) { diff --git a/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundOrderRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundOrderRepository.java index 3d9de0415..e11916d90 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundOrderRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundOrderRepository.java @@ -15,6 +15,7 @@ import com.baiyue.firstleg.entity.InboundPalletAllocationEntity; import com.baiyue.firstleg.entity.InboundStatusHistoryEntity; import com.baiyue.firstleg.entity.InboundTransportSnapshotEntity; import com.baiyue.firstleg.entity.InboundPickupSnapshotEntity; +import com.baiyue.firstleg.entity.InboundWeightResultEntity; import com.baiyue.firstleg.mapper.InboundFileMapper; import com.baiyue.firstleg.mapper.InboundInternalNoteMapper; import com.baiyue.firstleg.mapper.InboundOrderMapper; @@ -22,6 +23,7 @@ import com.baiyue.firstleg.mapper.InboundPalletAllocationMapper; import com.baiyue.firstleg.mapper.InboundStatusHistoryMapper; import com.baiyue.firstleg.mapper.InboundTransportSnapshotMapper; import com.baiyue.firstleg.mapper.InboundPickupSnapshotMapper; +import com.baiyue.firstleg.mapper.InboundWeightResultMapper; import org.springframework.stereotype.Repository; import org.springframework.util.StringUtils; @@ -48,6 +50,8 @@ public class InboundOrderRepository { private InboundInternalNoteMapper notes; @Resource private InboundStatusHistoryMapper histories; + @Resource + private InboundWeightResultMapper weights; public PageResult page(Long tenantId, InboundOrderQuery query) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() @@ -287,6 +291,18 @@ public class InboundOrderRepository { Collectors.joining("、")))); } + public Map confirmedPalletCountsMap(Long tenantId, Map tenantByInbound) { + if (tenantByInbound.isEmpty()) return Map.of(); + return weights.selectList(new LambdaQueryWrapper() + .eq(tenantId != null, InboundWeightResultEntity::getTenantId, tenantId) + .in(InboundWeightResultEntity::getInboundId, tenantByInbound.keySet()) + .eq(InboundWeightResultEntity::getRecognitionStatus, "CONFIRMED")) + .stream() + .filter(item -> owns(tenantByInbound, item.getInboundId(), item.getTenantId())) + .collect(Collectors.groupingBy(InboundWeightResultEntity::getInboundId, + java.util.LinkedHashMap::new, Collectors.summingInt(item -> 1))); + } + private static boolean owns(Map tenantByInbound, Long inboundId, Long tenantId) { return inboundId != null && tenantId != null && tenantId.equals(tenantByInbound.get(inboundId)); } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java index aa46edbec..6fecfa3cd 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java @@ -330,6 +330,7 @@ public class InboundMeasurementService { repository.listWeights(inbound.getTenantId(), inbound.getId())); inbound.setActualGrossWeightKg(totals.grossWeightKg()); inbound.setActualNetWeightKg(totals.netWeightKg()); + inbound.setPalletCount(totals.palletCount()); if ("WAIT_MEASURE".equals(inbound.getProcessStatus())) { inbound.setProcessStatus("MEASURING"); } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java index 219b72682..4f3bd8f81 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java @@ -56,6 +56,8 @@ public class UnifiedInboundQueryService { public UnifiedInboundDetail detail(long tenantId, long orderId) { InboundOrderEntity inbound = inbounds.findByOrderId(tenantId, orderId); if (inbound == null) return null; + applyConfirmedPalletCount(inbound, inbounds.confirmedPalletCountsMap(tenantId, + Map.of(inbound.getId(), inbound.getTenantId()))); InboundOrderDetail detail = inbounds.detail(tenantId, inbound); String mainStatus = mainStatus(inbound.getProcessStatus()); boolean includePhaseThree = requiresPhaseThreeSummary(mainStatus); @@ -93,6 +95,8 @@ public class UnifiedInboundQueryService { var transports = operations.findTransports(phaseThreeOwners); Map owners = records.stream().collect(Collectors.toMap( InboundOrderEntity::getId, InboundOrderEntity::getTenantId, (left, right) -> left)); + var confirmedPalletCounts = inbounds.confirmedPalletCountsMap(null, owners); + records.forEach(inbound -> applyConfirmedPalletCount(inbound, confirmedPalletCounts)); var locationCodes = inbounds.locationCodesMap(null, owners); var pickups = inbounds.pickupMap(null, owners); return records.stream().map(inbound -> summary(inbound, null, preloads.get(inbound.getId()), @@ -101,6 +105,14 @@ public class UnifiedInboundQueryService { transports.get(inbound.getId()), locationCodes.get(inbound.getId()), pickups.get(inbound.getId()))).toList(); } + private static void applyConfirmedPalletCount(InboundOrderEntity inbound, + Map confirmedPalletCounts) { + if ((inbound.getPalletCount() == null || inbound.getPalletCount() <= 0) + && confirmedPalletCounts.getOrDefault(inbound.getId(), 0) > 0) { + inbound.setPalletCount(confirmedPalletCounts.get(inbound.getId())); + } + } + private UnifiedInboundSummary summary(InboundOrderEntity inbound, InboundOrderDetail detail, com.baiyue.firstleg.split.entity.PreloadPlanEntity preload, com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity pick, diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/InboundOrderRepositoryTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/InboundOrderRepositoryTest.java index 66d5a1993..99ef11f61 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/InboundOrderRepositoryTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/InboundOrderRepositoryTest.java @@ -17,6 +17,7 @@ import com.baiyue.firstleg.mapper.InboundPalletAllocationMapper; import com.baiyue.firstleg.mapper.InboundStatusHistoryMapper; import com.baiyue.firstleg.mapper.InboundTransportSnapshotMapper; import com.baiyue.firstleg.mapper.InboundPickupSnapshotMapper; +import com.baiyue.firstleg.mapper.InboundWeightResultMapper; import org.junit.jupiter.api.Test; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.mockito.ArgumentCaptor; @@ -43,6 +44,7 @@ class InboundOrderRepositoryTest { @MockBean private InboundFileMapper files; @MockBean private InboundInternalNoteMapper notes; @MockBean private InboundStatusHistoryMapper histories; + @MockBean private InboundWeightResultMapper weights; @Resource private InboundOrderRepository repository; @Test @SuppressWarnings({"rawtypes", "unchecked"}) diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java index 9d2ef2219..03f7d1c7c 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java @@ -108,7 +108,9 @@ class TenantScopedMutationRepositoryTest { verify(inboundOrders).update(eq(inbound), wrapper.capture()); assertTenantAndId(wrapper.getValue()); assertThat(((LambdaUpdateWrapper) wrapper.getValue()).getSqlSet()) - .contains("actual_gross_weight_kg"); + .contains("actual_gross_weight_kg") + .contains("actual_net_weight_kg") + .contains("pallet_count"); } @Test diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java index c2439be80..10cb7b82b 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java @@ -123,6 +123,7 @@ class InboundMeasurementServiceTest { assertThat(weight.getNetWeightKg()).isNull(); assertThat(inbound.getActualGrossWeightKg()).isNull(); assertThat(inbound.getActualNetWeightKg()).isNull(); + assertThat(inbound.getPalletCount()).isZero(); verify(repository).updateInboundWeightSummary(inbound); } @@ -283,6 +284,7 @@ class InboundMeasurementServiceTest { assertThat(response.netWeightKg()).isEqualByComparingTo("4.536"); assertThat(inbound.getActualGrossWeightKg()).isEqualByComparingTo("6.536"); assertThat(inbound.getActualNetWeightKg()).isEqualByComparingTo("6.536"); + assertThat(inbound.getPalletCount()).isEqualTo(2); assertThat(inbound.getProcessStatus()).isEqualTo("MEASURING"); verify(repository).insertRevision(any(InboundWeightRevisionEntity.class)); } @@ -630,6 +632,7 @@ class InboundMeasurementServiceTest { assertThat(inbound.getActualGrossWeightKg()).isNull(); assertThat(inbound.getActualNetWeightKg()).isNull(); + assertThat(inbound.getPalletCount()).isZero(); verify(repository).updateInboundWeightSummary(inbound); } @@ -655,6 +658,7 @@ class InboundMeasurementServiceTest { assertThat(inbound.getActualGrossWeightKg()).isEqualByComparingTo("5.000"); assertThat(inbound.getActualNetWeightKg()).isEqualByComparingTo("5.000"); + assertThat(inbound.getPalletCount()).isEqualTo(1); verify(repository).updateInboundWeightSummary(inbound); } diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/UnifiedInboundQueryServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/UnifiedInboundQueryServiceTest.java index d0aee7573..13dcd3121 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/UnifiedInboundQueryServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/UnifiedInboundQueryServiceTest.java @@ -13,6 +13,7 @@ import org.junit.jupiter.params.provider.ValueSource; import org.springframework.test.util.ReflectionTestUtils; import java.util.List; +import java.util.Map; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verifyNoInteractions; @@ -71,6 +72,20 @@ class UnifiedInboundQueryServiceTest { assertThat(UnifiedInboundQueryService.requiresPhaseThreeSummary("DELIVERED")).isTrue(); } + @Test + void completedHistoricalInboundUsesConfirmedWeightCountWhenStoredPalletCountIsZero() throws Exception { + InboundOrderEntity inbound = new InboundOrderEntity(); + inbound.setId(88L); + inbound.setPalletCount(0); + var method = UnifiedInboundQueryService.class.getDeclaredMethod( + "applyConfirmedPalletCount", InboundOrderEntity.class, Map.class); + method.setAccessible(true); + + method.invoke(null, inbound, Map.of(88L, 2)); + + assertThat(inbound.getPalletCount()).isEqualTo(2); + } + @ParameterizedTest @ValueSource(strings = {"WAIT_MEASURE", "WAIT_SPLIT"}) void phaseTwoDetailDoesNotQueryPhaseThreeTables(String processStatus) {