Files
ppt/ppt_manager_v2/README.md

384 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📊 PPT智能管理系统 V2.0 说明书
基于 **锚点定位** + **原生图表更新** + **插件化架构** + **WebSocket实时日志** 的下一代PPT自动化平台。
---
## 🚀 快速开始
### 1. 环境准备
```bash
cd f:\ppt\ppt_manager_v2
pip install -r requirements_v2.txt
```
### 2. 启动WebSocket服务
```bash
python web_socket_app.py
```
### 3. 浏览器访问
打开 **http://localhost:5001**
---
## 📁 项目目录结构
```
ppt_manager_v2/
├── 📄 web_socket_app.py # WebSocket服务端
├── 📄 orchestrator.py # 主编排引擎Pipeline
├── 📄 requirements_v2.txt # Python依赖包
├── 📄 README.md # 本文件
├──
├── 📂 core/ # 核心层
│ ├── anchor_engine.py # ✅ 锚点定位引擎
│ ├── native_chart.py # ✅ 原生图表数据源更新
│ └── conditional_renderer.py # ✅ 条件渲染引擎(动态增删页)
├──
├── 📂 plugins/ # 插件化架构
│ ├── base_generator.py # BaseGenerator 标准接口
│ └── generators/ # 插件目录(自动扫描注册)
│ ├── gdp_generator.py # GDP趋势图生成插件
│ └── cpi_generator.py # CPI/PPI图表生成插件
├──
├── 📂 ai/ # AI智能化
│ └── llm_analyst.py # LLM分析师 + Diff对比器
├──
├── 📂 connectors/ # 多数据源适配
│ └── sql_connector.py # MySQL/ClickHouse/REST API/CSV
├──
├── 📂 config/
│ └── project_config_v2.yaml # V2版配置文件范式
├──
├── 📂 templates/ # Flask模板目录
│ └── index_v2.html # WebSocket前端页面
├──
├── 📂 logs/ # 日志目录
└── 📂 web/ # 备用template_dir配置用
└── templates/
└── index_v2.html
```
> **输出目录**: `f:\ppt\output\` 所有生成的PPT文件在这里
---
## 🎯 五大核心增强能力
### 一、PPT核心操作层从"拼图"到"原生替换"
#### 1.1 锚点(Anchor)定位引擎 → 无惧页码变动
**痛点解决**: 旧版YAML写 `page: 5`老板在第3页插一页所有配置页码全乱。
**新版方案**:
1. 打开你的PPT模板 → 选中一个 **Shape/图表/文本框**
2. 在PowerPoint的 **"选择窗格"** 里给Shape改名例如`chart_gdp_trend`
3. 在YAML里直接配置 **锚点名**,不是页码:
```yaml
anchors:
- name: chart_gdp_trend # Shape Name选择窗格里的名称
type: native_chart_update
plugin: gdp_chart
```
**代码参考**: [core/anchor_engine.py](file:///f:/ppt/ppt_manager_v2/core/anchor_engine.py#L21-L60)
---
#### 1.2 原生图表数据源直接更新不是插PNG
**痛点解决**: 旧版先生成PNG再插入PPT → 图片无法编辑、丢失主题配色和动画效果、文件体积大。
**新版方案**: 用 `python-pptx` 直接替换PPT内嵌图表的Excel数据源
```python
# 在native_chart.py里的实现
chart_data = CategoryChartData()
chart_data.categories = ['2026Q1', '2026Q2', '2026Q3']
chart_data.add_series('GDP同比增长', [5.2, 5.0, 5.1])
chart.replace_data(chart_data) # ✅ 原生数据源替换!
```
**这样做的好处**:
- ✅ 生成的PPT里**双击图表可以进入Excel编辑**
- ✅ 自动继承PPT母版的**主题配色**
- ✅ 保留图表原有的**进入/强调动画**效果
- ✅ 文本清晰,不是模糊的点阵图
**代码参考**: [core/native_chart.py](file:///f:/ppt/ppt_manager_v2/core/native_chart.py#L12-L90)
---
#### 1.3 条件渲染与动态增删页
**能力描述**: 支持规则判断动态插入/隐藏页面:
```yaml
slide_conditions:
- condition: unemployment_rate > 5.1
action: insert_slide
template: "risk_warning_template.pptx"
position: 5
```
表达式求值:`unemployment_rate > 5.1 AND gdp_growth < 5.0` 等复合条件。
**代码参考**: [core/conditional_renderer.py](file:///f:/ppt/ppt_manager_v2/core/conditional_renderer.py#L1-L100)
---
### 二、插件化数据流架构(真正的即插即用)
#### 2.1 BaseGenerator 标准接口
所有插件继承 `BaseGenerator` 抽象基类,实现两个方法:
```python
# plugins/base_generator.py 定义
class BaseGenerator(ABC):
generator_id = "gdp_chart"
generator_name = "GDP趋势生成器"
@abstractmethod
def fetch_data(self, params): # 步骤A取数
pass
@abstractmethod
def render(self): # 步骤B渲染返回原生图表数据
pass
```
插件例子 → [plugins/generators/gdp_generator.py](file:///f:/ppt/ppt_manager_v2/plugins/generators/gdp_generator.py)
---
#### 2.2 插件自动扫描注册
启动时系统自动扫描 `plugins/generators/` 目录下所有 `.py` 文件,发现继承 BaseGenerator 且有 `generator_id` 的类自动注册到插件管理器,**无需修改任何注册代码**,真正即插即用。
```
# 启动日志里可以看到:
SUCCESS | 加载插件 [cpi_chart]: CPI/PPI通胀图表生成器
SUCCESS | 加载插件 [gdp_chart]: GDP趋势图表生成器
INFO | 插件扫描完成,共加载 2 个生成器
```
**代码参考**: [plugins/base_generator.py - GeneratorPluginManager.discover_plugins()](file:///f:/ppt/ppt_manager_v2/plugins/base_generator.py#L46-L89)
---
#### 2.3 参数化生成
Web端不是单一"开始生成"按钮,而是传参给后端插件:
```javascript
// 前端传params给WebSocket
socket.emit('start_generation', {
params: {
year: 2026,
quarter: "Q2",
theme: "保守型"
}
});
```
插件的 `fetch_data(params)` 拿到这些参数去数据库/API拉对应区间的数据。
---
### 三、WebSocket Web交互体验实时日志推流
#### 3.1 启动服务
```bash
python web_socket_app.py
```
控制台输出:
```
=================================================================
🚀 PPT智能管理系统 V2.0 - WebSocket实时日志版
请在浏览器打开: http://localhost:5001
=================================================================
```
#### 3.2 前端页面三大区域
| 区域 | 功能 |
|------|------|
| **左上角参数表单** | Year/Quarter 参数化输入 |
| **左下角实时面板** | 动态进度条 0-100% + Loguru日志逐行推送 |
| **右侧边栏** | 已加载插件清单 + 历史生成文件下载列表 |
**WebSocket后端代码**: [web_socket_app.py](file:///f:/ppt/ppt_manager_v2/web_socket_app.py#L1-L95)
---
### 四、主编排引擎 Pipeline
Orchestrator 是串联所有模块的大脑:
```python
# orchestrator.py - run_full_pipeline()
def run_full_pipeline(self):
self.load_template() # 1. 打开PPT扫描所有锚点
self.run_plugins(params) # 2. 并行执行所有插件 fetch_data + render
self.update_native_charts() # 3. 原生图表数据源逐个更新
self.ai_generate_summary() # 4. LLM生成200字洞察文本
self.process_conditions() # 5. 条件表达式求值动态增删页
return self.save() # 6. 保存最终PPT
```
**Pipeline代码位置**: [orchestrator.py - 第244-251行](file:///f:/ppt/ppt_manager_v2/orchestrator.py#L244-L251)
---
### 五、AI 智能化LLM + Diff对比
#### 5.1 LLM 自动生成"分析结论"
图表只能展示"是什么"LLM帮你解释"为什么"
```python
# ai/llm_analyst.py
prompt = "基于以下数据:{gdp}{cpi}200字专业分析师口吻总结本月市场"
llm.generate_analysis({
'gdp_growth': 5.1,
'cpi': 0.9,
'unemployment': 5.2
})
# 返回示例:
"""
本月宏观经济洞察GDP增长5.1%动能平稳。CPI同比0.9%
通胀水平温和为货币政策留出空间。就业失业率5.2%
青年失业率需重点关注...
"""
```
支持 **Mock模式** / **OpenAI** / **通义千问** 三种provider切换。
**代码参考**: [ai/llm_analyst.py](file:///f:/ppt/ppt_manager_v2/ai/llm_analyst.py#L1-L90)
---
## 📄 YAML V2版 配置范式参考
```yaml
project_name: "宏观经济月度分析报告"
version: "2.0"
template: "macro_analysis_template.pptx"
params: # 参数化生成默认值
default_year: 2026
default_quarter: "Q2"
anchors: # 锚点绑定关系
- name: chart_gdp
type: native_chart_update
plugin: gdp_chart
chart_type: line
fallback: gdp_fallback.png
- name: chart_cpi
type: native_chart_update
plugin: cpi_chart
slide_conditions: # 条件渲染规则
- condition: unemployment_rate > 5.1
action: insert_slide
position: 5
connectors: # 多数据源配置
mysql_stats: {type: mysql, database: macro_stats}
ai: # LLM配置
provider: mock # mock/openai/tongyi
model: qwen-turbo
scheduler: # 定时调度
cron: "0 8 1 * *" # 每月1号早上8点
```
配置文件位置: [config/project_config_v2.yaml](file:///f:/ppt/ppt_manager_v2/config/project_config_v2.yaml)
---
## 🔧 命令行非交互模式测试
直接跑整个Pipeline验证所有环节
```bash
cd f:\ppt\ppt_manager_v2
python -c "
import sys
sys.path.insert(0, '.')
from orchestrator import Orchestrator
orch = Orchestrator()
orch.load_template() # 检查: 锚点扫描
result = orch.run_plugins() # 检查: 插件取数+渲染
print('插件结果:', list(result.keys()))
orch.update_native_charts() # 检查: 原生图表更新
orch.ai_generate_summary() # 检查: LLM生成
orch.save() # 检查: 输出文件
print('✅ 全流程通过!')
"
```
---
## ❓ 常见问题排查
### Q1: TemplateNotFound jinja2 错误
**现象**: `jinja2.exceptions.TemplateNotFound: index_v2.html`
**已修复**: web_socket_app.py第16行明确了 template_folder 绝对路径,且文件在两处备份:
- `f:\ppt\ppt_manager_v2\templates\index_v2.html` Flask标准位置
- `f:\ppt\ppt_manager_v2\web\templates\index_v2.html` (配置位置)
---
### Q2: 下载文件找不到 /api/files 返回空
**已修复**: `/api/files``/download/<filename>` 两处的 `base_dir / "output"` 统一改为 `base_dir.parent / "output"` 指向 `f:\ppt\output\`
---
### Q3: 'NoneType' object has no attribute 'text'
**现象**: 加载模板时报错
**已修复**: [orchestrator.py](file:///f:/ppt/ppt_manager_v2/orchestrator.py#L75-L90) 先判断 `if slide.shapes.title:` 再安全访问 `.text`
---
### Q4: 插件不显示/不执行
检查两点:
1. 插件类继承 `BaseGenerator(ABC)`
2. 类属性 `generator_id` 不能是 `None`
3. 目录在 `plugins/generators/*.py` 且文件名不以 `_` 开头
---
## 📌 维护信息
| 项目 | 详情 |
|------|------|
| **版本** | V2.0 2026-05-29 |
| **入口** | `python web_socket_app.py` |
| **前端地址** | http://localhost:5001 |
| **输出目录** | `f:\ppt\output\*.pptx` |
| **日志目录** | `f:\ppt\ppt_manager_v2\logs\` |
| **核心模块** | orchestrator.py / anchor_engine.py / native_chart.py |
| **插件目录** | plugins/generators/ |