fix(测试计划): 修复同步关联&重复关联问题

This commit is contained in:
WangXu10 2024-07-18 17:25:26 +08:00 committed by 刘瑞斌
parent 889fecd1ee
commit 6e0c20771e
11 changed files with 45 additions and 18 deletions

View File

@ -87,7 +87,7 @@ public interface ExtApiScenarioMapper {
List<ApiScenario> selectAllCase(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("testPlanId") String testPlanId); List<ApiScenario> selectAllCase(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("testPlanId") String testPlanId);
List<ApiScenario> getListBySelectModules(@Param("projectId") String projectId, @Param("moduleIds") List<String> moduleIds, @Param("testPlanId") String testPlanId); List<ApiScenario> getListBySelectModules(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("moduleIds") List<String> moduleIds, @Param("testPlanId") String testPlanId);
List<ApiScenario> getListBySelectIds(@Param("projectId") String projectId, @Param("ids") List<String> ids, @Param("testPlanId") String testPlanId); List<ApiScenario> getListBySelectIds(@Param("projectId") String projectId, @Param("ids") List<String> ids, @Param("testPlanId") String testPlanId);
} }

View File

@ -708,6 +708,11 @@
<foreach collection="moduleIds" item="moduleId" open="(" separator="," close=")"> <foreach collection="moduleIds" item="moduleId" open="(" separator="," close=")">
#{moduleId} #{moduleId}
</foreach> </foreach>
<if test="!isRepeat">
AND api_scenario.id not in (
select api_scenario_id from test_plan_api_scenario where test_plan_id = #{testPlanId}
)
</if>
</select> </select>
<select id="getListBySelectIds" resultType="io.metersphere.api.domain.ApiScenario"> <select id="getListBySelectIds" resultType="io.metersphere.api.domain.ApiScenario">

View File

@ -105,7 +105,7 @@ public interface ExtApiTestCaseMapper {
List<ApiTestCase> selectAllApiCase(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("testPlanId") String testPlanId); List<ApiTestCase> selectAllApiCase(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("testPlanId") String testPlanId);
List<ApiTestCase> getListBySelectModules(@Param("projectId") String projectId, @Param("moduleIds") List<String> moduleIds, @Param("testPlanId") String testPlanId); List<ApiTestCase> getListBySelectModules(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("moduleIds") List<String> moduleIds, @Param("testPlanId") String testPlanId);
List<ApiTestCase> getListBySelectIds(@Param("projectId") String projectId, @Param("ids") List<String> ids, @Param("testPlanId") String testPlanId); List<ApiTestCase> getListBySelectIds(@Param("projectId") String projectId, @Param("ids") List<String> ids, @Param("testPlanId") String testPlanId);

View File

@ -649,6 +649,11 @@
<foreach collection="moduleIds" item="moduleId" open="(" separator="," close=")"> <foreach collection="moduleIds" item="moduleId" open="(" separator="," close=")">
#{moduleId} #{moduleId}
</foreach> </foreach>
<if test="!isRepeat">
AND api_test_case.id not in (
select api_case_id from test_plan_api_case where test_plan_id = #{testPlanId}
)
</if>
</select> </select>
<select id="getListBySelectIds" resultType="io.metersphere.api.domain.ApiTestCase"> <select id="getListBySelectIds" resultType="io.metersphere.api.domain.ApiTestCase">

View File

@ -101,7 +101,7 @@ public interface ExtFunctionalCaseMapper {
List<FunctionalCase> selectAllFunctionalCase(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("testPlanId") String testPlanId); List<FunctionalCase> selectAllFunctionalCase(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("testPlanId") String testPlanId);
List<FunctionalCase> getListBySelectModules(@Param("projectId") String projectId, @Param("moduleIds") List<String> moduleIds, @Param("testPlanId") String testPlanId); List<FunctionalCase> getListBySelectModules(@Param("isRepeat") boolean isRepeat, @Param("projectId") String projectId, @Param("moduleIds") List<String> moduleIds, @Param("testPlanId") String testPlanId);
List<FunctionalCase> getListBySelectIds(@Param("projectId") String projectId, @Param("ids") List<String> ids, @Param("testPlanId") String testPlanId); List<FunctionalCase> getListBySelectIds(@Param("projectId") String projectId, @Param("ids") List<String> ids, @Param("testPlanId") String testPlanId);
} }

View File

@ -930,6 +930,11 @@
<foreach collection="moduleIds" item="moduleId" open="(" separator="," close=")"> <foreach collection="moduleIds" item="moduleId" open="(" separator="," close=")">
#{moduleId} #{moduleId}
</foreach> </foreach>
<if test="!isRepeat">
AND functional_case.id not in (
select functional_case_id from test_plan_functional_case where test_plan_id = #{testPlanId}
)
</if>
</select> </select>

View File

@ -25,9 +25,9 @@ public interface ExtFunctionalCaseTestMapper {
List<TestPlanCaseExecuteHistoryDTO> getPlanExecuteHistoryList(@Param("caseId") String caseId, @Param("planId") String planId); List<TestPlanCaseExecuteHistoryDTO> getPlanExecuteHistoryList(@Param("caseId") String caseId, @Param("planId") String planId);
List<ApiTestCase> selectApiCaseByCaseIds(@Param("caseIds") List<String> caseIds); List<ApiTestCase> selectApiCaseByCaseIds(@Param("isRepeat") boolean isRepeat, @Param("caseIds") List<String> caseIds, @Param("testPlanId") String testPlanId);
List<ApiScenario> selectApiScenarioByCaseIds(@Param("caseIds") List<String> caseIds); List<ApiScenario> selectApiScenarioByCaseIds(@Param("isRepeat") boolean isRepeat, @Param("caseIds") List<String> caseIds, @Param("testPlanId") String testPlanId);
List<FunctionalCaseTest> selectApiAndScenarioIdsFromCaseIds(@Param("caseIds") List<String> functionalCaseIds); List<FunctionalCaseTest> selectApiAndScenarioIdsFromCaseIds(@Param("caseIds") List<String> functionalCaseIds);
} }

View File

@ -223,6 +223,11 @@
#{caseId} #{caseId}
</foreach> </foreach>
</if> </if>
<if test="!isRepeat">
AND api_test_case.id not in (
select api_case_id from test_plan_api_case where test_plan_id = #{testPlanId}
)
</if>
</select> </select>
@ -243,6 +248,11 @@
#{caseId} #{caseId}
</foreach> </foreach>
</if> </if>
<if test="!isRepeat">
AND api_scenario.id not in (
select api_scenario_id from test_plan_api_scenario where test_plan_id = #{testPlanId}
)
</if>
</select> </select>
<select id="selectApiAndScenarioIdsFromCaseIds" <select id="selectApiAndScenarioIdsFromCaseIds"
resultType="io.metersphere.functional.domain.FunctionalCaseTest"> resultType="io.metersphere.functional.domain.FunctionalCaseTest">

View File

