Commit Graph

23 Commits

Author SHA1 Message Date
0bb9f76080 fix(deps): add missing @element-plus/icons-vue dependency
Was installed as a transitive dependency previously but not declared
in package.json. After a clean reinstall the build failed with
'Rollup failed to resolve import @element-plus/icons-vue'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 14:29:08 +08:00
8a5d13fcde feat(ui): redesign PPT/poster generation pages for trust and delivery
PPT data review: 3-layer structure — summary bar with trust indicator
and key metrics, sorted issues checklist, collapsible detail sections.
Error state disables primary action with explanation.

Poster template: left-right layout with size selection moved upfront,
template grid with scene tags and preview, AI style presets, compliance
notice for AI copy, reference image moved to advanced settings.

PPT result: product summary chips, pre-download checklist, delivery
confirmation feel instead of bare download page.

Poster preview: fix duplicate size options, add polling timeout (3 min),
show delivery metadata (size, generation mode) on success.

PosterPage: pass size from template step to preview step, widen to 1180px.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 14:24:20 +08:00
e3479f0546 上线阻断问题全部修复
#	问题	修复	文件
1	前端构建失败(引号错误)	size="small type=" → size="small" type="	PosterHistoryPage.vue
2	migrate_014 ORM vs 缺失列	全部改为原始 SQL,不再引用 ORM 模型	migrate_014.py
3	cleanup 字段名错误	output_path → ppt_path	cleanup.py
4	文案生成 case 越权	添加 case.user_id != user_id 校验	poster/service.py
5	存储路径未接通持久化卷	全部改用 get_storage_root()(默认 /app/api/storage/insurance)	config.py, ppt/routes.py, poster/service.py, poster/tasks.py
高风险问题修复
#	问题	修复	文件
6	migrate_019 rollback 撤销成功字段	每个 ALTER 后立即 commit,失败只回滚当前语句	migrate_019.py
7	迁移锁 Windows 不兼容 + 句柄未持久化	全局变量保存锁句柄,支持 Windows msvcrt	api/insurance/db/__init__.py
8	PDF 校验异常时放行	异常返回 False(文件损坏)	security.py
9	健康检查始终返回成功	缺少关键资源时返回 503 + missing 列表	poster/routes.py
10	短密钥掩码泄露原值	≤4 字符返回 ****	ppt_admin_service.py
11	设置无键名白名单	添加 _ALLOWED_SETTING_KEYS 白名单	ppt_admin_service.py
12	容器重启任务永久 stuck	添加 recover_stale_tasks() 启动恢复函数	poster/tasks.py, ppt/parse_worker.py
2026-07-27 13:52:09 +08:00
67b2dac23f slidesConfig 结构错误 — migrate_017 输出改为数组格式,migrate_019 修复历史数据
迁移系统加固 — 加 advisory lock 防并发,失败回滚并中止启动(原来是 catch-and-continue)
安全漏洞 — Settings/History API 权限收紧,API key 返回掩码值,海报 case 所有权校验
依赖缺失 — requirements.txt 补齐 python-pptx/openai/Pillow,Dockerfile 改为统一安装
海报鉴权下载 — 前端全部改用 authenticated blob,不再 window.open 无 token URL
LLM 配置分离 — 海报文案读取 poster_llm_*(不再复用 ppt_llm_*),支持 config namespace
图片生成器 — 兼容 b64_json 和 URL 两种响应格式,追踪 generation_mode/provider/model
种子数据 — 新环境自动获得 2 个海报模板 + 2 个文案模板
2026-07-27 13:21:34 +08:00
48f6388554 0727 PPT加海报功能02修复一个版本 2026-07-27 10:37:00 +08:00
dbe2f9202d feat: support direct LLM provider config with model sync
- Fix _call_provider to support custom providers (OpenAI-compatible
  fallback) instead of raising ValueError for unknown providers
- Add POST /admin/ppt/sync-models endpoint that fetches available
  models from the configured provider's API
- Redesign PptSettingsAdmin UI: replace Dify model dropdown with
  per-provider 'sync models' button + searchable model selector
- Remove dead Dify-specific code (fetchDifyModels, applyDifyModel)
- Update deepseek default model from deepseek-chat to deepseek-v4-pro
- API Key field now always shown (not conditional on non-dify)
2026-07-25 13:45:32 +08:00
63c7e87ea7 feat(ppt): add data review step between parsing and generation
Add a mandatory data verification step so users can inspect and edit
LLM-extracted data before generating the PPT.

- New PptDataReview.vue: auto-validation on mount, key metrics cards,
  editable benefit/withdrawal tables, inline error highlighting
- New PUT /session/<id>/extractions API endpoint for saving user edits
- Extend PptPage flow from 4 steps to 5 (upload→parse→review→generate→result)
- Update ppt-api.ts with updateExtractions() method
- Update PptParsing button text to match new flow

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 18:22:14 +08:00
1debd7df39 feat(ppt): upgrade renderer from 5 fixed slides to 10+ configurable pages
Rewrite fast_pptx_renderer.py to read requiredPageTypes from template
config instead of hardcoding 5 slides. Add 10 slide builder functions
(cover, company, narrative, chart, timeline, table, compare, synergy,
conclusion, closing) with python-pptx native charts.

