diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/mapper/OverseasQuoteMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/mapper/OverseasQuoteMapper.java index 6d70df64a..32b3dcc35 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/mapper/OverseasQuoteMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/mapper/OverseasQuoteMapper.java @@ -16,8 +16,8 @@ public interface OverseasQuoteMapper extends BaseMapper { @Select(""" SELECT COUNT(*) FROM ll_overseas_quote WHERE warehouse_id=#{warehouseId} AND provider_name=#{providerName} AND currency=#{currency} - AND status='ACTIVE' AND id<>#{excludedId} - AND effective_start<=#{effectiveEnd} AND effective_end>=#{effectiveStart} + AND status='ACTIVE' AND id<>#{excludedId} + AND effective_start<=#{effectiveEnd} AND effective_end>=#{effectiveStart} """) int countActiveOverlap(@Param("warehouseId") long warehouseId, @Param("providerName") String providerName, diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/controller/InboundPlanControllerTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/controller/InboundPlanControllerTest.java index d73d29c68..e95ead766 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/controller/InboundPlanControllerTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/controller/InboundPlanControllerTest.java @@ -39,7 +39,7 @@ class InboundPlanControllerTest { void platformPageAllowsAllCustomersWhenCustomerIdIsOmitted() { InboundPlanRequests.Query query = new InboundPlanRequests.Query(1, 20, null, null, null, null, null, null, null, null, null, null, null); - when(service.page("100", query)).thenReturn(new PageResult<>(List.of(), 1, 20, 0, 0)); + when(service.page(null, query)).thenReturn(new PageResult<>(List.of(), 1, 20, 0, 0)); controller.page(platform(), null, query); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/masterdata/quote/service/OverseasQuoteServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/masterdata/quote/service/OverseasQuoteServiceTest.java index 3e7715610..d28e2c658 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/masterdata/quote/service/OverseasQuoteServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/masterdata/quote/service/OverseasQuoteServiceTest.java @@ -5,9 +5,13 @@ import com.baiyue.lastleg.masterdata.quote.entity.OverseasQuote; import com.baiyue.lastleg.masterdata.quote.mapper.OverseasQuoteMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.apache.ibatis.annotations.Select; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.server.ResponseStatusException; +import java.lang.reflect.Method; +import java.time.LocalDate; + import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -36,4 +40,18 @@ class OverseasQuoteServiceTest { .isInstanceOf(ResponseStatusException.class) .hasMessageContaining("409 CONFLICT"); } + + @Test + void overlapQueryUsesExecutableSqlOperators() throws NoSuchMethodException { + Method method = OverseasQuoteMapper.class.getDeclaredMethod("countActiveOverlap", + long.class, String.class, String.class, LocalDate.class, LocalDate.class, long.class); + String sql = String.join(" ", method.getAnnotation(Select.class).value()); + + org.assertj.core.api.Assertions.assertThat(sql) + .contains("id<>#{excludedId}") + .contains("effective_start<=#{effectiveEnd}") + .contains("effective_end>=#{effectiveStart}") + .doesNotContain("<") + .doesNotContain(">"); + } } diff --git a/scripts/admin-test-env-modules/phase4-overseas-master-data.mjs b/scripts/admin-test-env-modules/phase4-overseas-master-data.mjs index 77acae128..8e181bae6 100644 --- a/scripts/admin-test-env-modules/phase4-overseas-master-data.mjs +++ b/scripts/admin-test-env-modules/phase4-overseas-master-data.mjs @@ -32,6 +32,15 @@ async function safeCleanup(context, name, action) { } } +async function continueLifecycle(context, name, action) { + try { + await action() + } catch (error) { + context.assert(MODULE, `${name}生命周期执行`, null, false, + error instanceof Error ? error.message : String(error), BLOCKER) + } +} + function warehousePayload(marker, edited = false) { const suffix = marker.replace(/[^A-Za-z0-9]/g, '').slice(-20).toUpperCase() return { @@ -350,10 +359,12 @@ export async function run(context) { const resource = { marker: context.marker } context.createdResources.phase4OverseasMasterData = resource try { - await createAndVerifyPartnerWarehouse(context, resource) - await quoteLifecycle(context, resource) - await exchangeLifecycle(context, resource) - await vehicleLifecycle(context, resource) + await continueLifecycle(context, '海外报价', async () => { + await createAndVerifyPartnerWarehouse(context, resource) + await quoteLifecycle(context, resource) + }) + await continueLifecycle(context, '月度汇率', () => exchangeLifecycle(context, resource)) + await continueLifecycle(context, '车辆主数据', () => vehicleLifecycle(context, resource)) } finally { await safeCleanup(context, '海外报价', async () => { if (!resource.quote?.id) return