guoyuqi 2022-07-07 20:12:10 +08:00 committed by xiaomeinvG
parent 3ccd5a055b
commit ef15966ffd
8 changed files with 266 additions and 250 deletions

View File

@ -1335,15 +1335,19 @@ public class ApiAutomationService {
_importCreate(sameList, batchMapper, extApiScenarioMapper, scenarioWithBLOBs, apiTestImportRequest, apiTestCaseMapper, apiDefinitionMapper); _importCreate(sameList, batchMapper, extApiScenarioMapper, scenarioWithBLOBs, apiTestImportRequest, apiTestCaseMapper, apiDefinitionMapper);
} else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) { } else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) {
if (CollectionUtils.isEmpty(sameList)) { if (CollectionUtils.isEmpty(sameList)) {
if (scenarioWithBLOBs.getVersionId() == null || scenarioWithBLOBs.getVersionId().equals("new")) {
scenarioWithBLOBs.setLatest(apiTestImportRequest.getVersionId().equals(apiTestImportRequest.getDefaultVersion()));
} else {
scenarioWithBLOBs.setOrder(getImportNextOrder(request.getProjectId())); scenarioWithBLOBs.setOrder(getImportNextOrder(request.getProjectId()));
scenarioWithBLOBs.setId(UUID.randomUUID().toString());
scenarioWithBLOBs.setRefId(scenarioWithBLOBs.getId()); scenarioWithBLOBs.setRefId(scenarioWithBLOBs.getId());
scenarioWithBLOBs.setLatest(true);
}
scenarioWithBLOBs.setId(UUID.randomUUID().toString());
if (StringUtils.isNotEmpty(apiTestImportRequest.getVersionId())) { if (StringUtils.isNotEmpty(apiTestImportRequest.getVersionId())) {
scenarioWithBLOBs.setVersionId(apiTestImportRequest.getVersionId()); scenarioWithBLOBs.setVersionId(apiTestImportRequest.getVersionId());
} else { } else {
scenarioWithBLOBs.setVersionId(apiTestImportRequest.getDefaultVersion()); scenarioWithBLOBs.setVersionId(apiTestImportRequest.getDefaultVersion());
} }
scenarioWithBLOBs.setLatest(true);
checkReferenceCase(scenarioWithBLOBs, apiTestCaseMapper, apiDefinitionMapper); checkReferenceCase(scenarioWithBLOBs, apiTestCaseMapper, apiDefinitionMapper);
batchMapper.insert(scenarioWithBLOBs); batchMapper.insert(scenarioWithBLOBs);
// 存储依赖关系 // 存储依赖关系
@ -1375,6 +1379,9 @@ public class ApiAutomationService {
String defaultVersion = extProjectVersionMapper.getDefaultVersion(request.getProjectId()); String defaultVersion = extProjectVersionMapper.getDefaultVersion(request.getProjectId());
request.setDefaultVersion(defaultVersion); request.setDefaultVersion(defaultVersion);
if (request.getVersionId() == null) {
request.setVersionId(defaultVersion);
}
UpdateScenarioModuleDTO updateScenarioModuleDTO = apiScenarioModuleService.checkScenarioModule(request, initData, StringUtils.equals("fullCoverage", request.getModeId()), request.getCoverModule()); UpdateScenarioModuleDTO updateScenarioModuleDTO = apiScenarioModuleService.checkScenarioModule(request, initData, StringUtils.equals("fullCoverage", request.getModeId()), request.getCoverModule());
List<ApiScenarioModule> moduleList = updateScenarioModuleDTO.getModuleList(); List<ApiScenarioModule> moduleList = updateScenarioModuleDTO.getModuleList();
@ -1404,7 +1411,9 @@ public class ApiAutomationService {
if (item.getName().length() > 255) { if (item.getName().length() > 255) {
item.setName(item.getName().substring(0, 255)); item.setName(item.getName().substring(0, 255));
} }
if (item.getVersionId() == null || !item.getVersionId().equals("new")) {
item.setNum(num); item.setNum(num);
}
if (BooleanUtils.isFalse(request.getOpenCustomNum())) { if (BooleanUtils.isFalse(request.getOpenCustomNum())) {
// 如果未开启即使有自定值也直接覆盖 // 如果未开启即使有自定值也直接覆盖
item.setCustomNum(String.valueOf(num)); item.setCustomNum(String.valueOf(num));

View File

@ -803,17 +803,21 @@ public class ApiDefinitionService {
_importCreate(collect, batchMapper, apiTestCaseMapper, apiDefinition, extApiDefinitionMapper, apiTestImportRequest, cases, mocks); _importCreate(collect, batchMapper, apiTestCaseMapper, apiDefinition, extApiDefinitionMapper, apiTestImportRequest, cases, mocks);
} else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) { } else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) {
if (CollectionUtils.isEmpty(collect)) { if (CollectionUtils.isEmpty(collect)) {
//postman 可能含有前置脚本接口定义去掉脚本
apiDefinition.setOrder(getImportNextOrder(apiTestImportRequest.getProjectId()));
String originId = apiDefinition.getId(); String originId = apiDefinition.getId();
apiDefinition.setId(UUID.randomUUID().toString()); //postman 可能含有前置脚本接口定义去掉脚本
if (apiDefinition.getVersionId() == null || apiDefinition.getVersionId().equals("new")) {
apiDefinition.setLatest(apiTestImportRequest.getVersionId().equals(apiTestImportRequest.getDefaultVersion()));
} else {
apiDefinition.setOrder(getImportNextOrder(apiTestImportRequest.getProjectId()));
apiDefinition.setRefId(apiDefinition.getId()); apiDefinition.setRefId(apiDefinition.getId());
apiDefinition.setLatest(true); // 新增的接口 latest = true
}
apiDefinition.setId(UUID.randomUUID().toString());
if (StringUtils.isNotEmpty(apiTestImportRequest.getVersionId())) { if (StringUtils.isNotEmpty(apiTestImportRequest.getVersionId())) {
apiDefinition.setVersionId(apiTestImportRequest.getVersionId()); apiDefinition.setVersionId(apiTestImportRequest.getVersionId());
} else { } else {
apiDefinition.setVersionId(apiTestImportRequest.getDefaultVersion()); apiDefinition.setVersionId(apiTestImportRequest.getDefaultVersion());
} }
apiDefinition.setLatest(true); // 新增的接口 latest = true
batchMapper.insert(apiDefinition); batchMapper.insert(apiDefinition);
String requestStr = setImportHashTree(apiDefinition); String requestStr = setImportHashTree(apiDefinition);
@ -917,7 +921,6 @@ public class ApiDefinitionService {
apiDefinition.setOriginalState(existApi.getOriginalState()); apiDefinition.setOriginalState(existApi.getOriginalState());
apiDefinition.setCaseStatus(existApi.getCaseStatus()); apiDefinition.setCaseStatus(existApi.getCaseStatus());
apiDefinition.setNum(existApi.getNum()); //id 不变 apiDefinition.setNum(existApi.getNum()); //id 不变
apiDefinition.setRefId(existApi.getRefId());
if (existApi.getRefId() != null) { if (existApi.getRefId() != null) {
apiDefinition.setRefId(existApi.getRefId()); apiDefinition.setRefId(existApi.getRefId());
} else { } else {
@ -1416,6 +1419,9 @@ public class ApiDefinitionService {
currentApiOrder.remove(); currentApiOrder.remove();
String defaultVersion = extProjectVersionMapper.getDefaultVersion(request.getProjectId()); String defaultVersion = extProjectVersionMapper.getDefaultVersion(request.getProjectId());
request.setDefaultVersion(defaultVersion); request.setDefaultVersion(defaultVersion);
if (request.getVersionId() == null) {
request.setVersionId(defaultVersion);
}
List<ApiDefinitionWithBLOBs> initData = apiImport.getData(); List<ApiDefinitionWithBLOBs> initData = apiImport.getData();
Project project = projectMapper.selectByPrimaryKey(request.getProjectId()); Project project = projectMapper.selectByPrimaryKey(request.getProjectId());
@ -1446,14 +1452,20 @@ public class ApiDefinitionService {
apiModuleMapper.insert(apiModule); apiModuleMapper.insert(apiModule);
} }
} }
//如果需要导入的数据为空此时清空mock信息
if (data.isEmpty()) {
apiImport.getMocks().clear();
}
for (int i = 0; i < data.size(); i++) { for (int i = 0; i < data.size(); i++) {
ApiDefinitionWithBLOBs item = data.get(i); ApiDefinitionWithBLOBs item = data.get(i);
this.setModule(item); this.setModule(item);
if (item.getName().length() > 255) { if (item.getName().length() > 255) {
item.setName(item.getName().substring(0, 255)); item.setName(item.getName().substring(0, 255));
} }
//如果是创建版本数据则num和其他版本数据一致
if (item.getVersionId() == null || !item.getVersionId().equals("new")) {
item.setNum(num++); item.setNum(num++);
}
//如果EsbData需要存储,则需要进行接口是否更新的判断 //如果EsbData需要存储,则需要进行接口是否更新的判断
if (apiImport.getEsbApiParamsMap() != null) { if (apiImport.getEsbApiParamsMap() != null) {
String apiId = item.getId(); String apiId = item.getId();

View File

@ -619,14 +619,9 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
if (apiImport.getEsbApiParamsMap() != null) { if (apiImport.getEsbApiParamsMap() != null) {
fullCoverage = true; fullCoverage = true;
} }
Set<String> versionSet = new HashSet<>();
if (fullCoverage) {
setFullVersionSet(request, versionSet);
} else {
String updateVersionId = getUpdateVersionId(request); String updateVersionId = getUpdateVersionId(request);
versionSet.add(updateVersionId); String versionId = getVersionId(request);
}
//需要新增的模块key 为模块路径 //需要新增的模块key 为模块路径
Map<String, ApiModule> moduleMap = new HashMap<>(); Map<String, ApiModule> moduleMap = new HashMap<>();
@ -665,29 +660,87 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
//处理模块 //处理模块
setModule(moduleMap, pidChildrenMap, idPathMap, idModuleMap, optionData, chooseModule); setModule(moduleMap, pidChildrenMap, idPathMap, idModuleMap, optionData, chooseModule);
//系统内重复的数据 //系统内重复的数据
repeatApiDefinitionWithBLOBs = extApiDefinitionMapper.selectRepeatByBLOBs(optionData, projectId, versionSet); repeatApiDefinitionWithBLOBs = extApiDefinitionMapper.selectRepeatByBLOBs(optionData, projectId);
//处理数据 //处理数据
if (urlRepeat) { if (urlRepeat) {
moduleMap = getRepeatApiModuleMap(fullCoverage, fullCoverageApi, moduleMap, toUpdateList, idPathMap, chooseModule, optionData, repeatApiDefinitionWithBLOBs); Map<String, ApiDefinitionWithBLOBs> methodPathMap;
//最后在整个体统内检查一遍 Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap;
//按照原来的顺序
if (chooseModule != null) {
String chooseModuleParentId = getChooseModuleParentId(chooseModule);
String chooseModulePath = getChooseModulePath(idPathMap, chooseModule, chooseModuleParentId);
methodPathMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getMethod() + t.getPath() + chooseModulePath, api -> api));
ApiModuleDTO finalChooseModule = chooseModule;
repeatDataMap = repeatApiDefinitionWithBLOBs.stream().filter(t -> t.getModuleId().equals(finalChooseModule.getId())).collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath()));
} else {
methodPathMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getMethod() + t.getPath() + (t.getModulePath() == null ? "" : t.getModulePath()), api -> api));
repeatDataMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath()));
}
//覆盖接口
if (fullCoverage) {
//允许覆盖模块用导入的重复数据的最后一条覆盖查询的所有重复数据
if (fullCoverageApi) {
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
startCoverModule(toUpdateList, optionData, methodPathMap, repeatDataMap, updateVersionId);
}
} else {
//覆盖但不覆盖模块
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
moduleMap = judgeModuleMap(moduleMap, methodPathMap, repeatDataMap);
startCover(toUpdateList, optionData, methodPathMap, repeatDataMap, updateVersionId);
}
}
} else {
//不覆盖,同一接口不做更新
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
removeSameData(repeatDataMap, methodPathMap, optionData, moduleMap, versionId);
}
} //最后在整个体统内检查一遍
if (!repeatApiDefinitionWithBLOBs.isEmpty()) { if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
Map<String, List<ApiDefinitionWithBLOBs>> repeatMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath())); Map<String, List<ApiDefinitionWithBLOBs>> repeatMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath()));
Map<String, ApiDefinitionWithBLOBs> optionMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath(), api -> api)); Map<String, ApiDefinitionWithBLOBs> optionMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath(), api -> api));
if (fullCoverage) { if (fullCoverage) {
startCover(toUpdateList, optionData, optionMap, repeatMap); startCover(toUpdateList, optionData, optionMap, repeatMap, updateVersionId);
} else { } else {
//不覆盖,同一接口不做更新 //不覆盖,同一接口不做更新
if (!repeatApiDefinitionWithBLOBs.isEmpty()) { if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
removeSameData(repeatMap, optionMap, optionData, moduleMap); removeSameData(repeatMap, optionMap, optionData, moduleMap, versionId);
} }
} }
} }
} else { } else {
moduleMap = getOnlyApiModuleMap(fullCoverage, fullCoverageApi, moduleMap, toUpdateList, optionData, repeatApiDefinitionWithBLOBs); Map<String, ApiDefinitionWithBLOBs> methodPathMap;
Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.groupingBy(t -> t.getMethod() + t.getPath()));
//按照原来的顺序
methodPathMap = optionData.stream().collect(Collectors.toMap(t -> t.getMethod() + t.getPath(), api -> api));
if (fullCoverage) {
if (fullCoverageApi) {
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
startCoverModule(toUpdateList, optionData, methodPathMap, repeatDataMap, updateVersionId);
}
} else {
//不覆盖模块
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
if (repeatDataMap.size() >= methodPathMap.size()) {
//导入文件没有新增接口无需创建接口模块
moduleMap = new HashMap<>();
}
startCover(toUpdateList, optionData, methodPathMap, repeatDataMap, updateVersionId);
}
}
} else {
//不覆盖,同一接口不做更新
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
removeSameData(repeatDataMap, methodPathMap, optionData, moduleMap, versionId);
}
}
} }
} else { } else {
//去重TCP,SQL,DUBBO 模块下名称唯一 //去重TCP,SQL,DUBBO 模块下名称唯一
removeRepeat(data, fullCoverage, optionData); removeRepeatOrigin(data, fullCoverage, optionData);
//处理模块 //处理模块
setModule(moduleMap, pidChildrenMap, idPathMap, idModuleMap, optionData, chooseModule); setModule(moduleMap, pidChildrenMap, idPathMap, idModuleMap, optionData, chooseModule);
@ -696,27 +749,8 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
List<String> nameList = optionData.stream().map(ApiDefinitionWithBLOBs::getName).collect(Collectors.toList()); List<String> nameList = optionData.stream().map(ApiDefinitionWithBLOBs::getName).collect(Collectors.toList());
//获取系统内重复数据 //获取系统内重复数据
repeatApiDefinitionWithBLOBs = extApiDefinitionMapper.selectRepeatByProtocol(nameList, protocol, versionSet); repeatApiDefinitionWithBLOBs = extApiDefinitionMapper.selectRepeatByProtocol(nameList, protocol);
moduleMap = getOtherApiModuleMap(fullCoverage, fullCoverageApi, chooseModuleId, moduleMap, toUpdateList, idPathMap, chooseModule, optionData, repeatApiDefinitionWithBLOBs);
//系统内检查重复
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
Map<String, ApiDefinitionWithBLOBs> repeatMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), api -> api));
Map<String, ApiDefinitionWithBLOBs> optionMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), api -> api));
if (fullCoverage) {
cover(moduleMap, toUpdateList, optionMap, repeatMap);
} else {
//不覆盖,同一接口不做更新
removeRepeat(optionData, optionMap, repeatMap, moduleMap);
}
}
}
return getUpdateApiModuleDTO(moduleMap, toUpdateList, optionData);
}
private Map<String, ApiModule> getOtherApiModuleMap(Boolean fullCoverage, Boolean fullCoverageApi, String chooseModuleId, Map<String, ApiModule> moduleMap, List<ApiDefinitionWithBLOBs> toUpdateList, Map<String, String> idPathMap, ApiModuleDTO chooseModule, List<ApiDefinitionWithBLOBs> optionData, List<ApiDefinitionWithBLOBs> repeatApiDefinitionWithBLOBs) {
Map<String, ApiDefinitionWithBLOBs> repeatDataMap = null; Map<String, ApiDefinitionWithBLOBs> repeatDataMap = null;
Map<String, ApiDefinitionWithBLOBs> nameModuleMap = null; Map<String, ApiDefinitionWithBLOBs> nameModuleMap = null;
@ -735,15 +769,28 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
//处理数据 //处理数据
if (fullCoverage) { if (fullCoverage) {
if (fullCoverageApi) { if (fullCoverageApi) {
coverModule(toUpdateList, nameModuleMap, repeatDataMap); coverModule(toUpdateList, nameModuleMap, repeatDataMap, updateVersionId);
} else { } else {
moduleMap = cover(moduleMap, toUpdateList, nameModuleMap, repeatDataMap); moduleMap = cover(moduleMap, toUpdateList, nameModuleMap, repeatDataMap, updateVersionId);
} }
} else { } else {
//不覆盖 //不覆盖
removeRepeat(optionData, nameModuleMap, repeatDataMap, moduleMap); removeRepeat(optionData, nameModuleMap, repeatDataMap, moduleMap, versionId);
} }
return moduleMap; //系统内检查重复
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
Map<String, ApiDefinitionWithBLOBs> repeatMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), api -> api));
Map<String, ApiDefinitionWithBLOBs> optionMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), api -> api));
if (fullCoverage) {
cover(moduleMap, toUpdateList, optionMap, repeatMap, updateVersionId);
} else {
//不覆盖,同一接口不做更新
removeRepeat(optionData, optionMap, repeatMap, moduleMap, versionId);
}
}
}
return getUpdateApiModuleDTO(moduleMap, toUpdateList, optionData);
} }
@ -755,7 +802,9 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
return updateApiModuleDTO; return updateApiModuleDTO;
} }
private void removeRepeat(List<ApiDefinitionWithBLOBs> optionData, Map<String, ApiDefinitionWithBLOBs> nameModuleMap, Map<String, ApiDefinitionWithBLOBs> repeatDataMap, Map<String, ApiModule> moduleMap) { private void removeRepeat(List<ApiDefinitionWithBLOBs> optionData, Map<String, ApiDefinitionWithBLOBs> nameModuleMap,
Map<String, ApiDefinitionWithBLOBs> repeatDataMap, Map<String, ApiModule> moduleMap,
String versionId) {
if (nameModuleMap != null) { if (nameModuleMap != null) {
Map<String, List<ApiDefinitionWithBLOBs>> moduleOptionData = optionData.stream().collect(Collectors.groupingBy(ApiDefinition::getModulePath)); Map<String, List<ApiDefinitionWithBLOBs>> moduleOptionData = optionData.stream().collect(Collectors.groupingBy(ApiDefinition::getModulePath));
Map<String, ApiDefinitionWithBLOBs> finalNameModuleMap = nameModuleMap; Map<String, ApiDefinitionWithBLOBs> finalNameModuleMap = nameModuleMap;
@ -769,13 +818,25 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
removeModulePath(moduleMap, moduleOptionData, modulePath); removeModulePath(moduleMap, moduleOptionData, modulePath);
moduleDatas.remove(apiDefinitionWithBLOBs); moduleDatas.remove(apiDefinitionWithBLOBs);
} }
//不覆盖选择版本如果被选版本有同接口不导入否则创建新版本接口
if (v.getVersionId().equals(versionId)) {
optionData.remove(apiDefinitionWithBLOBs); optionData.remove(apiDefinitionWithBLOBs);
} else {
//这里是为了标识当前数据是需要创建版本的不是全新增的数据
apiDefinitionWithBLOBs.setVersionId("new");
apiDefinitionWithBLOBs.setNum(v.getNum());
apiDefinitionWithBLOBs.setStatus(v.getStatus());
apiDefinitionWithBLOBs.setOrder(v.getOrder());
apiDefinitionWithBLOBs.setRefId(v.getRefId());
apiDefinitionWithBLOBs.setLatest(v.getLatest());
}
} }
}); });
} }
} }
private Map<String, ApiModule> cover(Map<String, ApiModule> moduleMap, List<ApiDefinitionWithBLOBs> toUpdateList, Map<String, ApiDefinitionWithBLOBs> nameModuleMap, Map<String, ApiDefinitionWithBLOBs> repeatDataMap) { private Map<String, ApiModule> cover(Map<String, ApiModule> moduleMap, List<ApiDefinitionWithBLOBs> toUpdateList,
Map<String, ApiDefinitionWithBLOBs> nameModuleMap, Map<String, ApiDefinitionWithBLOBs> repeatDataMap, String updateVersionId) {
//覆盖但不覆盖模块 //覆盖但不覆盖模块
if (nameModuleMap != null) { if (nameModuleMap != null) {
//导入文件没有新增接口无需创建接口模块 //导入文件没有新增接口无需创建接口模块
@ -785,7 +846,7 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = finalNameModuleMap.get(k); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = finalNameModuleMap.get(k);
if (apiDefinitionWithBLOBs != null) { if (apiDefinitionWithBLOBs != null) {
apiDefinitionWithBLOBs.setId(v.getId()); apiDefinitionWithBLOBs.setId(v.getId());
apiDefinitionWithBLOBs.setVersionId(v.getVersionId()); apiDefinitionWithBLOBs.setVersionId(updateVersionId);
apiDefinitionWithBLOBs.setModuleId(v.getModuleId()); apiDefinitionWithBLOBs.setModuleId(v.getModuleId());
apiDefinitionWithBLOBs.setModulePath(v.getModulePath()); apiDefinitionWithBLOBs.setModulePath(v.getModulePath());
apiDefinitionWithBLOBs.setNum(v.getNum()); apiDefinitionWithBLOBs.setNum(v.getNum());
@ -793,6 +854,7 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
apiDefinitionWithBLOBs.setOrder(v.getOrder()); apiDefinitionWithBLOBs.setOrder(v.getOrder());
apiDefinitionWithBLOBs.setRefId(v.getRefId()); apiDefinitionWithBLOBs.setRefId(v.getRefId());
apiDefinitionWithBLOBs.setLatest(v.getLatest()); apiDefinitionWithBLOBs.setLatest(v.getLatest());
apiDefinitionWithBLOBs.setCreateTime(v.getCreateTime());
toUpdateList.add(apiDefinitionWithBLOBs); toUpdateList.add(apiDefinitionWithBLOBs);
} }
}); });
@ -817,26 +879,21 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
return moduleMap; return moduleMap;
} }
private void coverModule(List<ApiDefinitionWithBLOBs> toUpdateList, Map<String, ApiDefinitionWithBLOBs> nameModuleMap, Map<String, ApiDefinitionWithBLOBs> repeatDataMap) { private void coverModule(List<ApiDefinitionWithBLOBs> toUpdateList, Map<String, ApiDefinitionWithBLOBs> nameModuleMap, Map<String, ApiDefinitionWithBLOBs> repeatDataMap, String updateVersionId) {
if (nameModuleMap != null) { if (nameModuleMap != null) {
Map<String, ApiDefinitionWithBLOBs> finalNameModuleMap = nameModuleMap; Map<String, ApiDefinitionWithBLOBs> finalNameModuleMap = nameModuleMap;
repeatDataMap.forEach((k, v) -> { repeatDataMap.forEach((k, v) -> {
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = finalNameModuleMap.get(k); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = finalNameModuleMap.get(k);
if (apiDefinitionWithBLOBs != null) { if (apiDefinitionWithBLOBs != null) {
apiDefinitionWithBLOBs.setId(v.getId()); apiDefinitionWithBLOBs.setId(v.getId());
apiDefinitionWithBLOBs.setVersionId(v.getVersionId()); setApiParam(apiDefinitionWithBLOBs, updateVersionId, v);
apiDefinitionWithBLOBs.setNum(v.getNum());
apiDefinitionWithBLOBs.setStatus(v.getStatus());
apiDefinitionWithBLOBs.setOrder(v.getOrder());
apiDefinitionWithBLOBs.setRefId(v.getRefId());
apiDefinitionWithBLOBs.setLatest(v.getLatest());
toUpdateList.add(apiDefinitionWithBLOBs); toUpdateList.add(apiDefinitionWithBLOBs);
} }
}); });
} }
} }
private void removeRepeat(List<ApiDefinitionWithBLOBs> data, Boolean fullCoverage, List<ApiDefinitionWithBLOBs> optionData) { private void removeRepeatOrigin(List<ApiDefinitionWithBLOBs> data, Boolean fullCoverage, List<ApiDefinitionWithBLOBs> optionData) {
LinkedHashMap<String, List<ApiDefinitionWithBLOBs>> methodPathMap = data.stream().collect(Collectors.groupingBy(t -> t.getName() + (t.getModulePath() == null ? "" : t.getModulePath()), LinkedHashMap::new, Collectors.toList())); LinkedHashMap<String, List<ApiDefinitionWithBLOBs>> methodPathMap = data.stream().collect(Collectors.groupingBy(t -> t.getName() + (t.getModulePath() == null ? "" : t.getModulePath()), LinkedHashMap::new, Collectors.toList()));
if (fullCoverage) { if (fullCoverage) {
methodPathMap.forEach((k, v) -> { methodPathMap.forEach((k, v) -> {
@ -849,75 +906,6 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
} }
} }
private Map<String, ApiModule> getOnlyApiModuleMap(Boolean fullCoverage, Boolean fullCoverageApi, Map<String, ApiModule> moduleMap, List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData, List<ApiDefinitionWithBLOBs> repeatApiDefinitionWithBLOBs) {
Map<String, ApiDefinitionWithBLOBs> methodPathMap;
Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.groupingBy(t -> t.getMethod() + t.getPath()));
//按照原来的顺序
methodPathMap = optionData.stream().collect(Collectors.toMap(t -> t.getMethod() + t.getPath(), api -> api));
if (fullCoverage) {
if (fullCoverageApi) {
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
startCoverModule(toUpdateList, optionData, methodPathMap, repeatDataMap);
}
} else {
//不覆盖模块
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
if (repeatDataMap.size() >= methodPathMap.size()) {
//导入文件没有新增接口无需创建接口模块
moduleMap = new HashMap<>();
}
startCover(toUpdateList, optionData, methodPathMap, repeatDataMap);
}
}
} else {
//不覆盖,同一接口不做更新
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
removeSameData(repeatDataMap, methodPathMap, optionData, moduleMap);
}
}
return moduleMap;
}
private Map<String, ApiModule> getRepeatApiModuleMap(Boolean fullCoverage, Boolean fullCoverageApi, Map<String, ApiModule> moduleMap, List<ApiDefinitionWithBLOBs> toUpdateList, Map<String, String> idPathMap, ApiModuleDTO chooseModule, List<ApiDefinitionWithBLOBs> optionData, List<ApiDefinitionWithBLOBs> repeatApiDefinitionWithBLOBs) {
Map<String, ApiDefinitionWithBLOBs> methodPathMap;
Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap;
//按照原来的顺序
if (chooseModule != null) {
String chooseModuleParentId = getChooseModuleParentId(chooseModule);
String chooseModulePath = getChooseModulePath(idPathMap, chooseModule, chooseModuleParentId);
methodPathMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getMethod() + t.getPath() + chooseModulePath, api -> api));
repeatDataMap = repeatApiDefinitionWithBLOBs.stream().filter(t -> t.getModuleId().equals(chooseModule.getId())).collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath()));
} else {
methodPathMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getMethod() + t.getPath() + (t.getModulePath() == null ? "" : t.getModulePath()), api -> api));
repeatDataMap = repeatApiDefinitionWithBLOBs.stream().collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + t.getModulePath()));
}
//覆盖接口
if (fullCoverage) {
//允许覆盖模块用导入的重复数据的最后一条覆盖查询的所有重复数据
if (fullCoverageApi) {
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
startCoverModule(toUpdateList, optionData, methodPathMap, repeatDataMap);
}
} else {
//覆盖但不覆盖模块
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
moduleMap = judgeModuleMap(moduleMap, methodPathMap, repeatDataMap);
startCover(toUpdateList, optionData, methodPathMap, repeatDataMap);
}
}
} else {
//不覆盖,同一接口不做更新
if (!repeatApiDefinitionWithBLOBs.isEmpty()) {
removeSameData(repeatDataMap, methodPathMap, optionData, moduleMap);
}
}
return moduleMap;
}
private void removeHTTPRepeat(List<ApiDefinitionWithBLOBs> data, Boolean fullCoverage, boolean urlRepeat, List<ApiDefinitionWithBLOBs> optionData) { private void removeHTTPRepeat(List<ApiDefinitionWithBLOBs> data, Boolean fullCoverage, boolean urlRepeat, List<ApiDefinitionWithBLOBs> optionData) {
if (urlRepeat) { if (urlRepeat) {
LinkedHashMap<String, List<ApiDefinitionWithBLOBs>> methodPathMap = data.stream().collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + (t.getModulePath() == null ? "" : t.getModulePath()), LinkedHashMap::new, Collectors.toList())); LinkedHashMap<String, List<ApiDefinitionWithBLOBs>> methodPathMap = data.stream().collect(Collectors.groupingBy(t -> t.getName() + t.getMethod() + t.getPath() + (t.getModulePath() == null ? "" : t.getModulePath()), LinkedHashMap::new, Collectors.toList()));
@ -944,34 +932,29 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
} }
} }
private void setFullVersionSet(ApiTestImportRequest request, Set<String> versionSet) { private String getVersionId(ApiTestImportRequest request) {
String creatVersionId; String versionId;
if (request.getVersionId() != null) { if (request.getVersionId() == null) {
creatVersionId = request.getVersionId(); versionId = request.getDefaultVersion();
} else { } else {
creatVersionId = request.getDefaultVersion(); versionId = request.getVersionId();
} }
versionSet.add(creatVersionId); return versionId;
}
private String getUpdateVersionId(ApiTestImportRequest request) {
String updateVersionId; String updateVersionId;
if (request.getUpdateVersionId() != null) { if (request.getUpdateVersionId() != null) {
updateVersionId = request.getUpdateVersionId(); updateVersionId = request.getUpdateVersionId();
} else { } else {
updateVersionId = request.getDefaultVersion(); updateVersionId = request.getDefaultVersion();
} }
versionSet.add(updateVersionId);
}
private String getUpdateVersionId(ApiTestImportRequest request) {
String updateVersionId;
if (request.getVersionId() == null) {
updateVersionId = request.getDefaultVersion();
} else {
updateVersionId = request.getVersionId();
}
return updateVersionId; return updateVersionId;
} }
private void removeSameData(Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap, Map<String, ApiDefinitionWithBLOBs> methodPathMap, List<ApiDefinitionWithBLOBs> optionData, Map<String, ApiModule> moduleMap) { private void removeSameData(Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap, Map<String, ApiDefinitionWithBLOBs> methodPathMap,
List<ApiDefinitionWithBLOBs> optionData, Map<String, ApiModule> moduleMap, String versionId) {
Map<String, List<ApiDefinitionWithBLOBs>> moduleOptionData = optionData.stream().collect(Collectors.groupingBy(ApiDefinition::getModulePath)); Map<String, List<ApiDefinitionWithBLOBs>> moduleOptionData = optionData.stream().collect(Collectors.groupingBy(ApiDefinition::getModulePath));
BiConsumer<String, List<ApiDefinitionWithBLOBs>> stringListBiConsumer = (k, v) -> { BiConsumer<String, List<ApiDefinitionWithBLOBs>> stringListBiConsumer = (k, v) -> {
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = methodPathMap.get(k); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = methodPathMap.get(k);
@ -983,13 +966,35 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
removeModulePath(moduleMap, moduleOptionData, modulePath); removeModulePath(moduleMap, moduleOptionData, modulePath);
moduleDatas.remove(apiDefinitionWithBLOBs); moduleDatas.remove(apiDefinitionWithBLOBs);
} }
//不覆盖选择版本如果被选版本有同接口不导入否则创建新版本接口
List<ApiDefinitionWithBLOBs> sameVersionList = v.stream().filter(t -> t.getVersionId().equals(versionId)).collect(Collectors.toList());
if (!sameVersionList.isEmpty()) {
optionData.remove(apiDefinitionWithBLOBs); optionData.remove(apiDefinitionWithBLOBs);
} else {
for (ApiDefinitionWithBLOBs definitionWithBLOBs : v) {
apiDefinitionWithBLOBs.setVersionId("new");
apiDefinitionWithBLOBs.setNum(definitionWithBLOBs.getNum());
apiDefinitionWithBLOBs.setStatus(definitionWithBLOBs.getStatus());
apiDefinitionWithBLOBs.setOrder(definitionWithBLOBs.getOrder());
apiDefinitionWithBLOBs.setRefId(definitionWithBLOBs.getRefId());
apiDefinitionWithBLOBs.setLatest(definitionWithBLOBs.getLatest());
}
}
} }
}; };
repeatDataMap.forEach(stringListBiConsumer); repeatDataMap.forEach(stringListBiConsumer);
} }
private void setApiParam(ApiDefinitionWithBLOBs apiDefinitionWithBLOBs, String versionId, ApiDefinitionWithBLOBs definitionWithBLOBs) {
apiDefinitionWithBLOBs.setVersionId(versionId);
apiDefinitionWithBLOBs.setNum(definitionWithBLOBs.getNum());
apiDefinitionWithBLOBs.setStatus(definitionWithBLOBs.getStatus());
apiDefinitionWithBLOBs.setOrder(definitionWithBLOBs.getOrder());
apiDefinitionWithBLOBs.setRefId(definitionWithBLOBs.getRefId());
apiDefinitionWithBLOBs.setLatest(definitionWithBLOBs.getLatest());
apiDefinitionWithBLOBs.setCreateTime(definitionWithBLOBs.getCreateTime());
}
private void removeModulePath(Map<String, ApiModule> moduleMap, Map<String, List<ApiDefinitionWithBLOBs>> moduleOptionData, String modulePath) { private void removeModulePath(Map<String, ApiModule> moduleMap, Map<String, List<ApiDefinitionWithBLOBs>> moduleOptionData, String modulePath) {
if (StringUtils.isBlank(modulePath)) { if (StringUtils.isBlank(modulePath)) {
return; return;
@ -1004,7 +1009,9 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
} }
private void startCoverModule(List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData, Map<String, ApiDefinitionWithBLOBs> methodPathMap, Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap) { private void startCoverModule(List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData,
Map<String, ApiDefinitionWithBLOBs> methodPathMap, Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap,
String updateVersionId) {
List<ApiDefinitionWithBLOBs> coverApiList = new ArrayList<>(); List<ApiDefinitionWithBLOBs> coverApiList = new ArrayList<>();
repeatDataMap.forEach((k, v) -> { repeatDataMap.forEach((k, v) -> {
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = methodPathMap.get(k); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = methodPathMap.get(k);
@ -1013,12 +1020,13 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
ApiDefinitionWithBLOBs api = new ApiDefinitionWithBLOBs(); ApiDefinitionWithBLOBs api = new ApiDefinitionWithBLOBs();
BeanUtils.copyBean(api, apiDefinitionWithBLOBs); BeanUtils.copyBean(api, apiDefinitionWithBLOBs);
api.setId(definitionWithBLOBs.getId()); api.setId(definitionWithBLOBs.getId());
api.setVersionId(definitionWithBLOBs.getVersionId()); api.setVersionId(updateVersionId);
api.setOrder(definitionWithBLOBs.getOrder()); api.setOrder(definitionWithBLOBs.getOrder());
api.setRefId(apiDefinitionWithBLOBs.getRefId()); api.setRefId(apiDefinitionWithBLOBs.getRefId());
api.setLatest(apiDefinitionWithBLOBs.getLatest()); api.setLatest(apiDefinitionWithBLOBs.getLatest());
api.setNum(definitionWithBLOBs.getNum()); api.setNum(definitionWithBLOBs.getNum());
api.setStatus(definitionWithBLOBs.getStatus()); api.setStatus(definitionWithBLOBs.getStatus());
api.setCreateTime(definitionWithBLOBs.getCreateTime());
coverApiList.add(api); coverApiList.add(api);
} }
optionData.remove(apiDefinitionWithBLOBs); optionData.remove(apiDefinitionWithBLOBs);
@ -1027,7 +1035,9 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
buildOtherParam(toUpdateList, optionData, coverApiList); buildOtherParam(toUpdateList, optionData, coverApiList);
} }
private void startCover(List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData, Map<String, ApiDefinitionWithBLOBs> methodPathMap, Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap) { private void startCover(List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData,
Map<String, ApiDefinitionWithBLOBs> methodPathMap, Map<String, List<ApiDefinitionWithBLOBs>> repeatDataMap,
String updateVersionId) {
List<ApiDefinitionWithBLOBs> coverApiList = new ArrayList<>(); List<ApiDefinitionWithBLOBs> coverApiList = new ArrayList<>();
repeatDataMap.forEach((k, v) -> { repeatDataMap.forEach((k, v) -> {
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = methodPathMap.get(k); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = methodPathMap.get(k);
@ -1038,12 +1048,13 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
api.setId(definitionWithBLOBs.getId()); api.setId(definitionWithBLOBs.getId());
api.setNum(definitionWithBLOBs.getNum()); api.setNum(definitionWithBLOBs.getNum());
api.setStatus(definitionWithBLOBs.getStatus()); api.setStatus(definitionWithBLOBs.getStatus());
api.setVersionId(definitionWithBLOBs.getVersionId()); api.setVersionId(updateVersionId);
api.setModuleId(definitionWithBLOBs.getModuleId()); api.setModuleId(definitionWithBLOBs.getModuleId());
api.setModulePath(definitionWithBLOBs.getModulePath()); api.setModulePath(definitionWithBLOBs.getModulePath());
api.setOrder(definitionWithBLOBs.getOrder()); api.setOrder(definitionWithBLOBs.getOrder());
api.setRefId(apiDefinitionWithBLOBs.getRefId()); api.setRefId(apiDefinitionWithBLOBs.getRefId());
api.setLatest(apiDefinitionWithBLOBs.getLatest()); api.setLatest(apiDefinitionWithBLOBs.getLatest());
api.setCreateTime(definitionWithBLOBs.getCreateTime());
coverApiList.add(api); coverApiList.add(api);
} }
optionData.remove(apiDefinitionWithBLOBs); optionData.remove(apiDefinitionWithBLOBs);
@ -1068,6 +1079,7 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
private void buildOtherParam(List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData, List<ApiDefinitionWithBLOBs> coverApiList) { private void buildOtherParam(List<ApiDefinitionWithBLOBs> toUpdateList, List<ApiDefinitionWithBLOBs> optionData, List<ApiDefinitionWithBLOBs> coverApiList) {
optionData.addAll(coverApiList); optionData.addAll(coverApiList);
toUpdateList.addAll(coverApiList); toUpdateList.addAll(coverApiList);
} }
private List<ApiDefinitionWithBLOBs> setModule(Map<String, ApiModule> moduleMap, Map<String, List<ApiModule>> pidChildrenMap, private List<ApiDefinitionWithBLOBs> setModule(Map<String, ApiModule> moduleMap, Map<String, List<ApiModule>> pidChildrenMap,
@ -1116,7 +1128,6 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
String chooseModuleParentId = getChooseModuleParentId(chooseModule); String chooseModuleParentId = getChooseModuleParentId(chooseModule);
//导入时选了模块且接口有模块的 //导入时选了模块且接口有模块的
if (StringUtils.isNotBlank(modulePath)) { if (StringUtils.isNotBlank(modulePath)) {
List<ApiModule> moduleList = pidChildrenMap.get(chooseModuleParentId);
pathTree = getPathTree(modulePath); pathTree = getPathTree(modulePath);
ApiModule chooseModuleOne = JSON.parseObject(JSON.toJSONString(chooseModule), ApiModule.class); ApiModule chooseModuleOne = JSON.parseObject(JSON.toJSONString(chooseModule), ApiModule.class);
ApiModule minModule = getChooseMinModule(pathTree, chooseModuleOne, pidChildrenMap, moduleMap, idPathMap); ApiModule minModule = getChooseMinModule(pathTree, chooseModuleOne, pidChildrenMap, moduleMap, idPathMap);

View File

@ -503,49 +503,21 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
chooseModule = idModuleMap.get(chooseModuleId); chooseModule = idModuleMap.get(chooseModuleId);
} }
Set<String> versionSet = new HashSet<>();
if (fullCoverage) {
setFullVersionSet(request, versionSet);
} else {
String updateVersionId = getUpdateVersionId(request); String updateVersionId = getUpdateVersionId(request);
versionSet.add(updateVersionId); String versionId = getVersionId(request);
}
List<ApiScenarioWithBLOBs> optionData = new ArrayList<>(); List<ApiScenarioWithBLOBs> optionData = new ArrayList<>();
//覆盖模式留重复的最后一个不覆盖留第一个 //覆盖模式留重复的最后一个不覆盖留第一个
LinkedHashMap<String, List<ApiScenarioWithBLOBs>> nameModuleMapList = data.stream().collect(Collectors.groupingBy(t -> t.getName() + (t.getModulePath() == null ? "" : t.getModulePath()), LinkedHashMap::new, Collectors.toList())); LinkedHashMap<String, List<ApiScenarioWithBLOBs>> nameModuleMapList = data.stream().collect(Collectors.groupingBy(t -> t.getName() + (t.getModulePath() == null ? "" : t.getModulePath()), LinkedHashMap::new, Collectors.toList()));
removeRepeat(fullCoverage, optionData, nameModuleMapList); removeRepeatOrigin(fullCoverage, optionData, nameModuleMapList);
//处理模块 //处理模块
setModule(optionData, moduleMap, pidChildrenMap, idPathMap, idModuleMap, chooseModule); setModule(optionData, moduleMap, pidChildrenMap, idPathMap, idModuleMap, chooseModule);
List<String> names = optionData.stream().map(ApiScenario::getName).collect(Collectors.toList()); List<String> names = optionData.stream().map(ApiScenario::getName).collect(Collectors.toList());
//系统内重复的数据 //系统内重复的数据
List<ApiScenarioWithBLOBs> repeatApiScenarioWithBLOBs = extApiScenarioMapper.selectRepeatByBLOBs(names, projectId, versionSet); List<ApiScenarioWithBLOBs> repeatApiScenarioWithBLOBs = extApiScenarioMapper.selectRepeatByBLOBs(names, projectId);
moduleMap = getApiScenarioModuleMap(fullCoverage, fullCoverageScenario, moduleMap, toUpdateList, chooseModuleId, idPathMap, chooseModule, optionData, repeatApiScenarioWithBLOBs);
if (!repeatApiScenarioWithBLOBs.isEmpty()) {
Map<String, ApiScenarioWithBLOBs> repeatMap = repeatApiScenarioWithBLOBs.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), scenario -> scenario));
Map<String, ApiScenarioWithBLOBs> optionMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), scenario -> scenario));
if (fullCoverage) {
startCover(toUpdateList, optionMap, repeatMap);
} else {
//不覆盖,同一接口不做更新
removeRepeat(optionData, optionMap, repeatMap, moduleMap);
}
}
UpdateScenarioModuleDTO updateScenarioModuleDTO = new UpdateScenarioModuleDTO();
updateScenarioModuleDTO.setModuleList(new ArrayList<>(moduleMap.values()));
updateScenarioModuleDTO.setNeedUpdateList(toUpdateList);
updateScenarioModuleDTO.setApiScenarioWithBLOBsList(optionData);
return updateScenarioModuleDTO;
}
private Map<String, ApiScenarioModule> getApiScenarioModuleMap(Boolean fullCoverage, Boolean fullCoverageScenario, Map<String, ApiScenarioModule> moduleMap, List<ApiScenarioWithBLOBs> toUpdateList, String chooseModuleId, Map<String, String> idPathMap, ApiScenarioModuleDTO chooseModule, List<ApiScenarioWithBLOBs> optionData, List<ApiScenarioWithBLOBs> repeatApiScenarioWithBLOBs) {
Map<String, ApiScenarioWithBLOBs> nameModuleMap = null; Map<String, ApiScenarioWithBLOBs> nameModuleMap = null;
Map<String, ApiScenarioWithBLOBs> repeatDataMap = null; Map<String, ApiScenarioWithBLOBs> repeatDataMap = null;
if (chooseModule != null) { if (chooseModule != null) {
@ -562,40 +534,41 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
//处理数据 //处理数据
if (fullCoverage) { if (fullCoverage) {
if (fullCoverageScenario) { if (fullCoverageScenario) {
startCoverModule(toUpdateList, nameModuleMap, repeatDataMap); startCoverModule(toUpdateList, nameModuleMap, repeatDataMap, updateVersionId);
} else { } else {
//覆盖但不覆盖模块 //覆盖但不覆盖模块
if (nameModuleMap != null) { if (nameModuleMap != null) {
//导入文件没有新增场景无需创建接口模块 //导入文件没有新增场景无需创建接口模块
moduleMap = judgeModuleMap(moduleMap, nameModuleMap, repeatDataMap); moduleMap = judgeModuleMap(moduleMap, nameModuleMap, repeatDataMap);
startCover(toUpdateList, nameModuleMap, repeatDataMap); startCover(toUpdateList, nameModuleMap, repeatDataMap, updateVersionId);
} }
} }
} else { } else {
//不覆盖 //不覆盖
removeRepeat(optionData, nameModuleMap, repeatDataMap, moduleMap); removeRepeat(optionData, nameModuleMap, repeatDataMap, moduleMap, versionId);
}
return moduleMap;
} }
private void setFullVersionSet(ApiTestImportRequest request, Set<String> versionSet) { if (!repeatApiScenarioWithBLOBs.isEmpty()) {
String creatVersionId; Map<String, ApiScenarioWithBLOBs> repeatMap = repeatApiScenarioWithBLOBs.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), scenario -> scenario));
if (request.getVersionId() != null) { Map<String, ApiScenarioWithBLOBs> optionMap = optionData.stream().collect(Collectors.toMap(t -> t.getName() + t.getModulePath(), scenario -> scenario));
creatVersionId = request.getVersionId(); if (fullCoverage) {
startCover(toUpdateList, optionMap, repeatMap, updateVersionId);
} else { } else {
creatVersionId = request.getDefaultVersion(); //不覆盖,同一接口不做更新
removeRepeat(optionData, optionMap, repeatMap, moduleMap, versionId);
} }
versionSet.add(creatVersionId);
String updateVersionId;
if (request.getUpdateVersionId() != null) {
updateVersionId = request.getUpdateVersionId();
} else {
updateVersionId = request.getDefaultVersion();
}
versionSet.add(updateVersionId);
} }
private void removeRepeat(List<ApiScenarioWithBLOBs> optionData, Map<String, ApiScenarioWithBLOBs> nameModuleMap, Map<String, ApiScenarioWithBLOBs> repeatDataMap, Map<String, ApiScenarioModule> moduleMap) { UpdateScenarioModuleDTO updateScenarioModuleDTO = new UpdateScenarioModuleDTO();
updateScenarioModuleDTO.setModuleList(new ArrayList<>(moduleMap.values()));
updateScenarioModuleDTO.setNeedUpdateList(toUpdateList);
updateScenarioModuleDTO.setApiScenarioWithBLOBsList(optionData);
return updateScenarioModuleDTO;
}
private void removeRepeat(List<ApiScenarioWithBLOBs> optionData, Map<String, ApiScenarioWithBLOBs> nameModuleMap,
Map<String, ApiScenarioWithBLOBs> repeatDataMap, Map<String, ApiScenarioModule> moduleMap,
String versionId) {
if (repeatDataMap != null) { if (repeatDataMap != null) {
Map<String, List<ApiScenarioWithBLOBs>> moduleOptionData = optionData.stream().collect(Collectors.groupingBy(ApiScenario::getModulePath)); Map<String, List<ApiScenarioWithBLOBs>> moduleOptionData = optionData.stream().collect(Collectors.groupingBy(ApiScenario::getModulePath));
repeatDataMap.forEach((k, v) -> { repeatDataMap.forEach((k, v) -> {
@ -608,7 +581,18 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
removeModulePath(moduleMap, moduleOptionData, modulePath); removeModulePath(moduleMap, moduleOptionData, modulePath);
moduleDatas.remove(apiScenarioWithBLOBs); moduleDatas.remove(apiScenarioWithBLOBs);
} }
//不覆盖选择版本如果被选版本有同接口不导入否则创建新版本接口
if (v.getVersionId().equals(versionId)) {
optionData.remove(apiScenarioWithBLOBs); optionData.remove(apiScenarioWithBLOBs);
} else {
apiScenarioWithBLOBs.setVersionId("new");
apiScenarioWithBLOBs.setNum(v.getNum());
apiScenarioWithBLOBs.setStatus(v.getStatus());
apiScenarioWithBLOBs.setCreateTime(v.getCreateTime());
apiScenarioWithBLOBs.setRefId(v.getRefId());
apiScenarioWithBLOBs.setOrder(v.getOrder());
apiScenarioWithBLOBs.setLatest(v.getLatest());
}
} }
}); });
} }
@ -628,16 +612,20 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
} }
private void startCover(List<ApiScenarioWithBLOBs> toUpdateList, Map<String, ApiScenarioWithBLOBs> nameModuleMap, Map<String, ApiScenarioWithBLOBs> repeatDataMap) { private void startCover(List<ApiScenarioWithBLOBs> toUpdateList, Map<String, ApiScenarioWithBLOBs> nameModuleMap, Map<String, ApiScenarioWithBLOBs> repeatDataMap, String updateVersionId) {
repeatDataMap.forEach((k, v) -> { repeatDataMap.forEach((k, v) -> {
ApiScenarioWithBLOBs apiScenarioWithBLOBs = nameModuleMap.get(k); ApiScenarioWithBLOBs apiScenarioWithBLOBs = nameModuleMap.get(k);
if (apiScenarioWithBLOBs != null) { if (apiScenarioWithBLOBs != null) {
apiScenarioWithBLOBs.setId(v.getId()); apiScenarioWithBLOBs.setId(v.getId());
apiScenarioWithBLOBs.setVersionId(v.getVersionId()); apiScenarioWithBLOBs.setVersionId(updateVersionId);
apiScenarioWithBLOBs.setApiScenarioModuleId(v.getApiScenarioModuleId()); apiScenarioWithBLOBs.setApiScenarioModuleId(v.getApiScenarioModuleId());
apiScenarioWithBLOBs.setModulePath(v.getModulePath()); apiScenarioWithBLOBs.setModulePath(v.getModulePath());
apiScenarioWithBLOBs.setNum(v.getNum()); apiScenarioWithBLOBs.setNum(v.getNum());
apiScenarioWithBLOBs.setStatus(v.getStatus()); apiScenarioWithBLOBs.setStatus(v.getStatus());
apiScenarioWithBLOBs.setCreateTime(v.getCreateTime());
apiScenarioWithBLOBs.setRefId(v.getRefId());
apiScenarioWithBLOBs.setOrder(v.getOrder());
apiScenarioWithBLOBs.setLatest(v.getLatest());
toUpdateList.add(apiScenarioWithBLOBs); toUpdateList.add(apiScenarioWithBLOBs);
} }
}); });
@ -660,22 +648,27 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
return moduleMap; return moduleMap;
} }
private void startCoverModule(List<ApiScenarioWithBLOBs> toUpdateList, Map<String, ApiScenarioWithBLOBs> nameModuleMap, Map<String, ApiScenarioWithBLOBs> repeatDataMap) { private void startCoverModule(List<ApiScenarioWithBLOBs> toUpdateList, Map<String, ApiScenarioWithBLOBs> nameModuleMap,
Map<String, ApiScenarioWithBLOBs> repeatDataMap, String updateVersionId) {
if (repeatDataMap != null) { if (repeatDataMap != null) {
repeatDataMap.forEach((k, v) -> { repeatDataMap.forEach((k, v) -> {
ApiScenarioWithBLOBs apiScenarioWithBLOBs = nameModuleMap.get(k); ApiScenarioWithBLOBs apiScenarioWithBLOBs = nameModuleMap.get(k);
if (apiScenarioWithBLOBs != null) { if (apiScenarioWithBLOBs != null) {
apiScenarioWithBLOBs.setId(v.getId()); apiScenarioWithBLOBs.setId(v.getId());
apiScenarioWithBLOBs.setVersionId(v.getVersionId()); apiScenarioWithBLOBs.setVersionId(updateVersionId);
apiScenarioWithBLOBs.setNum(v.getNum()); apiScenarioWithBLOBs.setNum(v.getNum());
apiScenarioWithBLOBs.setStatus(v.getStatus()); apiScenarioWithBLOBs.setStatus(v.getStatus());
apiScenarioWithBLOBs.setCreateTime(v.getCreateTime());
apiScenarioWithBLOBs.setRefId(v.getRefId());
apiScenarioWithBLOBs.setOrder(v.getOrder());
apiScenarioWithBLOBs.setLatest(v.getLatest());
toUpdateList.add(apiScenarioWithBLOBs); toUpdateList.add(apiScenarioWithBLOBs);
} }
}); });
} }
} }
private void removeRepeat(Boolean fullCoverage, List<ApiScenarioWithBLOBs> optionData, LinkedHashMap<String, List<ApiScenarioWithBLOBs>> nameModuleMapList) { private void removeRepeatOrigin(Boolean fullCoverage, List<ApiScenarioWithBLOBs> optionData, LinkedHashMap<String, List<ApiScenarioWithBLOBs>> nameModuleMapList) {
if (fullCoverage) { if (fullCoverage) {
nameModuleMapList.forEach((k, v) -> { nameModuleMapList.forEach((k, v) -> {
optionData.add(v.get(v.size() - 1)); optionData.add(v.get(v.size() - 1));
@ -687,12 +680,22 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
} }
} }
private String getVersionId(ApiTestImportRequest request) {
String versionId;
if (request.getVersionId() == null) {
versionId = request.getDefaultVersion();
} else {
versionId = request.getVersionId();
}
return versionId;
}
private String getUpdateVersionId(ApiTestImportRequest request) { private String getUpdateVersionId(ApiTestImportRequest request) {
String updateVersionId; String updateVersionId;
if (request.getVersionId() == null) { if (request.getUpdateVersionId() == null) {
updateVersionId = request.getDefaultVersion(); updateVersionId = request.getDefaultVersion();
} else { } else {
updateVersionId = request.getVersionId(); updateVersionId = request.getUpdateVersionId();
} }
return updateVersionId; return updateVersionId;
} }
@ -709,11 +712,8 @@ public class ApiScenarioModuleService extends NodeTreeService<ApiScenarioModuleD
String chooseModulePath = getChooseModulePath(idPathMap, chooseModule, chooseModuleParentId); String chooseModulePath = getChooseModulePath(idPathMap, chooseModule, chooseModuleParentId);
//导入时选了模块且接口有模块的 //导入时选了模块且接口有模块的
if (StringUtils.isNotBlank(modulePath)) { if (StringUtils.isNotBlank(modulePath)) {
//选中模块的同级模块集合用于和场景的全路径做对比
List<ApiScenarioModule> parentModuleList = pidChildrenMap.get(chooseModuleParentId);
//场景的全部路径的集合 //场景的全部路径的集合
tagTree = getTagTree(chooseModulePath + modulePath); tagTree = getTagTree(modulePath);
ApiScenarioModule chooseModuleOne = JSON.parseObject(JSON.toJSONString(chooseModule), ApiScenarioModule.class); ApiScenarioModule chooseModuleOne = JSON.parseObject(JSON.toJSONString(chooseModule), ApiScenarioModule.class);
ApiScenarioModule minModule = getChooseMinModule(tagTree, chooseModuleOne, pidChildrenMap, map, idPathMap); ApiScenarioModule minModule = getChooseMinModule(tagTree, chooseModuleOne, pidChildrenMap, map, idPathMap);
String id = minModule.getId(); String id = minModule.getId();

View File

@ -93,11 +93,11 @@ public interface ExtApiDefinitionMapper {
int toBeUpdateApi(@Param("ids") List<String> ids, @Param("toBeUpdate") Boolean toBeUpdate); int toBeUpdateApi(@Param("ids") List<String> ids, @Param("toBeUpdate") Boolean toBeUpdate);
List<ApiDefinitionWithBLOBs> selectRepeatByBLOBs(@Param("blobs") List<ApiDefinitionWithBLOBs> blobs, @Param("projectId") String projectId, @Param("versionIds") Set<String> versionIds); List<ApiDefinitionWithBLOBs> selectRepeatByBLOBs(@Param("blobs") List<ApiDefinitionWithBLOBs> blobs, @Param("projectId") String projectId);
List<ApiDefinitionWithBLOBs> selectRepeatByBLOBsSameUrl(@Param("blobs") List<ApiDefinitionWithBLOBs> blobs, @Param("projectId") String projectId, @Param("moduleId") String moduleId, @Param("versionIds") Set<String> versionIds); List<ApiDefinitionWithBLOBs> selectRepeatByBLOBsSameUrl(@Param("blobs") List<ApiDefinitionWithBLOBs> blobs, @Param("projectId") String projectId, @Param("moduleId") String moduleId);
List<ApiDefinitionWithBLOBs> selectRepeatByProtocol(@Param("names") List<String> names, @Param("protocol") String protocol, @Param("versionIds") Set<String> versionIds); List<ApiDefinitionWithBLOBs> selectRepeatByProtocol(@Param("names") List<String> names, @Param("protocol") String protocol);
int countById(String id); int countById(String id);
} }

View File

@ -1087,10 +1087,6 @@
<include refid="Same_Where_Clause"/> <include refid="Same_Where_Clause"/>
and status != 'Trash' and status != 'Trash'
and project_id = #{projectId} and project_id = #{projectId}
and version_id in
<foreach collection="versionIds" item="versionId" separator="," open="(" close=")">
#{versionId}
</foreach>
</select> </select>
<select id="selectRepeatByBLOBsSameUrl" resultType="io.metersphere.base.domain.ApiDefinitionWithBLOBs"> <select id="selectRepeatByBLOBsSameUrl" resultType="io.metersphere.base.domain.ApiDefinitionWithBLOBs">
SELECT * from api_definition SELECT * from api_definition
@ -1098,10 +1094,6 @@
and status != 'TRASH' and status != 'TRASH'
and project_id = #{projectId} and project_id = #{projectId}
and module_id = #{moduleId} and module_id = #{moduleId}
and version_id in
<foreach collection="versionIds" item="versionId" separator="," open="(" close=")">
#{versionId}
</foreach>
</select> </select>
<select id="selectRepeatByProtocol" resultType="io.metersphere.base.domain.ApiDefinitionWithBLOBs"> <select id="selectRepeatByProtocol" resultType="io.metersphere.base.domain.ApiDefinitionWithBLOBs">
SELECT * from api_definition SELECT * from api_definition
@ -1109,10 +1101,6 @@
<foreach collection="names" item="name" separator="," open="(" close=")"> <foreach collection="names" item="name" separator="," open="(" close=")">
#{name} #{name}
</foreach> </foreach>
and version_id in
<foreach collection="versionIds" item="versionId" separator="," open="(" close=")">
#{versionId}
</foreach>
and protocol = #{protocol} and protocol = #{protocol}
and status != 'Trash' and status != 'Trash'
</select> </select>

View File

@ -91,7 +91,7 @@ public interface ExtApiScenarioMapper {
List<ApiScenarioWithBLOBs> selectByStatusIsNotTrash(); List<ApiScenarioWithBLOBs> selectByStatusIsNotTrash();
List<ApiScenarioWithBLOBs> selectRepeatByBLOBs(@Param("names") List<String> names, @Param("projectId") String projectId, @Param("versionIds") Set<String> versionIds); List<ApiScenarioWithBLOBs> selectRepeatByBLOBs(@Param("names") List<String> names, @Param("projectId") String projectId);
} }

View File

@ -828,10 +828,6 @@
</foreach> </foreach>
and status != 'Trash' and status != 'Trash'
and project_id = #{projectId} and project_id = #{projectId}
and version_id in
<foreach collection="versionIds" item="versionId" separator="," open="(" close=")">
#{versionId}
</foreach>
</select> </select>
</mapper> </mapper>