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 6ff458e792..a7f579a610 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -278,14 +278,36 @@ public class ChartViewService { // 字段汇总 排序等 String[] field = yAxis.stream().map(y -> "CAST(" + y.getSummary() + "(" + y.getOriginName() + ") AS DECIMAL(20,2)) AS _" + y.getSummary() + "_" + (StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())).toArray(String[]::new); String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new); - String[] order = yAxis.stream().filter(y -> StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) - .map(y -> "_" + y.getSummary() + "_" + (StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()) + " " + y.getSort()).toArray(String[]::new); + String[] xOrder = xAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none")) + .map(f -> f.getOriginName() + " " + f.getSort()).toArray(String[]::new); + String[] yOrder = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none")) + .map(f -> "_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + " " + f.getSort()).toArray(String[]::new); + String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length); + System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length); + + String[] xFilter = xAxis.stream().filter(x -> CollectionUtils.isNotEmpty(x.getFilter()) && x.getFilter().size() > 0) + .map(x -> { + String[] s = x.getFilter().stream().map(f -> { + StringBuilder filter = new StringBuilder(); + filter.append(" AND ").append(x.getOriginName()).append(transMysqlFilterTerm(f.getTerm())); + if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { + filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { + filter.append("%").append(f.getValue()).append("%"); + } else { + filter.append(f.getValue()); + } + return filter.toString(); + }).toArray(String[]::new); + return StringUtils.join(s, " "); + }).toArray(String[]::new); String sql = MessageFormat.format("SELECT {0},{1} FROM {2} WHERE 1=1 {3} GROUP BY {4} ORDER BY null,{5}", StringUtils.join(group, ","), StringUtils.join(field, ","), table, - transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter + xFilter.length > 0 ? StringUtils.join(xFilter, " ") : "" + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter StringUtils.join(group, ","), StringUtils.join(order, ",")); if (sql.endsWith(",")) { @@ -296,7 +318,7 @@ public class ChartViewService { .map(y -> { String[] s = y.getFilter().stream().map(f -> { StringBuilder filter = new StringBuilder(); - filter.append("AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(transMysqlFilterTerm(f.getTerm())); + filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(transMysqlFilterTerm(f.getTerm())); if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) { } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')"); diff --git a/frontend/src/views/chart/components/drag-item/DimensionItem.vue b/frontend/src/views/chart/components/drag-item/DimensionItem.vue index 78665a05c5..1c07723b81 100644 --- a/frontend/src/views/chart/components/drag-item/DimensionItem.vue +++ b/frontend/src/views/chart/components/drag-item/DimensionItem.vue @@ -6,7 +6,27 @@ {{ item.name }} - + + + + + + {{ $t('chart.sort') }} + ({{ $t('chart.'+item.sort) }}) + + + + + {{ $t('chart.none') }} + {{ $t('chart.asc') }} + {{ $t('chart.desc') }} + + + + + {{ $t('chart.filter') }}... + + {{ $t('chart.show_name_set') }} @@ -49,6 +69,9 @@ export default { case 'remove': this.removeItem() break + case 'filter': + this.editFilter() + break default: break } @@ -58,6 +81,20 @@ export default { type: type } }, + sort(param) { + // console.log(param) + this.item.sort = param.type + this.$emit('onDimensionItemChange', this.item) + }, + beforeSort(type) { + return { + type: type + } + }, + editFilter() { + this.item.index = this.index + this.$emit('editItemFilter', this.item) + }, showRename() { this.item.index = this.index this.item.renameType = 'dimension' diff --git a/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue b/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue new file mode 100644 index 0000000000..aa9c8472a1 --- /dev/null +++ b/frontend/src/views/chart/components/filter/DimensionFilterEditor.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 2f67e6c948..ff2378ea05 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -174,7 +174,7 @@ @end="end2" > - + @@ -189,7 +189,7 @@ @end="end2" > - + @@ -217,7 +217,7 @@ {{ $t('chart.confirm') }} + + + + @@ -263,11 +276,12 @@ import XAxisSelector from '../components/component-style/XAxisSelector' import YAxisSelector from '../components/component-style/YAxisSelector' import BackgroundColorSelector from '../components/component-style/BackgroundColorSelector' import QuotaFilterEditor from '../components/filter/QuotaFilterEditor' +import DimensionFilterEditor from '../components/filter/DimensionFilterEditor' import TableNormal from '../components/table/TableNormal' export default { name: 'ChartEdit', - components: { TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, FilterItem, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, + components: { DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, FilterItem, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, props: { param: { type: Object, @@ -304,7 +318,9 @@ export default { chart: { id: 'echart' }, - filterEdit: false, + dimensionFilterEdit: false, + dimensionItem: {}, + quotaFilterEdit: false, quotaItem: {}, renameItem: false, itemForm: { @@ -363,11 +379,17 @@ export default { view.sceneId = this.view.sceneId view.name = this.view.name ? this.view.name : this.table.name view.tableId = this.view.tableId - // view.xaxis.forEach(function(ele) { - // if (!ele.summary || ele.summary === '') { - // ele.summary = 'sum' - // } - // }) + view.xaxis.forEach(function(ele) { + // if (!ele.summary || ele.summary === '') { + // ele.summary = 'sum' + // } + if (!ele.sort || ele.sort === '') { + ele.sort = 'none' + } + if (!ele.filter) { + ele.filter = [] + } + }) view.yaxis.forEach(function(ele) { if (!ele.summary || ele.summary === '') { if (ele.id === 'count') { @@ -574,12 +596,25 @@ export default { this.save() }, - showEditFilter(item) { + showDimensionEditFilter(item) { + this.dimensionItem = JSON.parse(JSON.stringify(item)) + this.dimensionFilterEdit = true + }, + closeDimensionFilter() { + this.dimensionFilterEdit = false + }, + saveDimensionFilter() { + this.view.xaxis[this.dimensionItem.index].filter = this.dimensionItem.filter + this.save() + this.closeDimensionFilter() + }, + + showQuotaEditFilter(item) { this.quotaItem = JSON.parse(JSON.stringify(item)) - this.filterEdit = true + this.quotaFilterEdit = true }, closeQuotaFilter() { - this.filterEdit = false + this.quotaFilterEdit = false }, saveQuotaFilter() { this.view.yaxis[this.quotaItem.index].filter = this.quotaItem.filter