From 41368f82a70f78c16a2afc736fe6229ef2269285 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Sun, 30 Nov 2025 16:39:24 +0800 Subject: [PATCH] update pay function --- src/components/ChatBot/EChartsRenderer.js | 56 ++++++++++++++++---- src/components/ChatBot/MarkdownWithCharts.js | 18 +++++++ 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/components/ChatBot/EChartsRenderer.js b/src/components/ChatBot/EChartsRenderer.js index 1042a3c2..900b11e3 100644 --- a/src/components/ChatBot/EChartsRenderer.js +++ b/src/components/ChatBot/EChartsRenderer.js @@ -11,24 +11,50 @@ import * as echarts from 'echarts'; const isValidOption = (option) => { if (!option || typeof option !== 'object') return false; - // 检查 xAxis 配置 - if (option.xAxis) { + // 检查 xAxis 配置(柱状图/折线图必须) + if (option.xAxis !== undefined) { const xAxis = Array.isArray(option.xAxis) ? option.xAxis[0] : option.xAxis; - if (xAxis && xAxis.type === 'category' && (!xAxis.data || xAxis.data.length === 0)) { - // category 类型的 xAxis 必须有数据 + // xAxis 必须存在且有效 + if (!xAxis || typeof xAxis !== 'object') { + return false; + } + // category 类型必须有 data + if (xAxis.type === 'category' && (!xAxis.data || !Array.isArray(xAxis.data) || xAxis.data.length === 0)) { return false; } } - // 检查 series 配置 - if (option.series) { - const series = Array.isArray(option.series) ? option.series : [option.series]; - const hasValidSeries = series.some(s => s && s.data && s.data.length > 0); - if (!hasValidSeries) { + // 检查 yAxis 配置 + if (option.yAxis !== undefined) { + const yAxis = Array.isArray(option.yAxis) ? option.yAxis[0] : option.yAxis; + if (!yAxis || typeof yAxis !== 'object') { return false; } } + // 检查 series 配置(必须有且有效) + if (!option.series) { + return false; + } + + const series = Array.isArray(option.series) ? option.series : [option.series]; + if (series.length === 0) { + return false; + } + + // 至少有一个 series 有有效数据 + const hasValidSeries = series.some(s => { + if (!s || typeof s !== 'object') return false; + // 检查 data 是否存在且为数组 + if (!s.data || !Array.isArray(s.data)) return false; + // 检查 data 是否有内容 + return s.data.length > 0; + }); + + if (!hasValidSeries) { + return false; + } + return true; }; @@ -88,8 +114,16 @@ export const EChartsRenderer = ({ option, height = 400, variant = 'auto' }) => { ...darkModeTextStyle, }; - // 设置图表配置 - chartInstance.current.setOption(defaultOption, true); + // 设置图表配置(使用 try-catch 防止 ECharts 内部错误) + try { + chartInstance.current.setOption(defaultOption, true); + } catch (error) { + console.error('EChartsRenderer: Failed to render chart', error); + // 销毁出错的图表实例 + chartInstance.current?.dispose(); + chartInstance.current = null; + return; + } // 响应式调整大小 const handleResize = () => { diff --git a/src/components/ChatBot/MarkdownWithCharts.js b/src/components/ChatBot/MarkdownWithCharts.js index 11b93a68..0f9dc0dd 100644 --- a/src/components/ChatBot/MarkdownWithCharts.js +++ b/src/components/ChatBot/MarkdownWithCharts.js @@ -216,6 +216,24 @@ export const MarkdownWithCharts = ({ content, variant = 'auto' }) => { throw new Error('Invalid chart configuration: not an object'); } + // 验证 series 是否存在且有效 + if (!chartOption.series) { + throw new Error('Invalid chart configuration: missing series'); + } + const series = Array.isArray(chartOption.series) ? chartOption.series : [chartOption.series]; + const hasValidSeries = series.some(s => s && s.data && Array.isArray(s.data) && s.data.length > 0); + if (!hasValidSeries) { + throw new Error('Invalid chart configuration: series has no valid data'); + } + + // 验证 xAxis(如果存在) + if (chartOption.xAxis) { + const xAxis = Array.isArray(chartOption.xAxis) ? chartOption.xAxis[0] : chartOption.xAxis; + if (xAxis && xAxis.type === 'category' && (!xAxis.data || !Array.isArray(xAxis.data) || xAxis.data.length === 0)) { + throw new Error('Invalid chart configuration: xAxis category type requires data'); + } + } + return (