baodan/docs/PPT与海报功能开发任务清单.md

339 lines
19 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 与海报功能 — 开发任务清单
> 来源:[PPT与海报功能完整解决方案.md](PPT与海报功能完整解决方案.md)
> 完成一项勾一项。格式:`- [ ]` → `- [x]`
> 核心约束:不修改当前可正常运行的功能,所有改动纯增量。
---
## Phase P1数据库 + 模型层(约 1 天)
### P1.1 迁移脚本 migrate_015 — 扩展现有表
- [x] **P1.1.1** 扩展 `insurance_ppt_companies` — 新增 3 字段
- [x] ALTER TABLE ADD COLUMN `logo_url VARCHAR(500)`
- [x] ALTER TABLE ADD COLUMN `status SMALLINT DEFAULT 1`
- [x] ALTER TABLE ADD COLUMN `sort_order INTEGER DEFAULT 0`
- [x] UPDATE 现有数据 `status = 1`(默认启用)
- [ ] 验证:现有 PPT 生成流程不受影响
- [x] **P1.1.2** 扩展 `insurance_ppt_products` — 新增 16 字段
- [x] ALTER TABLE ADD COLUMN `product_code VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `product_type VARCHAR(20)`
- [x] ALTER TABLE ADD COLUMN `coverage_period VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `payment_period VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `insured_age_range VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `waiting_period VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `highlights TEXT`
- [x] ALTER TABLE ADD COLUMN `extra_fields TEXT`
- [x] ALTER TABLE ADD COLUMN `status SMALLINT DEFAULT 1`
- [x] ALTER TABLE ADD COLUMN `sort_order INTEGER DEFAULT 0`
- [x] ALTER TABLE ADD COLUMN `updated_at TIMESTAMP`
- [x] ALTER TABLE ADD COLUMN `manual_file_url VARCHAR(500)`
- [x] ALTER TABLE ADD COLUMN `manual_parse_status VARCHAR(20) DEFAULT 'none'`
- [x] ALTER TABLE ADD COLUMN `manual_parsed_rules TEXT`
- [x] ALTER TABLE ADD COLUMN `manual_reviewed_by VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `manual_reviewed_at TIMESTAMP`
- [ ] 验证:现有 PPT 产品列表接口不受影响
- [x] **P1.1.3** 扩展 `insurance_ppt_templates` — 新增 6 字段
- [x] ALTER TABLE ADD COLUMN `name VARCHAR(100)`
- [x] ALTER TABLE ADD COLUMN `scenario_tag VARCHAR(50)`
- [x] ALTER TABLE ADD COLUMN `preview_image VARCHAR(500)`
- [x] ALTER TABLE ADD COLUMN `applicable_company_ids TEXT`
- [x] ALTER TABLE ADD COLUMN `applicable_product_ids TEXT`
- [x] ALTER TABLE ADD COLUMN `status SMALLINT DEFAULT 1`
- [ ] 验证:现有 PPT 模板列表接口不受影响
### P1.2 迁移脚本 migrate_015 — 创建新表
- [x] **P1.2.1** 创建 `insurance_ppt_history` 表 + 索引
- [x] **P1.2.2** 创建 `poster_case_uploads`
- [x] **P1.2.3** 创建 `poster_templates`AI 生图方案,含 style_description/color_scheme/reference_image
- [x] **P1.2.4** 创建 `poster_copy_templates`
- [x] **P1.2.5** 创建 `poster_records` 表 + 索引
- [x] **P1.2.6** 创建 `system_settings`
- [x] **P1.2.7** 插入种子数据ppt_history_retention_days / poster_history_retention_days 默认 365 天)
### P1.3 SQLAlchemy 模型
- [x] **P1.3.1** 更新 `models/ppt_config.py` — PptCompany 模型新增 logo_url/status/sort_order 字段 + to_dict 更新
- [x] **P1.3.2** 更新 `models/ppt_config.py` — PptProduct 模型新增 16 字段 + to_dict 更新
- [x] **P1.3.3** 更新 `models/ppt_config.py` — PptTemplate 模型新增 6 字段 + to_dict 更新
- [x] **P1.3.4** 新建 `models/ppt_history.py` — PptHistory 模型
- [x] **P1.3.5** 新建 `models/poster_case_upload.py` — PosterCaseUpload 模型
- [x] **P1.3.6** 新建 `models/poster_template_model.py` — PosterTemplate 模型(海报模板)
- [x] **P1.3.7** 新建 `models/poster_copy_template.py` — PosterCopyTemplate 模型
- [x] **P1.3.8** 新建 `models/poster_record.py` — PosterRecord 模型
- [x] **P1.3.9** 新建 `models/system_setting.py` — SystemSetting 模型
- [x] **P1.3.10** 更新 `models/__init__.py` — 注册所有新模型
- [x] **P1.3.11** 验证:`python -c "from insurance.models import *"` 无报错
### P1.4 路由注册
- [x] **P1.4.1** 更新 `api/insurance/routes.py` — 追加 `ppt_admin_bp` Blueprint 注册
- [x] **P1.4.2** 更新 `api/insurance/routes.py` — 追加 `poster_bp` Blueprint 注册
- [ ] **P1.4.3** 验证:`curl http://localhost:5001/insurance/admin/ppt/health` 返回 200
- [ ] **P1.4.4** 验证:现有 `/insurance/ppt/render-options` 接口不受影响
---
## Phase P2管理后台 — 后端 API约 2 天)
### P2.1 管理后台服务层
- [x] **P2.1.1** 新建 `admin/ppt_admin_service.py` — PptAdminService 类
- [x] **P2.1.2** 保司 CRUD — list_companies分页 + status 筛选 + keyword 搜索)
- [x] **P2.1.3** 保司 CRUD — create_company
- [x] **P2.1.4** 保司 CRUD — update_company
- [x] **P2.1.5** 保司 CRUD — update_company_status启用/停用)
- [x] **P2.1.6** 产品 CRUD — list_products分页 + company_id/plan_type/status 筛选)
- [x] **P2.1.7** 产品 CRUD — create_product
- [x] **P2.1.8** 产品 CRUD — update_product
- [x] **P2.1.9** 产品 CRUD — update_product_status
- [x] **P2.1.10** 产品小册子 — upload_manual上传 PDF 文件)
- [x] **P2.1.11** 产品小册子 — parse_manual调用 LLM 解析 PDF → 更新 manual_parsed_rules + status=parsed
- [x] **P2.1.12** 产品小册子 — review_manual管理员核对 → status=reviewed
- [x] **P2.1.13** PPT 模板 CRUD — list/create/update/update_status
- [x] **P2.1.14** 海报模板 CRUD — list/create/update/update_status含参考图上传
- [x] **P2.1.15** 文案模板 CRUD — list/create/update/delete
- [x] **P2.1.16** 历史记录 — list_history管理员查看全部 PPT+海报历史)
- [x] **P2.1.17** 历史记录 — export_history_csv
- [x] **P2.1.18** 历史记录 — delete_history软删除
- [x] **P2.1.19** 系统配置 — get_settings / update_settings
### P2.2 管理后台路由层
- [x] **P2.2.1** 新建 `admin/ppt_admin_routes.py` — ppt_admin_bp Blueprint
- [x] **P2.2.2** 保司管理路由 — GET/POST /companies, PUT /companies/{id}, PUT /companies/{id}/status
- [x] **P2.2.3** 产品管理路由 — GET/POST /products, PUT /products/{id}, PUT /products/{id}/status
- [x] **P2.2.4** 产品小册子路由 — POST /products/{id}/manual/upload, POST /products/{id}/manual/parse, PUT /products/{id}/manual/review
- [x] **P2.2.5** PPT 模板路由 — GET/POST /templates, PUT /templates/{id}, PUT /templates/{id}/status
- [x] **P2.2.6** 海报模板路由 — GET/POST /poster-templates, PUT /poster-templates/{id}, PUT /poster-templates/{id}/status
- [x] **P2.2.7** 文案模板路由 — GET/POST /copy-templates, PUT /copy-templates/{id}, DELETE /copy-templates/{id}
- [x] **P2.2.8** 历史记录路由 — GET /history, GET /history/export, DELETE /history/{id}
- [x] **P2.2.9** 系统配置路由 — GET /settings, PUT /settings
- [x] **P2.2.10** 验证:所有管理接口需 `permission_required("config_manage")`,无权限返回 1004
---
## Phase P3管理后台 — 前端页面(约 2 天)
### P3.1 API 封装 + 路由注册
- [x] **P3.1.1** 新建 `utils/ppt-admin-api.ts` — PPT 管理后台 API 封装
- [x] **P3.1.2** 更新 `router/index.ts` — 注册 7 个管理端路由(需 config_manage 权限)
- [x] **P3.1.3** 更新 `App.vue` 侧边栏 — 新增"PPT/海报配置"折叠子菜单7 个入口)
### P3.2 管理页面
- [x] **P3.2.1** 新建 `admin/PptCompaniesAdmin.vue` — 保司管理
- [x] 表格:公司名/简称/编码/Logo/状态/排序
- [x] 筛选:状态下拉 + 名称搜索
- [x] 弹窗:新增/编辑表单(含 Logo 上传)
- [x] 操作:启用/停用按钮
- [x] **P3.2.2** 新建 `admin/PptProductsAdmin.vue` — 产品管理
- [x] 表格:产品名/所属保司/类型/状态/小册子状态
- [x] 筛选:保司下拉 + 类型下拉 + 状态下拉
- [x] 弹窗:新增/编辑表单(基本信息 + 扩展字段)
- [x] 操作:启用/停用 + 上传小册子 + 解析 + 核对
- [x] **P3.2.3** 新建 `admin/PptTemplatesAdmin.vue` — PPT 模板管理
- [x] 表格:名称/类型/风格/场景标签/状态
- [x] 弹窗:编辑表单(名称、场景标签、预览图上传、适用范围多选)
- [x] **P3.2.4** 新建 `admin/PosterTemplatesAdmin.vue` — 海报模板管理
- [x] 表格:名称/场景标签/配色/状态
- [x] 弹窗:编辑表单(风格描述、配色方案编辑器、参考图上传、预览图)
- [x] **P3.2.5** 新建 `admin/CopyTemplatesAdmin.vue` — 文案模板管理
- [x] 表格:名称/场景标签/变量列表/状态
- [x] 弹窗:编辑表单(文案内容编辑、变量说明、场景标签)
- [x] **P3.2.6** 新建 `admin/PptHistoryAdmin.vue` — 生成历史管理
- [x] 表格:时间/用户/类型PPT/海报)/产品/操作
- [x] 筛选:用户 ID/保司/类型/日期范围
- [x] 操作:查看详情(弹窗)/ 导出 CSV / 删除
- [x] **P3.2.7** 新建 `admin/PptSettingsAdmin.vue` — 系统设置
- [x] 表单PPT 历史保留天数 / 海报历史保留天数
- [x] 保存按钮
- [ ] **P3.2.8** 验证:管理端全部 7 个页面可正常访问和操作
- [ ] **P3.2.9** 验证:非 admin 用户访问管理页面被拒绝
---
## Phase P4PPT 前端优化 + 历史记录(约 1.5 天)
### P4.1 PPT 前端优化(增量修改现有组件)
- [x] **P4.1.1** PptUpload.vue — 添加骨架屏(`<el-skeleton>` 包裹公司列表和上传区域)
- [x] **P4.1.2** PptUpload.vue — 移动端触屏优化(拖拽区 min-height 120px点击区域扩大
- [x] **P4.1.3** PptParsing.vue — 添加骨架屏(解析进度区域)(已有 progress circle 作为加载态)
- [x] **P4.1.4** PptGenerate.vue — 添加骨架屏(样式选择区域)
- [x] **P4.1.5** PptGenerate.vue — 样式卡片 min-width 140px + 按钮 min-height 44px
- [x] **P4.1.6** PptResult.vue — 导出进度反馈el-progress + axios onDownloadProgress
- [x] **P4.1.7** 全局 — 表单输入框 font-size 16px防止 iOS 自动缩放)
- [ ] **P4.1.8** 验证移动端768px 以下PPT 全流程可正常操作
### P4.2 PPT 历史记录 — 后端
- [x] **P4.2.1** 更新 `ppt/routes.py` — 在文件末尾追加历史记录路由(不改已有代码)
- [x] **P4.2.2** GET /ppt/history — 当前用户历史列表(分页 + company_id/action_type/日期筛选)
- [x] **P4.2.3** GET /ppt/history/{id} — 单条历史详情(含 content_snapshot
- [x] **P4.2.4** POST /ppt/history/{id}/re-download — 重新下载文件
- [x] **P4.2.5** 更新 `ppt/routes.py` generate_ppt — 生成成功后自动写入 historyaction_type=export
- [x] **P4.2.6** 更新 `ppt/routes.py` download_ppt — 下载时自动写入 historyaction_type=download
- [ ] **P4.2.7** 验证:生成 PPT 后 history 表自动新增记录
### P4.3 PPT 历史记录 — 前端
- [x] **P4.3.1** 新建 `pages/PptHistoryPage.vue`
- [x] **P4.3.2** 表格:时间、保司、产品、操作类型、文件、操作(查看/重新下载)
- [x] **P4.3.3** 筛选栏:保司下拉、操作类型下拉、日期范围
- [x] **P4.3.4** 分页el-pagination
- [x] **P4.3.5** 查看详情弹窗:展示 content_snapshot 的格式化 JSON 视图
- [x] **P4.3.6** 更新 `router/index.ts` — 注册 `/ppt/history` 路由
- [x] **P4.3.7** 更新 `App.vue` 侧边栏 — 功能菜单新增"建议书历史"入口
- [ ] **P4.3.8** 验证:历史记录页面正常显示,查看详情和重新下载可用
---
## Phase P5海报核心功能 — 后端(约 2.5 天)
### P5.1 小册子解析
- [x] **P5.1.1** 新建 `poster/manual_parser.py` — 小册子解析 prompt
- [x] **P5.1.2** 实现 `parse_manual_pdf(filepath)` — 调用 LLM 提取产品规则features/currency_options/coverage_highlights
- [ ] **P5.1.3** 验证:上传小册子 PDF → 解析出结构化 JSON → 更新 products.manual_parsed_rules
### P5.2 计划书解析(复用 extraction.py
- [x] **P5.2.1**`ppt/extraction.py` 新增 `extract_for_poster(filepath)` 方法
- [x] **P5.2.2** 精简 prompt只提取海报所需字段age/gender/currency/sum_assured/premium_term/annual_premium/coverage_period/key_benefits
- [ ] **P5.2.3** 验证:上传计划书 PDF → 解析出海报所需字段
### P5.3 海报业务逻辑
- [x] **P5.3.1** 新建 `poster/service.py` — PosterService 类
- [x] **P5.3.2** get_reviewed_products — 获取已 reviewed 的产品列表
- [x] **P5.3.3** upload_case — 上传计划书 PDF + 触发解析 → 创建 poster_case_uploads 记录
- [x] **P5.3.4** get_case_upload — 获取解析结果
- [x] **P5.3.5** confirm_case_upload — 人工核对/修正解析数据 → 更新 confirmed_data
- [x] **P5.3.6** get_templates — 获取可用海报模板列表status=1
- [x] **P5.3.7** get_copy_templates — 获取可用文案模板列表status=1
### P5.4 文案生成
- [x] **P5.4.1** 新建 `poster/copy_generator.py` — CopyGenerator 类
- [x] **P5.4.2** 模板模式 — `generate_template_copy(template, product_rules, customer_data)` — 本地变量替换
- [x] **P5.4.3** AI 模式 — `generate_ai_copy(product_rules, customer_data, style)` — 调用 llm_client.structured_output
- [ ] **P5.4.4** 验证:模板模式返回填充后文案 / AI 模式返回 {headline, body, call_to_action}
### P5.5 海报图片生成
- [x] **P5.5.1** 新建 `poster/image_generator.py` — PosterImageGenerator 类
- [x] **P5.5.2** 实现 `generate(prompt, size)` — 调用 OpenAI images.generatemodel=gpt-image-1
- [x] **P5.5.3** 实现尺寸映射 — 用户尺寸 → API 尺寸1024x1024 / 1024x1792 / 1792x1024
- [x] **P5.5.4** 实现 prompt 组装 — 风格 + 配色 + 产品信息 + 客户数据 + 文案 → 完整 prompt
- [x] **P5.5.5** 实现参考图处理 — reference_image 传入 edit 端点或 prompt 描述
- [x] **P5.5.6** 实现降级方案 — API 失败时用 Pillow 生成基础排版图
- [ ] **P5.5.7** 验证:调用 API 返回 PNG 图片 bytes
### P5.6 海报 API 路由
- [x] **P5.6.1** 新建 `poster/routes.py` — poster_bp Blueprint
- [x] **P5.6.2** GET /poster/products — 已 reviewed 产品列表
- [x] **P5.6.3** POST /poster/case-upload — 上传计划书 + 触发解析
- [x] **P5.6.4** GET /poster/case-upload/{id} — 获取解析结果
- [x] **P5.6.5** PUT /poster/case-upload/{id}/confirm — 核对/修正数据
- [x] **P5.6.6** GET /poster/templates — 海报模板列表
- [x] **P5.6.7** GET /poster/copy-templates — 文案模板列表
- [x] **P5.6.8** POST /poster/generate-copy — 生成文案template/ai 模式)
- [x] **P5.6.9** POST /poster/generate — 生成海报图片(组装 prompt → GPT image API
- [x] **P5.6.10** GET /poster/download/{record_id} — 下载海报文件
- [x] **P5.6.11** GET /poster/records — 海报生成记录列表
- [x] **P5.6.12** GET /poster/records/{id} — 记录详情
- [ ] **P5.6.13** 验证完整海报生成流程可用curl 全链路测试)
---
## Phase P6海报核心功能 — 前端(约 2 天)
### P6.1 API 封装 + 路由注册
- [x] **P6.1.1** 新建 `utils/poster-api.ts` — 海报功能 API 封装
- [x] **P6.1.2** 更新 `router/index.ts` — 注册 3 个用户端路由(/poster, /poster/history, /ppt/history
- [x] **P6.1.3** 更新 `App.vue` 侧边栏 — 功能菜单新增"海报生成""海报历史"入口
### P6.2 海报生成向导
- [x] **P6.2.1** 新建 `pages/PosterPage.vue` — 4 步 el-steps 向导容器
- [x] **P6.2.2** 新建 `components/poster/PosterStepProduct.vue` — Step 1: 选择产品
- [x] 已 reviewed 产品卡片列表(按保司分组)
- [x] 未 reviewed 产品灰显不可选
- [x] 选择产品后进入下一步
- [x] **P6.2.3** 新建 `components/poster/PosterStepUpload.vue` — Step 2: 上传计划书
- [x] 拖拽上传 PDF
- [x] 解析进度loading + 进度提示)
- [x] 解析结果表单:逐字段展示,置信度低的字段高亮
- [x] 用户可编辑修正每个字段
- [x] 确认按钮 → 更新 confirmed_data
- [x] **P6.2.4** 新建 `components/poster/PosterStepTemplate.vue` — Step 3: 选模板 + 文案
- [x] 海报模板卡片网格(含预览图和风格描述)
- [x] 配色方案展示(从模板继承)
- [x] 文案模式切换(模板/AI
- [x] 模板模式:选择文案模板 → 实时预览填充结果
- [x] AI 模式:生成文案按钮 → 展示 headline/body/call_to_action → 可编辑
- [x] 参考图上传(可选,覆盖模板默认图)
- [x] **P6.2.5** 新建 `components/poster/PosterStepPreview.vue` — Step 4: 预览导出
- [x] "生成海报"按钮 + loading 状态10-30 秒)
- [x] 海报图片预览
- [x] 尺寸选择下拉4 种预设 + 自定义)
- [x] 下载按钮
- [ ] **P6.2.6** 验证:完整海报生成流程可用(移动端 + PC 端)
### P6.3 海报历史记录
- [x] **P6.3.1** 新建 `pages/PosterHistoryPage.vue`
- [x] **P6.3.2** 表格:时间、产品、模板、文案模式、操作(查看/重新下载)
- [x] **P6.3.3** 筛选栏:产品下拉、文案模式下拉、日期范围
- [x] **P6.3.4** 分页el-pagination
- [x] **P6.3.5** 查看详情弹窗:展示文案内容 + 海报缩略图
- [ ] **P6.3.6** 验证:海报历史页面正常显示
---
## Phase P7合规留痕 + 全链路验证(约 0.5 天)
### P7.1 合规留痕
- [x] **P7.1.1** 海报生成时自动记录ai_raw_contentAI 原始文案、copy_content用户编辑后、prompt_used完整 prompt、reference_image_used
- [x] **P7.1.2** AI 模式下 poster_records 同时保存原始文案和最终文案
- [ ] **P7.1.3** 验证poster_records 表中合规字段完整填写
### P7.2 全链路验证
- [ ] **P7.2.1** PPT 生成流程不受影响 — 上传/解析/生成/下载全流程正常
- [ ] **P7.2.2** 管理后台 — 保司/产品/模板 CRUD 全部正常
- [ ] **P7.2.3** PPT 历史记录 — 自动生成 + 查询 + 重新下载
- [ ] **P7.2.4** 海报完整流程 — 选产品 → 上传计划书 → 核对 → 选模板 → 生成文案 → 生成海报 → 下载
- [ ] **P7.2.5** 海报历史记录 — 自动生成 + 查询
- [ ] **P7.2.6** 权限验证 — sales 可生成海报但不能管理配置client 不能访问海报功能
- [ ] **P7.2.7** 移动端验证 — 768px 以下 PPT 和海报全流程可用
- [ ] **P7.2.8** 系统设置 — 修改历史保留天数后生效
---
## 任务统计
| Phase | 任务数 | 预估工时 | 说明 |
|-------|:------:|:--------:|------|
| P1 数据库 + 模型层 | 22 | 1 天 | 迁移脚本 + 6 个模型 + 路由注册 |
| P2 管理后台后端 | 19 | 2 天 | CRUD 服务 + 路由 |
| P3 管理后台前端 | 17 | 2 天 | 7 个管理页面 + 侧边栏 |
| P4 PPT 优化 + 历史 | 18 | 1.5 天 | 骨架屏 + 触屏优化 + 历史记录 |
| P5 海报后端 | 20 | 2.5 天 | 小册子/计划书解析 + 文案 + AI 生图 + API |
| P6 海报前端 | 16 | 2 天 | 4 步向导 + 历史记录 |
| P7 合规 + 验证 | 8 | 0.5 天 | 留痕 + 全链路测试 |
| **合计** | **120** | **~11.5 天** | |