From 2a0c7df77303db6def713bde0343e708328546f3 Mon Sep 17 00:00:00 2001 From: wisonic Date: Fri, 13 Dec 2024 14:58:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=9B=BE=E8=A1=A8):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=AD=97=E6=AE=B5=E6=8E=92=E5=BA=8F=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=BA=A7=20#12454=20#12551?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../charts/impl/DefaultChartHandler.java | 2 +- .../charts/impl/map/SymbolicMapHandler.java | 2 +- .../impl/table/TableHeatmapHandler.java | 2 +- .../charts/impl/table/TableInfoHandler.java | 7 +- .../chart/dao/auto/entity/CoreChartView.java | 72 ++++--- .../dao/auto/mapper/CoreChartViewMapper.java | 2 +- .../io/dataease/engine/sql/SQLProvider.java | 22 +++ .../engine/trans/Dimension2SQLObj.java | 1 + .../dataease/engine/trans/Quota2SQLObj.java | 1 + .../resources/db/migration/V2.10.4__ddl.sql | 1 + .../src/assets/svg/icon_sort_priority.svg | 1 + core/core-frontend/src/locales/en.ts | 4 +- core/core-frontend/src/locales/tw.ts | 4 +- core/core-frontend/src/locales/zh-CN.ts | 4 +- .../core-frontend/src/models/chart/chart.d.ts | 1 + .../editor/drag-item/DimensionItem.vue | 38 ++-- .../components/editor/drag-item/DrillItem.vue | 37 ++-- .../components/editor/drag-item/QuotaItem.vue | 59 ++++-- .../drag-item/components/SortPriorityEdit.vue | 186 ++++++++++++++++++ .../views/chart/components/editor/index.vue | 53 +++++ .../chart/components/editor/util/chart.ts | 1 + .../js/panel/charts/others/indicator.ts | 1 + .../extensions/datasource/model/SQLObj.java | 2 + .../extensions/view/dto/ChartViewBaseDTO.java | 4 + .../extensions/view/dto/SortAxis.java | 12 ++ .../extensions/view/util/ChartDataUtil.java | 86 +++++--- 26 files changed, 494 insertions(+), 111 deletions(-) create mode 100644 core/core-frontend/src/assets/svg/icon_sort_priority.svg create mode 100644 core/core-frontend/src/views/chart/components/editor/drag-item/components/SortPriorityEdit.vue create mode 100644 sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/SortAxis.java diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java index 61a453e170..fcfcbb29ce 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java @@ -121,7 +121,7 @@ public class DefaultChartHandler extends AbstractChartPlugin { logger.debug("calcite chart sql: " + querySql); List data = (List) provider.fetchResultField(datasourceRequest).get("data"); //自定义排序 - data = ChartDataUtil.resultCustomSort(xAxis, data); + data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data); //快速计算 quickCalc(xAxis, yAxis, data); //数据重组逻辑可重载 diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java index cc8706c8a4..547ee0a811 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java @@ -107,7 +107,7 @@ public class SymbolicMapHandler extends GroupChartHandler { detailData = (List) provider.fetchResultField(datasourceRequest1).get("data"); } //自定义排序 - data = ChartDataUtil.resultCustomSort(xAxis, data); + data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data); //数据重组逻辑可重载 var result = customBuildResult(view, formatResult, filterResult, data, detailFields, detailData); T calcResult = (T) new ChartCalcDataResult(); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableHeatmapHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableHeatmapHandler.java index 85f0b249ca..53bdbf42b0 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableHeatmapHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableHeatmapHandler.java @@ -74,7 +74,7 @@ public class TableHeatmapHandler extends DefaultChartHandler { logger.debug("calcite chart sql: " + querySql); List data = (List) provider.fetchResultField(datasourceRequest).get("data"); //自定义排序 - data = ChartDataUtil.resultCustomSort(xAxis, data); + data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data); //数据重组逻辑可重载 var result = this.buildResult(view, formatResult, filterResult, data); T calcResult = (T) new ChartCalcDataResult(); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java index d4d3cab806..923a43ac0d 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java @@ -19,10 +19,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Component @@ -129,7 +126,7 @@ public class TableInfoHandler extends DefaultChartHandler { logger.debug("calcite chart sql: " + querySql); List data = (List) provider.fetchResultField(datasourceRequest).get("data"); //自定义排序 - data = ChartDataUtil.resultCustomSort(xAxis, data); + data = ChartDataUtil.resultCustomSort(xAxis, Collections.emptyList(), view.getSortPriority(), data); //数据重组逻辑可重载 var result = this.buildResult(view, formatResult, filterResult, data); T calcResult = (T) new ChartCalcDataResult(); diff --git a/core/core-backend/src/main/java/io/dataease/chart/dao/auto/entity/CoreChartView.java b/core/core-backend/src/main/java/io/dataease/chart/dao/auto/entity/CoreChartView.java index 1058f0465e..6307ee4e07 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/dao/auto/entity/CoreChartView.java +++ b/core/core-backend/src/main/java/io/dataease/chart/dao/auto/entity/CoreChartView.java @@ -9,7 +9,7 @@ import java.io.Serializable; *

