fix(测试跟踪): 导入更新时排除回收站的用例&回收站恢复操作添加自定义ID校验

--bug=1029871 --user=宋昌昌 【测试跟踪】github#26516,测试跟踪-导入用例新建415条,然后把用例全部删除,再次导入用例到列表有415条用例。然后修改本地用例导入更新用例就有830条了数据重复 https://www.tapd.cn/55049933/s/1413550
This commit is contained in:
song-cc-rock 2023-09-06 17:56:50 +08:00 committed by 刘瑞斌
parent 1a27672244
commit 54fd4446bf
4 changed files with 36 additions and 4 deletions

View File

@ -14,6 +14,7 @@ import io.metersphere.commons.constants.*;
import io.metersphere.commons.exception.MSException; import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.utils.*; import io.metersphere.commons.utils.*;
import io.metersphere.constants.AttachmentType; import io.metersphere.constants.AttachmentType;
import io.metersphere.constants.DataStatus;
import io.metersphere.constants.TestCaseTestType; import io.metersphere.constants.TestCaseTestType;
import io.metersphere.dto.*; import io.metersphere.dto.*;
import io.metersphere.excel.constants.TestCaseImportFiled; import io.metersphere.excel.constants.TestCaseImportFiled;
@ -87,6 +88,7 @@ import java.util.stream.Collectors;
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class TestCaseService { public class TestCaseService {
@Resource @Resource
TestCaseNodeMapper testCaseNodeMapper; TestCaseNodeMapper testCaseNodeMapper;
@ -698,6 +700,8 @@ public class TestCaseService {
TestCaseExample example = new TestCaseExample(); TestCaseExample example = new TestCaseExample();
TestCaseExample.Criteria criteria = example.createCriteria(); TestCaseExample.Criteria criteria = example.createCriteria();
if (null != id) { if (null != id) {
// 只校验未删除的用例
criteria.andStatusNotEqualTo(DataStatus.TRASH.getValue());
criteria.andCustomNumEqualTo(id); criteria.andCustomNumEqualTo(id);
criteria.andProjectIdEqualTo(projectId); criteria.andProjectIdEqualTo(projectId);
List<TestCase> testCaseList = testCaseMapper.selectByExample(example); //查询是否有包含此ID的数据 List<TestCase> testCaseList = testCaseMapper.selectByExample(example); //查询是否有包含此ID的数据
@ -2699,13 +2703,14 @@ public class TestCaseService {
ServiceUtils.getSelectAllIds(request, request.getCondition(), (query) -> extTestCaseMapper.selectIds(query)); ServiceUtils.getSelectAllIds(request, request.getCondition(), (query) -> extTestCaseMapper.selectIds(query));
List<String> ids = request.getIds(); List<String> ids = request.getIds();
if (CollectionUtils.isNotEmpty(ids)) { if (CollectionUtils.isNotEmpty(ids)) {
extTestCaseMapper.checkOriginalStatusByIds(ids);
//检查原来模块是否还在
TestCaseExample example = new TestCaseExample(); TestCaseExample example = new TestCaseExample();
// 关联版本之后必须查询每一个数据的所有版本依次还原
example.createCriteria().andIdIn(ids); example.createCriteria().andIdIn(ids);
List<TestCase> reductionCaseList = testCaseMapper.selectByExample(example); List<TestCase> reductionCaseList = testCaseMapper.selectByExample(example);
// 如果项目开启了用例自定义ID, 恢复的用例自定义ID不能重复
checkReductionCaseCustomIdExist(request.getProjectId(), reductionCaseList);
extTestCaseMapper.checkOriginalStatusByIds(ids);
// 检查原来模块是否还在
// 关联版本之后必须查询每一个数据的所有版本依次还原
List<String> refIds = reductionCaseList.stream().map(TestCase::getRefId).collect(Collectors.toList()); List<String> refIds = reductionCaseList.stream().map(TestCase::getRefId).collect(Collectors.toList());
example.clear(); example.clear();
example.createCriteria().andRefIdIn(refIds); example.createCriteria().andRefIdIn(refIds);
@ -3450,4 +3455,28 @@ public class TestCaseService {
public TestCaseWithBLOBs getSimpleCase(String testCaseId) { public TestCaseWithBLOBs getSimpleCase(String testCaseId) {
return testCaseMapper.selectByPrimaryKey(testCaseId); return testCaseMapper.selectByPrimaryKey(testCaseId);
} }
/**
* 校验恢复的用例集合是否自定义ID已存在(当所属项目的自定义ID开启时)
*
* @param projectId 所属项目ID
* @param cases 用例集合
*/
public void checkReductionCaseCustomIdExist(String projectId, List<TestCase> cases) {
Project project = baseProjectService.getProjectById(projectId);
if (project != null) {
ProjectConfig config = baseProjectApplicationService.getSpecificTypeValue(project.getId(), ProjectApplicationType.CASE_CUSTOM_NUM.name());
boolean customNum = config.getCaseCustomNum();
if (customNum) {
// 项目开启自定义ID
List<String> customNums = cases.stream().map(TestCase::getCustomNum).toList();
TestCaseExample example = new TestCaseExample();
example.createCriteria().andStatusNotEqualTo(DataStatus.TRASH.getValue()).andCustomNumIn(customNums).andProjectIdEqualTo(projectId);
List<TestCase> noTrashCases = testCaseMapper.selectByExample(example);
if (!noTrashCases.isEmpty()) {
MSException.throwException(Translator.get("reduction_error_of_custom_id_exist"));
}
}
}
}
} }

View File

@ -176,6 +176,7 @@ Swagger_parse_error=Swagger parsing failed, please confirm file format is correc
Swagger_parse_error_with_auth=Swagger parsing failed. Please check whether authentication information is correct or file format is correct! Swagger_parse_error_with_auth=Swagger parsing failed. Please check whether authentication information is correct or file format is correct!
test_track.length_less_than=The title is too long, the length must be less than test_track.length_less_than=The title is too long, the length must be less than
edit_trash_case_error=The case has been put in trash, please recover before edit! edit_trash_case_error=The case has been put in trash, please recover before edit!
reduction_error_of_custom_id_exist=Recovery failed, the selected use case custom ID already exists!
# check owner # check owner
check_owner_project=The current user does not have permission to operate this project check_owner_project=The current user does not have permission to operate this project
check_owner_test=The current user does not have permission to operate this test check_owner_test=The current user does not have permission to operate this test

View File

@ -148,6 +148,7 @@ swagger_parse_error=Swagger 解析失败,请确认文件格式是否正确!
swagger_parse_error_with_auth=Swagger 解析失败,请确认认证信息是否正确或文件格式是否正确! swagger_parse_error_with_auth=Swagger 解析失败,请确认认证信息是否正确或文件格式是否正确!
test_track.length_less_than=标题过长,字数必须小于 test_track.length_less_than=标题过长,字数必须小于
edit_trash_case_error=用例已进入回收站, 请恢复后再编辑! edit_trash_case_error=用例已进入回收站, 请恢复后再编辑!
reduction_error_of_custom_id_exist=恢复失败, 勾选用例自定义ID已存在!
# check owner # check owner
check_owner_project=当前用户没有操作此项目的权限 check_owner_project=当前用户没有操作此项目的权限
check_owner_test=当前用户没有操作此测试的权限 check_owner_test=当前用户没有操作此测试的权限

View File

@ -148,6 +148,7 @@ swagger_parse_error=Swagger 解析失敗,請確認文件格式是否正確!
swagger_parse_error_with_auth=Swagger 解析失敗,請確認認證信息是否正確或文件格式是否正確! swagger_parse_error_with_auth=Swagger 解析失敗,請確認認證信息是否正確或文件格式是否正確!
test_track.length_less_than=標題過長,字數必須小於 test_track.length_less_than=標題過長,字數必須小於
edit_trash_case_error=用例已進入回收站, 請恢復後再編輯! edit_trash_case_error=用例已進入回收站, 請恢復後再編輯!
reduction_error_of_custom_id_exist=恢復失敗, 勾選用例自定義ID已存在!
# check owner # check owner
check_owner_project=當前用戶沒有操作此項目的權限 check_owner_project=當前用戶沒有操作此項目的權限
check_owner_test=當前用戶沒有操作此測試的權限 check_owner_test=當前用戶沒有操作此測試的權限