From 1833ca5399c681363c8e20bb65501c87726ddab7 Mon Sep 17 00:00:00 2001 From: junjie Date: Fri, 21 May 2021 16:45:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=A7=86=E5=9B=BE):=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E8=BF=87=E6=BB=A4=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=AF=B9=E6=95=B0=E6=8D=AE=E9=9B=86=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=BF=9B=E8=A1=8C=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/chart/ChartCustomFilterDTO.java | 21 +++ .../io/dataease/provider/QueryProvider.java | 5 +- .../provider/doris/DorisQueryProvider.java | 40 ++++- .../provider/mysql/MysqlQueryProvider.java | 40 ++++- .../sqlserver/SqlserverQueryProvider.java | 40 ++++- .../service/chart/ChartViewService.java | 11 +- frontend/src/lang/en.js | 3 +- frontend/src/lang/tw.js | 3 +- frontend/src/lang/zh.js | 3 +- .../filter/DimensionFilterEditor.vue | 56 +++---- .../components/filter/QuotaFilterEditor.vue | 56 +++---- .../components/filter/ResultFilterEditor.vue | 152 ++++++++++++++++++ frontend/src/views/chart/view/ChartEdit.vue | 67 +++++--- 13 files changed, 400 insertions(+), 97 deletions(-) create mode 100644 backend/src/main/java/io/dataease/dto/chart/ChartCustomFilterDTO.java create mode 100644 frontend/src/views/chart/components/filter/ResultFilterEditor.vue diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartCustomFilterDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartCustomFilterDTO.java new file mode 100644 index 0000000000..f561e2ed18 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/chart/ChartCustomFilterDTO.java @@ -0,0 +1,21 @@ +package io.dataease.dto.chart; + +import io.dataease.base.domain.DatasetTableField; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @Author gin + * @Date 2021/5/21 4:24 下午 + */ +@Getter +@Setter +public class ChartCustomFilterDTO implements Serializable { + private String fieldId; + private String term; + private String value; + + private DatasetTableField field; +} diff --git a/backend/src/main/java/io/dataease/provider/QueryProvider.java b/backend/src/main/java/io/dataease/provider/QueryProvider.java index 42f3450ca9..5e02985b71 100644 --- a/backend/src/main/java/io/dataease/provider/QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/QueryProvider.java @@ -2,6 +2,7 @@ package io.dataease.provider; import io.dataease.base.domain.DatasetTableField; import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import java.util.List; @@ -27,9 +28,9 @@ public abstract class QueryProvider { public abstract String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize); - public abstract String getSQL(String table, List xAxis, List yAxis, List extFilterRequestList); + public abstract String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList); - public abstract String getSQLAsTmp(String table, List xAxis, List yAxis, List extFilterRequestList); + public abstract String getSQLAsTmp(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList); public abstract String searchTable(String table); } diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index 20d6b9ee9b..d840005eb0 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -2,6 +2,7 @@ package io.dataease.provider.doris; import io.dataease.base.domain.DatasetTableField; import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.provider.QueryProvider; import org.apache.commons.collections4.CollectionUtils; @@ -110,7 +111,7 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQL(String table, List xAxis, List yAxis, List extFilterRequestList) { + public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { // 字段汇总 排序等 String[] field = yAxis.stream().map(y -> { StringBuilder f = new StringBuilder(); @@ -180,7 +181,7 @@ public class DorisQueryProvider extends QueryProvider { StringUtils.join(groupField, ","), StringUtils.join(field, ","), table, - xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "" + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter + (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter StringUtils.join(group, ","), StringUtils.join(order, ",")); if (sql.endsWith(",")) { @@ -222,8 +223,8 @@ public class DorisQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List extFilterRequestList) { - return getSQL(" (" + sql + ") AS tmp ", xAxis, yAxis, extFilterRequestList); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { + return getSQL(" (" + sql + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList); } @Override @@ -264,7 +265,36 @@ public class DorisQueryProvider extends QueryProvider { } } - public String transMysqlExtFilter(List requestList) { + public String transCustomFilter(List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return ""; + } + StringBuilder filter = new StringBuilder(); + for (ChartCustomFilterDTO request : requestList) { + String value = request.getValue(); + DatasetTableField field = request.getField(); + if (field.getDeType() == 1 && field.getDeExtractType() != 1) { + filter.append(" AND FROM_UNIXTIME(cast(") + .append(field.getDataeaseName()) + .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + } else { + filter.append(" AND ").append(field.getDataeaseName()); + } + filter.append(" ") + .append(transMysqlFilterTerm(request.getTerm())) + .append(" "); + if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { + filter.append("('").append(StringUtils.join(value, "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { + filter.append("'%").append(value).append("%'"); + } else { + filter.append("'").append(value).append("'"); + } + } + return filter.toString(); + } + + public String transExtFilter(List requestList) { if (CollectionUtils.isEmpty(requestList)) { return ""; } diff --git a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java index 56019e566d..9f1a8244ce 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -2,6 +2,7 @@ package io.dataease.provider.mysql; import io.dataease.base.domain.DatasetTableField; import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.provider.QueryProvider; import org.apache.commons.collections4.CollectionUtils; @@ -110,7 +111,7 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQL(String table, List xAxis, List yAxis, List extFilterRequestList) { + public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { // 字段汇总 排序等 String[] field = yAxis.stream().map(y -> { StringBuilder f = new StringBuilder(); @@ -186,7 +187,7 @@ public class MysqlQueryProvider extends QueryProvider { StringUtils.join(groupField, ","), StringUtils.join(field, ","), table, - (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter + (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter StringUtils.join(group, ","), StringUtils.join(order, ",")); if (sql.endsWith(",")) { @@ -229,8 +230,8 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List extFilterRequestList) { - return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, extFilterRequestList); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { + return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList); } @Override @@ -271,7 +272,36 @@ public class MysqlQueryProvider extends QueryProvider { } } - public String transMysqlExtFilter(List requestList) { + public String transCustomFilter(List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return ""; + } + StringBuilder filter = new StringBuilder(); + for (ChartCustomFilterDTO request : requestList) { + String value = request.getValue(); + DatasetTableField field = request.getField(); + if (field.getDeType() == 1 && field.getDeExtractType() != 1) { + filter.append(" AND FROM_UNIXTIME(cast(") + .append(field.getDataeaseName()) + .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + } else { + filter.append(" AND ").append(field.getDataeaseName()); + } + filter.append(" ") + .append(transMysqlFilterTerm(request.getTerm())) + .append(" "); + if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { + filter.append("('").append(StringUtils.join(value, "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { + filter.append("'%").append(value).append("%'"); + } else { + filter.append("'").append(value).append("'"); + } + } + return filter.toString(); + } + + public String transExtFilter(List requestList) { if (CollectionUtils.isEmpty(requestList)) { return ""; } diff --git a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java index 83a2b11b8c..1f1d0d8956 100644 --- a/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/sqlserver/SqlserverQueryProvider.java @@ -2,6 +2,7 @@ package io.dataease.provider.sqlserver; import io.dataease.base.domain.DatasetTableField; import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.provider.QueryProvider; import org.apache.commons.collections4.CollectionUtils; @@ -111,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQL(String table, List xAxis, List yAxis, List extFilterRequestList) { + public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { // 字段汇总 排序等 String[] field = yAxis.stream().map(y -> { StringBuilder f = new StringBuilder(); @@ -187,7 +188,7 @@ public class SqlserverQueryProvider extends QueryProvider { StringUtils.join(groupField, ","), StringUtils.join(field, ","), table, - (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter + (xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "") + transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter StringUtils.join(group, ","), StringUtils.join(order, ",")); if (sql.endsWith(",")) { @@ -230,8 +231,8 @@ public class SqlserverQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmp(String sql, List xAxis, List yAxis, List extFilterRequestList) { - return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, extFilterRequestList); + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) { + return getSQL(" (" + sqlFix(sql) + ") AS tmp ", xAxis, yAxis, customFilter, extFilterRequestList); } @Override @@ -270,7 +271,36 @@ public class SqlserverQueryProvider extends QueryProvider { } } - public String transMysqlExtFilter(List requestList) { + public String transCustomFilter(List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return ""; + } + StringBuilder filter = new StringBuilder(); + for (ChartCustomFilterDTO request : requestList) { + String value = request.getValue(); + DatasetTableField field = request.getField(); + if (field.getDeType() == 1 && field.getDeExtractType() != 1) { + filter.append(" AND FROM_UNIXTIME(cast(") + .append(field.getDataeaseName()) + .append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') "); + } else { + filter.append(" AND ").append(field.getDataeaseName()); + } + filter.append(" ") + .append(transMysqlFilterTerm(request.getTerm())) + .append(" "); + if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { + filter.append("('").append(StringUtils.join(value, "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { + filter.append("'%").append(value).append("%'"); + } else { + filter.append("'").append(value).append("'"); + } + } + return filter.toString(); + } + + public String transExtFilter(List requestList) { if (CollectionUtils.isEmpty(requestList)) { return ""; } diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 4d6d79890f..963df03cbd 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -15,6 +15,7 @@ import io.dataease.datasource.provider.DatasourceProvider; import io.dataease.datasource.provider.ProviderFactory; import io.dataease.datasource.request.DatasourceRequest; import io.dataease.datasource.service.DatasourceService; +import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewDTO; import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.chart.Series; @@ -31,6 +32,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; /** * @Author gin @@ -89,6 +91,9 @@ public class ChartViewService { }.getType()); List yAxis = new Gson().fromJson(view.getYAxis(), new TypeToken>() { }.getType()); + List customFilter = new Gson().fromJson(view.getCustomFilter(), new TypeToken>() { + }.getType()); + customFilter.forEach(ele -> ele.setField(dataSetTableFieldsService.get(ele.getFieldId()))); if (CollectionUtils.isEmpty(xAxis) || CollectionUtils.isEmpty(yAxis)) { ChartViewDTO dto = new ChartViewDTO(); @@ -127,9 +132,9 @@ public class ChartViewService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase(table.getType(), "db")) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, extFilterList)); + datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList)); } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { - datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, extFilterList)); + datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList)); } data = datasourceProvider.getData(datasourceRequest); } else if (table.getMode() == 1) {// 抽取 @@ -141,7 +146,7 @@ public class ChartViewService { String tableName = "ds_" + table.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, extFilterList)); + datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, customFilter, extFilterList)); data = datasourceProvider.getData(datasourceRequest); } diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index cecbbc1c5a..ec654784a8 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -672,7 +672,8 @@ export default { only_one_result: 'Only show first result', dimension_show: 'Dimension Show', quota_show: 'Quota Show', - title_limit: 'Title cannot be greater than 50 characters' + title_limit: 'Title cannot be greater than 50 characters', + filter_condition: 'Filter Condition' }, dataset: { sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 81dfd4531c..2d7d6e44b7 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -671,7 +671,8 @@ export default { only_one_result: '僅顯示第1個計算結果', dimension_show: '維度顯示', quota_show: '指標顯示', - title_limit: '標題不能大於50個字符' + title_limit: '標題不能大於50個字符', + filter_condition: '過濾條件' }, dataset: { sheet_warn: '有多個sheet頁面,默認抽取第一個', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index b851d43661..9aee869067 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -673,7 +673,8 @@ export default { only_one_result: '仅显示第1个计算结果', dimension_show: '维度显示', quota_show: '指标显示', - title_limit: '标题不能大于50个字符' + title_limit: '标题不能大于50个字符', + filter_condition: '过滤条件' }, dataset: { sheet_warn: '有多个Sheet页,默认抽取第一个', diff --git a/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue b/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue index aa9c8472a1..050b9e548a 100644 --- a/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue +++ b/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue @@ -1,33 +1,35 @@ diff --git a/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue b/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue index 7ccafa100e..959652f0b5 100644 --- a/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue +++ b/frontend/src/views/chart/components/filter/QuotaFilterEditor.vue @@ -1,33 +1,35 @@ diff --git a/frontend/src/views/chart/components/filter/ResultFilterEditor.vue b/frontend/src/views/chart/components/filter/ResultFilterEditor.vue new file mode 100644 index 0000000000..6ed4867180 --- /dev/null +++ b/frontend/src/views/chart/components/filter/ResultFilterEditor.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index fc583bc76a..df922fe19d 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -165,22 +165,11 @@ -
+
{{ $t('chart.result_filter') }} -
- - - - - -
+ + {{ $t('chart.filter_condition') }} +
@@ -188,7 +177,7 @@ - {{ $t('chart.dimension') }} + {{ $t('chart.dimension') }} - {{ $t('chart.quota') }} + {{ $t('chart.quota') }} {{ $t('chart.confirm') }}
+ + + + @@ -283,7 +286,7 @@ import { post, ajaxGetData } from '@/api/chart/chart' import draggable from 'vuedraggable' import DimensionItem from '../components/drag-item/DimensionItem' import QuotaItem from '../components/drag-item/QuotaItem' -import FilterItem from '../components/drag-item/FilterItem' +import ResultFilterEditor from '../components/filter/ResultFilterEditor' import ChartComponent from '../components/ChartComponent' import bus from '@/utils/bus' import DatasetChartDetail from '../../dataset/common/DatasetChartDetail' @@ -317,7 +320,7 @@ import html2canvas from 'html2canvas' export default { name: 'ChartEdit', - components: { LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, FilterItem, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, + components: { ResultFilterEditor, LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, props: { param: { type: Object, @@ -359,6 +362,8 @@ export default { dimensionItem: {}, quotaFilterEdit: false, quotaItem: {}, + resultFilterEdit: false, + chartForFilter: {}, renameItem: false, itemForm: { name: '' @@ -784,6 +789,19 @@ export default { this.closeQuotaFilter() }, + showResultFilter() { + this.chartForFilter = JSON.parse(JSON.stringify(this.view)) + this.resultFilterEdit = true + }, + closeResultFilter() { + this.resultFilterEdit = false + }, + saveResultFilter() { + this.view.customFilter = this.chartForFilter.customFilter + this.save(true) + this.closeResultFilter() + }, + showRename(val) { this.itemForm = JSON.parse(JSON.stringify(val)) this.renameItem = true @@ -948,7 +966,7 @@ export default { } .attr-style{ - height: calc(100vh - 56px - 25vh - 40px - 62px - 10px); + height: calc(100vh - 56px - 25vh - 40px - 62px - 10px - 60px); } .attr-selector{ @@ -992,4 +1010,13 @@ export default { .dialog-css >>> .el-dialog__body { padding: 10px 20px 20px; } + + .filter-btn-class{ + padding: 6px; + border: none; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + }