feat(通用设置): 增加批量清空标签功能

This commit is contained in:
guoyuqi 2024-09-29 17:34:12 +08:00 committed by Yuki Guo
parent 994861ae7a
commit e48c01a8aa
21 changed files with 121 additions and 56 deletions

View File

@ -27,6 +27,8 @@ public class ApiCaseBatchEditRequest extends ApiTestCaseBatchRequest implements
private String type;
@Schema(description = "是否追加标签")
private boolean append = false;
@Schema(description = "默认不清空所有标签")
private boolean clear = false;
@Schema(description = "环境id")
@Size(max = 50, message = "{api_test_case.env_id.length_range}")
private String environmentId;

View File

@ -47,6 +47,9 @@ public class ApiDefinitionBatchUpdateRequest extends ApiDefinitionBatchRequest {
@Schema(description = "是否追加", requiredMode = Schema.RequiredMode.REQUIRED)
private boolean append = false;
@Schema(description = "是否清空")
private boolean clear = false;
public List<String> getTags() {
if (tags == null) {
return new ArrayList<>(0);

View File

@ -27,6 +27,8 @@ public class ApiMockBatchEditRequest extends ApiTestCaseBatchRequest implements
private String type;
@Schema(description = "是否追加标签")
private boolean append = false;
@Schema(description = "默认不清空所有标签")
private boolean clear = false;
@Schema(description = "状态 开启/关闭")
private boolean enable;

View File

@ -27,6 +27,8 @@ public class ApiScenarioBatchEditRequest extends ApiScenarioBatchRequest impleme
private String type;
@Schema(description = "默认覆盖原标签")
private boolean append = false;
@Schema(description = "默认不清空所有标签")
private boolean clear = false;
@Schema(description = "环境id")
@Size(max = 50, message = "{api_test_case.environment_id.length_range}")
private String envId;

View File

@ -449,7 +449,7 @@ public class ApiDefinitionMockService {
});
}
} else {
updateMock.setTags(ServiceUtils.parseTags(request.getTags()));
updateMock.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags()));
mapper.updateByExampleSelective(updateMock, example);
}
}

View File

@ -651,7 +651,7 @@ public class ApiDefinitionService extends MoveNodeService {
} else {
//替换标签
ApiDefinition apiDefinition = new ApiDefinition();
apiDefinition.setTags(ServiceUtils.parseTags(request.getTags()));
apiDefinition.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags()));
apiDefinition.setProjectId(request.getProjectId());
apiDefinition.setUpdateTime(System.currentTimeMillis());
apiDefinition.setUpdateUser(userId);

View File

@ -535,7 +535,7 @@ public class ApiTestCaseService extends MoveNodeService {
});
}
} else {
updateCase.setTags(ServiceUtils.parseTags(request.getTags()));
updateCase.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags()));
mapper.updateByExampleSelective(updateCase, example);
}
}

View File

