fix(工作台): 修复未按照列表顺序获取默认权限项目问题
--bug=1050600 --user=郭雨琦 https://www.tapd.cn/55049933/bugtrace/bugs/view/1155049933001050600
This commit is contained in:
parent
89857c2fff
commit
e9bef3c856
|
@ -34,5 +34,7 @@ public class LayoutDTO implements Serializable {
|
||||||
private List<String> handleUsers;
|
private List<String> handleUsers;
|
||||||
@Schema(description = "测试计划ID")
|
@Schema(description = "测试计划ID")
|
||||||
private String planId;
|
private String planId;
|
||||||
|
@Schema(description = "测试计划组ID")
|
||||||
|
private String groupId;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,17 +36,17 @@ public class DashboardProjectService {
|
||||||
boolean isAdmin = isAdmin(userId);
|
boolean isAdmin = isAdmin(userId);
|
||||||
Set<String> projectSet;
|
Set<String> projectSet;
|
||||||
Map<String, String> moduleMap;
|
Map<String, String> moduleMap;
|
||||||
projectSet = projects.stream().map(Project::getId).collect(Collectors.toSet());
|
projectSet = projects.stream() .map(Project::getId).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
moduleMap = projects.stream().collect(Collectors.toMap(Project::getId, Project::getModuleSetting));
|
moduleMap = projects.stream().collect(Collectors.toMap(Project::getId, Project::getModuleSetting));
|
||||||
Map<String, Set<String>> hasModuleProjectIds = new HashMap<>();
|
Map<String, Set<String>> hasModuleProjectIds = new HashMap<>();
|
||||||
Map<String, String> finalModuleMap = moduleMap;
|
Map<String, String> finalModuleMap = moduleMap;
|
||||||
Set<String> searchCaseProjectIds = new HashSet<>();
|
Set<String> searchCaseProjectIds = new LinkedHashSet<>();
|
||||||
Set<String> searchReviewProjectIds = new HashSet<>();
|
Set<String> searchReviewProjectIds = new LinkedHashSet<>();
|
||||||
Set<String> searchApiProjectIds = new HashSet<>();
|
Set<String> searchApiProjectIds = new LinkedHashSet<>();
|
||||||
Set<String> searchApiCaseProjectIds = new HashSet<>();
|
Set<String> searchApiCaseProjectIds = new LinkedHashSet<>();
|
||||||
Set<String> searchScenarioProjectIds = new HashSet<>();
|
Set<String> searchScenarioProjectIds = new LinkedHashSet<>();
|
||||||
Set<String> searchPlanProjectIds = new HashSet<>();
|
Set<String> searchPlanProjectIds = new LinkedHashSet<>();
|
||||||
Set<String> searchBugProjectIds = new HashSet<>();
|
Set<String> searchBugProjectIds = new LinkedHashSet<>();
|
||||||
//查出用户在选中的项目中有读取权限的, admin所有项目都有权限
|
//查出用户在选中的项目中有读取权限的, admin所有项目都有权限
|
||||||
if (!isAdmin) {
|
if (!isAdmin) {
|
||||||
Set<String> permissionSet = getPermissionSet();
|
Set<String> permissionSet = getPermissionSet();
|
||||||
|
@ -56,44 +56,44 @@ public class DashboardProjectService {
|
||||||
//检查是否开启功能用例模块
|
//检查是否开启功能用例模块
|
||||||
if (CollectionUtils.isNotEmpty(functionalProjectIds)) {
|
if (CollectionUtils.isNotEmpty(functionalProjectIds)) {
|
||||||
//有权限
|
//有权限
|
||||||
searchCaseProjectIds = functionalProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toSet());
|
searchCaseProjectIds = functionalProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
Set<String> reviewProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.CASE_REVIEW_READ);
|
Set<String> reviewProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.CASE_REVIEW_READ);
|
||||||
if (CollectionUtils.isNotEmpty(reviewProjectIds)) {
|
if (CollectionUtils.isNotEmpty(reviewProjectIds)) {
|
||||||
searchReviewProjectIds = reviewProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toSet());
|
searchReviewProjectIds = reviewProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
//检查是否开启接口模块
|
//检查是否开启接口模块
|
||||||
Set<String> apiProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_API_DEFINITION_READ);
|
Set<String> apiProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_API_DEFINITION_READ);
|
||||||
if (CollectionUtils.isNotEmpty(apiProjectIds)) {
|
if (CollectionUtils.isNotEmpty(apiProjectIds)) {
|
||||||
searchApiProjectIds = apiProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
searchApiProjectIds = apiProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
Set<String> apiCaseProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_API_DEFINITION_CASE_READ);
|
Set<String> apiCaseProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_API_DEFINITION_CASE_READ);
|
||||||
if (CollectionUtils.isNotEmpty(apiCaseProjectIds)) {
|
if (CollectionUtils.isNotEmpty(apiCaseProjectIds)) {
|
||||||
searchApiCaseProjectIds = apiCaseProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
searchApiCaseProjectIds = apiCaseProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
Set<String> scenarioProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_API_SCENARIO_READ);
|
Set<String> scenarioProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_API_SCENARIO_READ);
|
||||||
if (CollectionUtils.isNotEmpty(scenarioProjectIds)) {
|
if (CollectionUtils.isNotEmpty(scenarioProjectIds)) {
|
||||||
searchScenarioProjectIds = scenarioProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
searchScenarioProjectIds = scenarioProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
//检查是否开启测试计划模块
|
//检查是否开启测试计划模块
|
||||||
Set<String> planProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.TEST_PLAN_READ);
|
Set<String> planProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.TEST_PLAN_READ);
|
||||||
if (CollectionUtils.isNotEmpty(planProjectIds)) {
|
if (CollectionUtils.isNotEmpty(planProjectIds)) {
|
||||||
searchPlanProjectIds = planProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(TEST_PLAN)).collect(Collectors.toSet());
|
searchPlanProjectIds = planProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(TEST_PLAN)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
//检查是否开启缺陷模块
|
//检查是否开启缺陷模块
|
||||||
Set<String> bugProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_BUG_READ);
|
Set<String> bugProjectIds = hasUserPermissionProjectIds.get(PermissionConstants.PROJECT_BUG_READ);
|
||||||
if (CollectionUtils.isNotEmpty(bugProjectIds)) {
|
if (CollectionUtils.isNotEmpty(bugProjectIds)) {
|
||||||
searchBugProjectIds = bugProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(BUG)).collect(Collectors.toSet());
|
searchBugProjectIds = bugProjectIds.stream().filter(t -> finalModuleMap.get(t).contains(BUG)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//查出这些项目分别有模块的
|
//查出这些项目分别有模块的
|
||||||
searchCaseProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toSet());
|
searchCaseProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
searchReviewProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toSet());
|
searchReviewProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
searchApiProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
searchApiProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
searchApiCaseProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
searchApiCaseProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
searchScenarioProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
searchScenarioProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
searchPlanProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(TEST_PLAN)).collect(Collectors.toSet());
|
searchPlanProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(TEST_PLAN)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
searchBugProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(BUG)).collect(Collectors.toSet());
|
searchBugProjectIds = projectSet.stream().filter(t -> finalModuleMap.get(t).contains(BUG)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
}
|
}
|
||||||
//如果value 为空,则没有权限或者没开启模块
|
//如果value 为空,则没有权限或者没开启模块
|
||||||
hasModuleProjectIds.put(PermissionConstants.FUNCTIONAL_CASE_READ, searchCaseProjectIds);
|
hasModuleProjectIds.put(PermissionConstants.FUNCTIONAL_CASE_READ, searchCaseProjectIds);
|
||||||
|
@ -115,11 +115,11 @@ public class DashboardProjectService {
|
||||||
*/
|
*/
|
||||||
public Map<String, Set<String>> getModuleProjectIds(List<Project> userProject) {
|
public Map<String, Set<String>> getModuleProjectIds(List<Project> userProject) {
|
||||||
Map<String, String> moduleMap = userProject.stream().collect(Collectors.toMap(Project::getId, Project::getModuleSetting));
|
Map<String, String> moduleMap = userProject.stream().collect(Collectors.toMap(Project::getId, Project::getModuleSetting));
|
||||||
Set<String> projectIds = userProject.stream().map(Project::getId).collect(Collectors.toSet());
|
Set<String> projectIds = userProject.stream().map(Project::getId).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
Set<String> searchCaseProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toSet());
|
Set<String> searchCaseProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(FUNCTIONAL_CASE)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
Set<String> searchApiProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(API_TEST)).collect(Collectors.toSet());
|
Set<String> searchApiProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(API_TEST)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
Set<String> searchPlanProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(TEST_PLAN)).collect(Collectors.toSet());
|
Set<String> searchPlanProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(TEST_PLAN)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
Set<String> searchBugProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(BUG)).collect(Collectors.toSet());
|
Set<String> searchBugProjectIds = projectIds.stream().filter(t -> moduleMap.get(t).contains(BUG)).collect(Collectors.toCollection(LinkedHashSet::new));
|
||||||
Map<String, Set<String>> hasModuleProjectIds = new HashMap<>();
|
Map<String, Set<String>> hasModuleProjectIds = new HashMap<>();
|
||||||
hasModuleProjectIds.put(PermissionConstants.FUNCTIONAL_CASE_READ, searchCaseProjectIds);
|
hasModuleProjectIds.put(PermissionConstants.FUNCTIONAL_CASE_READ, searchCaseProjectIds);
|
||||||
hasModuleProjectIds.put(PermissionConstants.CASE_REVIEW_READ, searchCaseProjectIds);
|
hasModuleProjectIds.put(PermissionConstants.CASE_REVIEW_READ, searchCaseProjectIds);
|
||||||
|
|
|
@ -495,6 +495,12 @@ public class DashboardService {
|
||||||
checkHasPermissionProject(layoutDTO, hasReadProjectIds);
|
checkHasPermissionProject(layoutDTO, hasReadProjectIds);
|
||||||
if (StringUtils.equalsIgnoreCase(layoutDTO.getKey(), DashboardUserLayoutKeys.PROJECT_PLAN_VIEW.toString())) {
|
if (StringUtils.equalsIgnoreCase(layoutDTO.getKey(), DashboardUserLayoutKeys.PROJECT_PLAN_VIEW.toString())) {
|
||||||
setPlanId(layoutDTO);
|
setPlanId(layoutDTO);
|
||||||
|
if (StringUtils.isBlank(layoutDTO.getPlanId())) {
|
||||||
|
TestPlan latestPlanByProjectIds = extTestPlanMapper.getLatestPlanByProjectIds(hasReadProjectIds);
|
||||||
|
layoutDTO.setPlanId(latestPlanByProjectIds.getId());
|
||||||
|
layoutDTO.setGroupId(latestPlanByProjectIds.getGroupId());
|
||||||
|
layoutDTO.setProjectIds(List.of(latestPlanByProjectIds.getProjectId()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (StringUtils.equalsIgnoreCase(layoutDTO.getKey(), DashboardUserLayoutKeys.BUG_COUNT.toString())
|
} else if (StringUtils.equalsIgnoreCase(layoutDTO.getKey(), DashboardUserLayoutKeys.BUG_COUNT.toString())
|
||||||
|| StringUtils.equalsIgnoreCase(layoutDTO.getKey(), DashboardUserLayoutKeys.CREATE_BUG_BY_ME.toString())
|
|| StringUtils.equalsIgnoreCase(layoutDTO.getKey(), DashboardUserLayoutKeys.CREATE_BUG_BY_ME.toString())
|
||||||
|
@ -516,6 +522,9 @@ public class DashboardService {
|
||||||
TestPlan latestPlan = extTestPlanMapper.getLatestPlan(layoutDTO.getProjectIds().getFirst());
|
TestPlan latestPlan = extTestPlanMapper.getLatestPlan(layoutDTO.getProjectIds().getFirst());
|
||||||
if (latestPlan != null) {
|
if (latestPlan != null) {
|
||||||
layoutDTO.setPlanId(latestPlan.getId());
|
layoutDTO.setPlanId(latestPlan.getId());
|
||||||
|
layoutDTO.setGroupId(layoutDTO.getGroupId());
|
||||||
|
} else {
|
||||||
|
layoutDTO.setPlanId(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import io.metersphere.sdk.util.JSON;
|
||||||
import io.metersphere.system.domain.UserRole;
|
import io.metersphere.system.domain.UserRole;
|
||||||
import io.metersphere.system.domain.UserRolePermission;
|
import io.metersphere.system.domain.UserRolePermission;
|
||||||
import io.metersphere.system.dto.user.UserDTO;
|
import io.metersphere.system.dto.user.UserDTO;
|
||||||
|
import io.metersphere.system.dto.user.UserRoleResourceDTO;
|
||||||
import io.metersphere.system.service.UserLoginService;
|
import io.metersphere.system.service.UserLoginService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
@ -101,28 +102,26 @@ public class PermissionCheckService {
|
||||||
UserDTO user = getUserDTO(userId);
|
UserDTO user = getUserDTO(userId);
|
||||||
if (user == null) return new HashMap<>();
|
if (user == null) return new HashMap<>();
|
||||||
// 注意超级管理员包含所有权限,这里不予返回,请在方法外自行判断
|
// 注意超级管理员包含所有权限,这里不予返回,请在方法外自行判断
|
||||||
Map<String, Set<String>> permissionProjectIdMap = new HashMap<>();
|
Map<String, Set<String>> permissionProjectIdMap = new LinkedHashMap<>();
|
||||||
Map<String, List<UserRolePermission>> projectPermissionMap = new HashMap<>();
|
Map<String, List<UserRolePermission>> projectPermissionMap = new LinkedHashMap<>();
|
||||||
Map<String, List<UserRolePermission>>rolePermissionMap = new HashMap<>();
|
|
||||||
|
Map<String, List<UserRolePermission>>rolePermissionMap = user.getUserRolePermissions().stream().filter(t->StringUtils.equalsIgnoreCase(t.getUserRole().getType(), UserRoleType.PROJECT.name())).collect(Collectors.toMap(f->f.getUserRole().getId(), UserRoleResourceDTO::getUserRolePermissions));
|
||||||
|
|
||||||
user.getUserRolePermissions().forEach(t->{
|
|
||||||
if (StringUtils.equalsIgnoreCase(t.getUserRole().getType(), UserRoleType.PROJECT.name())) {
|
|
||||||
rolePermissionMap.put(t.getUserRole().getId(),t.getUserRolePermissions());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
user.getUserRoleRelations().forEach(ug -> {
|
user.getUserRoleRelations().forEach(ug -> {
|
||||||
List<UserRolePermission> userRolePermissions = rolePermissionMap.get(ug.getRoleId());
|
List<UserRolePermission> userRolePermissions = rolePermissionMap.get(ug.getRoleId());
|
||||||
if (CollectionUtils.isNotEmpty(userRolePermissions) && projectIds.contains(ug.getSourceId())) {
|
if (CollectionUtils.isNotEmpty(userRolePermissions) && projectIds.contains(ug.getSourceId())) {
|
||||||
projectPermissionMap.put(ug.getSourceId(),userRolePermissions);
|
projectPermissionMap.put(ug.getSourceId(),userRolePermissions);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
projectPermissionMap.forEach((projectId, userRolePermissions)->{
|
|
||||||
|
for (String projectId : projectIds) {
|
||||||
|
List<UserRolePermission> userRolePermissions = projectPermissionMap.get(projectId);
|
||||||
for (UserRolePermission userRolePermission : userRolePermissions) {
|
for (UserRolePermission userRolePermission : userRolePermissions) {
|
||||||
if (permissions.contains(userRolePermission.getPermissionId())) {
|
if (permissions.contains(userRolePermission.getPermissionId())) {
|
||||||
permissionProjectIdMap.computeIfAbsent(userRolePermission.getPermissionId(), key -> new HashSet<>()).add(projectId);
|
permissionProjectIdMap.computeIfAbsent(userRolePermission.getPermissionId(), key -> new LinkedHashSet<>()).add(projectId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
return permissionProjectIdMap;
|
return permissionProjectIdMap;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,7 @@ public interface ExtTestPlanMapper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取项目下的计划关联缺陷
|
* 获取项目下的计划关联缺陷
|
||||||
|
*
|
||||||
* @param projectId 项目
|
* @param projectId 项目
|
||||||
* @param type 计划类型
|
* @param type 计划类型
|
||||||
* @param platform 缺陷平台集合
|
* @param platform 缺陷平台集合
|
||||||
|
@ -108,6 +109,8 @@ public interface ExtTestPlanMapper {
|
||||||
|
|
||||||
TestPlan getLatestPlan(@Param("projectId") String projectId);
|
TestPlan getLatestPlan(@Param("projectId") String projectId);
|
||||||
|
|
||||||
|
TestPlan getLatestPlanByProjectIds(@Param("projectIds") Set<String> projectIds);
|
||||||
|
|
||||||
|
|
||||||
List<TestPlanConfig> selectTestPlanConfigByTestPlanIds(@Param("testPlanIds") List<String> testPlanIds);
|
List<TestPlanConfig> selectTestPlanConfigByTestPlanIds(@Param("testPlanIds") List<String> testPlanIds);
|
||||||
|
|
||||||
|
|
|
@ -929,6 +929,16 @@
|
||||||
where type = 'TEST_PLAN' and status='NOT_ARCHIVED' and project_id = #{projectId} order by create_time desc limit 1;
|
where type = 'TEST_PLAN' and status='NOT_ARCHIVED' and project_id = #{projectId} order by create_time desc limit 1;
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="getLatestPlanByProjectIds" resultType="io.metersphere.plan.domain.TestPlan">
|
||||||
|
select id, name, group_id, project_id
|
||||||
|
from test_plan
|
||||||
|
where type = 'TEST_PLAN' and status='NOT_ARCHIVED' and project_id IN
|
||||||
|
<foreach collection="projectIds" item="projectId" open="(" separator="," close=")">
|
||||||
|
#{projectId}
|
||||||
|
</foreach>
|
||||||
|
order by create_time desc limit 1;
|
||||||
|
</select>
|
||||||
|
|
||||||
<select id="selectTestPlanConfigByTestPlanIds" resultType="io.metersphere.plan.domain.TestPlanConfig">
|
<select id="selectTestPlanConfigByTestPlanIds" resultType="io.metersphere.plan.domain.TestPlanConfig">
|
||||||
SELECT *
|
SELECT *
|
||||||
from test_plan_config test_plan_id
|
from test_plan_config test_plan_id
|
||||||
|
|
Loading…
Reference in New Issue