From 7b5976dd160c3664c11eab9ae20e7e2d142403fb Mon Sep 17 00:00:00 2001 From: chenjianxing Date: Fri, 5 Nov 2021 14:35:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20azure=20=E6=94=AF=E6=8C=81=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E7=88=B6workItem=E8=BF=87=E6=BB=A4=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/metersphere/base/domain/Project.java | 2 + .../base/domain/ProjectExample.java | 70 +++++++++++++++++++ .../metersphere/base/mapper/ProjectMapper.xml | 25 +++++-- .../base/mapper/ext/ExtProjectMapper.xml | 1 + .../io/metersphere/track/dto/DemandDTO.java | 9 ++- backend/src/main/java/io/metersphere/xpack | 2 +- .../db/migration/V98__v1.14.1_release.sql | 1 + .../settings/workspace/MsProject.vue | 4 ++ .../case/components/TestCaseEditOtherInfo.vue | 64 +++++++++++++---- 9 files changed, 155 insertions(+), 23 deletions(-) diff --git a/backend/src/main/java/io/metersphere/base/domain/Project.java b/backend/src/main/java/io/metersphere/base/domain/Project.java index d434edb2b5..f85eadf639 100644 --- a/backend/src/main/java/io/metersphere/base/domain/Project.java +++ b/backend/src/main/java/io/metersphere/base/domain/Project.java @@ -43,5 +43,7 @@ public class Project implements Serializable { private Boolean isMockTcpOpen; + private String azureFilterId; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java b/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java index 33b5c69343..7f42ebe850 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java @@ -1363,6 +1363,76 @@ public class ProjectExample { addCriterion("is_mock_tcp_open not between", value1, value2, "isMockTcpOpen"); return (Criteria) this; } + + public Criteria andAzureFilterIdIsNull() { + addCriterion("azure_filter_id is null"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdIsNotNull() { + addCriterion("azure_filter_id is not null"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdEqualTo(String value) { + addCriterion("azure_filter_id =", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdNotEqualTo(String value) { + addCriterion("azure_filter_id <>", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdGreaterThan(String value) { + addCriterion("azure_filter_id >", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdGreaterThanOrEqualTo(String value) { + addCriterion("azure_filter_id >=", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdLessThan(String value) { + addCriterion("azure_filter_id <", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdLessThanOrEqualTo(String value) { + addCriterion("azure_filter_id <=", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdLike(String value) { + addCriterion("azure_filter_id like", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdNotLike(String value) { + addCriterion("azure_filter_id not like", value, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdIn(List values) { + addCriterion("azure_filter_id in", values, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdNotIn(List values) { + addCriterion("azure_filter_id not in", values, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdBetween(String value1, String value2) { + addCriterion("azure_filter_id between", value1, value2, "azureFilterId"); + return (Criteria) this; + } + + public Criteria andAzureFilterIdNotBetween(String value1, String value2) { + addCriterion("azure_filter_id not between", value1, value2, "azureFilterId"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml index 55baf5e074..e02df82cce 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml @@ -21,6 +21,7 @@ + @@ -83,7 +84,7 @@ id, workspace_id, `name`, description, create_time, update_time, tapd_id, jira_key, zentao_id, azure_devops_id, `repeatable`, case_template_id, issue_template_id, custom_num, - scenario_custom_num, create_user, system_id, mock_tcp_port, is_mock_tcp_open + scenario_custom_num, create_user, system_id, mock_tcp_port, is_mock_tcp_open, azure_filter_id @@ -318,6 +325,9 @@ is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT}, + + azure_filter_id = #{record.azureFilterId,jdbcType=VARCHAR}, + @@ -343,7 +353,8 @@ create_user = #{record.createUser,jdbcType=VARCHAR}, system_id = #{record.systemId,jdbcType=VARCHAR}, mock_tcp_port = #{record.mockTcpPort,jdbcType=INTEGER}, - is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT} + is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT}, + azure_filter_id = #{record.azureFilterId,jdbcType=VARCHAR} @@ -405,6 +416,9 @@ is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT}, + + azure_filter_id = #{azureFilterId,jdbcType=VARCHAR}, + where id = #{id,jdbcType=VARCHAR} @@ -427,7 +441,8 @@ create_user = #{createUser,jdbcType=VARCHAR}, system_id = #{systemId,jdbcType=VARCHAR}, mock_tcp_port = #{mockTcpPort,jdbcType=INTEGER}, - is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT} + is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT}, + azure_filter_id = #{azureFilterId,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml index b484186758..f9b5e6f44a 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml @@ -48,6 +48,7 @@ p.azure_devops_id, p.repeatable, p.custom_num, + p.azure_filter_id, user.name AS createUserName, p.mock_tcp_port AS mockTcpPort, p.is_mock_tcp_open AS isMockTcpOpen, diff --git a/backend/src/main/java/io/metersphere/track/dto/DemandDTO.java b/backend/src/main/java/io/metersphere/track/dto/DemandDTO.java index 1fba8cad3b..992ae06c1b 100644 --- a/backend/src/main/java/io/metersphere/track/dto/DemandDTO.java +++ b/backend/src/main/java/io/metersphere/track/dto/DemandDTO.java @@ -3,10 +3,13 @@ package io.metersphere.track.dto; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Setter @Getter public class DemandDTO { - private String id; - private String name; - private String platform; + protected String id; + protected String name; + protected String platform; + protected List children; } diff --git a/backend/src/main/java/io/metersphere/xpack b/backend/src/main/java/io/metersphere/xpack index 09533c9466..a432acd823 160000 --- a/backend/src/main/java/io/metersphere/xpack +++ b/backend/src/main/java/io/metersphere/xpack @@ -1 +1 @@ -Subproject commit 09533c94661faf6b8a6b7695545e0850a52d07e6 +Subproject commit a432acd823010a980e9976b4d386b4bd2d1c7354 diff --git a/backend/src/main/resources/db/migration/V98__v1.14.1_release.sql b/backend/src/main/resources/db/migration/V98__v1.14.1_release.sql index e972e07a22..f78e4e38d6 100644 --- a/backend/src/main/resources/db/migration/V98__v1.14.1_release.sql +++ b/backend/src/main/resources/db/migration/V98__v1.14.1_release.sql @@ -10,3 +10,4 @@ values (UUID(), 'ws_admin', 'WORKSPACE_PROJECT_MANAGER:READ+UPLOAD_JAR', 'WORKSP insert into user_group_permission (id, group_id, permission_id, module_id) values (UUID(), 'ws_member', 'WORKSPACE_PROJECT_MANAGER:READ+UPLOAD_JAR', 'WORKSPACE_PROJECT_MANAGER'); +ALTER TABLE project ADD COLUMN azure_filter_id varchar(50) NULL COMMENT 'azure 过滤需求的 parent workItem ID'; diff --git a/frontend/src/business/components/settings/workspace/MsProject.vue b/frontend/src/business/components/settings/workspace/MsProject.vue index 1b26003aa4..9b977ca6e8 100644 --- a/frontend/src/business/components/settings/workspace/MsProject.vue +++ b/frontend/src/business/components/settings/workspace/MsProject.vue @@ -142,6 +142,10 @@ + + + + diff --git a/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue b/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue index 0fa114da62..af42896536 100644 --- a/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue +++ b/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue @@ -13,15 +13,17 @@ - - - - + + + + + + + + + + + @@ -106,6 +108,7 @@ export default { tableData: [], demandOptions: [], relationshipCount: 0, + demandValue: [], //sysList:this.sysList,//一级选择框的数据 props: { multiple: true, @@ -135,6 +138,13 @@ export default { getRelationshipCountCase(this.caseId, (data) => { this.relationshipCount = data; }); + }, + demandValue() { + if (this.demandValue.length > 0) { + this.form.demandId = this.demandValue[this.demandValue.length - 1]; + } else { + this.form.demandId = null; + } } }, methods: { @@ -261,16 +271,42 @@ export default { if (this.demandOptions.length === 0) { this.result = {loading: true}; this.$get("demand/list/" + this.projectId).then(response => { - this.demandOptions = response.data.data; - this.demandOptions.unshift({id: 'other', name: this.$t('test_track.case.other'), platform: 'Other'}); + this.demandOptions = []; + if (response.data.data && response.data.data.length > 0) { + this.buildDemandCascaderOptions(response.data.data, this.demandOptions, []); + } + this.demandOptions.unshift({value: 'other', label: 'Other: ' + this.$t('test_track.case.other'), platform: 'Other'}); + if (this.form.demandId === 'other') { + this.demandValue = ['other']; + } this.result = {loading: false}; }).catch(() => { - this.demandOptions.unshift({id: 'other', name: this.$t('test_track.case.other'), platform: 'Other'}); + this.demandOptions.unshift({value: 'other', label: 'Other: ' + this.$t('test_track.case.other'), platform: 'Other'}); + if (this.form.demandId === 'other') { + this.demandValue = ['other']; + } this.result = {loading: false}; }); } }, - + buildDemandCascaderOptions(data, options, pathArray) { + data.forEach(item => { + let option = { + label: item.platform + ': ' + item.name, + value: item.id + } + options.push(option); + pathArray.push(item.id); + if (item.id === this.form.demandId) { + this.demandValue = [...pathArray]; // 回显级联选项 + } + if (item.children && item.children.length > 0) { + option.children = []; + this.buildDemandCascaderOptions(item.children, option.children, pathArray); + } + pathArray.pop(); + }); + } } }; @@ -291,6 +327,6 @@ export default { .el-cascader >>> .el-input { cursor: pointer; - width: 500px; + width: 250px; }