update pay function

This commit is contained in:
2025-11-30 16:39:24 +08:00
parent 608ac4a962
commit 41368f82a7
2 changed files with 63 additions and 11 deletions

View File

@@ -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,
};
// 设置图表配置
// 设置图表配置(使用 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 = () => {

View File

@@ -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 (
<Box key={index}>
<EChartsRenderer option={chartOption} height={350} variant={variant} />