This commit is contained in:
2026-08-06 15:36:23 +08:00
parent 5f8b1f64da
commit 3ecb8d7613
5 changed files with 30 additions and 6 deletions
@@ -23,6 +23,9 @@ import jakarta.annotation.Resource;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import java.time.LocalDate;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -30,9 +33,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.time.LocalDate;
import java.util.List;
@SpringJUnitConfig(InboundOrderRepository.class) @SpringJUnitConfig(InboundOrderRepository.class)
class InboundOrderRepositoryTest { class InboundOrderRepositoryTest {
@MockBean private InboundOrderMapper orders; @MockBean private InboundOrderMapper orders;
@@ -189,6 +189,7 @@ public class OrderRepository {
QueryWrapper<OrderCargoEntity> wrapper = new QueryWrapper<OrderCargoEntity>() QueryWrapper<OrderCargoEntity> wrapper = new QueryWrapper<OrderCargoEntity>()
.select("DISTINCT order_id") .select("DISTINCT order_id")
.eq(tenantId != null, "tenant_id", tenantId) .eq(tenantId != null, "tenant_id", tenantId)
.eq("deleted", 0)
.like("sku_no", fbaCode); .like("sku_no", fbaCode);
return cargoMapper.selectObjs(wrapper).stream().map(value -> ((Number) value).longValue()).toList(); return cargoMapper.selectObjs(wrapper).stream().map(value -> ((Number) value).longValue()).toList();
} }
@@ -31,6 +31,7 @@ import java.util.stream.Collectors;
public class UnifiedOrderQueryService { public class UnifiedOrderQueryService {
private static final Set<String> MAIN_STATUSES = Set.of( private static final Set<String> MAIN_STATUSES = Set.of(
"PENDING_REVIEW", "WAIT_MEASURE", "INBOUNDED", "WAIT_SPLIT", "LOADING", "LOADED", "DELIVERED"); "PENDING_REVIEW", "WAIT_MEASURE", "INBOUNDED", "WAIT_SPLIT", "LOADING", "LOADED", "DELIVERED");
private static final Set<String> REVIEW_STATUSES = Set.of("UNRECORDED", "PENDING", "APPROVED", "REJECTED");
private static final List<OrderStatus> ACTIVE_ORDER_STATUSES = List.copyOf(EnumSet.of( private static final List<OrderStatus> ACTIVE_ORDER_STATUSES = List.copyOf(EnumSet.of(
OrderStatus.SUBMITTED, OrderStatus.APPROVED, OrderStatus.ACCEPTED, OrderStatus.SUBMITTED, OrderStatus.APPROVED, OrderStatus.ACCEPTED,
OrderStatus.PROCESSING, OrderStatus.COMPLETED)); OrderStatus.PROCESSING, OrderStatus.COMPLETED));
@@ -201,10 +202,17 @@ public class UnifiedOrderQueryService {
throw new BizException(ResultCode.BAD_REQUEST, "订单内部状态不合法"); throw new BizException(ResultCode.BAD_REQUEST, "订单内部状态不合法");
} }
} }
if (StringUtils.hasText(query.feeReviewStatus()) && !REVIEW_STATUSES.contains(query.feeReviewStatus())) {
throw new BizException(ResultCode.BAD_REQUEST, "费用审核状态不合法");
}
if (StringUtils.hasText(query.measurementReviewStatus())
&& !REVIEW_STATUSES.contains(query.measurementReviewStatus())) {
throw new BizException(ResultCode.BAD_REQUEST, "测量审核状态不合法");
}
} }
private boolean requiresFirstlegQuery(UnifiedOrderQuery query) { private boolean requiresFirstlegQuery(UnifiedOrderQuery query) {
return StringUtils.hasText(query.mainStatus()) && !"PENDING_REVIEW".equals(query.mainStatus()) return (StringUtils.hasText(query.mainStatus()) && !"PENDING_REVIEW".equals(query.mainStatus()))
|| StringUtils.hasText(query.inboundCode()) || query.expectedArrivalDate() != null || StringUtils.hasText(query.inboundCode()) || query.expectedArrivalDate() != null
|| StringUtils.hasText(query.feeReviewStatus()) || StringUtils.hasText(query.containerNo()) || StringUtils.hasText(query.feeReviewStatus()) || StringUtils.hasText(query.containerNo())
|| StringUtils.hasText(query.cabinetNo()) || query.sailingDate() != null || query.loaded() != null || StringUtils.hasText(query.cabinetNo()) || query.sailingDate() != null || query.loaded() != null
@@ -2,7 +2,7 @@ openapi: 3.0.3
info: info:
title: 柏悦头程订单 API title: 柏悦头程订单 API
description: 业务成功和失败均使用 HTTP 200;仅响应体 code 为字符串 "200" 时表示成功,其他 code 表示失败。 description: 业务成功和失败均使用 HTTP 200;仅响应体 code 为字符串 "200" 时表示成功,其他 code 表示失败。
version: 1.2.0 version: 1.3.0
security: security:
- bearerAuth: [] - bearerAuth: []
paths: paths:
@@ -2,6 +2,7 @@ package com.baiyue.order.service;
import com.baiyue.common.core.api.ApiResponse; import com.baiyue.common.core.api.ApiResponse;
import com.baiyue.common.core.api.PageResult; import com.baiyue.common.core.api.PageResult;
import com.baiyue.common.core.exception.BizException;
import com.baiyue.order.client.FirstlegUnifiedOrderClient; import com.baiyue.order.client.FirstlegUnifiedOrderClient;
import com.baiyue.order.dto.UnifiedOrderQuery; import com.baiyue.order.dto.UnifiedOrderQuery;
import com.baiyue.order.entity.OrderEntity; import com.baiyue.order.entity.OrderEntity;
@@ -14,11 +15,12 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import java.time.LocalDateTime;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -99,6 +101,19 @@ class UnifiedOrderQueryServiceTest {
}); });
} }
@Test
void rejectsUnknownReviewStatusesBeforeQueryingEitherService() {
UnifiedOrderQuery query = new UnifiedOrderQuery(
null, null, null, null, null, null, null, null,
null, "UNKNOWN", null, null, null, null, null, null, "INVALID", null,
null, null, 1, 20);
assertThatThrownBy(() -> service.page(10001L, query))
.isInstanceOf(BizException.class);
verify(orders, never()).unifiedPage(any(), any(), any());
verify(firstleg, never()).page(any(), any());
}
private UnifiedOrderQuery query(String status) { private UnifiedOrderQuery query(String status) {
return new UnifiedOrderQuery(null, null, status, null, null, null, return new UnifiedOrderQuery(null, null, status, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,