From daf0ee2acd7f58edf38becd41ad4e8d380d70c3d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 27 Aug 2026 11:45:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../firstleg/service/ContainerService.java | 9 ++++++- .../service/ContainerServiceTest.java | 1 + .../service/SmartLoadingServiceTest.java | 24 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/ContainerService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/ContainerService.java index d01ab88c4..f93e8e578 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/ContainerService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/ContainerService.java @@ -192,7 +192,14 @@ public class ContainerService { if (repository.containerNoExists(containerNo, id)) throw conflict("集装箱号已存在"); try { if (repository.updateTransport(id, containerNo, voyageNo, request.version(), - operatorId, operatorName) != 1) throw conflict("货柜状态或版本已变化,请刷新后重试"); + operatorId, operatorName) != 1) { + ContainerTransportHistoryEntity concurrent = transportHistories == null ? null + : transportHistories.selectOperation(id, operatorId, operationId); + if (concurrent != null && requestHash.equals(concurrent.getRequestHash())) { + return required(id); + } + throw conflict("货柜状态或版本已变化,请刷新后重试"); + } } catch (DuplicateKeyException ex) { throw conflict("集装箱号已存在"); } ContainerTransportHistoryEntity history = new ContainerTransportHistoryEntity(); history.setContainerBookingId(id); history.setBeforeContainerNo(current.getContainerNo()); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/ContainerServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/ContainerServiceTest.java index 7c0625f34..f0902129a 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/ContainerServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/ContainerServiceTest.java @@ -11,6 +11,7 @@ import com.baiyue.firstleg.dto.ContainerDtos.OceanBookingLinkRequest; import com.baiyue.firstleg.dto.ContainerDtos.OceanBookingUnlinkRequest; import com.baiyue.firstleg.dto.ContainerDtos.TransportUpdateRequest; import com.baiyue.firstleg.entity.ContainerBookingEntity; +import com.baiyue.firstleg.entity.ContainerTransportHistoryEntity; import com.baiyue.firstleg.entity.LoadingPlanEntity; import com.baiyue.firstleg.entity.LoadingPickTaskEntity; import com.baiyue.firstleg.mapper.ContainerTransportHistoryMapper; diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/SmartLoadingServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/SmartLoadingServiceTest.java index 4351f70ad..41a4717ba 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/SmartLoadingServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/SmartLoadingServiceTest.java @@ -625,6 +625,30 @@ class SmartLoadingServiceTest { assertThat(updated.getValue().getWarehouseRemark()).isEqualTo("装柜时注意外箱"); } + @Test + void unchangedQuantityAndCargoSnapshotDoNotWriteAdjustmentHistory() { + LoadingPlanEntity plan = plan("LOADING", 2); + LoadingPlanItemEntity line = item(8, 9, 20, 2); + line.setGrossWeightKg(new BigDecimal("4.00")); + line.setNetWeightKg(new BigDecimal("3.0")); + line.setVolumeCbm(new BigDecimal("1.000")); + line.setPalletCount(0); + when(repository.plan(1L)).thenReturn(plan); + when(repository.item(1L, 8L)).thenReturn(line); + when(repository.booking(99L)).thenReturn(booking()); + when(repository.candidate(1L, 100L, 10L, 20L)).thenReturn(candidate(10)); + when(repository.items(1L)).thenReturn(List.of(line)); + + Plan result = service.adjust(1L, 8L, + new AdjustRequest(2, 2, 0, "adjust-noop"), 7L, "u"); + + assertThat(result.version()).isEqualTo(2); + verify(repository, never()).touch(anyLong(), anyInt(), anyLong(), anyString()); + verify(repository, never()).update(any(LoadingPlanItemEntity.class)); + verify(repository, never()).insert(any(LoadingPlanHistoryEntity.class)); + verify(loadingPickService, never()).sync(anyLong(), any(LoadingPlanItemEntity.class)); + } + @Test void pickedQuantityConflictPrecedesCandidateAvailabilityValidation() { LoadingPlanEntity plan = plan("LOADING", 2);