@ -596,7 +596,7 @@ public class TestPlanApiCaseService extends TestPlanResourceService {
List<ApiTestCase> apiTestCaseList = new ArrayList<>(); List<ApiTestCase> apiTestCaseList = new ArrayList<>();
//获取全选的模块数据 //获取全选的模块数据
if (CollectionUtils.isNotEmpty(dto.getModuleIds())) { if (CollectionUtils.isNotEmpty(dto.getModuleIds())) {
apiTestCaseList = extApiTestCaseMapper.getListBySelectModules(apiCase.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId()); apiTestCaseList = extApiTestCaseMapper.getListBySelectModules(isRepeat, apiCase.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId());
} }
if (CollectionUtils.isNotEmpty(dto.getSelectIds())) { if (CollectionUtils.isNotEmpty(dto.getSelectIds())) {
@ -638,7 +638,7 @@ public class TestPlanApiCaseService extends TestPlanResourceService {
List<ApiTestCase> apiTestCaseList = new ArrayList<>(); List<ApiTestCase> apiTestCaseList = new ArrayList<>();
//获取全选的模块数据 //获取全选的模块数据
if (CollectionUtils.isNotEmpty(dto.getModuleIds())) { if (CollectionUtils.isNotEmpty(dto.getModuleIds())) {
apiTestCaseList = extApiTestCaseMapper.getListBySelectModules(apiCase.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId()); apiTestCaseList = extApiTestCaseMapper.getListBySelectModules(isRepeat, apiCase.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId());
} }
if (CollectionUtils.isNotEmpty(dto.getSelectIds())) { if (CollectionUtils.isNotEmpty(dto.getSelectIds())) {

View File

@ -207,7 +207,7 @@ public class TestPlanApiScenarioService extends TestPlanResourceService {
List<ApiScenario> scenarioList = new ArrayList<>(); List<ApiScenario> scenarioList = new ArrayList<>();
//获取全选的模块数据 //获取全选的模块数据
if (CollectionUtils.isNotEmpty(dto.getModuleIds())) { if (CollectionUtils.isNotEmpty(dto.getModuleIds())) {
scenarioList = extApiScenarioMapper.getListBySelectModules(apiScenario.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId()); scenarioList = extApiScenarioMapper.getListBySelectModules(isRepeat, apiScenario.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId());
} }
if (CollectionUtils.isNotEmpty(dto.getSelectIds())) { if (CollectionUtils.isNotEmpty(dto.getSelectIds())) {

View File

@ -806,13 +806,13 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
// 选择了全部模块 // 选择了全部模块
List<FunctionalCase> functionalCaseList = extFunctionalCaseMapper.selectAllFunctionalCase(isRepeat, functional.getModules().getProjectId(), testPlan.getId()); List<FunctionalCase> functionalCaseList = extFunctionalCaseMapper.selectAllFunctionalCase(isRepeat, functional.getModules().getProjectId(), testPlan.getId());
buildTestPlanFunctionalCaseDTO(functional, functionalCaseList, testPlan, user, testPlanFunctionalCaseList); buildTestPlanFunctionalCaseDTO(functional, functionalCaseList, testPlan, user, testPlanFunctionalCaseList);
handleSyncCase(functionalCaseList, functional, testPlan, user); handleSyncCase(isRepeat, functionalCaseList, functional, testPlan, user);
} else { } else {
AssociateCaseDTO dto = super.getCaseIds(moduleMaps); AssociateCaseDTO dto = super.getCaseIds(moduleMaps);
List<FunctionalCase> functionalCaseList = new ArrayList<>(); List<FunctionalCase> functionalCaseList = new ArrayList<>();
//获取全选的模块数据 //获取全选的模块数据
if (CollectionUtils.isNotEmpty(dto.getModuleIds())) { if (CollectionUtils.isNotEmpty(dto.getModuleIds())) {
functionalCaseList = extFunctionalCaseMapper.getListBySelectModules(functional.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId()); functionalCaseList = extFunctionalCaseMapper.getListBySelectModules(isRepeat, functional.getModules().getProjectId(), dto.getModuleIds(), testPlan.getId());
} }
if (CollectionUtils.isNotEmpty(dto.getSelectIds())) { if (CollectionUtils.isNotEmpty(dto.getSelectIds())) {
@ -831,7 +831,7 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
if (CollectionUtils.isNotEmpty(functionalCaseList)) { if (CollectionUtils.isNotEmpty(functionalCaseList)) {
List<FunctionalCase> list = functionalCaseList.stream().sorted(Comparator.comparing(FunctionalCase::getPos).reversed()).toList(); List<FunctionalCase> list = functionalCaseList.stream().sorted(Comparator.comparing(FunctionalCase::getPos).reversed()).toList();
buildTestPlanFunctionalCaseDTO(functional, list, testPlan, user, testPlanFunctionalCaseList); buildTestPlanFunctionalCaseDTO(functional, list, testPlan, user, testPlanFunctionalCaseList);
handleSyncCase(functionalCaseList, functional, testPlan, user); handleSyncCase(isRepeat, functionalCaseList, functional, testPlan, user);
} }
} }
@ -841,30 +841,32 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
/** /**
* 处理同步添加功能用例关联的用例 * 处理同步添加功能用例关联的用例
* *
* @param isRepeat
* @param functionalCaseList * @param functionalCaseList
* @param functional * @param functional
* @param testPlan * @param testPlan
* @param user * @param user
*/ */
private void handleSyncCase(List<FunctionalCase> functionalCaseList, BaseCollectionAssociateRequest functional, TestPlan testPlan, SessionUser user) { private void handleSyncCase(boolean isRepeat, List<FunctionalCase> functionalCaseList, BaseCollectionAssociateRequest functional, TestPlan testPlan, SessionUser user) {
if (BooleanUtils.isTrue(functional.getModules().isSyncCase())) { if (BooleanUtils.isTrue(functional.getModules().isSyncCase())) {
handleApiCaseData(functionalCaseList, functional, testPlan, user); handleApiCaseData(isRepeat, functionalCaseList, functional, testPlan, user);
handleApiScenarioData(functionalCaseList, functional, testPlan, user); handleApiScenarioData(isRepeat, functionalCaseList, functional, testPlan, user);
} }
} }
/** /**
* 处理场景用例数据 * 处理场景用例数据
* *
* @param isRepeat
* @param functionalCaseList * @param functionalCaseList
* @param functional * @param functional
* @param testPlan * @param testPlan
* @param user * @param user
*/ */
private void handleApiScenarioData(List<FunctionalCase> functionalCaseList, BaseCollectionAssociateRequest functional, TestPlan testPlan, SessionUser user) { private void handleApiScenarioData(boolean isRepeat, List<FunctionalCase> functionalCaseList, BaseCollectionAssociateRequest functional, TestPlan testPlan, SessionUser user) {
if (StringUtils.isNotBlank(functional.getModules().getApiScenarioCollectionId()) && checkApiCollection(testPlan, functional.getModules().getApiScenarioCollectionId(), CaseType.SCENARIO_CASE.getKey())) { if (StringUtils.isNotBlank(functional.getModules().getApiScenarioCollectionId()) && checkApiCollection(testPlan, functional.getModules().getApiScenarioCollectionId(), CaseType.SCENARIO_CASE.getKey())) {
List<String> caseIds = functionalCaseList.stream().map(FunctionalCase::getId).toList(); List<String> caseIds = functionalCaseList.stream().map(FunctionalCase::getId).toList();
List<ApiScenario> scenarioList = extFunctionalCaseTestMapper.selectApiScenarioByCaseIds(caseIds); List<ApiScenario> scenarioList = extFunctionalCaseTestMapper.selectApiScenarioByCaseIds(isRepeat, caseIds, testPlan.getId());
List<TestPlanApiScenario> testPlanApiScenarioList = new ArrayList<>(); List<TestPlanApiScenario> testPlanApiScenarioList = new ArrayList<>();
testPlanApiScenarioService.buildTestPlanApiScenarioDTO(functional.getModules().getApiScenarioCollectionId(), scenarioList, testPlan, user, testPlanApiScenarioList); testPlanApiScenarioService.buildTestPlanApiScenarioDTO(functional.getModules().getApiScenarioCollectionId(), scenarioList, testPlan, user, testPlanApiScenarioList);
if (CollectionUtils.isNotEmpty(testPlanApiScenarioList)) { if (CollectionUtils.isNotEmpty(testPlanApiScenarioList)) {
@ -881,10 +883,10 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
* @param testPlan * @param testPlan
* @param user * @param user
*/ */
private void handleApiCaseData(List<FunctionalCase> functionalCaseList, BaseCollectionAssociateRequest functional, TestPlan testPlan, SessionUser user) { private void handleApiCaseData(boolean isRepeat, List<FunctionalCase> functionalCaseList, BaseCollectionAssociateRequest functional, TestPlan testPlan, SessionUser user) {
if (StringUtils.isNotBlank(functional.getModules().getApiCaseCollectionId()) && checkApiCollection(testPlan, functional.getModules().getApiCaseCollectionId(), CaseType.API_CASE.getKey())) { if (StringUtils.isNotBlank(functional.getModules().getApiCaseCollectionId()) && checkApiCollection(testPlan, functional.getModules().getApiCaseCollectionId(), CaseType.API_CASE.getKey())) {
List<String> caseIds = functionalCaseList.stream().map(FunctionalCase::getId).toList(); List<String> caseIds = functionalCaseList.stream().map(FunctionalCase::getId).toList();
List<ApiTestCase> apiTestCaseList = extFunctionalCaseTestMapper.selectApiCaseByCaseIds(caseIds); List<ApiTestCase> apiTestCaseList = extFunctionalCaseTestMapper.selectApiCaseByCaseIds(isRepeat, caseIds, testPlan.getId());
List<TestPlanApiCase> testPlanApiCaseList = new ArrayList<>(); List<TestPlanApiCase> testPlanApiCaseList = new ArrayList<>();
testPlanApiCaseService.buildTestPlanApiCaseDTO(functional.getModules().getApiCaseCollectionId(), apiTestCaseList, testPlan, user, testPlanApiCaseList); testPlanApiCaseService.buildTestPlanApiCaseDTO(functional.getModules().getApiCaseCollectionId(), apiTestCaseList, testPlan, user, testPlanApiCaseList);
if (CollectionUtils.isNotEmpty(testPlanApiCaseList)) { if (CollectionUtils.isNotEmpty(testPlanApiCaseList)) {