From 620ff4af5840d5efb9a58028484bbf413559296b Mon Sep 17 00:00:00 2001 From: junjun Date: Mon, 16 May 2022 13:25:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=B4=E5=BA=A6=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/chart/ChartViewService.java | 70 +++++++++++++------ .../components/compare/CustomSortEdit.vue | 3 +- frontend/src/views/chart/view/ChartEdit.vue | 12 ++-- 3 files changed, 56 insertions(+), 29 deletions(-) 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 1eb5fc4d91..f8d10b09be 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -873,24 +873,7 @@ public class ChartViewService { } } // 自定义排序 - if (xAxis.size() > 0) { - // 找到对应维度 - ChartViewFieldDTO chartViewFieldDTO = null; - int index = 0; - for (int i = 0; i < xAxis.size(); i++) { - ChartViewFieldDTO item = xAxis.get(i); - if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort")) { - chartViewFieldDTO = item; - index = i; - break; - } - } - if (ObjectUtils.isNotEmpty(chartViewFieldDTO)) { - // 获取自定义值与data对应列的结果 - data = customSort(Optional.ofNullable(chartViewFieldDTO.getCustomSort()).orElse(new ArrayList<>()), data, index); - } - } - + data = resultCustomSort(xAxis, data); // 同比/环比计算,通过对比类型和数据设置,计算出对应指标的结果,然后替换结果data数组中的对应元素 // 如果因维度变化(如时间字段缺失,时间字段的展示格式变化)导致无法计算结果的,则结果data数组中的对应元素全置为null // 根据不同图表类型,获得需要替换的指标index array @@ -1020,6 +1003,48 @@ public class ChartViewService { return uniteViewResult(datasourceRequest.getQuery(), mapChart, mapTableNormal, view, isDrill, drillFilters); } + // 对结果排序 + public List resultCustomSort(List xAxis, List data) { + List res = new ArrayList<>(data); + if (xAxis.size() > 0) { + // 找到对应维度 + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO item = xAxis.get(i); + if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort")) { + // 获取自定义值与data对应列的结果 + if (i > 0) { + // 首先根据优先级高的字段分类,在每个前置字段相同的组里排序 + Map> map = new LinkedHashMap<>(); + for (String[] d : res) { + StringBuilder stringBuilder = new StringBuilder(); + for (int j = 0; j < i; j++) { + if (StringUtils.equalsIgnoreCase(xAxis.get(j).getSort(), "none")) { + continue; + } + stringBuilder.append(d[j]); + } + if (CollectionUtils.isEmpty(map.get(stringBuilder.toString()))) { + map.put(stringBuilder.toString(), new ArrayList<>()); + } + map.get(stringBuilder.toString()).add(d); + } + Iterator>> iterator = map.entrySet().iterator(); + List list = new ArrayList<>(); + while (iterator.hasNext()) { + Map.Entry> next = iterator.next(); + list.addAll(customSort(Optional.ofNullable(item.getCustomSort()).orElse(new ArrayList<>()), next.getValue(), i)); + } + res.clear(); + res.addAll(list); + } else { + res = customSort(Optional.ofNullable(item.getCustomSort()).orElse(new ArrayList<>()), res, i); + } + } + } + } + return res; + } + public ChartViewDTO uniteViewResult(String sql, Map chartData, Map tabelData, ChartViewDTO view, Boolean isDrill, List drillFilters) { Map map = new HashMap<>(); @@ -1371,16 +1396,17 @@ public class ChartViewService { getIndex = i; } } - if (ObjectUtils.isNotEmpty(chartViewFieldDTO)) { + List sortResult = resultCustomSort(xAxis, sqlData); + if (ObjectUtils.isNotEmpty(chartViewFieldDTO) && (getIndex >= index)) { // 获取自定义值与data对应列的结果 - List strings = customSort(Optional.ofNullable(chartViewFieldDTO.getCustomSort()).orElse(new ArrayList<>()), sqlData, index); + List strings = customSort(Optional.ofNullable(chartViewFieldDTO.getCustomSort()).orElse(new ArrayList<>()), sortResult, index); for (int i = 0; i < strings.size(); i++) { res.add(strings.get(i)[getIndex]); } } else { // 返回请求结果 - for (int i = 0; i < sqlData.size(); i++) { - res.add(sqlData.get(i)[getIndex]); + for (int i = 0; i < sortResult.size(); i++) { + res.add(sortResult.get(i)[getIndex]); } } } diff --git a/frontend/src/views/chart/components/compare/CustomSortEdit.vue b/frontend/src/views/chart/components/compare/CustomSortEdit.vue index 39dc2d558c..a1bd6fc443 100644 --- a/frontend/src/views/chart/components/compare/CustomSortEdit.vue +++ b/frontend/src/views/chart/components/compare/CustomSortEdit.vue @@ -17,7 +17,8 @@ -

{{ $t('chart.custom_sort_tip') }}

+ + diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 9c0142839e..fac1be5c49 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -2444,19 +2444,19 @@ export default { this.customSortList = [] }, saveCustomSort() { - // 先将所有自定义排序的维度设置为none,再对当前维度赋值 this.view.xaxis.forEach(ele => { - if (ele.sort === 'custom_sort') { - ele.sort = 'none' - ele.customSort = [] - } + // 先将所有自定义排序的维度设置为none,再对当前维度赋值 + // if (ele.sort === 'custom_sort') { + // ele.sort = 'none' + // ele.customSort = [] + // } if (ele.id === this.customSortField.id) { ele.sort = 'custom_sort' ele.customSort = this.customSortList } }) - this.calcData(true) this.closeCustomSort() + this.calcData(true) } } }