diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/dto/DeliveryRequests.java b/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/dto/DeliveryRequests.java index 33ef7acd4..c61e717d4 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/dto/DeliveryRequests.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/dto/DeliveryRequests.java @@ -23,7 +23,7 @@ public final class DeliveryRequests { @NotBlank @Size(max = 64) String pickupMethod, @NotBlank @Size(max = 64) String loadingType, @Size(max = 64) String vehicleType, - @Size(max = 64) String vehicleSize, + @jakarta.validation.constraints.Pattern(regexp = "15托|30托") String vehicleSize, @Size(max = 128) String driverName, @Size(max = 64) String driverPhone, @Size(max = 64) String vehiclePlate, diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/dto/DispatchRequests.java b/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/dto/DispatchRequests.java index 3167ab72e..2c6ed8808 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/dto/DispatchRequests.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/dto/DispatchRequests.java @@ -39,7 +39,7 @@ public final class DispatchRequests { public DraftPallet(Long planPalletId, String draftToken) { this(planPalletId, draftToken, null); } } - public record DraftContainer(@NotBlank @Size(max = 64) String draftToken, @NotNull @Min(1) @Max(500) Integer capacity) {} + public record DraftContainer(@NotBlank @Size(max = 64) String draftToken, @NotNull Integer capacity) {} public record DraftRelease(@NotBlank @Size(max = 64) String draftToken) { } diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/service/DispatchService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/service/DispatchService.java index cf6d9291b..90aabd930 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/service/DispatchService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/service/DispatchService.java @@ -123,6 +123,9 @@ public class DispatchService { @Transactional public DispatchContainerResponse createDraftContainer(String operatorId, DispatchRequests.DraftContainer request) { + if (!Set.of(15, 30).contains(request.capacity())) { + throw new ResponseStatusException(HttpStatus.CONFLICT, "车辆大小仅支持15托或30托"); + } DispatchDraft draft = ensureDraft(operatorId, request.draftToken()); int next = draftContainers.findByToken(request.draftToken()).stream().mapToInt(DispatchDraftContainer::getSequenceNo).max().orElse(0) + 1; DispatchDraftContainer c = new DispatchDraftContainer(); c.setId(IdWorker.getId()); c.setDraftId(draft.getId()); c.setDraftToken(request.draftToken()); c.setSequenceNo(next); c.setCapacity(request.capacity()); c.setCreatedAt(LocalDateTime.now()); c.setUpdatedAt(LocalDateTime.now()); draftContainers.insert(c); diff --git a/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml b/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml index 150518692..e1c2f2814 100644 --- a/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml +++ b/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml @@ -2118,7 +2118,7 @@ components: required: [draftToken, capacity] properties: draftToken: { type: string, minLength: 1, maxLength: 64 } - capacity: { type: integer, minimum: 1, maximum: 500 } + capacity: { type: integer, enum: [15, 30] } SmartDispatchDraft: type: object required: [draftToken, containers] @@ -2159,7 +2159,7 @@ components: pickupMethod: { type: string, maxLength: 64 } loadingType: { type: string, maxLength: 64 } vehicleType: { type: string, nullable: true, maxLength: 64 } - vehicleSize: { type: string, nullable: true, maxLength: 64 } + vehicleSize: { type: string, nullable: true, enum: [15托, 30托] } driverName: { type: string, nullable: true, maxLength: 128 } driverPhone: { type: string, nullable: true, maxLength: 64 } vehiclePlate: { type: string, nullable: true, maxLength: 64 } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/PlatformDispatchOutboundContractTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/PlatformDispatchOutboundContractTest.java index 600e871ba..0f5679676 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/PlatformDispatchOutboundContractTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/PlatformDispatchOutboundContractTest.java @@ -181,6 +181,7 @@ class PlatformDispatchOutboundContractTest { assertTrue(yaml.contains("platform:overseas-warehouse:outbound:list")); assertTrue(yaml.contains("platform:overseas-warehouse:outbound:create")); assertTrue(yaml.contains("platform:overseas-warehouse:outbound:cancel")); + assertTrue(yaml.contains("vehicleSize: { type: string, nullable: true, enum: [15托, 30托] }")); } private static void assertPermission(Method method, String permission) { diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/SmartDispatchOpenApiContractTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/SmartDispatchOpenApiContractTest.java index 4817f8d90..2e6f27c46 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/SmartDispatchOpenApiContractTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/SmartDispatchOpenApiContractTest.java @@ -25,6 +25,7 @@ class SmartDispatchOpenApiContractTest { assertTrue(yaml.contains("/api/platform/v1/last-leg/dispatches/drafts/{draftToken}/containers/{containerId}:")); assertTrue(yaml.contains("draftContainerId:")); assertTrue(yaml.contains("SmartDispatchDraftContainer:")); + assertTrue(yaml.contains("capacity: { type: integer, enum: [15, 30] }")); assertTrue(yaml.contains("SmartDispatchDraft:")); assertTrue(yaml.contains("platform:overseas-warehouse:inbound-order:list")); assertTrue(yaml.contains("platform:overseas-warehouse:inbound-order:smart-dispatch")); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchServiceTest.java index 1d3aa7415..59b49b718 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchServiceTest.java @@ -252,6 +252,17 @@ class DispatchServiceTest { verify(locks).findActiveByDraftContainer("draft-1", 21L); } + @Test + void draftContainerOnlyAcceptsFifteenOrThirtyPalletVehicles() { + ResponseStatusException exception = assertThrows(ResponseStatusException.class, + () -> service.createDraftContainer("7", new DispatchRequests.DraftContainer("draft-1", 14))); + + assertEquals(409, exception.getStatusCode().value()); + assertEquals("车辆大小仅支持15托或30托", exception.getReason()); + verify(drafts, never()).lockActive(any(), any()); + verify(draftContainers, never()).insert(any(DispatchDraftContainer.class)); + } + @Test void rejectsPalletAlreadyLockedByAnotherDispatch() { when(candidates.lockSelected("100", List.of(10L))).thenReturn(List.of(candidate(10L, null, "ONT8")));