@ -331,7 +331,7 @@ public class ApiScenarioService extends MoveNodeService {
});
}
} else {
updateScenario.setTags(ServiceUtils.parseTags(request.getTags().stream().distinct().toList()));
updateScenario.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags().stream().distinct().toList()));
mapper.updateByExampleSelective(updateScenario, example);
}
}
@ -583,6 +583,7 @@ public class ApiScenarioService extends MoveNodeService {
/**
* 当文件管理更新了关联资源的 csv 文件版本时
* 前端文件并未更新这里使用时进行对比使用较新的文件版本
*
* @param csvVariables
* @param dbCsv
*/

View File

@ -750,14 +750,24 @@ public class ApiDefinitionControllerTests extends BaseTest {
apiDefinitionBatchUpdateRequest.setSelectIds(List.of("1001", "1002"));
apiDefinitionBatchUpdateRequest.setTags(new LinkedHashSet<>(List.of("tag-append", "tag-append1")));
apiDefinitionBatchUpdateRequest.setAppend(true);
apiDefinitionBatchUpdateRequest.setClear(false);
this.requestPostWithOk(BATCH_UPDATE, apiDefinitionBatchUpdateRequest);
assertBatchUpdateApiDefinition(apiDefinitionBatchUpdateRequest, List.of("1001", "1002"));
// 修改标签覆盖
apiDefinitionBatchUpdateRequest.setSelectIds(List.of("1003", "1004"));
apiDefinitionBatchUpdateRequest.setTags(new LinkedHashSet<>(List.of("tag-append", "tag-append1")));
apiDefinitionBatchUpdateRequest.setAppend(false);
apiDefinitionBatchUpdateRequest.setClear(false);
this.requestPostWithOk(BATCH_UPDATE, apiDefinitionBatchUpdateRequest);
assertBatchUpdateApiDefinition(apiDefinitionBatchUpdateRequest, List.of("1003", "1004"));
apiDefinitionBatchUpdateRequest.setClear(true);
this.requestPostWithOk(BATCH_UPDATE, apiDefinitionBatchUpdateRequest);
ApiDefinitionExample apiDefinitionExample = new ApiDefinitionExample();
apiDefinitionExample.createCriteria().andIdIn(List.of("1003", "1004"));
List<ApiDefinition> apiDefinitions = apiDefinitionMapper.selectByExample(apiDefinitionExample);
for (ApiDefinition definition : apiDefinitions) {
Assertions.assertTrue(CollectionUtils.isEmpty(definition.getTags()));
}
// 自定义字段覆盖
apiDefinitionBatchUpdateRequest.setType("customs");
apiDefinitionBatchUpdateRequest.setSelectIds(List.of("1002", "1003", "1004"));
@ -766,6 +776,7 @@ public class ApiDefinitionControllerTests extends BaseTest {
field.setValue(JSON.toJSONString(List.of("test1-batch")));
apiDefinitionBatchUpdateRequest.setCustomField(field);
apiDefinitionBatchUpdateRequest.setAppend(false);
apiDefinitionBatchUpdateRequest.setClear(false);
this.requestPostWithOk(BATCH_UPDATE, apiDefinitionBatchUpdateRequest);
// 修改协议类型
apiDefinitionBatchUpdateRequest.setType("method");

View File

@ -607,6 +607,7 @@ public class ApiDefinitionMockControllerTests extends BaseTest {
request.setProjectId(DEFAULT_PROJECT_ID);
request.setType("Tags");
request.setAppend(true);
request.setClear(false);
request.setSelectAll(true);
request.setTags(new LinkedHashSet<>(List.of("tag1", "tag3", "tag4")));
requestPostWithOkAndReturn(BATCH_EDIT, request);
@ -623,10 +624,16 @@ public class ApiDefinitionMockControllerTests extends BaseTest {
//覆盖标签
request.setTags(new LinkedHashSet<>(List.of("tag1")));
request.setAppend(false);
request.setClear(false);
requestPostWithOkAndReturn(BATCH_EDIT, request);
apiDefinitionMockMapper.selectByExample(example).forEach(apiTestCase -> {
Assertions.assertEquals(apiTestCase.getTags(), List.of("tag1"));
});
request.setClear(true);
requestPostWithOkAndReturn(BATCH_EDIT, request);
apiDefinitionMockMapper.selectByExample(example).forEach(apiTestCase -> {
Assertions.assertTrue(CollectionUtils.isEmpty(apiTestCase.getTags()));
});
//标签为空 报错
request.setTags(new LinkedHashSet<>());
this.requestPost(BATCH_EDIT, request, status().is4xxClientError());

View File

@ -1621,6 +1621,7 @@ public class ApiScenarioControllerTests extends BaseTest {
request.setProjectId(DEFAULT_PROJECT_ID);
request.setType("Tags");
request.setAppend(true);
request.setClear(false);
request.setSelectAll(true);
request.setTags(new LinkedHashSet<>(List.of("tag1", "tag3", "tag4")));
requestPostAndReturn(BATCH_EDIT, request);
@ -1654,10 +1655,17 @@ public class ApiScenarioControllerTests extends BaseTest {
//覆盖标签
request.setTags(new LinkedHashSet<>(List.of("tag1")));
request.setAppend(false);
request.setClear(false);
requestPostAndReturn(BATCH_EDIT, request);
apiScenarioMapper.selectByExample(example).forEach(scenario -> {
Assertions.assertEquals(scenario.getTags(), List.of("tag1"));
});
request.setAppend(false);
request.setClear(true);
requestPostAndReturn(BATCH_EDIT, request);
apiScenarioMapper.selectByExample(example).forEach(scenario -> {
Assertions.assertTrue(CollectionUtils.isEmpty(scenario.getTags()));
});
//标签为空 报错
request.setTags(new LinkedHashSet<>());
this.requestPost(BATCH_EDIT, request, ERROR_REQUEST_MATCHER);

View File

@ -1101,6 +1101,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
request.setProjectId(DEFAULT_PROJECT_ID);
request.setType("Tags");
request.setAppend(true);
request.setClear(false);
request.setSelectAll(true);
request.setTags(new LinkedHashSet<>(List.of("tag1", "tag3", "tag4")));
requestPostWithOkAndReturn(BATCH_EDIT, request);
@ -1117,10 +1118,16 @@ public class ApiTestCaseControllerTests extends BaseTest {
//覆盖标签
request.setTags(new LinkedHashSet<>(List.of("tag1")));
request.setAppend(false);
request.setClear(false);
requestPostWithOkAndReturn(BATCH_EDIT, request);
apiTestCaseMapper.selectByExample(example).forEach(apiTestCase -> {
Assertions.assertEquals(apiTestCase.getTags(), List.of("tag1"));
});
request.setClear(true);
requestPostWithOkAndReturn(BATCH_EDIT, request);
apiTestCaseMapper.selectByExample(example).forEach(apiTestCase -> {
Assertions.assertTrue(CollectionUtils.isEmpty(apiTestCase.getTags()));
});
//标签为空 报错
request.setTags(new LinkedHashSet<>());
this.requestPost(BATCH_EDIT, request, ERROR_REQUEST_MATCHER);

View File

@ -16,6 +16,9 @@ public class BugBatchUpdateRequest extends BugBatchRequest{
@Schema(description = "是否追加", requiredMode = Schema.RequiredMode.REQUIRED)
private boolean append;
@Schema(description = "是否清空")
private boolean clear;
@Schema(description = "更新人")
private String updateUser;

View File

@ -492,7 +492,7 @@ public class BugService {
List<String> batchIds = getBatchIdsByRequest(request);
// 批量日志{修改之前}
List<LogDTO> logs = getBatchLogByRequest(batchIds, OperationLogType.UPDATE.name(), OperationLogModule.BUG_MANAGEMENT_INDEX, "/bug/batch-update",
request.getProjectId(), true, request.isAppend(), request.getTags(), currentUser);
request.getProjectId(), true, request.isAppend(), request.isClear() ? new ArrayList<>() : request.getTags(), currentUser);
operationLogService.batchAdd(logs);
// 目前只做标签的批量编辑
if (request.isAppend()) {
@ -513,8 +513,8 @@ public class BugService {
sqlSession.flushStatements();
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
} else {
request.setTags(ServiceUtils.parseTags(request.getTags()));
// 标签(覆盖)
// 标签(清空/覆盖)
request.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags()));
request.setUpdateUser(currentUser);
request.setUpdateTime(System.currentTimeMillis());
extBugMapper.batchUpdate(request, batchIds);
@ -721,6 +721,7 @@ public class BugService {
/**
* 处理平台全量缺陷
*
* @param project 项目
* @param request 同步请求参数
* @param currentUser 当前用户
@ -1455,6 +1456,7 @@ public class BugService {
/**
* 是否插件默认模板
*
* @param templateId 模板ID
* @param pluginTemplate 插件模板
* @return 是否插件默认模板
@ -1969,7 +1971,6 @@ public class BugService {
}
/**
*
* @param atomicPos 位置
* @param batchBugMapper 批量操作缺陷
* @param batchBugContentMapper 批量操作缺陷内容

View File

@ -51,6 +51,7 @@ import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlConfig;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@ -380,16 +381,29 @@ public class BugControllerTests extends BaseTest {
// TAG追加
request.setTags(List.of("TAG", "TEST_TAG"));
request.setAppend(true);
request.setClear(false);
this.requestPost(BUG_BATCH_UPDATE, request, status().isOk());
// TAG覆盖
request.setExcludeIds(List.of("default-bug-id-tapd1"));
request.setTags(List.of("A", "B"));
request.setAppend(false);
request.setClear(false);
this.requestPost(BUG_BATCH_UPDATE, request, status().isOk());
// 勾选部分
request.setSelectAll(false);
request.setSelectIds(List.of("default-bug-id"));
this.requestPost(BUG_BATCH_UPDATE, request, status().isOk());
//TAG追加 清空
Bug bug = bugMapper.selectByPrimaryKey("default-bug-id");
Assertions.assertEquals(2, bug.getTags().size());
request.setAppend(false);
request.setClear(true);
this.requestPost(BUG_BATCH_UPDATE, request, status().isOk());
bug = bugMapper.selectByPrimaryKey("default-bug-id");
Assertions.assertTrue(CollectionUtils.isEmpty(bug.getTags()));
}
@Test

View File

@ -808,8 +808,6 @@
WHERE
tpfc.test_plan_id = #{request.planId}
AND fc.deleted = #{deleted}
AND
fc.project_Id = #{request.projectId}
AND
tpfc.test_plan_collection_id = #{request.collectionId}
</select>

View File

@ -1348,8 +1348,13 @@ public class FunctionalCaseMinderService {
public List<FunctionalMinderTreeDTO> getCollectionMindFunctionalCase(FunctionalCaseCollectionMindRequest request, boolean deleted) {
List<FunctionalMinderTreeDTO> list = new ArrayList<>();
List<FunctionalCaseMindDTO> functionalCaseMindDTOList = extFunctionalCaseMapper.getMinderCollectionList(request, deleted);
List<String> fieldIds = getFieldIds(request.getProjectId());
List<FunctionalCaseCustomField> caseCustomFieldList = extFunctionalCaseMapper.getCaseCustomFieldListByCollection(request, deleted, fieldIds);
List<String> projectIds = functionalCaseMindDTOList.stream().map(FunctionalCaseMindDTO::getProjectId).distinct().toList();
List<FunctionalCaseCustomField> caseCustomFieldList = new ArrayList<>();
for (String projectId : projectIds) {
List<String> fieldIds = getFieldIds(projectId);
List<FunctionalCaseCustomField> caseCustomFieldListByProjectId = extFunctionalCaseMapper.getCaseCustomFieldListByCollection(request, deleted, fieldIds);
caseCustomFieldList.addAll(caseCustomFieldListByProjectId);
}
Map<String, String> priorityMap = caseCustomFieldList.stream().collect(Collectors.toMap(FunctionalCaseCustomField::getCaseId, FunctionalCaseCustomField::getValue));
//构造父子级数据
buildList(functionalCaseMindDTOList, list, priorityMap, "TEST_PLAN");

View File

@ -138,8 +138,6 @@ public class FunctionalCaseService {
@Resource
private FunctionalCaseDemandMapper functionalCaseDemandMapper;
@Resource
private FunctionalCaseTestMapper functionalCaseTestMapper;
@Resource
private ExtFunctionalCaseTestMapper extFunctionalCaseTestMapper;
@Resource
private BugRelationCaseMapper bugRelationCaseMapper;
@ -1026,18 +1024,10 @@ public class FunctionalCaseService {
});
sqlSession.flushStatements();
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
} else if (request.isClear()) {
//清空标签
FunctionalCase functionalCase = new FunctionalCase();
functionalCase.setTags(new ArrayList<>());
functionalCase.setProjectId(request.getProjectId());
functionalCase.setUpdateTime(System.currentTimeMillis());
functionalCase.setUpdateUser(userId);
extFunctionalCaseMapper.batchUpdate(functionalCase, ids);
}else {
} else {
//替换标签
FunctionalCase functionalCase = new FunctionalCase();
functionalCase.setTags(request.getTags());
functionalCase.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags()));
functionalCase.setProjectId(request.getProjectId());
functionalCase.setUpdateTime(System.currentTimeMillis());
functionalCase.setUpdateUser(userId);

View File

@ -14,6 +14,9 @@ public class TestPlanBatchEditRequest extends TestPlanBatchProcessRequest {
@Schema(description = "是否追加")
private boolean append = true;
@Schema(description = "是否清空")
private boolean clear;
@Schema(description = "标签")
private List<String> tags;

View File

@ -794,7 +794,7 @@ public class TestPlanService extends TestPlanBaseUtilsService {
} else {
//替换标签
TestPlan testPlan = new TestPlan();
testPlan.setTags(ServiceUtils.parseTags(request.getTags()));
testPlan.setTags(request.isClear() ? new ArrayList<>() : ServiceUtils.parseTags(request.getTags()));
testPlan.setProjectId(request.getProjectId());
testPlan.setUpdateTime(System.currentTimeMillis());
testPlan.setUpdateUser(userId);

View File

@ -2384,6 +2384,7 @@ public class TestPlanTests extends BaseTest {
request.setProjectId("songtianyang-fix-wx");
request.setSelectIds(Arrays.asList("wx_test_plan_id_1"));
request.setAppend(false);
request.setClear(false);
request.setTags(Arrays.asList("tag3", "tag4"));
this.requestPostWithOk(URL_TEST_PLAN_BATCH_EDIT, request);
//检查标签是否覆盖
@ -2393,6 +2394,7 @@ public class TestPlanTests extends BaseTest {
Assertions.assertTrue(testPlan.getTags().contains("tag4"));
request.setAppend(true);
request.setClear(false);
request.setTags(Arrays.asList("tag1", "tag2"));
this.requestPostWithOk(URL_TEST_PLAN_BATCH_EDIT, request);
testPlan = testPlanMapper.selectByPrimaryKey("wx_test_plan_id_1");
@ -2417,6 +2419,12 @@ public class TestPlanTests extends BaseTest {
Assertions.assertTrue(testPlan.getTags().contains("tag8"));
Assertions.assertTrue(testPlan.getTags().contains("tag9"));
Assertions.assertTrue(testPlan.getTags().contains("tag0"));
request.setAppend(false);
request.setClear(true);
request.setSelectAll(true);
this.requestPostWithOkAndReturn(URL_TEST_PLAN_BATCH_EDIT, request);
testPlan = testPlanMapper.selectByPrimaryKey("wx_test_plan_id_1");
Assertions.assertTrue(CollectionUtils.isEmpty(testPlan.getTags()));
}
@Test