feat(任务中心): 任务中心定时任务增加测试计划展示

This commit is contained in:
wxg0103 2024-06-03 16:20:42 +08:00 committed by wxg0103
parent 0f2ba1d329
commit d30cf886f2
16 changed files with 206 additions and 57 deletions

View File

@ -3,8 +3,6 @@ package io.metersphere.sdk.constants;
public enum ScheduleResourceType { public enum ScheduleResourceType {
API_IMPORT, API_IMPORT,
API_SCENARIO, API_SCENARIO,
UI_SCENARIO,
LOAD_TEST,
TEST_PLAN, TEST_PLAN,
CLEAN_REPORT, CLEAN_REPORT,

View File

@ -258,7 +258,7 @@ public class Swagger3Parser<T> extends ApiImportAbstractParser<ApiDefinitionImpo
body.setBodyType(Body.BodyType.JSON.name()); body.setBodyType(Body.BodyType.JSON.name());
JsonBody jsonBody = new JsonBody(); JsonBody jsonBody = new JsonBody();
jsonBody.setJsonSchema(jsonSchemaItem); jsonBody.setJsonSchema(jsonSchemaItem);
jsonBody.setEnableJsonSchema(true); jsonBody.setEnableJsonSchema(false);
if (ObjectUtils.isNotEmpty(value.getExample())) { if (ObjectUtils.isNotEmpty(value.getExample())) {
jsonBody.setJsonValue(ApiDataUtils.toJSONString(value.getExample())); jsonBody.setJsonValue(ApiDataUtils.toJSONString(value.getExample()));
} }

View File

@ -74,7 +74,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void deleteOrg(@PathVariable String moduleType, @PathVariable String id) { public void deleteOrg(@PathVariable String moduleType, @PathVariable String id) {
hasPermission(ORG, moduleType); hasPermission(ORG, moduleType);
taskCenterService.delete(id, moduleType,SessionUtils.getUserId(), "/task/center/org/schedule/delete/", OperationLogModule.SETTING_ORGANIZATION_TASK_CENTER); taskCenterService.delete(id, moduleType, SessionUtils.getUserId(), "/task/center/org/schedule/delete/", OperationLogModule.SETTING_ORGANIZATION_TASK_CENTER);
} }
@GetMapping("/project/schedule/delete/{moduleType}/{id}") @GetMapping("/project/schedule/delete/{moduleType}/{id}")
@ -82,7 +82,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void deleteProject(@PathVariable String moduleType, @PathVariable String id) { public void deleteProject(@PathVariable String moduleType, @PathVariable String id) {
hasPermission(PROJECT, moduleType); hasPermission(PROJECT, moduleType);
taskCenterService.delete(id, moduleType,SessionUtils.getUserId(), "/task/center/project/schedule/delete/", OperationLogModule.PROJECT_MANAGEMENT_TASK_CENTER); taskCenterService.delete(id, moduleType, SessionUtils.getUserId(), "/task/center/project/schedule/delete/", OperationLogModule.PROJECT_MANAGEMENT_TASK_CENTER);
} }
@GetMapping("/system/schedule/switch/{moduleType}/{id}") @GetMapping("/system/schedule/switch/{moduleType}/{id}")
@ -90,7 +90,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void enable(@PathVariable String moduleType, @PathVariable String id) { public void enable(@PathVariable String moduleType, @PathVariable String id) {
hasPermission(SYSTEM, moduleType); hasPermission(SYSTEM, moduleType);
taskCenterService.enable(id, moduleType,SessionUtils.getUserId(), "/task/center/system/schedule/switch/", OperationLogModule.SETTING_SYSTEM_TASK_CENTER); taskCenterService.enable(id, moduleType, SessionUtils.getUserId(), "/task/center/system/schedule/switch/", OperationLogModule.SETTING_SYSTEM_TASK_CENTER);
} }
@ -99,7 +99,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void enableOrg(@PathVariable String moduleType, @PathVariable String id) { public void enableOrg(@PathVariable String moduleType, @PathVariable String id) {
hasPermission(ORG, moduleType); hasPermission(ORG, moduleType);
taskCenterService.enable(id, moduleType,SessionUtils.getUserId(), "/task/center/org/schedule/switch/", OperationLogModule.SETTING_ORGANIZATION_TASK_CENTER); taskCenterService.enable(id, moduleType, SessionUtils.getUserId(), "/task/center/org/schedule/switch/", OperationLogModule.SETTING_ORGANIZATION_TASK_CENTER);
} }
@GetMapping("/project/schedule/switch/{moduleType}/{id}") @GetMapping("/project/schedule/switch/{moduleType}/{id}")
@ -107,7 +107,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void enableProject(@PathVariable String moduleType, @PathVariable String id) { public void enableProject(@PathVariable String moduleType, @PathVariable String id) {
hasPermission(PROJECT, moduleType); hasPermission(PROJECT, moduleType);
taskCenterService.enable(id, moduleType,SessionUtils.getUserId(), "/task/center/project/schedule/switch/", OperationLogModule.PROJECT_MANAGEMENT_TASK_CENTER); taskCenterService.enable(id, moduleType, SessionUtils.getUserId(), "/task/center/project/schedule/switch/", OperationLogModule.PROJECT_MANAGEMENT_TASK_CENTER);
} }
@PostMapping("/system/schedule/update/{moduleType}/{id}") @PostMapping("/system/schedule/update/{moduleType}/{id}")
@ -115,7 +115,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void update(@PathVariable String moduleType, @PathVariable String id, @RequestBody Object cron) { public void update(@PathVariable String moduleType, @PathVariable String id, @RequestBody Object cron) {
hasPermission(SYSTEM, moduleType); hasPermission(SYSTEM, moduleType);
taskCenterService.update(id, moduleType,cron.toString(), SessionUtils.getUserId(), "/task/center/system/schedule/update/", OperationLogModule.SETTING_SYSTEM_TASK_CENTER); taskCenterService.update(id, moduleType, cron.toString(), SessionUtils.getUserId(), "/task/center/system/schedule/update/", OperationLogModule.SETTING_SYSTEM_TASK_CENTER);
} }
@PostMapping("/org/schedule/update/{moduleType}/{id}") @PostMapping("/org/schedule/update/{moduleType}/{id}")
@ -123,7 +123,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void updateOrg(@PathVariable String moduleType, @PathVariable String id, @RequestBody Object cron) { public void updateOrg(@PathVariable String moduleType, @PathVariable String id, @RequestBody Object cron) {
hasPermission(ORG, moduleType); hasPermission(ORG, moduleType);
taskCenterService.update(id, moduleType,cron.toString(), SessionUtils.getUserId(), "/task/center/org/schedule/update/", OperationLogModule.SETTING_ORGANIZATION_TASK_CENTER); taskCenterService.update(id, moduleType, cron.toString(), SessionUtils.getUserId(), "/task/center/org/schedule/update/", OperationLogModule.SETTING_ORGANIZATION_TASK_CENTER);
} }
@PostMapping("/project/schedule/update/{moduleType}/{id}") @PostMapping("/project/schedule/update/{moduleType}/{id}")
@ -131,7 +131,7 @@ public class TaskCenterController {
@CheckOwner(resourceId = "#id", resourceType = "schedule") @CheckOwner(resourceId = "#id", resourceType = "schedule")
public void updateProject(@PathVariable String moduleType, @PathVariable String id, @RequestBody Object cron) { public void updateProject(@PathVariable String moduleType, @PathVariable String id, @RequestBody Object cron) {
hasPermission(PROJECT, moduleType); hasPermission(PROJECT, moduleType);
taskCenterService.update(id, moduleType,cron.toString(), SessionUtils.getUserId(), "/task/center/project/schedule/update/", OperationLogModule.PROJECT_MANAGEMENT_TASK_CENTER); taskCenterService.update(id, moduleType, cron.toString(), SessionUtils.getUserId(), "/task/center/project/schedule/update/", OperationLogModule.PROJECT_MANAGEMENT_TASK_CENTER);
} }
@PostMapping("/system/schedule/batch-enable") @PostMapping("/system/schedule/batch-enable")
@ -180,12 +180,15 @@ public class TaskCenterController {
Map<String, List<String>> projectPermission = new HashMap<>(2); Map<String, List<String>> projectPermission = new HashMap<>(2);
projectPermission.put(ScheduleTagType.API_IMPORT.toString(), List.of(PermissionConstants.PROJECT_API_DEFINITION_IMPORT)); projectPermission.put(ScheduleTagType.API_IMPORT.toString(), List.of(PermissionConstants.PROJECT_API_DEFINITION_IMPORT));
projectPermission.put(TaskCenterResourceType.API_SCENARIO.toString(), List.of(PermissionConstants.PROJECT_API_SCENARIO_EXECUTE)); projectPermission.put(TaskCenterResourceType.API_SCENARIO.toString(), List.of(PermissionConstants.PROJECT_API_SCENARIO_EXECUTE));
projectPermission.put(TaskCenterResourceType.TEST_PLAN.toString(), List.of(PermissionConstants.TEST_PLAN_READ_EXECUTE));
Map<String, List<String>> orgPermission = new HashMap<>(2); Map<String, List<String>> orgPermission = new HashMap<>(2);
orgPermission.put(ScheduleTagType.API_IMPORT.toString(), List.of(PermissionConstants.ORGANIZATION_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_DEFINITION_IMPORT)); orgPermission.put(ScheduleTagType.API_IMPORT.toString(), List.of(PermissionConstants.ORGANIZATION_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_DEFINITION_IMPORT));
orgPermission.put(TaskCenterResourceType.API_SCENARIO.toString(), List.of(PermissionConstants.ORGANIZATION_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_SCENARIO_EXECUTE)); orgPermission.put(TaskCenterResourceType.API_SCENARIO.toString(), List.of(PermissionConstants.ORGANIZATION_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_SCENARIO_EXECUTE));
orgPermission.put(TaskCenterResourceType.TEST_PLAN.toString(), List.of(PermissionConstants.ORGANIZATION_TASK_CENTER_READ_STOP, PermissionConstants.TEST_PLAN_READ_EXECUTE));
Map<String, List<String>> systemPermission = new HashMap<>(2); Map<String, List<String>> systemPermission = new HashMap<>(2);
systemPermission.put(ScheduleTagType.API_IMPORT.toString(), List.of(PermissionConstants.SYSTEM_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_DEFINITION_IMPORT)); systemPermission.put(ScheduleTagType.API_IMPORT.toString(), List.of(PermissionConstants.SYSTEM_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_DEFINITION_IMPORT));
systemPermission.put(TaskCenterResourceType.API_SCENARIO.toString(), List.of(PermissionConstants.SYSTEM_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_SCENARIO_EXECUTE)); systemPermission.put(TaskCenterResourceType.API_SCENARIO.toString(), List.of(PermissionConstants.SYSTEM_TASK_CENTER_READ_STOP, PermissionConstants.PROJECT_API_SCENARIO_EXECUTE));
systemPermission.put(TaskCenterResourceType.TEST_PLAN.toString(), List.of(PermissionConstants.SYSTEM_TASK_CENTER_READ_STOP, PermissionConstants.TEST_PLAN_READ_EXECUTE));
boolean hasPermission = switch (type) { boolean hasPermission = switch (type) {
case ORG -> case ORG ->

View File

@ -59,7 +59,8 @@ public class TaskCenterScheduleDTO implements Serializable {
private Long createTime; private Long createTime;
@Schema(description = "swaggerUrl") @Schema(description = "swaggerUrl")
private String swaggerUrl; private String swaggerUrl;
@Schema(description = "任务类型 测试计划组 GROUP 测试计划 TEST_PLAN")
private String type;
} }

View File

@ -40,6 +40,25 @@
inner join api_scenario on schedule.resource_id = api_scenario.id inner join api_scenario on schedule.resource_id = api_scenario.id
</if> </if>
<if test="request.scheduleTagType == 'TEST_PLAN'">
SELECT
schedule.id,
schedule.name as taskname,
schedule.project_id,
resource_type,
test_plan.num as resource_num,
test_plan.name as resource_name,
test_plan.id as resource_id,
schedule.value,
schedule.enable,
schedule.create_user AS createUserName,
schedule.create_time,
test_plan.type
FROM
schedule
inner join test_plan on schedule.resource_id = test_plan.id
</if>
) task left join project on task.project_id = project.id ) task left join project on task.project_id = project.id
left join QRTZ_TRIGGERS on task.resource_id = QRTZ_TRIGGERS.TRIGGER_NAME left join QRTZ_TRIGGERS on task.resource_id = QRTZ_TRIGGERS.TRIGGER_NAME
where where
@ -85,6 +104,12 @@
#{value} #{value}
</foreach> </foreach>
</when> </when>
<when test="key=='type'">
and task.type in
<foreach collection="values" item="value" separator="," open="(" close=")">
#{value}
</foreach>
</when>
</choose> </choose>
</if> </if>
</foreach> </foreach>
@ -171,6 +196,16 @@
schedule schedule
inner join api_scenario on schedule.resource_id = api_scenario.id inner join api_scenario on schedule.resource_id = api_scenario.id
</if> </if>
<if test="request.scheduleTagType == 'TEST_PLAN'">
SELECT
schedule.*,
test_plan.type,
test_plan.num as resource_num,
test_plan.name as resource_name
FROM
schedule
inner join test_plan on schedule.resource_id = test_plan.id
</if>
) task left join project on task.project_id = project.id ) task left join project on task.project_id = project.id
where where

View File

@ -75,6 +75,7 @@ public class CommonProjectService {
private TestResourcePoolService testResourcePoolService; private TestResourcePoolService testResourcePoolService;
public static final Integer DEFAULT_REMAIN_DAY_COUNT = 30; public static final Integer DEFAULT_REMAIN_DAY_COUNT = 30;
public static final String API_TEST = "apiTest"; public static final String API_TEST = "apiTest";
public static final String TEST_PLAN = "testPlan";
@Autowired @Autowired
public CommonProjectService(ProjectServiceInvoker serviceInvoker) { public CommonProjectService(ProjectServiceInvoker serviceInvoker) {
@ -645,7 +646,7 @@ public class CommonProjectService {
//这里需要获取项目开启的模块 判断资源池开启的使用范围的模块是否在项目开启的模块中 //这里需要获取项目开启的模块 判断资源池开启的使用范围的模块是否在项目开启的模块中
List<String> moduleIds = request.getModulesIds(); List<String> moduleIds = request.getModulesIds();
testResourcePools.forEach(pool -> { testResourcePools.forEach(pool -> {
if (moduleIds.contains(API_TEST)) { if (moduleIds.contains(API_TEST) || moduleIds.contains(TEST_PLAN)) {
OptionDTO optionDTO = new OptionDTO(); OptionDTO optionDTO = new OptionDTO();
optionDTO.setId(pool.getId()); optionDTO.setId(pool.getId());
optionDTO.setName(pool.getName()); optionDTO.setName(pool.getName());

View File

@ -40,7 +40,10 @@ import org.quartz.TriggerKey;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -189,7 +192,7 @@ public class TaskCenterService {
return organization; return organization;
} }
public void delete(String id,String moduleType, String userId, String path, String module) { public void delete(String id, String moduleType, String userId, String path, String module) {
Schedule schedule = checkScheduleExit(id); Schedule schedule = checkScheduleExit(id);
String logModule = getLogModule(moduleType, module); String logModule = getLogModule(moduleType, module);
if (StringUtils.equals(schedule.getResourceType(), ScheduleTagType.API_IMPORT.name())) { if (StringUtils.equals(schedule.getResourceType(), ScheduleTagType.API_IMPORT.name())) {
@ -203,6 +206,7 @@ public class TaskCenterService {
return switch (ScheduleTagType.valueOf(moduleType)) { return switch (ScheduleTagType.valueOf(moduleType)) {
case ScheduleTagType.API_IMPORT -> StringUtils.join(module, "_TIME_API_IMPORT"); case ScheduleTagType.API_IMPORT -> StringUtils.join(module, "_TIME_API_IMPORT");
case ScheduleTagType.API_SCENARIO -> StringUtils.join(module, "_TIME_API_SCENARIO"); case ScheduleTagType.API_SCENARIO -> StringUtils.join(module, "_TIME_API_SCENARIO");
case ScheduleTagType.TEST_PLAN -> StringUtils.join(module, "_TIME_TEST_PLAN");
default -> throw new MSException(Translator.get("module_type_error")); default -> throw new MSException(Translator.get("module_type_error"));
}; };
} }
@ -215,7 +219,7 @@ public class TaskCenterService {
return schedule; return schedule;
} }
public void enable(String id,String moduleType, String userId, String path, String module) { public void enable(String id, String moduleType, String userId, String path, String module) {
Schedule schedule = checkScheduleExit(id); Schedule schedule = checkScheduleExit(id);
schedule.setEnable(!schedule.getEnable()); schedule.setEnable(!schedule.getEnable());
scheduleService.editSchedule(schedule); scheduleService.editSchedule(schedule);
@ -226,7 +230,7 @@ public class TaskCenterService {
saveLog(List.of(schedule), userId, path, HttpMethodConstants.GET.name(), logModule, OperationLogType.UPDATE.name()); saveLog(List.of(schedule), userId, path, HttpMethodConstants.GET.name(), logModule, OperationLogType.UPDATE.name());
} }
public void update(String id,String moduleType, String cron, String userId, String path, String module) { public void update(String id, String moduleType, String cron, String userId, String path, String module) {
Schedule schedule = checkScheduleExit(id); Schedule schedule = checkScheduleExit(id);
schedule.setValue(cron); schedule.setValue(cron);
scheduleService.editSchedule(schedule); scheduleService.editSchedule(schedule);

View File

@ -11,7 +11,6 @@ import io.metersphere.system.domain.Schedule;
import io.metersphere.system.dto.taskcenter.enums.ScheduleTagType; import io.metersphere.system.dto.taskcenter.enums.ScheduleTagType;
import io.metersphere.system.dto.taskcenter.request.TaskCenterScheduleBatchRequest; import io.metersphere.system.dto.taskcenter.request.TaskCenterScheduleBatchRequest;
import io.metersphere.system.dto.taskcenter.request.TaskCenterSchedulePageRequest; import io.metersphere.system.dto.taskcenter.request.TaskCenterSchedulePageRequest;
import io.metersphere.system.mapper.ExtSwaggerMapper;
import io.metersphere.system.mapper.ScheduleMapper; import io.metersphere.system.mapper.ScheduleMapper;
import io.metersphere.system.schedule.ScheduleService; import io.metersphere.system.schedule.ScheduleService;
import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.Pager;
@ -35,7 +34,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@AutoConfigureMockMvc @AutoConfigureMockMvc
class TaskCenterScheduleControllerTests extends BaseTest { class TaskCenterScheduleControllerTests extends BaseTest {
@ -44,20 +43,17 @@ class TaskCenterScheduleControllerTests extends BaseTest {
private final static String SCHEDULED_PROJECT_PAGE = BASE_PATH + "project/schedule/page"; private final static String SCHEDULED_PROJECT_PAGE = BASE_PATH + "project/schedule/page";
private final static String SCHEDULED_ORG_PAGE = BASE_PATH + "org/schedule/page"; private final static String SCHEDULED_ORG_PAGE = BASE_PATH + "org/schedule/page";
private final static String SCHEDULED_SYSTEM_PAGE = BASE_PATH + "system/schedule/page"; private final static String SCHEDULED_SYSTEM_PAGE = BASE_PATH + "system/schedule/page";
private final static String SCHEDULED_DELETE = BASE_PATH + "schedule/delete/";
private static final ResultMatcher ERROR_REQUEST_MATCHER = status().is5xxServerError(); private static final ResultMatcher ERROR_REQUEST_MATCHER = status().is5xxServerError();
@Resource @Resource
ScheduleMapper scheduleMapper; ScheduleMapper scheduleMapper;
@Resource
ExtSwaggerMapper extSwaggerMapper;
@Resource @Resource
ScheduleService scheduleService; ScheduleService scheduleService;
@Test @Test
@Order(9) @Order(9)
@Sql(scripts = {"/dml/init_task_center.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED)) @Sql(scripts = {"/dml/init_task_center.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED))
@ -75,6 +71,13 @@ class TaskCenterScheduleControllerTests extends BaseTest {
doTaskCenterSchedulePage("FILTER", SCHEDULED_ORG_PAGE, ScheduleTagType.API_SCENARIO.toString()); doTaskCenterSchedulePage("FILTER", SCHEDULED_ORG_PAGE, ScheduleTagType.API_SCENARIO.toString());
doTaskCenterSchedulePage("KEYWORD", SCHEDULED_SYSTEM_PAGE, ScheduleTagType.API_SCENARIO.toString()); doTaskCenterSchedulePage("KEYWORD", SCHEDULED_SYSTEM_PAGE, ScheduleTagType.API_SCENARIO.toString());
doTaskCenterSchedulePage("FILTER", SCHEDULED_SYSTEM_PAGE, ScheduleTagType.API_SCENARIO.toString()); doTaskCenterSchedulePage("FILTER", SCHEDULED_SYSTEM_PAGE, ScheduleTagType.API_SCENARIO.toString());
doTaskCenterSchedulePage("KEYWORD", SCHEDULED_PROJECT_PAGE, ScheduleTagType.TEST_PLAN.toString());
doTaskCenterSchedulePage("FILTER", SCHEDULED_PROJECT_PAGE, ScheduleTagType.TEST_PLAN.toString());
doTaskCenterSchedulePage("KEYWORD", SCHEDULED_ORG_PAGE, ScheduleTagType.TEST_PLAN.toString());
doTaskCenterSchedulePage("FILTER", SCHEDULED_ORG_PAGE, ScheduleTagType.TEST_PLAN.toString());
doTaskCenterSchedulePage("KEYWORD", SCHEDULED_SYSTEM_PAGE, ScheduleTagType.TEST_PLAN.toString());
doTaskCenterSchedulePage("FILTER", SCHEDULED_SYSTEM_PAGE, ScheduleTagType.TEST_PLAN.toString());
} }
private void doTaskCenterSchedulePage(String search, String url, String scheduleTagType) throws Exception { private void doTaskCenterSchedulePage(String search, String url, String scheduleTagType) throws Exception {
@ -87,7 +90,8 @@ class TaskCenterScheduleControllerTests extends BaseTest {
switch (search) { switch (search) {
case "KEYWORD" -> configureKeywordSearch(request); case "KEYWORD" -> configureKeywordSearch(request);
case "FILTER" -> configureFilterSearch(request); case "FILTER" -> configureFilterSearch(request);
default -> {} default -> {
}
} }
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(url) MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(url)
@ -115,7 +119,7 @@ class TaskCenterScheduleControllerTests extends BaseTest {
} }
private void doTaskCenterSchedulePageError( String url, String scheduleTagType) throws Exception { private void doTaskCenterSchedulePageError(String url, String scheduleTagType) throws Exception {
TaskCenterSchedulePageRequest request = new TaskCenterSchedulePageRequest(); TaskCenterSchedulePageRequest request = new TaskCenterSchedulePageRequest();
request.setScheduleTagType(scheduleTagType); request.setScheduleTagType(scheduleTagType);
request.setCurrent(1); request.setCurrent(1);
@ -172,7 +176,7 @@ class TaskCenterScheduleControllerTests extends BaseTest {
@Test @Test
@Order(13) @Order(13)
void testEnable() throws Exception { void testEnable() throws Exception {
//先导入数据 //先导入数据
Schedule schedule = new Schedule(); Schedule schedule = new Schedule();
schedule.setName("test-schedule-switch"); schedule.setName("test-schedule-switch");
schedule.setResourceId("test-schedule-switch"); schedule.setResourceId("test-schedule-switch");
@ -190,12 +194,12 @@ class TaskCenterScheduleControllerTests extends BaseTest {
scheduleService.getSchedule(schedule.getId()); scheduleService.getSchedule(schedule.getId());
scheduleService.editSchedule(schedule); scheduleService.editSchedule(schedule);
scheduleService.getScheduleByResource(schedule.getResourceId(), schedule.getJob()); scheduleService.getScheduleByResource(schedule.getResourceId(), schedule.getJob());
this.requestGet("/task/center/system/schedule/switch/" +"API_IMPORT/"+ "test-schedule-switch"); this.requestGet("/task/center/system/schedule/switch/" + "API_IMPORT/" + "test-schedule-switch");
this.requestGet("/task/center/org/schedule/switch/" +"API_IMPORT/"+ "test-schedule-switch"); this.requestGet("/task/center/org/schedule/switch/" + "API_IMPORT/" + "test-schedule-switch");
this.requestGet("/task/center/project/schedule/switch/" +"API_IMPORT/"+ "test-schedule-switch"); this.requestGet("/task/center/project/schedule/switch/" + "API_IMPORT/" + "test-schedule-switch");
this.requestPost("/task/center/system/schedule/update/" + "API_IMPORT/"+ "test-schedule-switch" ,"/0 0/2 * * * ?"); this.requestPost("/task/center/system/schedule/update/" + "API_IMPORT/" + "test-schedule-switch", "/0 0/2 * * * ?");
this.requestPost("/task/center/org/schedule/update/" + "API_IMPORT/"+ "test-schedule-switch" ,"/0 0/2 * * * ?"); this.requestPost("/task/center/org/schedule/update/" + "API_IMPORT/" + "test-schedule-switch", "/0 0/2 * * * ?");
this.requestPost("/task/center/project/schedule/update/" + "API_IMPORT/"+ "test-schedule-switch" ,"/0 0/2 * * * ?"); this.requestPost("/task/center/project/schedule/update/" + "API_IMPORT/" + "test-schedule-switch", "/0 0/2 * * * ?");
//批量操作 //批量操作
TaskCenterScheduleBatchRequest request = new TaskCenterScheduleBatchRequest(); TaskCenterScheduleBatchRequest request = new TaskCenterScheduleBatchRequest();

View File

@ -42,3 +42,11 @@ INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `e
INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('17', 'key_17', 'cron', '59 46 16 01 06 ?', 'JobClass17', 'UI_SCENARIO', b'1', 'ui_scenario_17', 'admin', 1640777600000, 1640778600000, '100001100001', 'Schedule 17', '{\"param1\": \"value1\", \"param2\": \"value2\"}'); INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('17', 'key_17', 'cron', '59 46 16 01 06 ?', 'JobClass17', 'UI_SCENARIO', b'1', 'ui_scenario_17', 'admin', 1640777600000, 1640778600000, '100001100001', 'Schedule 17', '{\"param1\": \"value1\", \"param2\": \"value2\"}');
INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('24', 'key_24', 'cron', '19 22 11 20 05 ?', 'JobClass24', 'UI_SCENARIO', b'0', 'ui_scenario_24', 'admin', 1640778300000, 1640779300000, '100001100001', 'Schedule 24', '{\"param1\": \"value1\", \"param2\": \"value2\"}'); INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('24', 'key_24', 'cron', '19 22 11 20 05 ?', 'JobClass24', 'UI_SCENARIO', b'0', 'ui_scenario_24', 'admin', 1640778300000, 1640779300000, '100001100001', 'Schedule 24', '{\"param1\": \"value1\", \"param2\": \"value2\"}');
INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('3', 'key_3', 'cron', '50 50 16 01 06 ?', 'JobClass3', 'UI_SCENARIO', b'0', 'ui_scenario_3', 'admin', 1640776200000, 1640777200000, '100001100001', 'Schedule 3', '{\"param1\": \"value1\", \"param2\": \"value2\"}'); INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('3', 'key_3', 'cron', '50 50 16 01 06 ?', 'JobClass3', 'UI_SCENARIO', b'0', 'ui_scenario_3', 'admin', 1640776200000, 1640777200000, '100001100001', 'Schedule 3', '{\"param1\": \"value1\", \"param2\": \"value2\"}');
INSERT INTO `test_plan`(`id`, `num`, `project_id`, `group_id`, `module_id`, `name`, `status`, `type`, `tags`, `create_time`, `create_user`, `update_time`, `update_user`, `planned_start_time`, `planned_end_time`, `actual_start_time`, `actual_end_time`, `description`)
VALUES
('test_plan_1', 5000, '100001100001', 'NONE', '1', 'qwe', 'PREPARED', 'TEST_PLAN', NULL, 1714980158000, 'WX', 1714980158000, 'WX', 1714980158000, 1714980158000, 1714980158000, 1714980158000, '11'),
('test_plan_2', 10000, '100001100001', 'NONE', '1', 'eeew', 'PREPARED', 'TEST_PLAN', NULL, 1714980158000, 'WX', 1714980158000, 'WX', 1714980158000, 1714980158000, 1714980158000, 1714980158000, '11');
INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('test_plan1', 'test_plan1', 'cron', '50 50 16 01 06 ?', 'JobClass3', 'TEST_PLAN', b'0', 'test_plan_1', 'admin', 1640776200000, 1640777200000, '100001100001', 'Schedule 3', '{\"param1\": \"value1\", \"param2\": \"value2\"}');
INSERT INTO `schedule` (`id`, `key`, `type`, `value`, `job`, `resource_type`, `enable`, `resource_id`, `create_user`, `create_time`, `update_time`, `project_id`, `name`, `config`) VALUES ('test_plan2', 'test_plan2', 'cron', '50 50 16 01 06 ?', 'JobClass3', 'TEST_PLAN', b'0', 'test_plan_2', 'admin', 1640776200000, 1640777200000, '100001100001', 'Schedule 3', '{\"param1\": \"value1\", \"param2\": \"value2\"}');

View File

@ -2,6 +2,7 @@ export enum TableOpenDetailModeEnum {
DRAWER = 'drawer', DRAWER = 'drawer',
NEW_WINDOW = 'new_window', NEW_WINDOW = 'new_window',
} }
export enum TableModuleEnum { export enum TableModuleEnum {
USERGROUPINDEX = 'userGroupIndex', USERGROUPINDEX = 'userGroupIndex',
} }
@ -80,6 +81,9 @@ export enum TableKeyEnum {
TASK_SCHEDULE_TASK_API_SCENARIO_ORGANIZATION = 'taskCenterScheduleApiScenarioOrganization', TASK_SCHEDULE_TASK_API_SCENARIO_ORGANIZATION = 'taskCenterScheduleApiScenarioOrganization',
TASK_SCHEDULE_TASK_API_IMPORT_PROJECT = 'taskCenterScheduleApiImportProject', TASK_SCHEDULE_TASK_API_IMPORT_PROJECT = 'taskCenterScheduleApiImportProject',
TASK_SCHEDULE_TASK_API_SCENARIO_PROJECT = 'taskCenterScheduleApiScenarioProject', TASK_SCHEDULE_TASK_API_SCENARIO_PROJECT = 'taskCenterScheduleApiScenarioProject',
TASK_SCHEDULE_TASK_TEST_PLAN_SYSTEM = 'taskCenterScheduleTestPlanSystem',
TASK_SCHEDULE_TASK_TEST_PLAN_ORGANIZATION = 'taskCenterScheduleTestPlanOrganization',
TASK_SCHEDULE_TASK_TEST_PLAN_PROJECT = 'taskCenterScheduleTestPlanProject',
} }
// 具有特殊功能的列 // 具有特殊功能的列

View File

@ -1,5 +1,16 @@
<template> <template>
<div class="p-4 pt-0"> <div class="p-4 pt-0">
<a-radio-group
v-if="props.moduleType === 'TEST_PLAN'"
v-model:model-value="showType"
type="button"
class="file-show-type"
@change="changeShowType"
>
<a-radio value="All">{{ t('report.all') }}</a-radio>
<a-radio value="TEST_PLAN">{{ t('project.taskCenter.plan') }}</a-radio>
<a-radio value="GROUP">{{ t('project.taskCenter.planGroup') }}</a-radio>
</a-radio-group>
<div class="mb-4 flex items-center justify-end"> <div class="mb-4 flex items-center justify-end">
<!-- TODO这个版本不上 --> <!-- TODO这个版本不上 -->
<!-- <a-button type="primary"> <!-- <a-button type="primary">
@ -165,7 +176,8 @@
}>(); }>();
const keyword = ref<string>(''); const keyword = ref<string>('');
type ReportShowType = 'All' | 'TEST_PLAN' | 'GROUP';
const showType = ref<ReportShowType>('All');
const syncFrequencyOptions = [ const syncFrequencyOptions = [
{ label: t('apiTestManagement.timeTaskHour'), value: '0 0 0/1 * * ?' }, { label: t('apiTestManagement.timeTaskHour'), value: '0 0 0/1 * * ?' },
{ label: t('apiTestManagement.timeTaskSixHour'), value: '0 0 0/6 * * ?' }, { label: t('apiTestManagement.timeTaskSixHour'), value: '0 0 0/6 * * ?' },
@ -209,6 +221,10 @@
edit: ['ORGANIZATION_TASK_CENTER:READ+STOP', 'PROJECT_API_SCENARIO:READ+EXECUTE'], edit: ['ORGANIZATION_TASK_CENTER:READ+STOP', 'PROJECT_API_SCENARIO:READ+EXECUTE'],
jump: ['PROJECT_API_SCENARIO:READ'], jump: ['PROJECT_API_SCENARIO:READ'],
}, },
TEST_CASE: {
edit: ['ORGANIZATION_TASK_CENTER:READ+STOP', 'PROJECT_TEST_PLAN:READ+EXECUTE'],
jump: ['PROJECT_TEST_PLAN:READ'],
},
}, },
system: { system: {
API_IMPORT: { API_IMPORT: {
@ -218,6 +234,10 @@
edit: ['SYSTEM_TASK_CENTER:READ+STOP', 'PROJECT_API_SCENARIO:READ+EXECUTE'], edit: ['SYSTEM_TASK_CENTER:READ+STOP', 'PROJECT_API_SCENARIO:READ+EXECUTE'],
jump: ['PROJECT_API_SCENARIO:READ'], jump: ['PROJECT_API_SCENARIO:READ'],
}, },
TEST_CASE: {
edit: ['SYSTEM_TASK_CENTER:READ+STOP', 'PROJECT_TEST_PLAN:READ+EXECUTE'],
jump: ['PROJECT_TEST_PLAN:READ'],
},
}, },
project: { project: {
API_IMPORT: { API_IMPORT: {
@ -227,6 +247,10 @@
edit: ['PROJECT_API_SCENARIO:READ+EXECUTE'], edit: ['PROJECT_API_SCENARIO:READ+EXECUTE'],
jump: ['PROJECT_API_SCENARIO:READ'], jump: ['PROJECT_API_SCENARIO:READ'],
}, },
TEST_CASE: {
edit: ['PROJECT_TEST_PLAN:READ+EXECUTE'],
jump: ['PROJECT_TEST_PLAN:READ'],
},
}, },
}; };
const hasOperationPermission = computed(() => const hasOperationPermission = computed(() =>
@ -324,14 +348,17 @@
system: { system: {
API_IMPORT: TableKeyEnum.TASK_SCHEDULE_TASK_API_IMPORT_SYSTEM, API_IMPORT: TableKeyEnum.TASK_SCHEDULE_TASK_API_IMPORT_SYSTEM,
API_SCENARIO: TableKeyEnum.TASK_SCHEDULE_TASK_API_SCENARIO_SYSTEM, API_SCENARIO: TableKeyEnum.TASK_SCHEDULE_TASK_API_SCENARIO_SYSTEM,
TEST_PLAN: TableKeyEnum.TASK_SCHEDULE_TASK_TEST_PLAN_SYSTEM,
}, },
organization: { organization: {
API_IMPORT: TableKeyEnum.TASK_SCHEDULE_TASK_API_IMPORT_ORGANIZATION, API_IMPORT: TableKeyEnum.TASK_SCHEDULE_TASK_API_IMPORT_ORGANIZATION,
API_SCENARIO: TableKeyEnum.TASK_SCHEDULE_TASK_API_SCENARIO_ORGANIZATION, API_SCENARIO: TableKeyEnum.TASK_SCHEDULE_TASK_API_SCENARIO_ORGANIZATION,
TEST_PLAN: TableKeyEnum.TASK_SCHEDULE_TASK_TEST_PLAN_ORGANIZATION,
}, },
project: { project: {
API_IMPORT: TableKeyEnum.TASK_SCHEDULE_TASK_API_IMPORT_PROJECT, API_IMPORT: TableKeyEnum.TASK_SCHEDULE_TASK_API_IMPORT_PROJECT,
API_SCENARIO: TableKeyEnum.TASK_SCHEDULE_TASK_API_SCENARIO_PROJECT, API_SCENARIO: TableKeyEnum.TASK_SCHEDULE_TASK_API_SCENARIO_PROJECT,
TEST_PLAN: TableKeyEnum.TASK_SCHEDULE_TASK_TEST_PLAN_PROJECT,
}, },
}; };
@ -351,6 +378,12 @@
...resourceColumns, ...resourceColumns,
...staticColumns, ...staticColumns,
], ],
TEST_PLAN: [
getOrgColumns(),
getProjectColumns(tableKeyMap[props.group][props.moduleType]),
...resourceColumns,
...staticColumns,
],
}, },
organization: { organization: {
API_IMPORT: [ API_IMPORT: [
@ -364,61 +397,98 @@
...resourceColumns, ...resourceColumns,
...staticColumns, ...staticColumns,
], ],
TEST_PLAN: [getProjectColumns(tableKeyMap[props.group][props.moduleType]), ...resourceColumns, ...staticColumns],
}, },
project: { project: {
API_IMPORT: [...resourceColumns, ...swaggerUrlColumn, ...staticColumns], API_IMPORT: [...resourceColumns, ...swaggerUrlColumn, ...staticColumns],
API_SCENARIO: [...resourceColumns, ...staticColumns], API_SCENARIO: [...resourceColumns, ...staticColumns],
TEST_PLAN: [...resourceColumns, ...staticColumns],
}, },
}; };
const orgApiCaseFilter = ref([]); const orgApiCaseFilter = ref([]);
const orgApiScenarioFilter = ref([]); const orgApiScenarioFilter = ref([]);
const orgTestPlanFilter = ref([]);
const orgFiltersMap = ref<Record<string, string[]>>({ const orgFiltersMap = ref<Record<string, string[]>>({
API_IMPORT: orgApiCaseFilter.value, API_IMPORT: orgApiCaseFilter.value,
API_SCENARIO: orgApiScenarioFilter.value, API_SCENARIO: orgApiScenarioFilter.value,
TEST_PLAN: orgTestPlanFilter.value,
}); });
const projectApiCaseFilter = ref([]); const projectApiCaseFilter = ref([]);
const projectApiScenarioFilter = ref([]); const projectApiScenarioFilter = ref([]);
const projectTestPlanFilter = ref([]);
const projectFiltersMap = ref<Record<string, string[]>>({ const projectFiltersMap = ref<Record<string, string[]>>({
API_CASE: projectApiCaseFilter.value, API_CASE: projectApiCaseFilter.value,
API_SCENARIO: projectApiScenarioFilter.value, API_SCENARIO: projectApiScenarioFilter.value,
TEST_PLAN: projectTestPlanFilter.value,
});
const typeFilter = computed(() => {
if (showType.value === 'All') {
return [];
}
return [showType.value];
}); });
const hasJumpPermission = computed(() => hasAnyPermission(permissionsMap[props.group][props.moduleType].jump)); const hasJumpPermission = computed(() => hasAnyPermission(permissionsMap[props.group][props.moduleType].jump));
const { propsRes, propsEvent, loadList, setLoadListParams, resetSelector, resetFilterParams } = useTable( const { propsRes, propsEvent, loadList, setLoadListParams, setPagination, resetSelector, resetFilterParams } =
loadRealMap.value[props.group].list, useTable(
{ loadRealMap.value[props.group].list,
tableKey: tableKeyMap[props.group][props.moduleType], {
scroll: { tableKey: tableKeyMap[props.group][props.moduleType],
x: 1200, scroll: {
x: 1200,
},
showSetting: true,
selectable: hasOperationPermission.value,
heightUsed: 300,
enableDrag: false,
showSelectorAll: true,
}, },
showSetting: true, // eslint-disable-next-line no-return-assign
selectable: hasOperationPermission.value, (item) => ({
heightUsed: 300, ...item,
enableDrag: false, nextTime: item.nextTime ? dayjs(item.nextTime).format('YYYY-MM-DD HH:mm:ss') : null,
showSelectorAll: true, })
}, );
// eslint-disable-next-line no-return-assign
(item) => ({
...item,
nextTime: item.nextTime ? dayjs(item.nextTime).format('YYYY-MM-DD HH:mm:ss') : null,
})
);
function initData() { function initData() {
const filterParams = {
...propsRes.value.filter,
};
setLoadListParams({ setLoadListParams({
keyword: keyword.value, keyword: keyword.value,
scheduleTagType: props.moduleType, scheduleTagType: props.moduleType,
filter: {
...(props.moduleType === 'TEST_PLAN'
? {
type: typeFilter.value,
...filterParams,
}
: { ...filterParams }),
},
}); });
loadList(); loadList();
} }
function changeShowType(val: string | number | boolean) {
showType.value = val as ReportShowType;
resetFilterParams();
resetSelector();
//
setPagination({
current: 1,
});
initData();
}
function searchList() { function searchList() {
resetSelector(); resetSelector();
initData(); initData();
} }
const tableBatchActions = { const tableBatchActions = {
baseAction: [ baseAction: [
{ {
@ -530,6 +600,7 @@
onBeforeOk: async () => { onBeforeOk: async () => {
try { try {
const { selectIds, selectAll, excludeIds } = batchParams.value; const { selectIds, selectAll, excludeIds } = batchParams.value;
await loadRealMap.value[props.group].batchEnable({ await loadRealMap.value[props.group].batchEnable({
selectIds: selectIds || [], selectIds: selectIds || [],
selectAll: !!selectAll, selectAll: !!selectAll,
@ -537,7 +608,14 @@
excludeIds, excludeIds,
condition: { condition: {
keyword: keyword.value, keyword: keyword.value,
filter: propsRes.value.filter, filter: {
...(props.moduleType === 'TEST_PLAN'
? {
type: typeFilter.value,
...propsRes.value.filter,
}
: { ...propsRes.value.filter }),
},
}, },
}); });
resetSelector(); resetSelector();
@ -573,8 +651,9 @@
condition: { condition: {
keyword: keyword.value, keyword: keyword.value,
filter: { filter: {
organizationIds: orgFiltersMap.value[props.moduleType], ...(props.moduleType === 'TEST_PLAN'
projectIds: projectFiltersMap.value[props.moduleType], ? { type: typeFilter.value, ...propsRes.value.filter }
: { ...propsRes.value.filter }),
}, },
}, },
}); });
@ -598,6 +677,7 @@
batchDisableTask(); batchDisableTask();
} }
} }
onBeforeMount(() => { onBeforeMount(() => {
initData(); initData();
}); });
@ -635,12 +715,15 @@
:deep(.param-input:not(.arco-input-focus, .arco-select-view-focus)) { :deep(.param-input:not(.arco-input-focus, .arco-select-view-focus)) {
&:not(:hover) { &:not(:hover) {
border-color: transparent !important; border-color: transparent !important;
.arco-input::placeholder { .arco-input::placeholder {
@apply invisible; @apply invisible;
} }
.arco-select-view-icon { .arco-select-view-icon {
@apply invisible; @apply invisible;
} }
.arco-select-view-value { .arco-select-view-value {
color: var(--color-text-1); color: var(--color-text-1);
} }

View File

@ -75,6 +75,10 @@
value: TaskCenterEnum.API_IMPORT, value: TaskCenterEnum.API_IMPORT,
label: t('project.taskCenter.apiImport'), label: t('project.taskCenter.apiImport'),
}, },
{
value: TaskCenterEnum.TEST_PLAN,
label: t('project.taskCenter.testPlan'),
}
]); ]);
const activeTask = ref(route.query.tab || 'real'); const activeTask = ref(route.query.tab || 'real');

View File

@ -59,4 +59,6 @@ export default {
'project.taskCenter.filterPlaceholderText': 'Please select a project', 'project.taskCenter.filterPlaceholderText': 'Please select a project',
'project.taskCenter.filterOrgPlaceholderText': 'Please select an organization', 'project.taskCenter.filterOrgPlaceholderText': 'Please select an organization',
'project.executionHistory.cleared': 'Execution result has been cleared', 'project.executionHistory.cleared': 'Execution result has been cleared',
'project.taskCenter.plan': 'Plan',
'project.taskCenter.planGroup': 'Plan group',
}; };

View File

@ -57,4 +57,6 @@ export default {
'project.taskCenter.filterProPlaceholderText': '请选择所属项目', 'project.taskCenter.filterProPlaceholderText': '请选择所属项目',
'project.taskCenter.filterOrgPlaceholderText': '请选择所属组织', 'project.taskCenter.filterOrgPlaceholderText': '请选择所属组织',
'project.executionHistory.cleared': '执行结果被清理', 'project.executionHistory.cleared': '执行结果被清理',
'project.taskCenter.plan': '计划',
'project.taskCenter.planGroup': '计划组',
}; };

View File

@ -188,7 +188,7 @@
const allModuleIds = ['bugManagement', 'caseManagement', 'apiTest', 'testPlan']; const allModuleIds = ['bugManagement', 'caseManagement', 'apiTest', 'testPlan'];
const showPoolModuleIds = ['apiTest']; const showPoolModuleIds = ['apiTest', 'testPlan'];
const form = reactive<CreateOrUpdateSystemProjectParams>({ const form = reactive<CreateOrUpdateSystemProjectParams>({
name: '', name: '',

View File

@ -185,7 +185,7 @@
const allModuleIds = ['bugManagement', 'caseManagement', 'apiTest', 'testPlan']; const allModuleIds = ['bugManagement', 'caseManagement', 'apiTest', 'testPlan'];
const showPoolModuleIds = ['apiTest']; const showPoolModuleIds = ['apiTest', 'testPlan'];
const form = reactive<CreateOrUpdateSystemProjectParams>({ const form = reactive<CreateOrUpdateSystemProjectParams>({
name: '', name: '',