feat(markdown-ai): 添加可视化图表生成功能

- 新增 charts 分析类型,支持从文档中提取数据并生成可视化图表
- 集成 visualization_service 服务进行数据分析和图表生成
- 扩展 MarkdownAIService 支持 JSON 解析和图表数据处理
- 添加 _parse_chart_json 方法处理 LLM 返回的 JSON 数据
- 更新 API 接口定义支持 chart_data 返回字段
- 在前端界面添加图表分析选项和对应图标显示
- 修复 ExcelStorageService 中 id 列名为 MySQL 保留字的问题
This commit is contained in:
2026-04-02 13:28:39 +08:00
parent 7c19e49988
commit 41e5eaaa2d
4 changed files with 152 additions and 8 deletions

View File

@@ -182,6 +182,29 @@ export interface AIMarkdownAnalyzeResult {
};
sections?: MarkdownSection[];
analysis?: string;
chart_data?: {
tables?: Array<{
description?: string;
columns?: string[];
rows?: string[][];
visualization?: {
statistics?: any;
charts?: any;
distributions?: any;
};
}>;
key_statistics?: Array<{
name?: string;
value?: string;
trend?: string;
description?: string;
}>;
chart_suggestions?: Array<{
chart_type?: string;
title?: string;
data_source?: string;
}>;
};
error?: string;
}
@@ -201,7 +224,7 @@ export interface MarkdownOutlineResult {
error?: string;
}
export type MarkdownAnalysisType = 'summary' | 'outline' | 'key_points' | 'questions' | 'tags' | 'qa' | 'statistics' | 'section';
export type MarkdownAnalysisType = 'summary' | 'outline' | 'key_points' | 'questions' | 'tags' | 'qa' | 'statistics' | 'section' | 'charts';
export interface AIExcelAnalyzeResult {
success: boolean;

View File

@@ -84,7 +84,7 @@ const Documents: React.FC = () => {
// Markdown AI 分析相关状态
const [mdAnalysis, setMdAnalysis] = useState<AIMarkdownAnalyzeResult | null>(null);
const [mdAnalysisType, setMdAnalysisType] = useState<'summary' | 'outline' | 'key_points' | 'questions' | 'tags' | 'qa' | 'statistics' | 'section'>('summary');
const [mdAnalysisType, setMdAnalysisType] = useState<'summary' | 'outline' | 'key_points' | 'questions' | 'tags' | 'qa' | 'statistics' | 'section' | 'charts'>('summary');
const [mdUserPrompt, setMdUserPrompt] = useState('');
const [mdSections, setMdSections] = useState<MarkdownSection[]>([]);
const [mdSelectedSection, setMdSelectedSection] = useState<string>('');
@@ -517,6 +517,7 @@ const Documents: React.FC = () => {
case 'questions': return <MessageSquareCode size={20} />;
case 'tags': return <Tag size={20} />;
case 'qa': return <HelpCircle size={20} />;
case 'charts': return <TrendingUp size={20} />;
default: return <Sparkles size={20} />;
}
};
@@ -762,7 +763,8 @@ const Documents: React.FC = () => {
{ value: 'section', label: '章节分析', desc: '分章节详细分析' },
{ value: 'questions', label: '生成问题', desc: '生成理解性问题' },
{ value: 'tags', label: '生成标签', desc: '提取主题标签' },
{ value: 'qa', label: '问答对', desc: '生成问答内容' }
{ value: 'qa', label: '问答对', desc: '生成问答内容' },
{ value: 'charts', label: '数据图表', desc: '生成可视化数据' }
].map(type => (
<SelectItem key={type.value} value={type.value}>
<div className="flex items-center gap-2">