diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml index 3716d7959d..77590bee2f 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml @@ -524,6 +524,9 @@ and (test_case.status is null or test_case.status != #{request.notEqStatus}) + + and test_case.case_public = true + and (test_case.name like CONCAT('%', #{request.name},'%') or test_case.num like CONCAT('%', #{request.name},'%') diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java index 05fb14487b..93661cc432 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java @@ -28,6 +28,7 @@ import io.metersphere.notice.annotation.SendNotice; import io.metersphere.service.CheckPermissionService; import io.metersphere.service.FileService; import io.metersphere.track.dto.TestCaseDTO; +import io.metersphere.track.dto.TestCaseNodeDTO; import io.metersphere.track.request.testcase.*; import io.metersphere.track.request.testplan.FileOperationRequest; import io.metersphere.track.request.testplan.LoadCaseRequest; @@ -73,6 +74,12 @@ public class TestCaseController { return PageUtils.setPageInfo(page, testCaseService.publicListTestCase(request)); } + + @PostMapping("/public/case/node") + public List getPublicCaseNode(@RequestBody QueryTestCaseRequest request) { + return testCaseService.getPublicCaseNode(request); + } + @GetMapping("/list/{projectId}") @RequiresPermissions("PROJECT_TRACK_CASE:READ") public List list(@PathVariable String projectId) { diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java index feebe870e1..a5c34990fd 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java @@ -143,10 +143,14 @@ public class TestCaseNodeService extends NodeTreeService { } } public List getNodeTreeByProjectId(String projectId) { + QueryTestCaseRequest request = new QueryTestCaseRequest(); + return getNodeTreeByProjectId(projectId, request); + } + + public List getNodeTreeByProjectId(String projectId, QueryTestCaseRequest request) { // 判断当前项目下是否有默认模块,没有添加默认模块 this.getDefaultNode(projectId); List testCaseNodes = extTestCaseNodeMapper.getNodeTreeByProjectId(projectId); - QueryTestCaseRequest request = new QueryTestCaseRequest(); request.setUserId(SessionUtils.getUserId()); request.setProjectId(projectId); @@ -305,6 +309,25 @@ public class TestCaseNodeService extends NodeTreeService { return getNodeTreeWithPruningTree(projectNodeMap); } + public List getNodeByTestCases(List testCaseDTOS) { + Map> projectNodeMap = new HashMap<>(); + for (TestCase testCase : testCaseDTOS) { + List nodeIds = Optional.ofNullable(projectNodeMap.get(testCase.getProjectId())).orElse(new ArrayList<>()); + nodeIds.add(testCase.getNodeId()); + projectNodeMap.put(testCase.getProjectId(), nodeIds); + } + List tree = getNodeTreeWithPruningTree(projectNodeMap); + QueryTestCaseRequest request = new QueryTestCaseRequest(); + request.setCasePublic(true); + for (TestCaseNodeDTO dto : tree) { + List children = this.getNodeTreeByProjectId(dto.getId(), request); + dto.setChildren(children); + int sum = children.stream().mapToInt(TestCaseNodeDTO::getCaseNum).sum(); + dto.setCaseNum(sum); + } + return tree; + } + public List getNodeByReviewId(String reviewId) { List testCases = extTestCaseReviewTestCaseMapper.getTestCaseWithNodeInfo(reviewId); Map> projectNodeMap = getProjectNodeMap(testCases); diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java index 0a9853e314..994804d58d 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java @@ -45,6 +45,7 @@ import io.metersphere.performance.service.PerformanceTestService; import io.metersphere.service.*; import io.metersphere.track.dto.TestCaseCommentDTO; import io.metersphere.track.dto.TestCaseDTO; +import io.metersphere.track.dto.TestCaseNodeDTO; import io.metersphere.track.issue.AbstractIssuePlatform; import io.metersphere.track.issue.IssueFactory; import io.metersphere.track.issue.service.XpackIssueService; @@ -2673,4 +2674,9 @@ public class TestCaseService { } return false; } + + public List getPublicCaseNode(QueryTestCaseRequest request) { + List testCaseDTOS = publicListTestCase(request); + return testCaseNodeService.getNodeByTestCases(testCaseDTOS); + } } diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue index b241b964e7..6f80932f9a 100644 --- a/frontend/src/business/components/track/case/TestCase.vue +++ b/frontend/src/business/components/track/case/TestCase.vue @@ -21,6 +21,15 @@ /> + + + + @@ -66,6 +75,7 @@ @getPublicList="getPublicList" @refresh="refresh" @refreshAll="refreshAll" + @refreshPublic="refreshPublic" @setCondition="setCondition" ref="testCasePublicList"> @@ -253,6 +263,8 @@ export default { currentTrashVersion: null, versionEnable: false, isAsideHidden: true, + showPublicNode: false, + publicTreeNodes: [] }; }, mounted() { @@ -286,6 +298,7 @@ export default { }, activeName(newVal, oldVal) { this.isAsideHidden = this.activeName === 'default'; + this.showPublicNode = this.activeName === 'public'; if (oldVal !== 'default' && newVal === 'default' && this.$refs.minder) { this.$refs.minder.refresh(); } @@ -307,6 +320,9 @@ export default { publicEnable() { if (this.publicEnable) { this.activeName = 'public'; + this.result = this.$post('/test/case/public/case/node', {workspaceId: getCurrentWorkspaceId()}, res => { + this.publicTreeNodes = res.data; + }) } else { this.activeName = 'default'; } @@ -561,6 +577,13 @@ export default { this.publicEnable = false; this.activeName = "default"; }, + publicNodeChange(node, nodeIds, pNodes) { + this.activeName = 'public'; + this.publicEnable = true; + if (this.$refs.testCasePublicList) { + this.$refs.testCasePublicList.initTableData(nodeIds); + } + }, increase(id) { this.$refs.nodeTree.increase(id); }, @@ -658,6 +681,14 @@ export default { this.$refs.nodeTree.list(); this.setTable(data); }, + refreshPublic() { + if (this.$refs.testCasePublicList) { + this.$refs.testCasePublicList.initTableData([]); + } + this.result = this.$post('/test/case/public/case/node', {workspaceId: getCurrentWorkspaceId()}, res => { + this.publicTreeNodes = res.data; + }) + }, setTreeNodes(data) { this.treeNodes = data; }, diff --git a/frontend/src/business/components/track/case/components/TestCaseList.vue b/frontend/src/business/components/track/case/components/TestCaseList.vue index c0cb17dd43..575c44ceb7 100644 --- a/frontend/src/business/components/track/case/components/TestCaseList.vue +++ b/frontend/src/business/components/track/case/components/TestCaseList.vue @@ -708,7 +708,7 @@ export default { let dataType = this.$route.params.dataType; this.selectDataRange = dataType === 'case' ? dataRange : 'all'; }, - initTableData() { + initTableData(nodeIds) { this.condition.planId = ""; this.condition.nodeIds = []; initCondition(this.condition, this.condition.selectAll); @@ -728,6 +728,11 @@ export default { } } } + + if (nodeIds && nodeIds.length > 0) { + this.condition.nodeIds = nodeIds; + this.condition.workspaceId = getCurrentWorkspaceId(); + } this.getData(); }, open() { @@ -1101,7 +1106,7 @@ export default { let param = buildBatchParam(this, this.$refs.table.selectIds); this.$post('/test/case/batch/movePublic/deleteToGc', param, () => { this.$refs.table.clear(); - this.$emit("refresh"); + this.$emit("refreshPublic"); this.$success(this.$t('commons.delete_success')); }); } @@ -1123,7 +1128,7 @@ export default { this.$get('/test/case/deletePublic/' + testCase.versionId + '/' + testCase.refId, () => { this.$success(this.$t('commons.delete_success')); this.$refs.apiDeleteConfirm.close(); - this.$emit("refreshAll"); + this.$emit("refreshPublic"); }); } else { this.$get('/test/case/delete/' + testCase.versionId + '/' + testCase.refId, () => { @@ -1137,12 +1142,11 @@ export default { else { if (this.publicEnable) { let param = buildBatchParam(this, this.$refs.table.selectIds); + param.ids.push(testCase.id); this.$post('/test/case/batch/movePublic/deleteToGc', param, () => { this.$success(this.$t('commons.delete_success')); - // this.initTable(); this.$refs.apiDeleteConfirm.close(); - this.$emit("refreshAll"); - + this.$emit("refreshPublic"); }); } else { this._handleDeleteToGc(testCase);