Key changes:
- Renderer reads templateConfig.requiredPageTypes and slidesConfig
  from DeckContract to determine slide sequence and per-slide metadata
- routes.py loads PptTemplate and PptCompany from DB, normalizes all
  PDF extractions (not just the first), passes full context to renderer
- renderer.py injects templateConfig, company info, and multi-product
  data into DeckContract
- Add slides_config_json column to PptTemplate (migrate_017) for
  per-slide title/narrative/chartType configuration via admin UI
- Admin template editor now supports drag-reorder slides, per-slide
  title/narrative hint, chart/table type selection
- Add requiredPageTypes to savings/ink, savings/minimal, savings/business
  templates (were missing, causing fallback to defaults)
- Fix IUL normalizer: add payYears and totalPremium to policy dict
- Fix CI/IUL normalizer: add totalSurrenderValue alias to benefitRows
  so charts render correctly for all product types
- Port calculation functions from baodanppt: decade_rows, paid_premium,
  simple_return, compound_return, find_payback_year

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 17:49:09 +08:00
3a0f4f6830 feat: support Dify-synced models without separate API key
When a model is selected from Dify, set provider='dify' and call
through Dify Chat API (/v1/chat-messages) using the existing
DIFY_CHAT_APP_API_KEY. No separate API key configuration needed.

- Frontend: hide API Key/Base URL fields when provider is 'dify',
  show 'via Dify, no API key needed' tag
- Backend: add _call_dify() to route through Dify Chat API
- Backend: _try_load_db_config supports dify provider without api_key

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 16:18:59 +08:00
02e299682e feat: support configurable image generation models for poster creation
- Expand poster image model settings with provider, model name, API key,
  and base URL fields (was only model name + API key)
- Add presets for OpenAI (gpt-image-1), Doubao (火山引擎), and Zhipu (CogView)
- Refactor image_generator.py to read config from system_settings DB instead
  of hardcoding gpt-image-1 and OPENAI_API_KEY env var
- All OpenAI-compatible image APIs work via configurable base URL
- Add doubao and cogview to brand name mapping

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 16:11:37 +08:00
cecf908153 fix: correct response data path for Dify models and settings API
The axios interceptor already returns response.data, so accessing
res.data.data was one level too deep, causing the models list to
always be empty.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 15:23:45 +08:00
7a53834f5d fix: use localhost for BaoDan admin URL in local dev
Replace hardcoded server IP 150.5.135.143 with localhost in
openDifyAdmin() to match local development environment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 14:38:52 +08:00
53346c9def fix: query Dify DB directly for available models instead of API call
- Replace API-based model fetching with direct SQL query on
  provider_models table (shared PostgreSQL, no auth needed)
- Frontend: auto-detect base_url from model name when selecting
  a Dify model, set provider to 'custom'
- Remove unused requests import and API key fallback logic

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 14:20:34 +08:00
6d571f56a8 fix: auto-fetch Dify models using existing API keys as fallback
- Backend: try DIFY_CHAT/WORKFLOW_API_KEY when workspace key is missing
- Frontend: always show '从 Dify 获取' button, not just after first fetch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 13:48:37 +08:00
c8e0c0bb1e feat: add model configuration for PPT and poster generation
- PptSettingsAdmin.vue: full settings page with provider/model/API key
  config for PPT extraction, poster copy, and poster image generation
- Backend: GET /insurance/admin/ppt/available-models to fetch models
  from Dify API (falls back to builtin list when unavailable)
- LLM client: read model config from SystemSetting DB with 60s cache,
  priority: database > environment variables > defaults
- ppt-admin-api.ts: add getAvailableModels() method

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 13:46:04 +08:00
6c3343a222 fix: accept cached extractions in generate/validate and improve parse error UX
- generate_ppt and validate_extraction now accept status 'cached'
  alongside 'success', matching the frontend's hasSuccess logic
- PptParsing: show extraction error messages in the results table
- PptParsing: show '解析失败' icon when all extractions fail
- PptParsing: only show '下一步' button when at least one extraction succeeded
- routes.py: add error logging with stack trace in parse endpoint

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 13:05:27 +08:00
c8832ae50c fix: add missing progressStatus computed in PptParsing.vue
progressStatus was referenced in the template but never defined,
causing a Vue runtime warning on every render.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 12:57:33 +08:00
6eded843a7 0723 PPT加海报功能01版本修复-数据可以正常加载 2026-07-23 21:32:38 +08:00
effc2a24e4 0723 PPT加海报功能01版本修复 2026-07-23 17:40:12 +08:00
5d28e4518e 0723 PPT加海报功能初步完成 2026-07-23 15:04:16 +08:00
4a556a1cc7 0723 PPT功能初步融合 2026-07-23 13:10:50 +08:00
d0a887d5c2 0712 修复一个版本 2026-07-12 14:17:18 +08:00
bc4c339e0c 第一次提交。可以使用企微群消息 2026-07-02 23:13:23 +08:00