From 7f609ccbc325abba1194674cec2ca707d3c4efd7 Mon Sep 17 00:00:00 2001 From: jianneng-fit2cloud Date: Mon, 3 Mar 2025 17:48:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=A5=BC=E5=9B=BE=E4=BD=BF=E7=94=A8=E5=AD=98=E5=9C=A8=E8=B4=9F?= =?UTF-8?q?=E6=95=B0=E6=95=B0=E6=8D=AE=E6=97=B6=E6=98=BE=E7=A4=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/charts/impl/pie/PieHandler.java | 78 ++++++++++++++++++- core/core-frontend/src/locales/en.ts | 3 +- core/core-frontend/src/locales/tw.ts | 3 +- core/core-frontend/src/locales/zh-CN.ts | 3 +- .../js/panel/charts/liquid/liquid.ts | 2 +- .../js/panel/charts/others/gauge.ts | 2 +- .../components/js/panel/charts/pie/pie.ts | 5 +- .../components/js/panel/charts/pie/rose.ts | 1 + .../components/js/panel/common/common_antv.ts | 13 ++-- .../components/js/panel/types/impl/g2plot.ts | 4 +- .../views/components/ChartComponentG2Plot.vue | 3 + 11 files changed, 101 insertions(+), 16 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/pie/PieHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/pie/PieHandler.java index c859f4c8fd..939f2529e7 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/pie/PieHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/pie/PieHandler.java @@ -1,11 +1,14 @@ package io.dataease.chart.charts.impl.pie; import io.dataease.chart.charts.impl.YoyChartHandler; -import io.dataease.extensions.view.dto.AxisFormatResult; -import io.dataease.extensions.view.dto.ChartAxis; -import io.dataease.extensions.view.dto.ChartViewDTO; +import io.dataease.extensions.view.dto.*; import org.springframework.stereotype.Component; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Component public class PieHandler extends YoyChartHandler { @Override @@ -26,4 +29,73 @@ public class PieHandler extends YoyChartHandler { result.getAxisMap().put(ChartAxis.extTooltip, view.getExtTooltip()); return result; } + + @Override + public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) { + ChartViewDTO result = super.buildChart(view, calcResult, formatResult, filterResult); + filterPositiveData(result, "data", AxisChartDataAntVDTO.class); + filterPositiveData(result, "tableRow", Map.class, view.getYAxis().get(0).getDataeaseName()); + return result; + } + + /** + * 过滤正数数据根据data + * @param result + * @param key + * @param clazz + * @param + */ + private void filterPositiveData(ChartViewDTO result, String key, Class clazz) { + if (result.getData().containsKey(key)) { + List list = ((List) result.getData().get(key)) + .stream() + .filter(item -> { + if (clazz == AxisChartDataAntVDTO.class) { + return ((AxisChartDataAntVDTO) item).getValue().compareTo(BigDecimal.ZERO) >= 0; + } else if (clazz == Map.class) { + return isPositive(((Map) item).get("value")); + } + return false; + }) + .collect(Collectors.toList()); + result.getData().put(key, list); + } + } + + /** + * 过滤正数数据根据tableRow + * @param result + * @param key + * @param clazz + * @param yAxisName + * @param + */ + private void filterPositiveData(ChartViewDTO result, String key, Class clazz, String yAxisName) { + if (result.getData().containsKey(key)) { + List list = ((List) result.getData().get(key)) + .stream() + .filter(item -> { + if (clazz == Map.class) { + Object value = ((Map) item).get(yAxisName); + return isPositive(value); + } + return false; + }) + .collect(Collectors.toList()); + result.getData().put(key, list); + } + } + + private boolean isPositive(Object value) { + if (value instanceof String) { + try { + return new BigDecimal((String) value).compareTo(BigDecimal.ZERO) >= 0; + } catch (NumberFormatException e) { + return false; + } + } else if (value instanceof BigDecimal) { + return ((BigDecimal) value).compareTo(BigDecimal.ZERO) >= 0; + } + return false; + } } diff --git a/core/core-frontend/src/locales/en.ts b/core/core-frontend/src/locales/en.ts index 4a425ebfa4..90f1219ad3 100644 --- a/core/core-frontend/src/locales/en.ts +++ b/core/core-frontend/src/locales/en.ts @@ -2038,7 +2038,8 @@ export default { 'Table can not be exported cause the number of columns exceeds the maximum limit!', expand_all: 'Expand all', level_label: 'Level {num}', - default_expand_level: 'Default expand level' + default_expand_level: 'Default expand level', + no_data_or_not_positive: 'No data available, or all data are not positive, unable to plot' }, dataset: { field_value: 'Field Value', diff --git a/core/core-frontend/src/locales/tw.ts b/core/core-frontend/src/locales/tw.ts index 00c745a99d..ad90e9123d 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -1982,7 +1982,8 @@ export default { pivot_export_invalid_col_exceed: '表格列數超過最大限制不可導出!', expand_all: '全展開', level_label: '第{num}層級', - default_expand_level: '默認展開層級' + default_expand_level: '默認展開層級', + no_data_or_not_positive: '暫無數據,或數據均不是正數,無法繪製' }, dataset: { field_value: '欄位值', diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index fda1321b5f..07718db883 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -1988,7 +1988,8 @@ export default { pivot_export_invalid_col_exceed: '表格列数超过最大限制不可导出!', expand_all: '全展开', level_label: '第{num}层级', - default_expand_level: '默认展开层级' + default_expand_level: '默认展开层级', + no_data_or_not_positive: '暂无数据,或数据均不是正数,无法绘制' }, dataset: { field_value: '字段值', diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/liquid/liquid.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/liquid/liquid.ts index 52e87c3199..9a22ed318b 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/liquid/liquid.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/liquid/liquid.ts @@ -74,7 +74,7 @@ export class Liquid extends G2PlotChartView { }) // 处理空数据, 只要有一个指标是空数据,就不显示图表 const hasNoneData = chart.data?.series.some(s => !s.data?.[0]) - this.configEmptyDataStyle(newChart, hasNoneData ? [] : [1], container) + this.configEmptyDataStyle(hasNoneData ? [] : [1], container, newChart) if (hasNoneData) { return } diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts index e6928d529e..dbefaf6240 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts @@ -110,7 +110,7 @@ export class Gauge extends G2PlotChartView { }) }) const hasNoneData = chart.data?.series.some(s => !s.data?.[0]) - this.configEmptyDataStyle(newChart, hasNoneData ? [] : [1], container) + this.configEmptyDataStyle(hasNoneData ? [] : [1], container, newChart) if (hasNoneData) { return } diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/pie/pie.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/pie/pie.ts index 9947863e98..f506139e56 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/pie/pie.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/pie/pie.ts @@ -27,7 +27,9 @@ import type { Datum } from '@antv/g2plot/esm/types/common' import { add } from 'mathjs' import isEmpty from 'lodash-es/isEmpty' import { cloneDeep } from 'lodash-es' - +import { Chart } from '@antv/g2' +import { useI18n } from '@/hooks/web/useI18n' +const { t } = useI18n() const DEFAULT_DATA = [] export class Pie extends G2PlotChartView { axis: AxisType[] = PIE_AXIS_TYPE @@ -40,6 +42,7 @@ export class Pie extends G2PlotChartView { async drawChart(drawOptions: G2PlotDrawOptions): Promise { const { chart, container, action } = drawOptions + this.configEmptyDataStyle(chart.data?.data, container, null, t('chart.no_data_or_not_positive')) if (!chart.data?.data?.length) { return } diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/pie/rose.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/pie/rose.ts index 424c793a83..c59e45aae7 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/pie/rose.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/pie/rose.ts @@ -40,6 +40,7 @@ export class Rose extends G2PlotChartView { async drawChart(drawOptions: G2PlotDrawOptions): Promise { const { chart, container, action } = drawOptions + this.configEmptyDataStyle(chart.data?.data, container, null, t('chart.no_data_or_not_positive')) if (!chart?.data?.data?.length) { return } diff --git a/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts b/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts index 479d7d9024..0ea4b97005 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts @@ -1934,7 +1934,7 @@ export const getTooltipItemConditionColor = item => { * @param newData * @param container */ -export const configEmptyDataStyle = (newChart, newData, container) => { +export const configEmptyDataStyle = (newData, container, newChart?, content?) => { /** * 辅助函数:移除空数据dom */ @@ -1949,16 +1949,19 @@ export const configEmptyDataStyle = (newChart, newData, container) => { if (!newData.length) { const emptyDom = document.createElement('div') emptyDom.id = container + '_empty' - emptyDom.textContent = tI18n('data_set.no_data') + emptyDom.textContent = content || tI18n('data_set.no_data') emptyDom.setAttribute( 'style', `position: absolute; - left: 45%; - top: 50%;` + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + color: darkgray; + textAlign: center;` ) const parent = document.getElementById(container) parent.insertBefore(emptyDom, parent.firstChild) - newChart.destroy() + newChart?.destroy() } } diff --git a/core/core-frontend/src/views/chart/components/js/panel/types/impl/g2plot.ts b/core/core-frontend/src/views/chart/components/js/panel/types/impl/g2plot.ts index 918d135953..8aa142bea3 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/types/impl/g2plot.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/types/impl/g2plot.ts @@ -191,8 +191,8 @@ export abstract class G2PlotChartView< return addConditionsStyleColorToData(chart, data) } - protected configEmptyDataStyle(newChart, newData: any[], container: string) { - configEmptyDataStyle(newChart, newData, container) + protected configEmptyDataStyle(newData, container, newChart?, content?) { + configEmptyDataStyle(newData, container, newChart, content) } /** diff --git a/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue b/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue index 3f67dd951a..c3dd04507a 100644 --- a/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue +++ b/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue @@ -29,6 +29,7 @@ import { useEmitt } from '@/hooks/web/useEmitt' import { L7ChartView } from '@/views/chart/components/js/panel/types/impl/l7' import { useI18n } from '@/hooks/web/useI18n' import { ExportImage } from '@antv/l7' +import { configEmptyDataStyle } from '@/views/chart/components/js/panel/common/common_antv' const { t } = useI18n() const dvMainStore = dvMainStoreWithOut() const { nowPanelTrackInfo, nowPanelJumpInfo, mobileInPc, embeddedCallBack, inMobile } = @@ -283,6 +284,8 @@ const renderG2Plot = async (chart, chartView: G2PlotChartView) => { g2Timer && clearTimeout(g2Timer) g2Timer = setTimeout(async () => { try { + // 在这里清理掉之前图表的空dom + configEmptyDataStyle([1], containerId) myChart?.destroy() myChart = await chartView.drawChart({ chartObj: myChart,