From 831ecf0753ed7495f79f9a4d0d593505758765d7 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Wed, 23 Mar 2022 10:54:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):?= =?UTF-8?q?=20=E4=BB=BB=E5=8A=A1=E4=B8=AD=E5=BF=83=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=B7=A5=E4=BD=9C=E7=A9=BA=E9=97=B4=E4=B8=8B?= =?UTF-8?q?=E6=89=80=E6=9C=89=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1011600 --user=赵勇 【测试跟踪】测试计划引用了其他项目的case,执行后任务中心不显示执行记录 https://www.tapd.cn/55049933/s/1124098 --- .../base/mapper/ext/ExtTaskMapper.xml | 36 +++++++++++++++---- .../service/CheckPermissionService.java | 16 ++++++++- .../task/controller/TaskController.java | 1 + .../task/dto/TaskCenterRequest.java | 7 ++++ .../metersphere/task/service/TaskService.java | 26 ++++++++++---- .../websocket/TaskCenterWebSocket.java | 13 +++---- .../business/components/task/TaskCenter.vue | 2 +- 7 files changed, 80 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml index e63de76a0b..a7a4338b43 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml @@ -6,7 +6,10 @@ SELECT tt.* FROM ( (select t.id,if(t.scenario_id like "[\"%\"]", t.name,t.scenario_name) as name ,'SCENARIO' as executionModule,t.report_type, ifnull(t2.name,'LOCAL') as actuator, t1.`name` as executor,t.create_time as executionTime, t.trigger_mode as triggerMode ,t.status as executionStatus from api_scenario_report t left join `user` t1 ON t.user_id = t1.id left join test_resource_pool t2 on t.actuator = t2.id - where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.execute_type !='Debug' and t.execute_type !='Marge' and t.project_id= #{request.projectId} + where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.execute_type !='Debug' and t.execute_type !='Marge' and t.project_id in + + #{id} + and t.trigger_mode = #{request.triggerMode} @@ -20,8 +23,12 @@ UNION ALL (select t.id,t.name,'API' as executionModule, t.report_type, ifnull(t2.name,'LOCAL') as actuator, t1.`name` as executor,t.create_time as executionTime, ifnull(t.trigger_mode,'MANUAL') as triggerMode ,ifnull(t.status,'Saved') as executionStatus from api_definition_exec_result t left join `user` t1 ON t.user_id = t1.id left join test_resource_pool t2 on t.actuator = t2.id - where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.project_id =#{request.projectId} - + where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.project_id in + + #{id} + + + and t.trigger_mode = #{request.triggerMode} @@ -35,7 +42,10 @@ UNION ALL (select t.id,t.name,'PERFORMANCE' as executionModule,'PERFORMANCE' as report_type, ifnull(t2.name,'LOCAL') as actuator, t1.`name` as executor,t.create_time as executionTime, t.trigger_mode as triggerMode ,t.`status` as executionStatus from load_test_report t left join `user` t1 ON t.user_id = t1.id left join test_resource_pool t2 on t.test_resource_pool_id = t2.id - where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.project_id= #{request.projectId} + where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.project_id in + + #{id} + and t.trigger_mode = #{request.triggerMode} @@ -70,20 +80,32 @@ SELECT count(tt.id) FROM ( (select t.id,t.create_time as executionTime from api_scenario_report t left join `user` t1 ON t.user_id = t1.id left join test_resource_pool t2 on t.actuator = t2.id - where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.execute_type !='Debug' and t.execute_type !='Marge' and t.project_id= #{request.projectId} and t.status not in ("saved","completed","success","error","STOP") + where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.execute_type !='Debug' and t.execute_type !='Marge' and t.project_id in + + #{id} + + and t.status not in ("saved","completed","success","error","STOP") ) UNION ALL (select t.id,t.create_time as executionTime from api_definition_exec_result t left join `user` t1 ON t.user_id = t1.id left join test_resource_pool t2 on t.actuator = t2.id where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and (t.integrated_report_id is null or t.integrated_report_id='null') - and t.project_id =#{request.projectId} + and t.project_id in + + #{id} + and t.status not in ("saved","completed","success","error","STOP") ) UNION ALL (select t.id,t.create_time as executionTime from load_test_report t left join `user` t1 ON t.user_id = t1.id left join test_resource_pool t2 on t.test_resource_pool_id = t2.id - where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and t.project_id= #{request.projectId} and t.status not in ("saved","completed","success","error") + where to_days(FROM_UNIXTIME(t.create_time/1000))= to_days(now()) and + t.project_id in + + #{id} + + and t.status not in ("saved","completed","success","error") ) )tt ORDER BY tt.executionTime DESC; diff --git a/backend/src/main/java/io/metersphere/service/CheckPermissionService.java b/backend/src/main/java/io/metersphere/service/CheckPermissionService.java index 41b908b47d..aae51a5569 100644 --- a/backend/src/main/java/io/metersphere/service/CheckPermissionService.java +++ b/backend/src/main/java/io/metersphere/service/CheckPermissionService.java @@ -128,7 +128,8 @@ public class CheckPermissionService { MSException.throwException(Translator.get("check_owner_review")); } } - public List getOwnerProjects() { + + public List getOwnerProjects() { Set userRelatedProjectIds = getUserRelatedProjectIds(); if (CollectionUtils.isEmpty(userRelatedProjectIds)) { return new ArrayList<>(0); @@ -136,4 +137,17 @@ public class CheckPermissionService { List projectIds = new ArrayList<>(userRelatedProjectIds); return extProjectMapper.queryListByIds(projectIds); } + + public Set getOwnerByUserId(String userId) { + UserDTO userDTO = userService.getUserDTO(userId); + List groupIds = userDTO.getGroups() + .stream() + .filter(g -> StringUtils.equals(g.getType(), UserGroupType.PROJECT)) + .map(Group::getId) + .collect(Collectors.toList()); + return userDTO.getUserGroups().stream() + .filter(ur -> groupIds.contains(ur.getGroupId())) + .map(UserGroup::getSourceId) + .collect(Collectors.toSet()); + } } diff --git a/backend/src/main/java/io/metersphere/task/controller/TaskController.java b/backend/src/main/java/io/metersphere/task/controller/TaskController.java index d1e5089e10..0bbd4b7d7f 100644 --- a/backend/src/main/java/io/metersphere/task/controller/TaskController.java +++ b/backend/src/main/java/io/metersphere/task/controller/TaskController.java @@ -20,6 +20,7 @@ public class TaskController { @PostMapping("/list/{goPage}/{pageSize}") public Pager> getTasks(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody TaskCenterRequest request) { + request.setProjects(taskService.getOwnerProjectIds(null)); request.setGoPage(goPage); request.setPageSize(pageSize); Page page = PageHelper.startPage(goPage, pageSize, true); diff --git a/backend/src/main/java/io/metersphere/task/dto/TaskCenterRequest.java b/backend/src/main/java/io/metersphere/task/dto/TaskCenterRequest.java index 2fedf6ced3..393aa92529 100644 --- a/backend/src/main/java/io/metersphere/task/dto/TaskCenterRequest.java +++ b/backend/src/main/java/io/metersphere/task/dto/TaskCenterRequest.java @@ -2,10 +2,15 @@ package io.metersphere.task.dto; import lombok.Data; +import java.util.List; + @Data public class TaskCenterRequest { private String projectId; + + private String userId; + /** * 触发方式 */ @@ -22,4 +27,6 @@ public class TaskCenterRequest { private int goPage; private int pageSize; + + List projects; } diff --git a/backend/src/main/java/io/metersphere/task/service/TaskService.java b/backend/src/main/java/io/metersphere/task/service/TaskService.java index acb2d57675..22a29e44da 100644 --- a/backend/src/main/java/io/metersphere/task/service/TaskService.java +++ b/backend/src/main/java/io/metersphere/task/service/TaskService.java @@ -19,6 +19,7 @@ import io.metersphere.commons.utils.LogUtil; import io.metersphere.dto.NodeDTO; import io.metersphere.jmeter.LocalRunner; import io.metersphere.performance.service.PerformanceTestService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.task.dto.TaskCenterDTO; import io.metersphere.task.dto.TaskCenterRequest; import org.apache.commons.collections.CollectionUtils; @@ -28,10 +29,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -61,16 +59,32 @@ public class TaskService { private ExecThreadPoolExecutor execThreadPoolExecutor; @Resource private ApiExecutionQueueService apiExecutionQueueService; + @Resource + private CheckPermissionService checkPermissionService; + + public List getOwnerProjectIds(String userId) { + Set userRelatedProjectIds = null; + if (StringUtils.isEmpty(userId)) { + userRelatedProjectIds = checkPermissionService.getUserRelatedProjectIds(); + } else { + userRelatedProjectIds = checkPermissionService.getOwnerByUserId(userId); + } + if (CollectionUtils.isEmpty(userRelatedProjectIds)) { + return new ArrayList<>(0); + } + return new ArrayList<>(userRelatedProjectIds); + } public List getTasks(TaskCenterRequest request) { - if (StringUtils.isEmpty(request.getProjectId())) { + if (CollectionUtils.isEmpty(request.getProjects())) { return new ArrayList<>(); } return extTaskMapper.getTasks(request); } public int getRunningTasks(TaskCenterRequest request) { - if (StringUtils.isEmpty(request.getProjectId())) { + request.setProjects(this.getOwnerProjectIds(request.getUserId())); + if (CollectionUtils.isEmpty(request.getProjects())) { return 0; } return extTaskMapper.getRunningTasks(request); diff --git a/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java b/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java index da0a229ba6..af80c18f9e 100644 --- a/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java +++ b/backend/src/main/java/io/metersphere/websocket/TaskCenterWebSocket.java @@ -13,7 +13,7 @@ import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; -@ServerEndpoint("/task/center/count/running/{projectId}") +@ServerEndpoint("/task/center/count/running/{projectId}/{userId}") @Component public class TaskCenterWebSocket { private static TaskService taskService; @@ -28,9 +28,9 @@ public class TaskCenterWebSocket { * 开启连接的操作 */ @OnOpen - public void onOpen(@PathParam("projectId") String projectId, Session session) { + public void onOpen(@PathParam("projectId") String projectId, @PathParam("userId") String userId, Session session) { Timer timer = new Timer(true); - TaskCenterWebSocket.TaskCenter task = new TaskCenterWebSocket.TaskCenter(session, projectId); + TaskCenterWebSocket.TaskCenter task = new TaskCenterWebSocket.TaskCenter(session, projectId, userId); timer.schedule(task, 0, 10 * 1000); refreshTasks.putIfAbsent(session, timer); } @@ -51,7 +51,7 @@ public class TaskCenterWebSocket { * 推送消息 */ @OnMessage - public void onMessage(@PathParam("projectId") String projectId, Session session, String message) { + public void onMessage(@PathParam("projectId") String projectId, @PathParam("userId") String userId, Session session, String message) { int refreshTime = 10; try { refreshTime = Integer.parseInt(message); @@ -62,7 +62,7 @@ public class TaskCenterWebSocket { timer.cancel(); Timer newTimer = new Timer(true); - newTimer.schedule(new TaskCenterWebSocket.TaskCenter(session, projectId), 0, refreshTime * 1000L); + newTimer.schedule(new TaskCenterWebSocket.TaskCenter(session, projectId, userId), 0, refreshTime * 1000L); refreshTasks.put(session, newTimer); } catch (Exception e) { LogUtil.error(e.getMessage(), e); @@ -82,10 +82,11 @@ public class TaskCenterWebSocket { private Session session; private TaskCenterRequest request; - TaskCenter(Session session, String projectId) { + TaskCenter(Session session, String projectId, String userId) { this.session = session; TaskCenterRequest request = new TaskCenterRequest(); request.setProjectId(projectId); + request.setUserId(userId); this.request = request; } diff --git a/frontend/src/business/components/task/TaskCenter.vue b/frontend/src/business/components/task/TaskCenter.vue index 6039222847..4020585064 100644 --- a/frontend/src/business/components/task/TaskCenter.vue +++ b/frontend/src/business/components/task/TaskCenter.vue @@ -262,7 +262,7 @@ export default { if (window.location.protocol === 'https:') { protocol = "wss://"; } - const uri = protocol + window.location.host + "/task/center/count/running/" + getCurrentProjectID(); + const uri = protocol + window.location.host + "/task/center/count/running/" + getCurrentProjectID() + "/" + getCurrentUser().id; this.websocket = new WebSocket(uri); this.websocket.onmessage = this.onMessage; this.websocket.onopen = this.onOpen;