fix(测试计划): 报告用例明细列表跨项目用例所属模块展示问题

--bug=1044294 --user=宋昌昌 【测试计划】测试计划中关联了跨项目的接口用例-执行该计划-报告中的接口明细-所属模块列表信息获取错误 https://www.tapd.cn/55049933/s/1553888
This commit is contained in:
song-cc-rock 2024-07-24 18:16:46 +08:00 committed by 刘瑞斌
parent 16177fedb6
commit 47eba6f6a9
10 changed files with 67 additions and 119 deletions

View File

@ -43,7 +43,7 @@ public class BugRelateCaseController {
private BugRelateCaseCommonService bugRelateCaseCommonService; private BugRelateCaseCommonService bugRelateCaseCommonService;
@PostMapping("/un-relate/page") @PostMapping("/un-relate/page")
@Operation(description = "缺陷管理-关联用例-未关联用例-列表分页") @Operation(summary = "缺陷管理-关联用例-未关联用例-列表分页")
@RequiresPermissions(PermissionConstants.PROJECT_BUG_READ) @RequiresPermissions(PermissionConstants.PROJECT_BUG_READ)
public Pager<List<TestCaseProviderDTO>> unRelatedPage(@Validated @RequestBody TestCasePageProviderRequest request) { public Pager<List<TestCaseProviderDTO>> unRelatedPage(@Validated @RequestBody TestCasePageProviderRequest request) {
bugRelateCaseCommonService.checkCaseTypeParamIllegal(request.getSourceType()); bugRelateCaseCommonService.checkCaseTypeParamIllegal(request.getSourceType());
@ -77,7 +77,7 @@ public class BugRelateCaseController {
} }
@PostMapping("/page") @PostMapping("/page")
@Operation(description = "缺陷管理-关联用例-列表分页查询") @Operation(summary = "缺陷管理-关联用例-列表分页查询")
@RequiresPermissions(PermissionConstants.PROJECT_BUG_READ) @RequiresPermissions(PermissionConstants.PROJECT_BUG_READ)
public Pager<List<BugRelateCaseDTO>> page(@Validated @RequestBody BugRelatedCasePageRequest request) { public Pager<List<BugRelateCaseDTO>> page(@Validated @RequestBody BugRelatedCasePageRequest request) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize()); Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize());
@ -85,7 +85,7 @@ public class BugRelateCaseController {
} }
@GetMapping("/un-relate/{id}") @GetMapping("/un-relate/{id}")
@Operation(description = "缺陷管理-关联用例-取消关联用例") @Operation(summary = "缺陷管理-关联用例-取消关联用例")
@RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE)
@Parameter(name = "id", description = "ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)) @Parameter(name = "id", description = "ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
@Log(type = OperationLogType.DISASSOCIATE, expression = "#msClass.getRelateLog(#id)", msClass = BugRelateCaseLogService.class) @Log(type = OperationLogType.DISASSOCIATE, expression = "#msClass.getRelateLog(#id)", msClass = BugRelateCaseLogService.class)
@ -94,7 +94,7 @@ public class BugRelateCaseController {
} }
@GetMapping("/check-permission/{projectId}/{caseType}") @GetMapping("/check-permission/{projectId}/{caseType}")
@Operation(description = "缺陷管理-关联用例-查看用例权限校验") @Operation(summary = "缺陷管理-关联用例-查看用例权限校验")
@Parameters({ @Parameters({
@Parameter(name = "projectId", description = "项目ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)), @Parameter(name = "projectId", description = "项目ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)),
@Parameter(name = "caseType", description = "关联用例类型(FUNCTIONAL, API, SCENARIO)", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)) @Parameter(name = "caseType", description = "关联用例类型(FUNCTIONAL, API, SCENARIO)", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))

View File

@ -8,6 +8,7 @@ import io.metersphere.system.dto.sdk.request.PosRequest;
import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validator; import jakarta.validation.Validator;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
@ -120,6 +121,9 @@ public class ServiceUtils {
} }
public static String compressName(String name, int maxSize) { public static String compressName(String name, int maxSize) {
if (StringUtils.isBlank(name)) {
return StringUtils.EMPTY;
}
String newName = name; String newName = name;
// 限制名称长度 数据库里最大的长度是255这里判断超过250时截取到200附近 // 限制名称长度 数据库里最大的长度是255这里判断超过250时截取到200附近
if (newName.length() > maxSize) { if (newName.length() > maxSize) {

View File

@ -27,10 +27,10 @@ public interface ExtTestPlanReportApiCaseMapper {
/** /**
* 获取项目下接口用例所属模块集合 * 获取项目下接口用例所属模块集合
* @param projectId 计划ID * @param ids 模块ID集合
* @return 模块集合 * @return 模块集合
*/ */
List<TestPlanBaseModule> getPlanExecuteCaseModules(@Param("id") String projectId); List<TestPlanBaseModule> getPlanExecuteCaseModules(@Param("ids") List<String> ids);
/** /**
* 分页查询报告关联的用例 * 分页查询报告关联的用例

View File

@ -20,8 +20,11 @@
</select> </select>
<select id="getPlanExecuteCaseModules" resultType="io.metersphere.plan.dto.TestPlanBaseModule"> <select id="getPlanExecuteCaseModules" resultType="io.metersphere.plan.dto.TestPlanBaseModule">
select adm.id, adm.name, adm.parent_id as parentId from api_definition_module adm select adm.id, adm.name from api_definition_module adm
where adm.project_id = #{id} where adm.id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select> </select>
<select id="list" resultType="io.metersphere.plan.dto.ReportDetailCasePageDTO"> <select id="list" resultType="io.metersphere.plan.dto.ReportDetailCasePageDTO">

View File

@ -27,10 +27,10 @@ public interface ExtTestPlanReportApiScenarioMapper {
/** /**
* 获取项目下场景用例所属模块集合 * 获取项目下场景用例所属模块集合
* @param projectId 计划ID * @param ids 模块ID集合
* @return 模块集合 * @return 模块集合
*/ */
List<TestPlanBaseModule> getPlanExecuteCaseModules(@Param("id") String projectId); List<TestPlanBaseModule> getPlanExecuteCaseModules(@Param("ids") List<String> ids);
/** /**
* 分页查询报告关联的用例 * 分页查询报告关联的用例

View File

@ -19,8 +19,11 @@
</select> </select>
<select id="getPlanExecuteCaseModules" resultType="io.metersphere.plan.dto.TestPlanBaseModule"> <select id="getPlanExecuteCaseModules" resultType="io.metersphere.plan.dto.TestPlanBaseModule">
select asm.id, asm.name, asm.parent_id as parentId from api_scenario_module asm select asm.id, asm.name from api_scenario_module asm
where asm.project_id = #{id} where asm.id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select> </select>
<select id="list" resultType="io.metersphere.plan.dto.ReportDetailCasePageDTO"> <select id="list" resultType="io.metersphere.plan.dto.ReportDetailCasePageDTO">

View File

@ -21,10 +21,10 @@ public interface ExtTestPlanReportFunctionalCaseMapper {
/** /**
* 获取项目下功能用例所属模块集合 * 获取项目下功能用例所属模块集合
* @param projectId 计划ID * @param ids 模块ID集合
* @return 模块集合 * @return 模块集合
*/ */
List<TestPlanBaseModule> getPlanExecuteCaseModules(@Param("id") String projectId); List<TestPlanBaseModule> getPlanExecuteCaseModules(@Param("ids") List<String> ids);
/** /**
* 获取用例等级 * 获取用例等级

View File

@ -14,8 +14,11 @@
</select> </select>
<select id="getPlanExecuteCaseModules" resultType="io.metersphere.plan.dto.TestPlanBaseModule"> <select id="getPlanExecuteCaseModules" resultType="io.metersphere.plan.dto.TestPlanBaseModule">
select fcm.id, fcm.name, fcm.parent_id as parentId from functional_case_module fcm select fcm.id, fcm.name from functional_case_module fcm
where fcm.project_id = #{id} where fcm.id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select> </select>
<select id="getCasePriorityByIds" resultType="io.metersphere.plugin.platform.dto.SelectOption"> <select id="getCasePriorityByIds" resultType="io.metersphere.plugin.platform.dto.SelectOption">

View File

@ -12,7 +12,6 @@ import io.metersphere.plan.dto.response.TestPlanReportPageResponse;
import io.metersphere.plan.enums.TestPlanReportAttachmentSourceType; import io.metersphere.plan.enums.TestPlanReportAttachmentSourceType;
import io.metersphere.plan.mapper.*; import io.metersphere.plan.mapper.*;
import io.metersphere.plan.utils.CountUtils; import io.metersphere.plan.utils.CountUtils;
import io.metersphere.plan.utils.ModuleTreeUtils;
import io.metersphere.plan.utils.RateCalculateUtils; import io.metersphere.plan.utils.RateCalculateUtils;
import io.metersphere.plugin.platform.dto.SelectOption; import io.metersphere.plugin.platform.dto.SelectOption;
import io.metersphere.project.service.FileService; import io.metersphere.project.service.FileService;
@ -304,8 +303,6 @@ public class TestPlanReportService {
try { try {
// 所有计划 // 所有计划
List<TestPlan> plans = getPlans(request.getTestPlanId()); List<TestPlan> plans = getPlans(request.getTestPlanId());
// 模块参数
TestPlanReportModuleParam moduleParam = getModuleParam(request.getProjectId());
/* /*
* 1. 准备报告生成参数 * 1. 准备报告生成参数
@ -326,7 +323,7 @@ public class TestPlanReportService {
genPreParam.setUseManual(manual); genPreParam.setUseManual(manual);
//如果是测试计划的独立报告使用参数中的预生成的报告id否则只有测试计划组报告使用该id //如果是测试计划的独立报告使用参数中的预生成的报告id否则只有测试计划组报告使用该id
String prepareItemReportId = isGroupReports ? IDGenerator.nextStr() : prepareReportId; String prepareItemReportId = isGroupReports ? IDGenerator.nextStr() : prepareReportId;
TestPlanReport preReport = preGenReport(prepareItemReportId, genPreParam, currentUser, moduleParam, childPlanIds, reportManualParam); TestPlanReport preReport = preGenReport(prepareItemReportId, genPreParam, currentUser, childPlanIds, reportManualParam);
if (manual) { if (manual) {
// 汇总 // 汇总
if (genPreParam.getIntegrated()) { if (genPreParam.getIntegrated()) {
@ -357,8 +354,8 @@ public class TestPlanReportService {
* *
* @return 报告 * @return 报告
*/ */
public TestPlanReport preGenReport(String prepareId, TestPlanReportGenPreParam genParam, String currentUser, TestPlanReportModuleParam moduleParam, public TestPlanReport preGenReport(String prepareId, TestPlanReportGenPreParam genParam, String currentUser, List<String> childPlanIds,
List<String> childPlanIds, TestPlanReportManualParam reportManualParam) { TestPlanReportManualParam reportManualParam) {
// 计划配置 // 计划配置
TestPlanConfig config = testPlanConfigMapper.selectByPrimaryKey(genParam.getTestPlanId()); TestPlanConfig config = testPlanConfigMapper.selectByPrimaryKey(genParam.getTestPlanId());
@ -383,7 +380,7 @@ public class TestPlanReportService {
TestPlanReportDetailCaseDTO reportCaseDetail; TestPlanReportDetailCaseDTO reportCaseDetail;
if (!genParam.getIntegrated()) { if (!genParam.getIntegrated()) {
// 生成独立报告的关联数据 // 生成独立报告的关联数据
reportCaseDetail = genReportDetail(genParam, moduleParam, report); reportCaseDetail = genReportDetail(genParam, report);
} else { } else {
// 计划组报告暂不统计各用例类型, 汇总时再入库 // 计划组报告暂不统计各用例类型, 汇总时再入库
reportCaseDetail = TestPlanReportDetailCaseDTO.builder().build(); reportCaseDetail = TestPlanReportDetailCaseDTO.builder().build();
@ -408,10 +405,9 @@ public class TestPlanReportService {
* 生成独立报告的关联数据 * 生成独立报告的关联数据
* *
* @param genParam 报告生成的参数 * @param genParam 报告生成的参数
* @param moduleParam 模块参数
* @param report 报告 * @param report 报告
*/ */
private TestPlanReportDetailCaseDTO genReportDetail(TestPlanReportGenPreParam genParam, TestPlanReportModuleParam moduleParam, TestPlanReport report) { private TestPlanReportDetailCaseDTO genReportDetail(TestPlanReportGenPreParam genParam, TestPlanReport report) {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
// 功能用例 // 功能用例
List<TestPlanReportFunctionCase> reportFunctionCases = extTestPlanReportFunctionalCaseMapper.getPlanExecuteCases(genParam.getTestPlanId()); List<TestPlanReportFunctionCase> reportFunctionCases = extTestPlanReportFunctionalCaseMapper.getPlanExecuteCases(genParam.getTestPlanId());
@ -420,6 +416,13 @@ public class TestPlanReportService {
List<String> ids = reportFunctionCases.stream().map(TestPlanReportFunctionCase::getFunctionCaseId).distinct().toList(); List<String> ids = reportFunctionCases.stream().map(TestPlanReportFunctionCase::getFunctionCaseId).distinct().toList();
List<SelectOption> options = extTestPlanReportFunctionalCaseMapper.getCasePriorityByIds(ids); List<SelectOption> options = extTestPlanReportFunctionalCaseMapper.getCasePriorityByIds(ids);
Map<String, String> casePriorityMap = options.stream().collect(Collectors.toMap(SelectOption::getValue, SelectOption::getText)); Map<String, String> casePriorityMap = options.stream().collect(Collectors.toMap(SelectOption::getValue, SelectOption::getText));
// 用例模块
List<String> moduleIds = reportFunctionCases.stream().map(TestPlanReportFunctionCase::getFunctionCaseModule).filter(Objects::nonNull).toList();
Map<String, String> moduleMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(moduleIds)) {
List<TestPlanBaseModule> modules = extTestPlanReportFunctionalCaseMapper.getPlanExecuteCaseModules(moduleIds);
moduleMap = modules.stream().collect(Collectors.toMap(TestPlanBaseModule::getId, TestPlanBaseModule::getName));
}
// 关联的功能用例最新一次执行历史 // 关联的功能用例最新一次执行历史
List<String> relateIds = reportFunctionCases.stream().map(TestPlanReportFunctionCase::getTestPlanFunctionCaseId).toList(); List<String> relateIds = reportFunctionCases.stream().map(TestPlanReportFunctionCase::getTestPlanFunctionCaseId).toList();
TestPlanCaseExecuteHistoryExample example = new TestPlanCaseExecuteHistoryExample(); TestPlanCaseExecuteHistoryExample example = new TestPlanCaseExecuteHistoryExample();
@ -427,13 +430,11 @@ public class TestPlanReportService {
List<TestPlanCaseExecuteHistory> functionalExecHisList = testPlanCaseExecuteHistoryMapper.selectByExample(example); List<TestPlanCaseExecuteHistory> functionalExecHisList = testPlanCaseExecuteHistoryMapper.selectByExample(example);
Map<String, List<TestPlanCaseExecuteHistory>> functionalExecMap = functionalExecHisList.stream().collect(Collectors.groupingBy(TestPlanCaseExecuteHistory::getTestPlanCaseId)); Map<String, List<TestPlanCaseExecuteHistory>> functionalExecMap = functionalExecHisList.stream().collect(Collectors.groupingBy(TestPlanCaseExecuteHistory::getTestPlanCaseId));
for (TestPlanReportFunctionCase reportFunctionalCase : reportFunctionCases) {
reportFunctionCases.forEach(reportFunctionalCase -> {
reportFunctionalCase.setId(IDGenerator.nextStr()); reportFunctionalCase.setId(IDGenerator.nextStr());
reportFunctionalCase.setTestPlanReportId(report.getId()); reportFunctionalCase.setTestPlanReportId(report.getId());
reportFunctionalCase.setTestPlanName(genParam.getTestPlanName()); reportFunctionalCase.setTestPlanName(genParam.getTestPlanName());
reportFunctionalCase.setFunctionCaseModule(moduleParam.getFunctionalModuleMap().getOrDefault(reportFunctionalCase.getFunctionCaseModule(), reportFunctionalCase.setFunctionCaseModule(moduleMap.getOrDefault(reportFunctionalCase.getFunctionCaseModule(), reportFunctionalCase.getFunctionCaseModule()));
ModuleTreeUtils.MODULE_PATH_PREFIX + reportFunctionalCase.getFunctionCaseModule()));
reportFunctionalCase.setFunctionCasePriority(casePriorityMap.get(reportFunctionalCase.getFunctionCaseId())); reportFunctionalCase.setFunctionCasePriority(casePriorityMap.get(reportFunctionalCase.getFunctionCaseId()));
List<TestPlanCaseExecuteHistory> hisList = functionalExecMap.get(reportFunctionalCase.getTestPlanFunctionCaseId()); List<TestPlanCaseExecuteHistory> hisList = functionalExecMap.get(reportFunctionalCase.getTestPlanFunctionCaseId());
if (CollectionUtils.isNotEmpty(hisList)) { if (CollectionUtils.isNotEmpty(hisList)) {
@ -442,7 +443,8 @@ public class TestPlanReportService {
} else { } else {
reportFunctionalCase.setFunctionCaseExecuteReportId(null); reportFunctionalCase.setFunctionCaseExecuteReportId(null);
} }
}); }
// 插入计划功能用例关联数据 -> 报告内容 // 插入计划功能用例关联数据 -> 报告内容
TestPlanReportFunctionCaseMapper batchMapper = sqlSession.getMapper(TestPlanReportFunctionCaseMapper.class); TestPlanReportFunctionCaseMapper batchMapper = sqlSession.getMapper(TestPlanReportFunctionCaseMapper.class);
batchMapper.batchInsert(reportFunctionCases); batchMapper.batchInsert(reportFunctionCases);
@ -451,12 +453,19 @@ public class TestPlanReportService {
// 接口用例 // 接口用例
List<TestPlanReportApiCase> reportApiCases = extTestPlanReportApiCaseMapper.getPlanExecuteCases(genParam.getTestPlanId()); List<TestPlanReportApiCase> reportApiCases = extTestPlanReportApiCaseMapper.getPlanExecuteCases(genParam.getTestPlanId());
if (CollectionUtils.isNotEmpty(reportApiCases)) { if (CollectionUtils.isNotEmpty(reportApiCases)) {
reportApiCases.forEach(reportApiCase -> { // 用例模块
List<String> moduleIds = reportApiCases.stream().map(TestPlanReportApiCase::getApiCaseModule).filter(Objects::nonNull).toList();
Map<String, String> moduleMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(moduleIds)) {
List<TestPlanBaseModule> modules = extTestPlanReportApiCaseMapper.getPlanExecuteCaseModules(moduleIds);
moduleMap = modules.stream().collect(Collectors.toMap(TestPlanBaseModule::getId, TestPlanBaseModule::getName));
}
for (TestPlanReportApiCase reportApiCase : reportApiCases) {
reportApiCase.setId(IDGenerator.nextStr()); reportApiCase.setId(IDGenerator.nextStr());
reportApiCase.setTestPlanReportId(report.getId()); reportApiCase.setTestPlanReportId(report.getId());
reportApiCase.setTestPlanName(genParam.getTestPlanName()); reportApiCase.setTestPlanName(genParam.getTestPlanName());
reportApiCase.setApiCaseModule(moduleParam.getApiModuleMap().getOrDefault(reportApiCase.getApiCaseModule(), reportApiCase.setApiCaseModule(moduleMap.getOrDefault(reportApiCase.getApiCaseModule(), reportApiCase.getApiCaseModule()));
ModuleTreeUtils.MODULE_PATH_PREFIX + reportApiCase.getApiCaseModule()));
//根据不超过数据库字段最大长度压缩模块名 //根据不超过数据库字段最大长度压缩模块名
reportApiCase.setApiCaseModule(ServiceUtils.compressName(reportApiCase.getApiCaseModule(), 450)); reportApiCase.setApiCaseModule(ServiceUtils.compressName(reportApiCase.getApiCaseModule(), 450));
if (!genParam.getUseManual()) { if (!genParam.getUseManual()) {
@ -465,7 +474,7 @@ public class TestPlanReportService {
reportApiCase.setApiCaseExecuteUser(null); reportApiCase.setApiCaseExecuteUser(null);
reportApiCase.setApiCaseExecuteReportId(IDGenerator.nextStr()); reportApiCase.setApiCaseExecuteReportId(IDGenerator.nextStr());
} }
}); }
// 插入计划接口用例关联数据 -> 报告内容 // 插入计划接口用例关联数据 -> 报告内容
TestPlanReportApiCaseMapper batchMapper = sqlSession.getMapper(TestPlanReportApiCaseMapper.class); TestPlanReportApiCaseMapper batchMapper = sqlSession.getMapper(TestPlanReportApiCaseMapper.class);
batchMapper.batchInsert(reportApiCases); batchMapper.batchInsert(reportApiCases);
@ -474,12 +483,19 @@ public class TestPlanReportService {
// 场景用例 // 场景用例
List<TestPlanReportApiScenario> reportApiScenarios = extTestPlanReportApiScenarioMapper.getPlanExecuteCases(genParam.getTestPlanId()); List<TestPlanReportApiScenario> reportApiScenarios = extTestPlanReportApiScenarioMapper.getPlanExecuteCases(genParam.getTestPlanId());
if (CollectionUtils.isNotEmpty(reportApiScenarios)) { if (CollectionUtils.isNotEmpty(reportApiScenarios)) {
reportApiScenarios.forEach(reportApiScenario -> { // 用例模块
List<String> moduleIds = reportApiScenarios.stream().map(TestPlanReportApiScenario::getApiScenarioModule).filter(Objects::nonNull).toList();
Map<String, String> moduleMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(moduleIds)) {
List<TestPlanBaseModule> modules = extTestPlanReportApiScenarioMapper.getPlanExecuteCaseModules(moduleIds);
moduleMap = modules.stream().collect(Collectors.toMap(TestPlanBaseModule::getId, TestPlanBaseModule::getName));
}
for (TestPlanReportApiScenario reportApiScenario : reportApiScenarios) {
reportApiScenario.setId(IDGenerator.nextStr()); reportApiScenario.setId(IDGenerator.nextStr());
reportApiScenario.setTestPlanReportId(report.getId()); reportApiScenario.setTestPlanReportId(report.getId());
reportApiScenario.setTestPlanName(genParam.getTestPlanName()); reportApiScenario.setTestPlanName(genParam.getTestPlanName());
reportApiScenario.setApiScenarioModule(moduleParam.getScenarioModuleMap().getOrDefault(reportApiScenario.getApiScenarioModule(), reportApiScenario.setApiScenarioModule(moduleMap.getOrDefault(reportApiScenario.getApiScenarioModule(), reportApiScenario.getApiScenarioModule()));
ModuleTreeUtils.MODULE_PATH_PREFIX + reportApiScenario.getApiScenarioModule()));
//根据不超过数据库字段最大长度压缩模块名 //根据不超过数据库字段最大长度压缩模块名
reportApiScenario.setApiScenarioModule(ServiceUtils.compressName(reportApiScenario.getApiScenarioModule(), 450)); reportApiScenario.setApiScenarioModule(ServiceUtils.compressName(reportApiScenario.getApiScenarioModule(), 450));
if (!genParam.getUseManual()) { if (!genParam.getUseManual()) {
@ -488,7 +504,7 @@ public class TestPlanReportService {
reportApiScenario.setApiScenarioExecuteUser(null); reportApiScenario.setApiScenarioExecuteUser(null);
reportApiScenario.setApiScenarioExecuteReportId(IDGenerator.nextStr()); reportApiScenario.setApiScenarioExecuteReportId(IDGenerator.nextStr());
} }
}); }
// 插入计划场景用例关联数据 -> 报告内容 // 插入计划场景用例关联数据 -> 报告内容
TestPlanReportApiScenarioMapper batchMapper = sqlSession.getMapper(TestPlanReportApiScenarioMapper.class); TestPlanReportApiScenarioMapper batchMapper = sqlSession.getMapper(TestPlanReportApiScenarioMapper.class);
batchMapper.batchInsert(reportApiScenarios); batchMapper.batchInsert(reportApiScenarios);
@ -1062,26 +1078,6 @@ public class TestPlanReportService {
return plans; return plans;
} }
/**
* 获取项目下的模块参数
*
* @param projectId 项目ID
* @return 模块参数
*/
private TestPlanReportModuleParam getModuleParam(String projectId) {
// 模块树 {功能, 接口, 场景}
List<TestPlanBaseModule> functionalModules = extTestPlanReportFunctionalCaseMapper.getPlanExecuteCaseModules(projectId);
Map<String, String> functionalModuleMap = new HashMap<>(functionalModules.size());
ModuleTreeUtils.genPathMap(functionalModules, functionalModuleMap, new ArrayList<>());
List<TestPlanBaseModule> apiModules = extTestPlanReportApiCaseMapper.getPlanExecuteCaseModules(projectId);
Map<String, String> apiModuleMap = new HashMap<>(apiModules.size());
ModuleTreeUtils.genPathMap(apiModules, apiModuleMap, new ArrayList<>());
List<TestPlanBaseModule> scenarioModules = extTestPlanReportApiScenarioMapper.getPlanExecuteCaseModules(projectId);
Map<String, String> scenarioModuleMap = new HashMap<>(apiModules.size());
ModuleTreeUtils.genPathMap(scenarioModules, scenarioModuleMap, new ArrayList<>());
return TestPlanReportModuleParam.builder().functionalModuleMap(functionalModuleMap).apiModuleMap(apiModuleMap).scenarioModuleMap(scenarioModuleMap).build();
}
/** /**
* 获取用户集合 * 获取用户集合
* *

View File

@ -1,61 +0,0 @@
package io.metersphere.plan.utils;
import io.metersphere.plan.dto.TestPlanBaseModule;
import lombok.experimental.UtilityClass;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
/**
* 模块树解析相关的工具类
*/
@UtilityClass
public class ModuleTreeUtils {
public static final String MODULE_PATH_PREFIX = "/";
/**
* 解析并返回模块的全路径
* @param filterNodes 模块集合
* @param nodePathMap 树节点路径集合
*/
private static void realGenPathMap(List<TestPlanBaseModule> filterNodes, Map<String, String> nodePathMap, List<String> scanIds) {
int lastLoopSize = nodePathMap.size();
if (MapUtils.isEmpty(nodePathMap)) {
// 根节点遍历
List<TestPlanBaseModule> rootNodes = filterNodes.stream().filter(node ->
StringUtils.isBlank(node.getParentId()) || StringUtils.equals(node.getParentId(), "NONE")).toList();
rootNodes.forEach(node -> nodePathMap.put(node.getId(), MODULE_PATH_PREFIX + node.getName()));
// 下一级父节点
scanIds = rootNodes.stream().map(TestPlanBaseModule::getId).toList();
filterNodes.removeAll(rootNodes);
} else {
// 非根节点遍历
List<String> finalScanIds = scanIds;
List<TestPlanBaseModule> scanNodes = filterNodes.stream().filter(node -> finalScanIds.contains(node.getParentId())).toList();
scanNodes.forEach(node -> nodePathMap.put(node.getId(), nodePathMap.getOrDefault(node.getParentId(), StringUtils.EMPTY) + MODULE_PATH_PREFIX + node.getName()));
// 下一级父节点
scanIds = scanNodes.stream().map(TestPlanBaseModule::getId).toList();
// 每次过滤的数据
filterNodes.removeAll(scanNodes);
}
if (CollectionUtils.isEmpty(scanIds)) {
// 叶子节点不存在, 跳出
return;
}
if (lastLoopSize == nodePathMap.size()) {
// 处理前后无新数据产生, 无效的迭代, 跳出;
return;
}
realGenPathMap(filterNodes, nodePathMap, scanIds);
}
public static void genPathMap(List<TestPlanBaseModule> allNodes, Map<String, String> nodePathMap, List<String> scanIds) {
// 过滤掉一些不好的数据
allNodes.removeIf(node -> StringUtils.equals(node.getId(), "NONE") || StringUtils.equals(node.getId(), node.getParentId()));
realGenPathMap(allNodes, nodePathMap, scanIds);
}
}