This commit is contained in:
2026-08-07 10:45:09 +08:00
parent 897f91af20
commit 830575cc92
17 changed files with 295 additions and 28 deletions
@@ -2,6 +2,7 @@ package com.baiyue.firstleg.controller;
import com.baiyue.common.core.exception.BizException;
import com.baiyue.firstleg.dto.InboundOrderReference;
import com.baiyue.firstleg.dto.OrderApprovedInboundCommand;
import com.baiyue.firstleg.service.InboundOrderCreationService;
import com.baiyue.firstleg.service.UnifiedInboundQueryService;
import com.baiyue.firstleg.dto.UnifiedInboundQuery;
@@ -63,4 +64,28 @@ class InternalInboundOrderReferenceControllerTest {
.isInstanceOf(BizException.class);
verify(unifiedQueryService).page(request);
}
@Test
void approvedOrderRequiresInboundCode() {
assertThatThrownBy(() -> controller.createFromApprovedOrder(
"internal-token", approvedCommand(" ", null)))
.isInstanceOf(BizException.class);
}
@Test
void approvedOrderAllowsMissingCarrier() {
OrderApprovedInboundCommand command = approvedCommand("RK-77", null);
when(service.createFromApprovedOrder(command)).thenReturn(88L);
assertThat(controller.createFromApprovedOrder("internal-token", command).data()).isEqualTo(88L);
verify(service).createFromApprovedOrder(command);
}
private static OrderApprovedInboundCommand approvedCommand(String inboundCode, Long carrierId) {
return new OrderApprovedInboundCommand(
10001L, 77L, "FL-77", inboundCode, 7L, "测试客户", 9L, "义乌仓",
null, null, null, "FBA", "AIR", "空运", carrierId,
carrierId == null ? null : "承运商", null, null, null, null,
null, null, null, null, null, null);
}
}
@@ -0,0 +1,59 @@
package com.baiyue.firstleg.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baiyue.firstleg.dto.OrderApprovedInboundCommand;
import com.baiyue.firstleg.entity.InboundOrderEntity;
import com.baiyue.firstleg.entity.InboundStatusHistoryEntity;
import com.baiyue.firstleg.mapper.InboundOrderMapper;
import com.baiyue.firstleg.mapper.InboundStatusHistoryMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class InboundOrderCreationServiceTest {
@Mock
private InboundOrderMapper orders;
@Mock
private InboundStatusHistoryMapper histories;
@InjectMocks
private InboundOrderCreationService service;
@Test
void shouldUseSubmittedInboundCodeAndKeepReplayIdempotentWithoutCarrier() {
OrderApprovedInboundCommand command = approvedCommand("RK-CUSTOM-77");
InboundOrderEntity existing = new InboundOrderEntity();
existing.setId(900L);
existing.setTenantId(10001L);
existing.setOrderId(77L);
existing.setInboundCode("RK-CUSTOM-77");
when(orders.selectOne(any(Wrapper.class))).thenReturn(null, existing);
long createdId = service.createFromApprovedOrder(command);
long replayedId = service.createFromApprovedOrder(command);
ArgumentCaptor<InboundOrderEntity> inboundCaptor = ArgumentCaptor.forClass(InboundOrderEntity.class);
verify(orders, times(1)).insert(inboundCaptor.capture());
verify(histories, times(1)).insert(any(InboundStatusHistoryEntity.class));
assertThat(inboundCaptor.getValue().getInboundCode()).isEqualTo("RK-CUSTOM-77");
assertThat(inboundCaptor.getValue().getCarrierId()).isNull();
assertThat(createdId).isEqualTo(inboundCaptor.getValue().getId());
assertThat(replayedId).isEqualTo(900L);
}
private static OrderApprovedInboundCommand approvedCommand(String inboundCode) {
return new OrderApprovedInboundCommand(
10001L, 77L, "FL-77", inboundCode, 7L, "测试客户", 9L, "义乌仓",
null, null, null, "FBA", "AIR", "空运", null, null,
null, null, null, null, null, null, null, null, null, null);
}
}