* * @author fit2cloud - * @since 2024-10-23 + * @since 2024-12-12 */ @TableName("core_chart_view") public class CoreChartView implements Serializable { @@ -101,21 +101,11 @@ public class CoreChartView implements Serializable { */ private String customAttr; - /** - * 图形属性_移动端 - */ - private String customAttrMobile; - /** * 组件样式 */ private String customStyle; - /** - * 组件样式_移动端 - */ - private String customStyleMobile; - /** * 结果过滤 */ @@ -231,6 +221,21 @@ public class CoreChartView implements Serializable { */ private String extColor; + /** + * 图形属性_移动端 + */ + private String customAttrMobile; + + /** + * 组件样式_移动端 + */ + private String customStyleMobile; + + /** + * 字段排序优先级 + */ + private String sortPriority; + public Long getId() { return id; } @@ -367,14 +372,6 @@ public class CoreChartView implements Serializable { this.customAttr = customAttr; } - public String getCustomAttrMobile() { - return customAttrMobile; - } - - public void setCustomAttrMobile(String customAttrMobile) { - this.customAttrMobile = customAttrMobile; - } - public String getCustomStyle() { return customStyle; } @@ -383,14 +380,6 @@ public class CoreChartView implements Serializable { this.customStyle = customStyle; } - public String getCustomStyleMobile() { - return customStyleMobile; - } - - public void setCustomStyleMobile(String customStyleMobile) { - this.customStyleMobile = customStyleMobile; - } - public String getCustomFilter() { return customFilter; } @@ -575,6 +564,30 @@ public class CoreChartView implements Serializable { this.extColor = extColor; } + public String getCustomAttrMobile() { + return customAttrMobile; + } + + public void setCustomAttrMobile(String customAttrMobile) { + this.customAttrMobile = customAttrMobile; + } + + public String getCustomStyleMobile() { + return customStyleMobile; + } + + public void setCustomStyleMobile(String customStyleMobile) { + this.customStyleMobile = customStyleMobile; + } + + public String getSortPriority() { + return sortPriority; + } + + public void setSortPriority(String sortPriority) { + this.sortPriority = sortPriority; + } + @Override public String toString() { return "CoreChartView{" + @@ -595,9 +608,7 @@ public class CoreChartView implements Serializable { ", extLabel = " + extLabel + ", extTooltip = " + extTooltip + ", customAttr = " + customAttr + - ", customAttrMobile = " + customAttrMobile + ", customStyle = " + customStyle + - ", customStyleMobile = " + customStyleMobile + ", customFilter = " + customFilter + ", drillFields = " + drillFields + ", senior = " + senior + @@ -621,6 +632,9 @@ public class CoreChartView implements Serializable { ", flowMapStartName = " + flowMapStartName + ", flowMapEndName = " + flowMapEndName + ", extColor = " + extColor + + ", customAttrMobile = " + customAttrMobile + + ", customStyleMobile = " + customStyleMobile + + ", sortPriority = " + sortPriority + "}"; } } diff --git a/core/core-backend/src/main/java/io/dataease/chart/dao/auto/mapper/CoreChartViewMapper.java b/core/core-backend/src/main/java/io/dataease/chart/dao/auto/mapper/CoreChartViewMapper.java index e5c4fb1c33..6b9fa610f6 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/dao/auto/mapper/CoreChartViewMapper.java +++ b/core/core-backend/src/main/java/io/dataease/chart/dao/auto/mapper/CoreChartViewMapper.java @@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper; *

* * @author fit2cloud - * @since 2024-10-23 + * @since 2024-12-12 */ @Mapper public interface CoreChartViewMapper extends BaseMapper { diff --git a/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java b/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java index 1b05e4424d..4bdffe551b 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java +++ b/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java @@ -4,6 +4,8 @@ import io.dataease.engine.constant.SQLConstants; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.view.dto.ChartViewDTO; +import io.dataease.extensions.view.dto.SortAxis; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.stringtemplate.v4.ST; @@ -11,6 +13,7 @@ import org.stringtemplate.v4.STGroup; import org.stringtemplate.v4.STGroupString; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; /** @@ -116,6 +119,25 @@ public class SQLProvider { List orders = new ArrayList<>(); if (ObjectUtils.isNotEmpty(xOrders)) orders.addAll(xOrders); if (ObjectUtils.isNotEmpty(yOrders)) orders.addAll(yOrders); + if (!orders.isEmpty() && CollectionUtils.isNotEmpty(view.getSortPriority())) { + var sortPriority = view.getSortPriority(); + var tmp = new ArrayList(); + var ids = new HashSet(); + for (SortAxis sortAxis : sortPriority) { + for (SQLObj order : orders) { + if (sortAxis.getId().equals(order.getId())){ + tmp.add(order); + ids.add(order.getId()); + } + } + } + for (SQLObj order : orders) { + if (!ids.contains(order.getId())) { + tmp.add(order); + } + } + orders = tmp; + } // check datasource 是否需要排序 if (needOrder && ObjectUtils.isEmpty(orders)) { if (ObjectUtils.isNotEmpty(xFields) || ObjectUtils.isNotEmpty(yFields)) { diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java index f0bff8ba7b..5f14fdaeee 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java @@ -76,6 +76,7 @@ public class Dimension2SQLObj { .orderField(originField) .orderAlias(fieldAlias) .orderDirection(x.getSort()) + .id(x.getId()) .build()); } } diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java index b4c35fe38b..6fcde84593 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java @@ -85,6 +85,7 @@ public class Quota2SQLObj { .orderField(originField) .orderAlias(fieldAlias) .orderDirection(y.getSort()) + .id(y.getId()) .build()); } } diff --git a/core/core-backend/src/main/resources/db/migration/V2.10.4__ddl.sql b/core/core-backend/src/main/resources/db/migration/V2.10.4__ddl.sql index af9304a0e4..921a566136 100644 --- a/core/core-backend/src/main/resources/db/migration/V2.10.4__ddl.sql +++ b/core/core-backend/src/main/resources/db/migration/V2.10.4__ddl.sql @@ -2,3 +2,4 @@ UPDATE `visualization_background` SET `name` = 'Board10' WHERE `id` = 'dark_1'; UPDATE `visualization_subject` SET `name` = 'chart.light_theme' WHERE `id` = '10001'; UPDATE `visualization_subject` SET `name` = 'chart.dark_theme' WHERE `id` = '10002'; CREATE INDEX idx_dataset_table_task_log_A ON core_datasource_task_log(ds_id, table_name, start_time); +ALTER TABLE core_chart_view ADD sort_priority longtext null comment '字段排序优先级'; diff --git a/core/core-frontend/src/assets/svg/icon_sort_priority.svg b/core/core-frontend/src/assets/svg/icon_sort_priority.svg new file mode 100644 index 0000000000..04ac42d671 --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sort_priority.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/core-frontend/src/locales/en.ts b/core/core-frontend/src/locales/en.ts index df424b9bec..382f73ae37 100644 --- a/core/core-frontend/src/locales/en.ts +++ b/core/core-frontend/src/locales/en.ts @@ -1917,7 +1917,9 @@ Scatter chart (bubble) chart: {a} (series name), {b} (data name), {c} (value arr 'When Customizing, Supports SVG, JPG, JPEG, and PNG files up to 1MB', size_range: 'Size Range', x_axis_constant_line: 'X-axis Constant Line', - y_axis_constant_line: 'Y-axis Constant Line' + y_axis_constant_line: 'Y-axis Constant Line', + sort_priority: 'Sort Priority Setting', + sort_priority_tip: 'Top-down, sorting priority from highest to lowest' }, dataset: { scope_edit: 'Only effective when editing', diff --git a/core/core-frontend/src/locales/tw.ts b/core/core-frontend/src/locales/tw.ts index 2c13306519..404da771f1 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -1873,7 +1873,9 @@ export default { symbolic_map_symbol_shape_tip: '自訂時, 支援 1MB 以內的 SVG, JPG, JPEG, PNG 檔案', size_range: '大小區間', x_axis_constant_line: 'X 軸恆線', - y_axis_constant_line: 'Y 軸恆線' + y_axis_constant_line: 'Y 軸恆線', + sort_priority: '排序優先級設置', + sort_priority_tip: '自上而下,排序優先級從高到低' }, dataset: { scope_edit: '僅編輯時生效', diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 5fb73f1ae8..f4fbe0ce7c 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -1875,7 +1875,9 @@ export default { symbolic_map_symbol_shape_tip: '自定义时, 支持 1MB 以内的 SVG, JPG, JPEG, PNG 文件', size_range: '大小区间', x_axis_constant_line: 'X 轴恒线', - y_axis_constant_line: 'Y 轴恒线' + y_axis_constant_line: 'Y 轴恒线', + sort_priority: '排序优先级设置', + sort_priority_tip: '自上而下,排序优先级从高到低' }, dataset: { scope_edit: '仅编辑时生效', diff --git a/core/core-frontend/src/models/chart/chart.d.ts b/core/core-frontend/src/models/chart/chart.d.ts index 6fc1a5f7f3..90787da11e 100644 --- a/core/core-frontend/src/models/chart/chart.d.ts +++ b/core/core-frontend/src/models/chart/chart.d.ts @@ -50,6 +50,7 @@ declare interface Chart { customStyleMobile: CustomStyle drillFields: ChartViewField[] drillFilters: Filter[] + sortPriority: ChartViewField[] datasetMode: 0 | 1 datasourceType: string totalItems: number diff --git a/core/core-frontend/src/views/chart/components/editor/drag-item/DimensionItem.vue b/core/core-frontend/src/views/chart/components/editor/drag-item/DimensionItem.vue index 41251b014b..36ceafc272 100644 --- a/core/core-frontend/src/views/chart/components/editor/drag-item/DimensionItem.vue +++ b/core/core-frontend/src/views/chart/components/editor/drag-item/DimensionItem.vue @@ -7,6 +7,7 @@ import icon_down_outlined1 from '@/assets/svg/icon_down_outlined-1.svg' import icon_right_outlined from '@/assets/svg/icon_right_outlined.svg' import icon_done_outlined from '@/assets/svg/icon_done_outlined.svg' import icon_edit_outlined from '@/assets/svg/icon_edit_outlined.svg' +import icon_sort_priority from '@/assets/svg/icon_sort_priority.svg' import { useI18n } from '@/hooks/web/useI18n' import { computed, onMounted, ref, toRefs, watch } from 'vue' import { getItemType } from '@/views/chart/components/editor/drag-item/utils' @@ -59,7 +60,8 @@ const emit = defineEmits([ 'onDimensionItemChange', 'onNameEdit', 'valueFormatter', - 'onToggleHide' + 'onToggleHide', + 'editSortPriority' ]) const { item } = toRefs(props) @@ -101,6 +103,9 @@ const clickItem = param => { case 'toggleHide': toggleHide() break + case 'sortPriority': + emit('editSortPriority') + break default: break } @@ -258,16 +263,18 @@ onMounted(() => { @@ -383,7 +390,14 @@ onMounted(() => { - + + {{ t('chart.sort_priority') }} + { case 'remove': removeItem() break + case 'sortPriority': + emit('editSortPriority') + break default: break } @@ -163,16 +168,18 @@ onMounted(() => { @@ -279,6 +286,14 @@ onMounted(() => { + + {{ t('chart.sort_priority') }} + diff --git a/core/core-frontend/src/views/chart/components/editor/drag-item/QuotaItem.vue b/core/core-frontend/src/views/chart/components/editor/drag-item/QuotaItem.vue index b011612910..c8752766df 100644 --- a/core/core-frontend/src/views/chart/components/editor/drag-item/QuotaItem.vue +++ b/core/core-frontend/src/views/chart/components/editor/drag-item/QuotaItem.vue @@ -9,6 +9,7 @@ import icon_right_outlined from '@/assets/svg/icon_right_outlined.svg' import icon_done_outlined from '@/assets/svg/icon_done_outlined.svg' import icon_functions_outlined from '@/assets/svg/icon_functions_outlined.svg' import icon_describe_outlined from '@/assets/svg/icon_describe_outlined.svg' +import icon_sort_priority from '@/assets/svg/icon_sort_priority.svg' import icon_edit_outlined from '@/assets/svg/icon_edit_outlined.svg' import { useI18n } from '@/hooks/web/useI18n' import { computed, onMounted, reactive, ref, toRefs, watch } from 'vue' @@ -73,7 +74,8 @@ const emit = defineEmits([ 'editItemFilter', 'editItemCompare', 'valueFormatter', - 'onToggleHide' + 'onToggleHide', + 'editSortPriority' ]) const { item, chart } = toRefs(props) @@ -166,6 +168,9 @@ const clickItem = param => { case 'toggleHide': toggleHide() break + case 'sortPriority': + emit('editSortPriority') + break default: break } @@ -298,6 +303,16 @@ const toggleHide = () => { const showHideIcon = computed(() => { return ['tale-info', 'table-normal'].includes(props.chart.type) && item.value.hide }) + +const showSort = computed(() => { + return ( + props.type !== 'extLabel' && + props.type !== 'extTooltip' && + props.type !== 'extBubble' && + !['chart-mix', 'indicator', 'liquid', 'gauge'].includes(chart.value.type) + ) +}) + onMounted(() => { isEnableCompare() getItemTagType() @@ -339,16 +354,18 @@ onMounted(() => { @@ -658,16 +675,7 @@ onMounted(() => { - + { + + {{ t('chart.sort_priority') }} + + +import icon_drag_outlined from '@/assets/svg/icon_drag_outlined.svg' +import draggable from 'vuedraggable' +import { reactive, watch, ref } from 'vue' +import chartViewManager from '../../../js/panel' + +const loading = ref(false) + +const state = reactive({ + sortList: [] +}) + +const props = defineProps({ + chart: { + type: Object, + required: true + } +}) + +const emit = defineEmits(['onPriorityChange']) + +watch( + () => props.chart, + () => { + init() + }, + { deep: true } +) + +const init = () => { + const chart = props.chart + if (!chart.sortPriority?.length) { + state.sortList.splice(0, state.sortList.length) + } else { + state.sortList.splice(0, state.sortList.length, ...chart.sortPriority) + } + const chartInstance = chartViewManager.getChartView(chart.render, chart.type) + if (chartInstance) { + const axis = chartInstance.axis + const axisMap = axis?.reduce((p, n) => { + let axisArr + switch (n) { + case 'xAxis': + axisArr = chart.xAxis + break + case 'yAxis': + axisArr = chart.yAxis + break + case 'xAxisExt': + axisArr = chart.xAxisExt + break + case 'yAxisExt': + axisArr = chart.yAxisExt + break + case 'extBubble': + axisArr = chart.extBubble + break + case 'flowMapEndName': + axisArr = chart.flowMapEndName + break + case 'flowMapStartName': + axisArr = chart.flowMapStartName + break + case 'extColor': + axisArr = chart.extColor + break + case 'extStack': + axisArr = chart.extStack + break + case 'drill': + axisArr = chart.drillFields + break + default: + break + } + axisArr?.forEach(ele => { + if (!p[ele.id]) { + p[ele.id] = ele.chartShowName ?? ele.name + } + }) + return p + }, {}) + state.sortList = state.sortList.reduce((p, n) => { + if (axisMap[n.id]) { + n.name = axisMap[n.id] + p.push(n) + } + return p + }, []) + Object.entries(axisMap).forEach(([key, value]) => { + if (!state.sortList.find(item => item.id === key)) { + state.sortList.push({ id: key, name: value }) + } + }) + } +} +const onUpdate = () => { + emit('onPriorityChange', state.sortList) +} + +init() + + + + + diff --git a/core/core-frontend/src/views/chart/components/editor/index.vue b/core/core-frontend/src/views/chart/components/editor/index.vue index a7a1c8610a..564b817c33 100644 --- a/core/core-frontend/src/views/chart/components/editor/index.vue +++ b/core/core-frontend/src/views/chart/components/editor/index.vue @@ -51,6 +51,7 @@ import { useRouter, useRoute } from 'vue-router' import CompareEdit from '@/views/chart/components/editor/drag-item/components/CompareEdit.vue' import ValueFormatterEdit from '@/views/chart/components/editor/drag-item/components/ValueFormatterEdit.vue' import CustomSortEdit from '@/views/chart/components/editor/drag-item/components/CustomSortEdit.vue' +import SortPriorityEdit from '@/views/chart/components/editor/drag-item/components/SortPriorityEdit.vue' import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot' import CalcFieldEdit from '@/views/visualized/data/dataset/form/CalcFieldEdit.vue' import { getFieldName, guid } from '@/views/visualized/data/dataset/form/util' @@ -230,6 +231,8 @@ const state = reactive({ showValueFormatter: false, valueFormatterItem: {}, showCustomSort: false, + showSortPriority: false, + sortPriority: [], customSortList: [], customSortField: {}, currEditField: {}, @@ -1521,6 +1524,19 @@ const onToggleHide = item => { } renderChart(view.value) } +const editSortPriority = () => { + state.showSortPriority = true +} +const closeSortPriority = () => { + state.showSortPriority = false +} +const saveSortPriority = () => { + view.value.sortPriority = state.sortPriority as ChartViewField[] + closeSortPriority() +} +const onPriorityChange = val => { + state.sortPriority = val +} const valueFormatter = item => { recordSnapshotInfo('render') state.valueFormatterItem = JSON.parse(JSON.stringify(item)) @@ -2159,6 +2175,7 @@ const deleteChartFieldItem = id => { @onCustomSort="onCustomSort" @valueFormatter="valueFormatter" @onToggleHide="onToggleHide" + @editSortPriority="editSortPriority" /> @@ -2221,6 +2238,7 @@ const deleteChartFieldItem = id => { @onDimensionItemRemove="dimensionItemRemove" @onNameEdit="showRename" @onCustomSort="onExtCustomSort" + @editSortPriority="editSortPriority" /> @@ -2285,6 +2303,7 @@ const deleteChartFieldItem = id => { @onNameEdit="showRename" @onCustomSort="onCustomFlowMapStartNameSort" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -2349,6 +2368,7 @@ const deleteChartFieldItem = id => { @onNameEdit="showRename" @onCustomSort="onCustomFlowMapEndNameSort" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -2411,6 +2431,7 @@ const deleteChartFieldItem = id => { @onDimensionItemRemove="dimensionItemRemove" @onNameEdit="showRename" @onCustomSort="onStackCustomSort" + @editSortPriority="editSortPriority" /> @@ -2475,6 +2496,7 @@ const deleteChartFieldItem = id => { @onNameEdit="showRename" @onCustomSort="onCustomExtColorSort" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -2562,6 +2584,7 @@ const deleteChartFieldItem = id => { @editItemCompare="showQuotaEditCompare" @valueFormatter="valueFormatter" @onToggleHide="onToggleHide" + @editSortPriority="editSortPriority" /> @@ -2627,6 +2650,7 @@ const deleteChartFieldItem = id => { @onDimensionItemRemove="dimensionItemRemove" @onNameEdit="showRename" @onCustomSort="onExtCustomRightSort" + @editSortPriority="editSortPriority" /> @@ -2691,6 +2715,7 @@ const deleteChartFieldItem = id => { @editItemFilter="showQuotaEditFilter" @editItemCompare="showQuotaEditCompare" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -2756,6 +2781,7 @@ const deleteChartFieldItem = id => { @onDimensionItemRemove="dimensionItemRemove" @onNameEdit="showRename" @onCustomSort="onExtCustomSort" + @editSortPriority="editSortPriority" /> { @editItemFilter="showQuotaEditFilter" @editItemCompare="showQuotaEditCompare" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -2835,6 +2862,7 @@ const deleteChartFieldItem = id => { @onDimensionItemRemove="dimensionItemRemove" @onNameEdit="showRename" @onCustomSort="onExtCustomSort" + @editSortPriority="editSortPriority" /> { @editItemFilter="showQuotaEditFilter" @editItemCompare="showQuotaEditCompare" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -2936,6 +2965,7 @@ const deleteChartFieldItem = id => { @editItemFilter="showQuotaEditFilter" @editItemCompare="showQuotaEditCompare" @valueFormatter="valueFormatter" + @editSortPriority="editSortPriority" /> @@ -3009,6 +3039,7 @@ const deleteChartFieldItem = id => { @onDimensionItemRemove="drillItemRemove" @onNameEdit="showRename" @onCustomSort="onDrillCustomSort" + @editSortPriority="editSortPriority" /> @@ -3876,6 +3907,28 @@ const deleteChartFieldItem = id => { + + + + + + calParams; private List extColor; + /** + * 字段排序优先级 + */ + List sortPriority; } diff --git a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/SortAxis.java b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/SortAxis.java new file mode 100644 index 0000000000..c81fd0d4be --- /dev/null +++ b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/SortAxis.java @@ -0,0 +1,12 @@ +package io.dataease.extensions.view.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +@Data +public class SortAxis { + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + private String name; +} diff --git a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/util/ChartDataUtil.java b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/util/ChartDataUtil.java index bb4a0d07c8..d0b57e83e7 100644 --- a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/util/ChartDataUtil.java +++ b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/util/ChartDataUtil.java @@ -1,5 +1,7 @@ package io.dataease.extensions.view.util; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.view.dto.*; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -10,13 +12,38 @@ import java.util.*; public class ChartDataUtil { // 对结果排序 - public static List resultCustomSort(List xAxis, List data) { + public static List resultCustomSort(List xAxis,List yAxis, List sortPriority, List data) { List res = new ArrayList<>(data); - if (xAxis.size() > 0) { + var axisList = new ArrayList(); + axisList.addAll(xAxis); + axisList.addAll(yAxis); + var dataIndexMap = new HashMap(axisList.size()); + for (int i = 0; i < axisList.size(); i++) { + dataIndexMap.put(axisList.get(i).getId(), i); + } + if (CollectionUtils.isNotEmpty(sortPriority)) { + var tmp = new ArrayList(); + var ids = new HashSet(); + for (SortAxis sortAxis : sortPriority) { + for (ChartViewFieldDTO axis : axisList) { + if (sortAxis.getId().equals(axis.getId())){ + tmp.add(axis); + ids.add(axis.getId()); + } + } + } + for (ChartViewFieldDTO axis : axisList) { + if (!ids.contains(axis.getId())) { + tmp.add(axis); + } + } + axisList = tmp; + } + if (axisList.size() > 0) { // 找到对应维度 - for (int i = 0; i < xAxis.size(); i++) { - ChartViewFieldDTO item = xAxis.get(i); - if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort")) { + for (int i = 0; i < axisList.size(); i++) { + ChartViewFieldDTO item = axisList.get(i); + if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort") && Objects.equals(item.getGroupType(), "d")) { // 获取自定义值与data对应列的结果 if (i > 0) { // 首先根据优先级高的字段分类,在每个前置字段相同的组里排序 @@ -24,10 +51,10 @@ public class ChartDataUtil { for (String[] d : res) { StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < i; j++) { - if (StringUtils.equalsIgnoreCase(xAxis.get(j).getSort(), "none")) { + if (StringUtils.equalsIgnoreCase(axisList.get(j).getSort(), "none")) { continue; } - stringBuilder.append(d[j]); + stringBuilder.append(d[dataIndexMap.get(axisList.get(j).getId())]); } if (ObjectUtils.isEmpty(map.get(stringBuilder.toString()))) { map.put(stringBuilder.toString(), new ArrayList<>()); @@ -38,12 +65,16 @@ public class ChartDataUtil { 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)); + if (next.getValue().size() == 1) { + list.addAll(next.getValue()); + } else { + list.addAll(customSort(Optional.ofNullable(item.getCustomSort()).orElse(new ArrayList<>()), next.getValue(), dataIndexMap.get(axisList.get(i).getId()))); + } } res.clear(); res.addAll(list); } else { - res = customSort(Optional.ofNullable(item.getCustomSort()).orElse(new ArrayList<>()), res, i); + res = customSort(Optional.ofNullable(item.getCustomSort()).orElse(new ArrayList<>()), res, dataIndexMap.get(axisList.get(i).getId())); } } } @@ -53,37 +84,40 @@ public class ChartDataUtil { public static List customSort(List custom, List data, int index) { List res = new ArrayList<>(); - - List indexArr = new ArrayList<>(); - List joinArr = new ArrayList<>(); + + // 数据行在自定义排序的范围内,记录该数据行的内容以及下标 + List indexInCustomSort = new ArrayList<>(); + List dataInCustomSort = new ArrayList<>(); for (int i = 0; i < custom.size(); i++) { String ele = custom.get(i); for (int j = 0; j < data.size(); j++) { String[] d = data.get(j); if (StringUtils.equalsIgnoreCase(ele, d[index])) { - joinArr.add(d); - indexArr.add(j); + dataInCustomSort.add(d); + indexInCustomSort.add(j); } } } - // 取得 joinArr 就是两者的交集 - List indexArrData = new ArrayList<>(); + // 记录总数据的下标 + List dataIndexArr = new ArrayList<>(); for (int i = 0; i < data.size(); i++) { - indexArrData.add(i); + dataIndexArr.add(i); } - List indexResult = new ArrayList<>(); - for (int i = 0; i < indexArrData.size(); i++) { - if (!indexArr.contains(indexArrData.get(i))) { - indexResult.add(indexArrData.get(i)); + // 记录不包含自定义排序行的下标 + List indexNotInCustomSort = new ArrayList<>(); + for (int i = 0; i < dataIndexArr.size(); i++) { + if (!indexInCustomSort.contains(dataIndexArr.get(i))) { + indexNotInCustomSort.add(dataIndexArr.get(i)); } } - List subArr = new ArrayList<>(); - for (int i = 0; i < indexResult.size(); i++) { - subArr.add(data.get(indexResult.get(i))); + List dataNotInCustomSort = new ArrayList<>(); + for (int i = 0; i < indexNotInCustomSort.size(); i++) { + dataNotInCustomSort.add(data.get(indexNotInCustomSort.get(i))); } - res.addAll(joinArr); - res.addAll(subArr); + // 自定义排序行放到前面,剩下的放到后面 + res.addAll(dataInCustomSort); + res.addAll(dataNotInCustomSort); return res; }