From 8e3e666b2544fca9b9d6ca1e6c962fbf2766a1da Mon Sep 17 00:00:00 2001 From: jianneng-fit2cloud Date: Tue, 14 Apr 2026 16:39:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E7=9A=84=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E6=98=BE=E7=A4=BA=E6=8C=87?= =?UTF-8?q?=E6=A0=87=E5=AD=97=E6=AE=B5=E6=97=B6=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E6=8C=87=E6=A0=87=E5=AD=97=E6=AE=B5=E6=98=AF=E9=9D=9E=E6=95=B0?= =?UTF-8?q?=E5=80=BC=E7=B1=BB=E5=9E=8B=E5=9B=BE=E8=A1=A8=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataease/chart/utils/ChartDataBuild.java | 40 +++++++++++++++---- .../components/TooltipSelector.vue | 21 +++++++--- .../js/panel/charts/others/scatter-multi.ts | 5 ++- .../components/js/panel/common/common_antv.ts | 10 ++++- .../extensions/view/dto/DynamicValueDTO.java | 1 + .../extensions/view/util/ChartDataUtil.java | 22 +++++++--- 6 files changed, 77 insertions(+), 22 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java index 220893c8d8..fe27e3428f 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java +++ b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java @@ -630,9 +630,15 @@ public class ChartDataBuild { DynamicValueDTO valueDTO = new DynamicValueDTO(); ChartViewFieldDTO f = view.getExtLabel().get(ii); int idx = extLabelStart + ii; - BigDecimal value = (idx < row.length && StringUtils.isNotEmpty(row[idx])) ? new BigDecimal(row[idx]) : null; + if (idx < row.length && StringUtils.isNotEmpty(row[idx])) { + try { + valueDTO.setValue(new BigDecimal(row[idx])); + } catch (NumberFormatException e) { + // 时间等非数值类型,保留原始字符串 + valueDTO.setStringValue(row[idx]); + } + } valueDTO.setFieldId(f.getId()); - valueDTO.setValue(value); dynamicLabelValue.add(valueDTO); } } @@ -641,9 +647,15 @@ public class ChartDataBuild { DynamicValueDTO valueDTO = new DynamicValueDTO(); ChartViewFieldDTO f = view.getExtTooltip().get(ii); int idx = extTooltipStart + ii; - BigDecimal value = (idx < row.length && StringUtils.isNotEmpty(row[idx])) ? new BigDecimal(row[idx]) : null; + if (idx < row.length && StringUtils.isNotEmpty(row[idx])) { + try { + valueDTO.setValue(new BigDecimal(row[idx])); + } catch (NumberFormatException e) { + // 时间等非数值类型,保留原始字符串 + valueDTO.setStringValue(row[idx]); + } + } valueDTO.setFieldId(f.getId()); - valueDTO.setValue(value); dynamicTooltipValue.add(valueDTO); } } @@ -1633,9 +1645,15 @@ public class ChartDataBuild { for (int ii = 0; ii < view.getExtLabel().size(); ii++) { DynamicValueDTO valueDTO = new DynamicValueDTO(); ChartViewFieldDTO chartViewFieldDTO = view.getExtLabel().get(ii); - BigDecimal value = StringUtils.isEmpty(row[ii + (size - extSize)]) ? null : new BigDecimal(row[ii + (size - extSize)]); + String raw = row[ii + (size - extSize)]; + if (StringUtils.isNotEmpty(raw)) { + try { + valueDTO.setValue(new BigDecimal(raw)); + } catch (NumberFormatException e) { + valueDTO.setStringValue(raw); + } + } valueDTO.setFieldId(chartViewFieldDTO.getId()); - valueDTO.setValue(value); dynamicLabelValue.add(valueDTO); } } @@ -1643,9 +1661,15 @@ public class ChartDataBuild { for (int ii = 0; ii < view.getExtTooltip().size(); ii++) { DynamicValueDTO valueDTO = new DynamicValueDTO(); ChartViewFieldDTO chartViewFieldDTO = view.getExtTooltip().get(ii); - BigDecimal value = StringUtils.isEmpty(row[ii + (size - extSize) + view.getExtLabel().size()]) ? null : new BigDecimal(row[ii + (size - extSize) + view.getExtLabel().size()]); + String raw = row[ii + (size - extSize) + view.getExtLabel().size()]; + if (StringUtils.isNotEmpty(raw)) { + try { + valueDTO.setValue(new BigDecimal(raw)); + } catch (NumberFormatException e) { + valueDTO.setStringValue(raw); + } + } valueDTO.setFieldId(chartViewFieldDTO.getId()); - valueDTO.setValue(value); dynamicTooltipValue.add(valueDTO); } } diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue index fc9acfddbd..692e0f7f92 100644 --- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue +++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue @@ -205,6 +205,11 @@ const COUNT_AGGREGATION_TYPE = [ ] const COUNT_DE_TYPE = [0, 1, 5] +// 当前选中的指标是否为非数值类型,非数值类型禁用数值格式配置 +const isNonNumericFormatter = computed(() => { + return COUNT_DE_TYPE.includes(curSeriesFormatter.value?.deType) +}) + const aggregationList = computed(() => { if (COUNT_DE_TYPE.includes(curSeriesFormatter.value?.deType)) { return COUNT_AGGREGATION_TYPE @@ -851,7 +856,7 @@ onMounted(() => { > { > { > { > { :class="'form-item-' + themes" > { { datum.dynamicTooltipValue?.forEach(item => { const formatter = formatterMap[item.fieldId] if (formatter) { - const value = valueFormatter(parseFloat(item.value), formatter.formatterCfg) + const value = + item.value != null + ? valueFormatter(parseFloat(item.value), formatter.formatterCfg) + : item.stringValue ?? '' const name = isEmpty(formatter.chartShowName) ? formatter.name : formatter.chartShowName result.push({ color: 'grey', name, value, marker: true }) } 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 cd3ce553f7..1e48ab9241 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 @@ -307,7 +307,10 @@ export function getMultiSeriesTooltip(chart: Chart) { head.data.dynamicTooltipValue?.forEach(item => { const formatter = formatterMap[item.fieldId] if (formatter) { - const value = valueFormatter(parseFloat(item.value), formatter.formatterCfg) + const value = + item.value != null + ? valueFormatter(parseFloat(item.value), formatter.formatterCfg) + : item.stringValue ?? '' const name = isEmpty(formatter.chartShowName) ? formatter.name : formatter.chartShowName result.push({ color: 'grey', name, value }) } @@ -1028,7 +1031,10 @@ export function configL7Tooltip(chart: Chart): TooltipOptions { head.dynamicTooltipValue?.forEach(item => { const formatter = formatterMap[item.fieldId] if (formatter) { - const value = valueFormatter(parseFloat(item.value), formatter.formatterCfg) + const value = + item.value != null + ? valueFormatter(parseFloat(item.value), formatter.formatterCfg) + : item.stringValue ?? '' const name = isEmpty(formatter.chartShowName) ? formatter.name : formatter.chartShowName result.push({ color: 'grey', name, value: `${value ?? ''}` }) } diff --git a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/DynamicValueDTO.java b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/DynamicValueDTO.java index 8ea0de280d..5dc4de55fb 100644 --- a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/DynamicValueDTO.java +++ b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/DynamicValueDTO.java @@ -14,4 +14,5 @@ public class DynamicValueDTO { @JsonSerialize(using = ToStringSerializer.class) private Long fieldId; private BigDecimal value; + private String stringValue; } 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 d0b57e83e7..b8db580a59 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 @@ -84,7 +84,7 @@ public class ChartDataUtil { public static List customSort(List custom, List data, int index) { List res = new ArrayList<>(); - + // 数据行在自定义排序的范围内,记录该数据行的内容以及下标 List indexInCustomSort = new ArrayList<>(); List dataInCustomSort = new ArrayList<>(); @@ -271,9 +271,15 @@ public class ChartDataUtil { for (int ii = 0; ii < view.getExtLabel().size(); ii++) { DynamicValueDTO valueDTO = new DynamicValueDTO(); ChartViewFieldDTO chartViewFieldDTO = view.getExtLabel().get(ii); - BigDecimal value = StringUtils.isEmpty(row[ii + (size - extSize)]) ? null : new BigDecimal(row[ii + (size - extSize)]); + String raw = row[ii + (size - extSize)]; + if (StringUtils.isNotEmpty(raw)) { + try { + valueDTO.setValue(new BigDecimal(raw)); + } catch (NumberFormatException e) { + valueDTO.setStringValue(raw); + } + } valueDTO.setFieldId(chartViewFieldDTO.getId()); - valueDTO.setValue(value); dynamicLabelValue.add(valueDTO); } } @@ -281,9 +287,15 @@ public class ChartDataUtil { for (int ii = 0; ii < view.getExtTooltip().size(); ii++) { DynamicValueDTO valueDTO = new DynamicValueDTO(); ChartViewFieldDTO chartViewFieldDTO = view.getExtTooltip().get(ii); - BigDecimal value = StringUtils.isEmpty(row[ii + (size - extSize) + view.getExtLabel().size()]) ? null : new BigDecimal(row[ii + (size - extSize) + view.getExtLabel().size()]); + String raw = row[ii + (size - extSize) + view.getExtLabel().size()]; + if (StringUtils.isNotEmpty(raw)) { + try { + valueDTO.setValue(new BigDecimal(raw)); + } catch (NumberFormatException e) { + valueDTO.setStringValue(raw); + } + } valueDTO.setFieldId(chartViewFieldDTO.getId()); - valueDTO.setValue(value); dynamicTooltipValue.add(valueDTO); } }