diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java index 221f62e3d..9ffd2e52b 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java @@ -61,6 +61,17 @@ public class LoadingRepository { .eq(LoadingEvidenceEntity::getSealNo, sealNo)); } + public LoadingEvidenceEntity findActiveEvidenceByFile(long tenantId, long inboundId, + String evidenceType, long fileId) { + return evidences.selectOne(new LambdaQueryWrapper() + .eq(LoadingEvidenceEntity::getTenantId, tenantId) + .eq(LoadingEvidenceEntity::getInboundId, inboundId) + .eq(LoadingEvidenceEntity::getEvidenceType, evidenceType) + .eq(LoadingEvidenceEntity::getFileId, fileId) + .eq(LoadingEvidenceEntity::getStatus, "ACTIVE") + .last("LIMIT 1")); + } + public void createEvidence(LoadingEvidenceEntity entity) { evidences.insert(entity); } public int voidEvidence(long tenantId, long inboundId, long evidenceId, String reason, diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java index 52467a049..8e97acbdc 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java @@ -34,6 +34,7 @@ import java.security.MessageDigest; import java.util.HexFormat; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -74,6 +75,18 @@ public class LoadingDeliveryService { throw new BizException(ResultCode.CONFLICT, "锁码已用于其他装柜任务"); } } + LoadingEvidenceEntity existingFile = repository.findActiveEvidenceByFile( + tenantId, inboundId, request.evidenceType(), request.fileId()); + if (existingFile != null) { + String requestedSealNo = LoadingEvidenceType.SEAL.equals(request.evidenceType()) + ? request.sealNo().trim() : null; + if (!Objects.equals(existingFile.getSealNo(), requestedSealNo)) { + throw new BizException(ResultCode.CONFLICT, "该带锁码照已绑定其他锁码,请先作废后重新拍摄"); + } + LoadingActionResponse result = new LoadingActionResponse( + requireInbound(tenantId, inboundId).processStatus(), evidenceResponse(tenantId, inboundId)); + return complete(tenantId, inboundId, operatorId, UPSERT_EVIDENCE, key, result); + } var file = validateFile(tenantId, inboundId, request.fileId(), request.evidenceType()); String fileName = file.fileName(); String sealNo = LoadingEvidenceType.SEAL.equals(request.evidenceType()) ? request.sealNo().trim() : null; diff --git a/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java index 7fdc885e3..c2e32e59b 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java @@ -350,6 +350,24 @@ class LoadingDeliveryServiceTest { "PHOTO_STEP_1".equals(value.getEvidenceType()) && "ACTIVE".equals(value.getStatus()))); } + @Test + void replaysTheSameActiveEvidenceFileWithoutAppendingAnotherRecord() { + when(repository.claimOperation(anyLong(), anyLong(), anyLong(), anyString(), anyString(), anyString())).thenReturn(true); + when(repository.findInbound(10, 20)).thenReturn(new Snapshot(20L, 10L, "LOADING", 3)); + LoadingEvidenceEntity existing = evidence("SEAL", 11L, "LOCK-001"); + existing.setId(99L); existing.setInboundId(20L); existing.setTenantId(10L); existing.setStatus("ACTIVE"); + when(repository.findEvidenceBySealNo(10, "LOCK-001")).thenReturn(existing); + when(repository.findActiveEvidenceByFile(10, 20, "SEAL", 11L)).thenReturn(existing); + when(repository.listEvidence(10, 20)).thenReturn(List.of(existing)); + + LoadingActionResponse result = service.upsertEvidence(10, 20, 7, "admin", "same-seal-photo", + new UpsertEvidenceRequest(0, "SEAL", 11L, null, "LOCK-001", null)); + + assertThat(result.evidences().evidences()).hasSize(1); + verify(repository, never()).createEvidence(any()); + verify(files, never()).validate(anyString(), anyLong(), anyLong(), anyLong()); + } + @Test void voidsPhotoWithReasonAndKeepsTheRecord() { when(repository.claimOperation(anyLong(), anyLong(), anyLong(), anyString(), anyString(), anyString())).thenReturn(true);