fix(dispatch): use supported capacity for default draft groups

This commit is contained in:
2026-10-15 18:45:05 +08:00
parent cda5f3dc32
commit 2631bd3af4
3 changed files with 40 additions and 3 deletions
@@ -163,6 +163,7 @@ class DispatchServiceTest {
ArgumentCaptor<DispatchDraftContainer> group = ArgumentCaptor.forClass(DispatchDraftContainer.class);
verify(draftContainers).insert(group.capture());
assertNotNull(group.getValue().getId());
assertEquals(30, group.getValue().getCapacity());
assertEquals(group.getValue().getId(), lock.getValue().getDraftContainerId());
assertNotNull(lock.getValue().getExpiresAt());
assertEquals(null, lock.getValue().getDispatchOrderId());
@@ -676,6 +677,40 @@ class DispatchServiceTest {
verify(orders, never()).insert(any(DispatchOrder.class)); verify(items, never()).insert(any(DispatchItem.class));
}
@Test
void groupedPreArrangeRejectsUnsupportedStoredCapacityBeforeCreatingDispatches() {
var fixture = twoGroupFixture();
for (Integer capacity : java.util.Arrays.asList(null, 0, 31, 500)) {
fixture.containers().get(0).setCapacity(capacity);
var error = assertThrows(ResponseStatusException.class,
() -> service.preArrangeDraft("7", fixture.request()));
assertEquals(409, error.getStatusCode().value());
assertEquals("车辆大小仅支持15托或30托", error.getReason());
}
verify(orders, never()).insert(any(DispatchOrder.class));
verify(items, never()).insert(any(DispatchItem.class));
}
@Test
void groupedPreArrangeRejectsThirtyOnePalletsInThirtyPalletVehicle() {
twoGroupFixture();
var palletIds = java.util.stream.LongStream.rangeClosed(100, 130).boxed().toList();
var bound = palletIds.stream().map(id -> {
var lock = new DispatchPalletLock();
lock.setPlanPalletId(id);
return lock;
}).toList();
when(locks.lockActiveByDraftContainer("draft-multi", 21L)).thenReturn(bound);
var request = new DispatchRequests.PreArrangeDraft("draft-multi",
List.of(new DispatchRequests.DraftGroup(21L, palletIds, List.of())));
var error = assertThrows(ResponseStatusException.class,
() -> service.preArrangeDraft("7", request));
assertEquals(409, error.getStatusCode().value());
assertEquals("装车分组超过车型托位容量", error.getReason());
verify(orders, never()).insert(any(DispatchOrder.class));
verify(items, never()).insert(any(DispatchItem.class));
}
@Test
void secondGroupFailureRollsBackFirstGroupInsertInTheSameTransaction() {
var fixture = twoGroupFixture();