Compare commits
8 Commits
main-20260
...
22ab39fed2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22ab39fed2 | ||
|
|
2080da87aa | ||
|
|
dd850f1023 | ||
|
|
91651682a3 | ||
|
|
c02c5cec0c | ||
|
|
4addda9182 | ||
|
|
0398fa3fb0 | ||
|
|
3b7153c95c |
1328
docs/superpowers/plans/2026-05-27-team-report-ppt.md
Normal file
1328
docs/superpowers/plans/2026-05-27-team-report-ppt.md
Normal file
File diff suppressed because it is too large
Load Diff
270
docs/superpowers/specs/2026-05-27-team-report-ppt-design.md
Normal file
270
docs/superpowers/specs/2026-05-27-team-report-ppt-design.md
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
# 团队阶段性汇报 PPT 设计文档
|
||||||
|
|
||||||
|
> 生成日期:2026-05-27
|
||||||
|
> 参考来源:boss-report.html、project-overview.html
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 目标
|
||||||
|
|
||||||
|
将现有 boss-report.html 和 project-overview.html 的内容重新组织,生成一份面向**跨团队 Leader / 中层管理者**的团队阶段性汇报 PPT,输出格式为 `.pptx`。
|
||||||
|
|
||||||
|
**与 boss-report.pptx 的核心差异:**
|
||||||
|
- 增加"负责角色"维度,体现团队分工
|
||||||
|
- 第9张改为"下阶段重点 & 分工",含角色分工明细
|
||||||
|
- 结尾改为 Q&A 互动页
|
||||||
|
- 去掉纯技术实现细节(不过深)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 视觉规范
|
||||||
|
|
||||||
|
**尺寸:** LAYOUT_WIDE — 13.33" × 7.5"
|
||||||
|
|
||||||
|
**配色(与 boss-report.html 一致):**
|
||||||
|
|
||||||
|
| 变量 | 颜色值 | 用途 |
|
||||||
|
|------|--------|------|
|
||||||
|
| accent | `E20074` | 品牌主色,标题/高亮/border |
|
||||||
|
| accent-dk | `BE0060` | 深品牌色,hover/渐变终点 |
|
||||||
|
| bg | `F7F7FA` | 页面背景 |
|
||||||
|
| bg-card | `FFFFFF` | 卡片背景 |
|
||||||
|
| bg-hover | `F0F0F5` | 分隔/hover |
|
||||||
|
| text | `1A1A2E` | 主文字 |
|
||||||
|
| text2 | `4A4A6A` | 次级文字 |
|
||||||
|
| text3 | `8888AA` | 辅助/标注 |
|
||||||
|
| green | `00896A` | 已完成/成功 |
|
||||||
|
| orange | `CC6200` | 进行中/警告 |
|
||||||
|
| blue | `2A68C8` | 信息/API |
|
||||||
|
| purple | `5A46B4` | 基础设施 |
|
||||||
|
| border | `E0E0EA` | 边框 |
|
||||||
|
|
||||||
|
**字体:** Calibri(标题),Calibri Light(正文)
|
||||||
|
**注意:** pptxgenjs 颜色不加 `#` 前缀;使用 `makeShadow()` 工厂函数避免对象复用 bug。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 幻灯片详细规格
|
||||||
|
|
||||||
|
### Slide 1 — 封面
|
||||||
|
|
||||||
|
**布局:** 左侧品牌色竖栏(宽 3.2") + 右侧内容区
|
||||||
|
|
||||||
|
**左栏(深色品牌色竖栏):**
|
||||||
|
- 背景:渐变 `B0005A` → `E20074`,宽 3.2",全高
|
||||||
|
- 垂直居中:
|
||||||
|
- 项目英文副标题:`EMS & EHS Compliance Intelligence Hub`,白色,14pt,斜体
|
||||||
|
- 大标题:`AI + 合规智能中枢`,白色,28pt,bold
|
||||||
|
- 分隔线:白色,opacity 40%
|
||||||
|
- 团队标注:`T-Systems · AI 合规项目组`,白色,11pt
|
||||||
|
- 日期:`2026 年 05 月`,白色,11pt
|
||||||
|
|
||||||
|
**右侧内容区(x=3.4"):**
|
||||||
|
- 标签:`TEAM PROGRESS REPORT`,品牌色,10pt,letter-spacing
|
||||||
|
- 副标题:`团队阶段性汇报`,深色,32pt,bold
|
||||||
|
- 说明文字:`基于 Agent 协同的多模块法规合规智能平台`,text2,13pt
|
||||||
|
- 3个数字指标卡(横排):
|
||||||
|
- `5` / 功能模块 / 品牌色
|
||||||
|
- `17+` / REST API 接口 / green
|
||||||
|
- `6+` / 法规来源覆盖 / orange
|
||||||
|
- 底部:`INTERNAL · CONFIDENTIAL`,text3,9pt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 2 — 项目背景
|
||||||
|
|
||||||
|
**sectionLabel:** 项目背景
|
||||||
|
**title:** 为什么要做这个系统?
|
||||||
|
**sub:** 汽车行业合规管理三大核心痛点,传统人工方式已无法满足
|
||||||
|
|
||||||
|
**3列卡片,各含顶部彩色3px条:**
|
||||||
|
|
||||||
|
| 卡片 | 顶色 | 图标 | 标题 | 内容 |
|
||||||
|
|------|------|------|------|------|
|
||||||
|
| 1 | 品牌色渐变 | 📋 | 法规碎片化 | GB、MIIT、UN-ECE、IATF 16949、ISO 45001、EUR-Lex 等多源法规并存,更新频繁,人工跟踪极易遗漏,合规窗口期短 |
|
||||||
|
| 2 | orange渐变 | ⏱ | 响应周期长 | 从法规发布到内部解读、影响评估、整改计划,人工流程往往需要数周,无法满足快速迭代的合规要求 |
|
||||||
|
| 3 | green渐变 | 💼 | 人工成本高 | 合规专家大量时间消耗在文档检索、条款比对、报告撰写等重复性工作上,高价值判断时间被严重压缩 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 3 — 本阶段工作总览
|
||||||
|
|
||||||
|
**sectionLabel:** 阶段成果
|
||||||
|
**title:** 本阶段工作总览
|
||||||
|
**sub:** 5 个功能模块 · 核心 Agent 问答链路全通
|
||||||
|
|
||||||
|
**5行模块表格,每行含:**
|
||||||
|
- 左侧:图标圆角方块 + 模块名 + 编号
|
||||||
|
- 中间:功能描述(1-2句)
|
||||||
|
- 右侧:状态 badge + 负责角色
|
||||||
|
|
||||||
|
| # | 图标 | 模块 | 简述 | 状态 | 负责角色 |
|
||||||
|
|---|------|------|------|------|---------|
|
||||||
|
| 01 | 📡 | 法规智能感知 | 六大法规源事件流,影响分级,SSE流式AI解读 | ⟳ 进行中 (orange) | 前端工程师 / 后端工程师 |
|
||||||
|
| 02 | 📚 | 文档知识库管理 | PDF/Word入库,5步Pipeline,双引擎OCR解析 | ⟳ 进行中 (orange) | 后端工程师 / AI工程师 |
|
||||||
|
| 03 | 🔍 | 合规分析审查 | 逐段风险评分,内嵌Agent对话,风险仪表盘 | ⟳ 进行中 (orange) | 全栈工程师 |
|
||||||
|
| 04 | 💬 | 法规 Agent 对话 | Milvus向量检索+LLM全链路贯通,多轮追问 | ✓ 核心链路已通 (green) | AI工程师 / 后端工程师 |
|
||||||
|
| 05 | 🖥️ | 系统状态监控 | 五项基础设施健康检查,17+ API,配置总览 | ✓ 已完成 (green) | 后端工程师 / 运维 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 4 — 核心功能演示 1/2
|
||||||
|
|
||||||
|
**sectionLabel:** 产品演示
|
||||||
|
**title:** 核心功能一览(1/2)
|
||||||
|
**sub:** 前3个模块已上线,功能可演示
|
||||||
|
|
||||||
|
**3列功能卡,每卡含:**
|
||||||
|
- 上方缩略图区(高 1.5",浅色渐变背景 + 大图标 + 标签)
|
||||||
|
- 下方:模块名(bold)+ 描述文字
|
||||||
|
|
||||||
|
| 模块 | 缩略图色 | 图标 | 特色标签 | 描述 |
|
||||||
|
|------|---------|------|---------|------|
|
||||||
|
| 法规智能感知 | `#FCE8F3` → `#FCD5E8` | 📡 | 高/中/低影响 · LIVE | 六大法规源实时事件流,影响等级分级过滤,选中事件触发SSE流式AI影响分析 |
|
||||||
|
| 文档知识库管理 | `#EEF2FD` → `#DCE8FB` | 📚 | LOAD→PARSE→CHUNK→EMBED→STORE | PDF/Word上传入库,5步Pipeline可视化,双引擎解析,文档列表管理 |
|
||||||
|
| 合规分析审查 | `#FFF5E8` → `#FDE8CC` | 🔍 | ⚠ 高风险 · ✓ 合规 | 上传文件逐段风险评分,内嵌Agent对话针对具体条款实时问答,风险聚合仪表盘 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 5 — 核心功能演示 2/2
|
||||||
|
|
||||||
|
**sectionLabel:** 产品演示
|
||||||
|
**title:** 核心功能一览(2/2)
|
||||||
|
**sub:** Agent 对话核心链路真实运行,监控模块已完成
|
||||||
|
|
||||||
|
**布局:左宽(2/3)+ 右窄(1/3)**
|
||||||
|
|
||||||
|
**左宽卡 — 法规 Agent 对话(✓ 核心链路已通):**
|
||||||
|
- 缩略图:`#E8F5EF` → `#D0EDE2`,内含示例对话条
|
||||||
|
- 示例文字:`"GB 18384 对我们的 BMS 设计有什么影响?" → Agent 检索 Milvus → 流式回答 + 来源引用`
|
||||||
|
- 右侧5个组件badge:Milvus向量库 / MinIO对象库 / Embedding引擎 / Reranker / Sessions会话
|
||||||
|
- 描述:真实 Milvus 向量检索 + LLM 流式输出全链路贯通;会话管理、来源归因卡片、多轮追问
|
||||||
|
|
||||||
|
**右窄卡 — 系统状态监控(✓ 已完成):**
|
||||||
|
- 缩略图:`#F0ECFF` → `#E2D8FF`,内含健康检查badge(Milvus✓/MinIO✓/LLM✓)
|
||||||
|
- 描述:五项基础设施实时健康检查,文档统计,系统配置总览
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 6 — 系统架构
|
||||||
|
|
||||||
|
**sectionLabel:** 技术架构
|
||||||
|
**title:** 系统分层架构
|
||||||
|
**sub:** 清洁架构 + Ports & Adapters,5 层分离,高内聚低耦合
|
||||||
|
|
||||||
|
**5层堆叠图,每层含顶部渐变色 header + 内容 tags:**
|
||||||
|
|
||||||
|
| 层 | 渐变色 | 图标 | 层名 | 副标题 | Tags |
|
||||||
|
|----|--------|------|------|--------|------|
|
||||||
|
| 用户层 | `B0005A`→`E20074` | 👥 | 用户层 | 合规专员/EHS专员/审核员/管理员 | 法规感知、文档分析、EHS合规、API集成、报告生成 |
|
||||||
|
| 前端层 | `00A080`→`00D4AA` | 🖥️ | 前端层 | React 19 · TypeScript · Vite · React Router v7 | KeepAlive路由、三主题系统(Dark/Dim/Light)、shadcn/ui组件库、Tailwind v4 |
|
||||||
|
| API层 | `2060A0`→`4A90D9` | ⚡ | API 层 | FastAPI · kbmp-service · mcp-server · Worker | 知识库管理API、合规检查API、文档解析API、检索问答API、订阅推送API |
|
||||||
|
| AI引擎层 | `C05000`→`FF8800` | 🧠 | AI 引擎层 | Agent Orchestration · LLM · Embedding · Tools | Qwen/DeepSeek LLM、Agent协同编排、向量知识检索、工具调用(Tool Use)、阿里云DocMind OCR |
|
||||||
|
| 基础设施层 | `5040B0`→`7B68EE` | 🗄️ | 基础设施层 | Milvus · PostgreSQL · MinIO · Prometheus · Grafana | Milvus向量数据库、PostgreSQL结构化存储、对象存储(文档/Markdown)、Prometheus+Grafana |
|
||||||
|
|
||||||
|
层间用 `↕` 符号(品牌色)连接。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 7 — 业务价值
|
||||||
|
|
||||||
|
**sectionLabel:** 业务价值
|
||||||
|
**title:** 有与没有的差距
|
||||||
|
**sub:** 量化对比:AI 智能中枢 vs 传统人工合规方式
|
||||||
|
|
||||||
|
**左右对比框(3:1:3 比例):**
|
||||||
|
|
||||||
|
左侧(传统方式,浅红背景):
|
||||||
|
- 标题:❌ 传统人工方式(红色)
|
||||||
|
- 5条对比项:数周法规解读 / 人工检索易遗漏 / 碎片化孤岛 / 高成本重复劳动 / 被动响应
|
||||||
|
|
||||||
|
中间:`→`(品牌色箭头)
|
||||||
|
|
||||||
|
右侧(AI平台,浅绿背景):
|
||||||
|
- 标题:✅ AI+合规智能中枢(绿色)
|
||||||
|
- 5条对比项:分钟级响应 / Agent智能协同精准 / 统一平台多源融合 / 降低重复劳动70%+ / 主动预警订阅推送
|
||||||
|
|
||||||
|
**底部4个KPI数字卡(横排):**
|
||||||
|
- `70%+` 重复性工作减少(品牌色)
|
||||||
|
- `分钟级` 法规响应时间(green)
|
||||||
|
- `6+` 法规源统一管理(orange)
|
||||||
|
- `5` 业务场景覆盖(blue)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 8 — 四阶段路线图
|
||||||
|
|
||||||
|
**sectionLabel:** 发展路线
|
||||||
|
**title:** 四阶段推进计划
|
||||||
|
**sub:** 当前处于第二阶段"Demo 打磨",核心 Agent 链路已通,正在补全剩余模块
|
||||||
|
|
||||||
|
**时间线设计:**
|
||||||
|
- 顶部横线:左25% green,右25% 品牌色(进行中),后50% border色
|
||||||
|
- 4个节点圆圈 + 下方内容卡
|
||||||
|
|
||||||
|
| 阶段 | 圆圈 | 卡片border | 状态标 | 标题 | 要点 |
|
||||||
|
|------|------|-----------|--------|------|------|
|
||||||
|
| 01 | ✓ green | green | 已完成 | 技术验证 POC | 清洁架构+Ports&Adapters / Agent协同框架 / Milvus向量链路打通 / 前后端结构建立 |
|
||||||
|
| 02 | ⟳ 品牌色(pulsing) | 品牌色(2px) | 进行中◀当前 | Demo 打磨 | 5页面前端上线 / Agent对话全通 / Pipeline已通 / EHS合规&监控开发中 |
|
||||||
|
| 03 | 3 灰色 | border | 待启动 | 生产部署 | PLM/ERP/MES集成 / Agent扩展 / Milvus集群化 / 合规&监控完善 |
|
||||||
|
| 04 | 4 灰色 | border | 待启动 | 规模推广 | 多租户 / 主动预警 / 1-2行业推广 / 数据治理&安全 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 9 — 下阶段重点 & 分工
|
||||||
|
|
||||||
|
**sectionLabel:** 下一步
|
||||||
|
**title:** 下阶段重点 & 角色分工
|
||||||
|
**sub:** Demo 收尾为核心目标,同步推进业务对齐与技术准备
|
||||||
|
|
||||||
|
**左侧2×2行动卡(占约65%宽):**
|
||||||
|
|
||||||
|
| 卡片 | 图标 | 标题 | 要点 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| 1 | 🎯 | Demo 收尾 | 补全 parse/embed Pipeline / 接入1-2个真实文档 / Mock替换真实LLM |
|
||||||
|
| 2 | 🤝 | 业务对齐 | 确认演示场景 / 收集业务方反馈 / 需求优先级排序 |
|
||||||
|
| 3 | 🔧 | 技术债清理 | RBAC权限设计 / 接入DocMind正式账号 / 前端性能优化 |
|
||||||
|
| 4 | 📋 | 资源 & 决策 | GPU/算力评估 / 确认LLM方案 / 确定生产环境规划 |
|
||||||
|
|
||||||
|
**右侧角色分工栏(占约30%宽):**
|
||||||
|
- 标题:角色分工
|
||||||
|
- 4行:
|
||||||
|
- 前端工程师 — 法规感知UI / 文档管理 / 性能优化
|
||||||
|
- 后端工程师 — Pipeline补全 / API稳定性 / RBAC
|
||||||
|
- AI工程师 — Agent调优 / LLM接入 / Embedding优化
|
||||||
|
- 全栈/架构 — 合规分析模块 / 系统集成 / 文档
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Slide 10 — 结语 & Q&A
|
||||||
|
|
||||||
|
**布局:** 深色背景封底(深海蓝 `1A1A2E`),品牌色顶部横条(3px)
|
||||||
|
|
||||||
|
**内容(垂直居中):**
|
||||||
|
- 大字:`感谢聆听`,白色,44pt,bold
|
||||||
|
- 副标题:`AI + 合规智能中枢 · 团队阶段性汇报`,text3色,16pt
|
||||||
|
- 分隔线
|
||||||
|
- `Q & A`,品牌色,32pt,bold
|
||||||
|
- 说明:`欢迎提问与交流`,白色,14pt
|
||||||
|
- 底部:`T-Systems · AI 合规项目组 · 2026.05 · INTERNAL CONFIDENTIAL`,text3,10pt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 输出规格
|
||||||
|
|
||||||
|
- **文件名:** `team-report.pptx`
|
||||||
|
- **输出路径:** `C:/Projects/AIProjects/AIRegulations/AIRegulation-DocAnalysis-Demo/team-report.pptx`
|
||||||
|
- **生成脚本:** `generate-team-ppt.js`
|
||||||
|
- **依赖:** `require("C:/nvm4w/nodejs/node_modules/pptxgenjs")`
|
||||||
|
- **布局:** `LAYOUT_WIDE` (13.33" × 7.5")
|
||||||
|
- **颜色规范:** 不加 `#` 前缀,使用 `makeShadow()` 工厂函数
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 技术注意事项
|
||||||
|
|
||||||
|
1. `makeShadow()` 必须每次返回新对象,不可复用同一引用
|
||||||
|
2. pptxgenjs 中颜色值不加 `#`(如 `"E20074"` 而非 `"#E20074"`)
|
||||||
|
3. 中文字体使用 `"Microsoft YaHei"` 或 `"Calibri"` 作为 fallback
|
||||||
|
4. `ROUNDED_RECTANGLE` 在某些版本有问题,使用 `RECTANGLE` + 自定义 `rectRadius`
|
||||||
|
5. 渐变使用 `fill: { type: "solid", color: "..." }` 或 `{ type: "grad", stops: [...] }`
|
||||||
186
docs/superpowers/specs/2026-06-03-frontend-redesign-design.md
Normal file
186
docs/superpowers/specs/2026-06-03-frontend-redesign-design.md
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
# Frontend Redesign — Design Spec
|
||||||
|
**Date:** 2026-06-03
|
||||||
|
**Status:** Approved
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Complete replacement of the existing frontend UI layer, strictly following the HTML prototype designs in the `Prototype/` folder. The API layer (`api/`), mock data (`data/`), and TypeScript types (`types/`) are preserved unchanged. Only the UI layer is rewritten.
|
||||||
|
|
||||||
|
## Design System
|
||||||
|
|
||||||
|
### CSS Variables (Design Tokens)
|
||||||
|
|
||||||
|
Defined in `frontend/src/styles/globals.css`, extracted directly from prototypes:
|
||||||
|
|
||||||
|
```css
|
||||||
|
/* Sidebar (light rail) */
|
||||||
|
--rail-bg: #ffffff
|
||||||
|
--rail-surface: #f7f8fa
|
||||||
|
--rail-fg: #111827
|
||||||
|
--rail-muted: #8b929e
|
||||||
|
--rail-border: #e8eaed
|
||||||
|
--rail-hover: rgba(0,0,0,.04)
|
||||||
|
--rail-active: rgba(226,0,116,.07)
|
||||||
|
|
||||||
|
/* Canvas */
|
||||||
|
--bg: #f2f4f7
|
||||||
|
--surface: #ffffff
|
||||||
|
--fg: #111827
|
||||||
|
--muted: #6b7280
|
||||||
|
--border: #e5e7eb
|
||||||
|
|
||||||
|
/* Brand */
|
||||||
|
--accent: #e20074
|
||||||
|
--accent-dim: rgba(226,0,116,.10)
|
||||||
|
--accent-hover: #c8006a
|
||||||
|
--success: #16a34a
|
||||||
|
--warn: #d97706
|
||||||
|
--danger: #dc2626
|
||||||
|
|
||||||
|
/* Typography */
|
||||||
|
--font-display: "TeleNeoWeb-Bold", "Inter", -apple-system, sans-serif
|
||||||
|
--font-body: "TeleNeoWeb-Regular", "Inter", -apple-system, sans-serif
|
||||||
|
--font-mono: ui-monospace, "JetBrains Mono", Menlo, monospace
|
||||||
|
|
||||||
|
/* Layout */
|
||||||
|
--sidebar-w: 232px
|
||||||
|
--radius-sm: 6px
|
||||||
|
--radius-md: 10px
|
||||||
|
--radius-pill: 9999px
|
||||||
|
--shadow-card: 0 1px 4px rgba(0,0,0,.06), 0 0 0 1px rgba(0,0,0,.04)
|
||||||
|
|
||||||
|
/* Dark mode: data-theme="dark" overrides all above */
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dark Mode
|
||||||
|
Toggle via `data-theme="dark"` on `<html>`. Persisted to `localStorage`. Sidebar footer button triggers toggle.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### File Structure (UI layer only — rewrite)
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/src/
|
||||||
|
├── styles/
|
||||||
|
│ └── globals.css ← Rewrite: design tokens + base reset
|
||||||
|
├── components/
|
||||||
|
│ └── layout/
|
||||||
|
│ ├── AppShell.tsx ← Rewrite: CSS grid sidebar(232px) + content-area
|
||||||
|
│ ├── Sidebar.tsx ← New: brand + nav groups + user footer + theme toggle
|
||||||
|
│ └── Topbar.tsx ← New: sticky topbar (per-page title + actions)
|
||||||
|
├── pages/
|
||||||
|
│ ├── Overview/
|
||||||
|
│ │ └── OverviewPage.tsx ← New: launcher index
|
||||||
|
│ ├── Status/
|
||||||
|
│ │ └── StatusPage.tsx ← Rewrite: system status dashboard
|
||||||
|
│ ├── Perception/
|
||||||
|
│ │ ├── PerceptionPage.tsx ← Rewrite: regulatory signals
|
||||||
|
│ │ └── EventFeed.tsx ← Rewrite: feed pane
|
||||||
|
│ ├── Docs/
|
||||||
|
│ │ └── DocsPage.tsx ← Rewrite: document management
|
||||||
|
│ ├── Compliance/
|
||||||
|
│ │ └── CompliancePage.tsx ← Rewrite: compliance analysis workspace
|
||||||
|
│ └── RagChat/
|
||||||
|
│ └── RagChatPage.tsx ← Rewrite: regulation Q&A chat
|
||||||
|
├── router/
|
||||||
|
│ └── AppRouter.tsx ← Rewrite: 6 routes with sidebar layout
|
||||||
|
├── api/ ← PRESERVE unchanged
|
||||||
|
├── data/ ← PRESERVE unchanged
|
||||||
|
└── types/ ← PRESERVE unchanged
|
||||||
|
```
|
||||||
|
|
||||||
|
### Navigation (Sidebar)
|
||||||
|
|
||||||
|
Permanent left sidebar, 232px wide. Groups:
|
||||||
|
|
||||||
|
**Main**
|
||||||
|
- Overview (grid icon)
|
||||||
|
- Regulatory Signals (eye/radar icon) — badge: high-impact count
|
||||||
|
- System Status (list icon) — badge: active issues count
|
||||||
|
|
||||||
|
**Workbench**
|
||||||
|
- Documents (file icon)
|
||||||
|
- Compliance Analysis (shield icon)
|
||||||
|
|
||||||
|
**Chat**
|
||||||
|
- Regulation Q&A (chat bubble icon)
|
||||||
|
|
||||||
|
Footer: user avatar (TS) + name/role + theme toggle button.
|
||||||
|
|
||||||
|
Active item: accent-colored left border bar (3px) + accent background tint.
|
||||||
|
|
||||||
|
## Pages
|
||||||
|
|
||||||
|
### 1. Overview
|
||||||
|
- Hero section: title + subtitle + CTA buttons (Open dashboard, Jump to regulation chat)
|
||||||
|
- Summary card (scope: 6 screens / Backend-aware flows / Review posture)
|
||||||
|
- Workflow steps (6-column grid): 01 Dashboard → 06 Chat
|
||||||
|
- Screen grid (2×3): clickable cards with mini mockup previews
|
||||||
|
|
||||||
|
### 2. System Status (`dashboard-sidebar.html`)
|
||||||
|
- **Topbar**: "System Status" title + search + "Export status" btn + "New upload" btn (primary)
|
||||||
|
- **Stats grid (4-col)**: Documents total / Vector chunks / High-impact signals / Last 90 days — values fetched from `/api/v1/perception/stats`
|
||||||
|
- **Panel grid (1.4fr + 0.9fr)**:
|
||||||
|
- Left: Workflow queue (task rows: name/status/progress/CTA) + Active compliance programs (program rows + KPI strip: Retrieval hit rate / Evidence coverage / Reviewer SLA with meter bars)
|
||||||
|
- Right: System health (service rows: name/status) + Regulatory watch (event rows: date/title/summary clamp-2)
|
||||||
|
- **Footer**: brand name + live green dot + "Online"
|
||||||
|
|
||||||
|
### 3. Regulatory Signals (`perception.html`)
|
||||||
|
- **Topbar**: title + subtitle monospace + search + Refresh btn
|
||||||
|
- **Stats bar (4-col, flush, no card borders)**: Total / High impact (danger color) / Medium impact (warn color) / Last 90 days (accent color) — fetched from `/api/v1/perception/stats`
|
||||||
|
- **Filter bar**: Source chips (All/MIIT/UN-ECE/ISO/GB Comm./EUR-Lex/IATF) + separator + Impact chips (All/High/Medium/Low)
|
||||||
|
- **Two-pane split (360px + 1fr)**:
|
||||||
|
- Left feed pane: scrollable event cards (source tag colored, standard code, status pill, title, summary clamp-2, date, tags, impact dot). Selected card gets accent border + glow ring.
|
||||||
|
- Right analysis pane: empty state with ring icon. On select: detail card (source/code/status/title/summary/meta) + action row (Run impact analysis btn, Stop btn, Source link) + Affected documents card (doc rows: score%/name/clause/snippet) + AI output card (SSE streaming with blink cursor, markdown rendering)
|
||||||
|
- **Footer**: live dot + "Live feed" + brand
|
||||||
|
|
||||||
|
### 4. Documents (`document-management.html`)
|
||||||
|
- **Topbar**: title + search + filter controls + "Upload document" primary btn
|
||||||
|
- **Filter bar**: status chips (All/Ready/Embedding/Failed/Pending) + regulation type filter
|
||||||
|
- **Document table**: rows with doc name, status pill (ok/warn/risk), upload time, chunk count, action CTAs (Inspect/Analyze/Resolve)
|
||||||
|
- Rows link to document detail view
|
||||||
|
|
||||||
|
### 5. Compliance Analysis (`compliance-analysis.html`)
|
||||||
|
- **Topbar**: title + search + "New analysis" primary btn
|
||||||
|
- **Hero**: eyebrow + h1 + description + nav buttons
|
||||||
|
- **Three-column workspace (0.95fr + 1.25fr + 0.9fr)**:
|
||||||
|
- Col 1 — Retrieved regulations: source items (standard name, helper text, score pills, status pill)
|
||||||
|
- Col 2 — Document paragraph under review: source text block with `<mark>` highlights + Analysis stages (4 progress bars: Clause retrieval / Requirement extraction / Gap analysis / Recommendation synthesis)
|
||||||
|
- Col 3 — Findings and conclusion: finding items (title/description/status pill) + conclusion box (recommended replacement text) + action items (Next action / Escalation)
|
||||||
|
|
||||||
|
### 6. Regulation Q&A (`regulation-chat.html`)
|
||||||
|
- **Two-column layout**: main chat area + right citation rail
|
||||||
|
- **Topbar**: chat title + export btn
|
||||||
|
- **Chat area**: message bubbles (user right/assistant left), streaming cursor blink, citation superscripts
|
||||||
|
- **Citation rail**: source doc rows (score/name/clause/snippet)
|
||||||
|
- **Input area**: textarea + quick-prompt chips + send button (primary)
|
||||||
|
|
||||||
|
## Component Patterns
|
||||||
|
|
||||||
|
### Status Pills
|
||||||
|
```
|
||||||
|
.status.ok → green dot + green bg tint
|
||||||
|
.status.warn → amber dot + amber bg tint
|
||||||
|
.status.risk → red dot + red bg tint
|
||||||
|
.status.info → blue dot + blue bg tint
|
||||||
|
```
|
||||||
|
|
||||||
|
### Buttons
|
||||||
|
- Default: border + surface bg, 32px height
|
||||||
|
- Primary: accent bg, white text
|
||||||
|
- Small: 28px height
|
||||||
|
|
||||||
|
### Cards
|
||||||
|
- `border-radius: 10px`, `box-shadow: var(--shadow-card)`, `padding: 16px 18px`
|
||||||
|
|
||||||
|
### Nav badges
|
||||||
|
- Accent-tinted pill, monospace font, 10px
|
||||||
|
|
||||||
|
## Preserved (No Changes)
|
||||||
|
- `frontend/src/api/` — all API client files
|
||||||
|
- `frontend/src/data/` — all mock data files
|
||||||
|
- `frontend/src/types/` — TypeScript definitions
|
||||||
|
- `frontend/src/contexts/ThemeContext.tsx` — theme state (adapt to use data-theme on html element)
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
React 19 + TypeScript + Vite + TailwindCSS 4 + React Router 7. Lucide React for icons.
|
||||||
916
generate-team-ppt.js
Normal file
916
generate-team-ppt.js
Normal file
@@ -0,0 +1,916 @@
|
|||||||
|
// generate-team-ppt.js
|
||||||
|
const pptxgenjs = require("C:/nvm4w/nodejs/node_modules/pptxgenjs");
|
||||||
|
|
||||||
|
// ── 颜色常量 ──────────────────────────────────────────────
|
||||||
|
const C = {
|
||||||
|
accent: "E20074",
|
||||||
|
accentDk: "BE0060",
|
||||||
|
bg: "F7F7FA",
|
||||||
|
bgCard: "FFFFFF",
|
||||||
|
bgHover: "F0F0F5",
|
||||||
|
border: "E0E0EA",
|
||||||
|
text: "1A1A2E",
|
||||||
|
text2: "4A4A6A",
|
||||||
|
text3: "8888AA",
|
||||||
|
green: "00896A",
|
||||||
|
orange: "CC6200",
|
||||||
|
blue: "2A68C8",
|
||||||
|
purple: "5A46B4",
|
||||||
|
red: "C0392B",
|
||||||
|
darkBg: "1A1A2E",
|
||||||
|
};
|
||||||
|
|
||||||
|
// ── 辅助函数 ─────────────────────────────────────────────
|
||||||
|
function makeShadow() {
|
||||||
|
return { type: "outer", color: "000000", opacity: 0.08, blur: 6, offset: 2, angle: 45 };
|
||||||
|
}
|
||||||
|
|
||||||
|
function topBar(slide) {
|
||||||
|
slide.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: 0.04,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: C.accent }, { position: 100, color: C.accentDk }] },
|
||||||
|
line: { color: C.accent, width: 0 },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function sectionLabel(slide, text, x, y) {
|
||||||
|
slide.addText(text, {
|
||||||
|
x, y, w: 9, h: 0.25,
|
||||||
|
fontSize: 9, bold: true, color: C.accent,
|
||||||
|
charSpacing: 3, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function sectionTitle(slide, text, x, y) {
|
||||||
|
slide.addText(text, {
|
||||||
|
x, y, w: 9, h: 0.5,
|
||||||
|
fontSize: 26, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function sectionSub(slide, text, x, y) {
|
||||||
|
slide.addText(text, {
|
||||||
|
x, y, w: 10, h: 0.3,
|
||||||
|
fontSize: 12, color: C.text3, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function slideNum(slide, n, total) {
|
||||||
|
slide.addText(`${n} / ${total}`, {
|
||||||
|
x: 12, y: 7.1, w: 1.2, h: 0.25,
|
||||||
|
fontSize: 9, color: C.text3, align: "right", fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 初始化 PPT ───────────────────────────────────────────
|
||||||
|
const prs = new pptxgenjs();
|
||||||
|
prs.layout = "LAYOUT_WIDE";
|
||||||
|
prs.defineLayout({ name: "LAYOUT_WIDE", width: 13.33, height: 7.5 });
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 1 — 封面
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
// 浅色背景
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
|
||||||
|
// 左侧品牌色竖栏 3.2"
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: 3.2, h: 7.5,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: "B0005A" }, { position: 100, color: C.accent }] },
|
||||||
|
line: { color: C.accent, width: 0 },
|
||||||
|
});
|
||||||
|
|
||||||
|
// 左栏:英文副标题
|
||||||
|
sl.addText("EMS & EHS Compliance\nIntelligence Hub", {
|
||||||
|
x: 0.3, y: 1.8, w: 2.6, h: 0.7,
|
||||||
|
fontSize: 11, italic: true, color: "FFFFFF",
|
||||||
|
fontFace: "Calibri Light", align: "center",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 左栏:项目大标题
|
||||||
|
sl.addText("AI + 合规\n智能中枢", {
|
||||||
|
x: 0.2, y: 2.6, w: 2.8, h: 1.2,
|
||||||
|
fontSize: 24, bold: true, color: "FFFFFF",
|
||||||
|
fontFace: "Calibri", align: "center",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 左栏:分隔线
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.6, y: 3.9, w: 2.0, h: 0.02,
|
||||||
|
fill: { color: "FFFFFF", transparency: 60 },
|
||||||
|
line: { color: "FFFFFF", width: 0 },
|
||||||
|
});
|
||||||
|
|
||||||
|
// 左栏:团队 + 日期
|
||||||
|
sl.addText("T-Systems · AI 合规项目组", {
|
||||||
|
x: 0.2, y: 4.0, w: 2.8, h: 0.28,
|
||||||
|
fontSize: 10, color: "FFFFFF", fontFace: "Calibri Light", align: "center",
|
||||||
|
});
|
||||||
|
sl.addText("2026 年 05 月", {
|
||||||
|
x: 0.2, y: 4.3, w: 2.8, h: 0.28,
|
||||||
|
fontSize: 10, color: "FFFFFF", fontFace: "Calibri Light", align: "center",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右侧:标签
|
||||||
|
sl.addText("TEAM PROGRESS REPORT", {
|
||||||
|
x: 3.6, y: 1.2, w: 6, h: 0.25,
|
||||||
|
fontSize: 9, bold: true, color: C.accent,
|
||||||
|
charSpacing: 3, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右侧:汇报标题
|
||||||
|
sl.addText("团队阶段性汇报", {
|
||||||
|
x: 3.6, y: 1.5, w: 9, h: 0.65,
|
||||||
|
fontSize: 34, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右侧:说明文字
|
||||||
|
sl.addText("基于 Agent 协同的多模块法规合规智能平台\n多团队协作 · 阶段成果汇报 · 分工与规划", {
|
||||||
|
x: 3.6, y: 2.25, w: 9, h: 0.6,
|
||||||
|
fontSize: 12, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右侧:3个数字指标卡
|
||||||
|
const stats = [
|
||||||
|
{ num: "5", label: "功能模块\n已完成/开发中", color: C.accent },
|
||||||
|
{ num: "17+", label: "REST API 接口\n已设计并文档化", color: C.green },
|
||||||
|
{ num: "6+", label: "法规来源\n接入覆盖", color: C.orange },
|
||||||
|
];
|
||||||
|
stats.forEach((s, i) => {
|
||||||
|
const sx = 3.6 + i * 2.8;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: sx, y: 3.1, w: 2.5, h: 1.4,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: sx, y: 3.1, w: 2.5, h: 0.05,
|
||||||
|
fill: { color: s.color }, line: { color: s.color, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(s.num, {
|
||||||
|
x: sx + 0.15, y: 3.2, w: 2.2, h: 0.65,
|
||||||
|
fontSize: 40, bold: true, color: s.color, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(s.label, {
|
||||||
|
x: sx + 0.15, y: 3.85, w: 2.2, h: 0.55,
|
||||||
|
fontSize: 10, color: C.text3, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 底部机密标注
|
||||||
|
sl.addText("INTERNAL · CONFIDENTIAL", {
|
||||||
|
x: 3.6, y: 7.1, w: 6, h: 0.25,
|
||||||
|
fontSize: 9, color: C.text3, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 2 — 项目背景
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "项目背景", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "为什么要做这个系统?", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "汽车行业合规管理三大核心痛点,传统人工方式已无法满足需求", 0.5, 1.4);
|
||||||
|
slideNum(sl, 2, 10);
|
||||||
|
|
||||||
|
const painPoints = [
|
||||||
|
{
|
||||||
|
topColor: ["B0005A", "E20074"],
|
||||||
|
icon: "📋",
|
||||||
|
title: "法规碎片化",
|
||||||
|
body: "GB、MIIT、UN-ECE、IATF 16949、ISO 45001、EUR-Lex 等多源法规并存,更新频繁,人工跟踪极易遗漏,合规窗口期短。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
topColor: ["C05000", "FF8800"],
|
||||||
|
icon: "⏱",
|
||||||
|
title: "响应周期长",
|
||||||
|
body: "从法规发布到内部解读、影响评估、整改计划,人工流程往往需要数周,无法满足快速迭代的合规要求。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
topColor: ["00A080", "00D4AA"],
|
||||||
|
icon: "💼",
|
||||||
|
title: "人工成本高",
|
||||||
|
body: "合规专家大量时间消耗在文档检索、条款比对、报告撰写等重复性工作上,高价值判断时间被严重压缩。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
painPoints.forEach((p, i) => {
|
||||||
|
const cx = 0.5 + i * 4.22;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: 1.9, w: 4.0, h: 4.8,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: 1.9, w: 4.0, h: 0.07,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: p.topColor[0] }, { position: 100, color: p.topColor[1] }] },
|
||||||
|
line: { color: p.topColor[0], width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(p.icon, {
|
||||||
|
x: cx + 0.25, y: 2.1, w: 0.7, h: 0.6,
|
||||||
|
fontSize: 28, fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
sl.addText(p.title, {
|
||||||
|
x: cx + 0.25, y: 2.75, w: 3.5, h: 0.4,
|
||||||
|
fontSize: 16, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(p.body, {
|
||||||
|
x: cx + 0.25, y: 3.25, w: 3.5, h: 2.8,
|
||||||
|
fontSize: 12, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
paraSpaceAfter: 4, lineSpacingMultiple: 1.4,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 3 — 本阶段工作总览
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "阶段成果", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "本阶段工作总览", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "5 个功能模块 · 核心 Agent 问答链路全通 · 角色分工一览", 0.5, 1.4);
|
||||||
|
slideNum(sl, 3, 10);
|
||||||
|
|
||||||
|
const modules = [
|
||||||
|
{
|
||||||
|
icon: "📡", num: "01", name: "法规智能感知",
|
||||||
|
desc: "六大法规源事件流,影响分级过滤,SSE 流式 AI 影响解读",
|
||||||
|
status: "⟳ 进行中", statusColor: C.orange,
|
||||||
|
role: "前端工程师 / 后端工程师",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "📚", num: "02", name: "文档知识库管理",
|
||||||
|
desc: "PDF/Word 入库,5 步 Pipeline 可视化,双引擎 OCR 解析",
|
||||||
|
status: "⟳ 进行中", statusColor: C.orange,
|
||||||
|
role: "后端工程师 / AI 工程师",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "🔍", num: "03", name: "合规分析审查",
|
||||||
|
desc: "逐段风险评分,内嵌 Agent 对话,风险聚合仪表盘",
|
||||||
|
status: "⟳ 进行中", statusColor: C.orange,
|
||||||
|
role: "全栈工程师",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "💬", num: "04", name: "法规 Agent 对话",
|
||||||
|
desc: "Milvus 向量检索 + LLM 全链路贯通,多轮追问,来源归因",
|
||||||
|
status: "✓ 核心链路已通", statusColor: C.green,
|
||||||
|
role: "AI 工程师 / 后端工程师",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "🖥️", num: "05", name: "系统状态监控",
|
||||||
|
desc: "五项基础设施健康检查,17+ API,系统配置总览",
|
||||||
|
status: "✓ 已完成", statusColor: C.green,
|
||||||
|
role: "后端工程师 / 运维",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
modules.forEach((m, i) => {
|
||||||
|
const ry = 1.85 + i * 1.02;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.5, y: ry, w: 12.3, h: 0.9,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addText(m.icon, {
|
||||||
|
x: 0.7, y: ry + 0.18, w: 0.55, h: 0.55,
|
||||||
|
fontSize: 20, fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
sl.addText(m.num, {
|
||||||
|
x: 1.3, y: ry + 0.28, w: 0.4, h: 0.28,
|
||||||
|
fontSize: 8, color: C.text3, fontFace: "Calibri", bold: true,
|
||||||
|
});
|
||||||
|
sl.addText(m.name, {
|
||||||
|
x: 1.7, y: ry + 0.12, w: 2.8, h: 0.3,
|
||||||
|
fontSize: 13, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(m.desc, {
|
||||||
|
x: 1.7, y: ry + 0.46, w: 5.8, h: 0.28,
|
||||||
|
fontSize: 10, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
sl.addText(m.status, {
|
||||||
|
x: 7.7, y: ry + 0.26, w: 2.2, h: 0.28,
|
||||||
|
fontSize: 9, bold: true, color: m.statusColor,
|
||||||
|
fill: { color: m.statusColor, transparency: 88 },
|
||||||
|
line: { color: m.statusColor, width: 0.5, transparency: 70 },
|
||||||
|
align: "center", margin: [2, 6, 2, 6], fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(m.role, {
|
||||||
|
x: 10.1, y: ry + 0.26, w: 2.5, h: 0.28,
|
||||||
|
fontSize: 9, color: C.text3, fontFace: "Calibri Light", align: "right",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 4 — 核心功能演示 1/2
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "产品演示", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "核心功能一览(1/2)", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "前 3 个模块已上线,功能可演示", 0.5, 1.4);
|
||||||
|
slideNum(sl, 4, 10);
|
||||||
|
|
||||||
|
const features = [
|
||||||
|
{
|
||||||
|
bg: ["FCE8F3", "FCD5E8"], icon: "📡", name: "法规智能感知",
|
||||||
|
tags: [{ t: "高影响", c: C.accent }, { t: "中影响", c: C.orange }, { t: "低影响", c: C.green }],
|
||||||
|
liveBadge: true,
|
||||||
|
desc: "六大法规源实时事件流,影响等级分级过滤,选中事件触发 SSE 流式 AI 影响分析",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bg: ["EEF2FD", "DCE8FB"], icon: "📚", name: "文档知识库管理",
|
||||||
|
tags: [{ t: "LOAD", c: C.blue }, { t: "PARSE", c: C.blue }, { t: "EMBED", c: C.blue }, { t: "STORE", c: C.green }],
|
||||||
|
liveBadge: false,
|
||||||
|
desc: "PDF/Word 上传入库,5 步 Pipeline 可视化进度,双引擎解析,文档列表管理",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bg: ["FFF5E8", "FDE8CC"], icon: "🔍", name: "合规分析审查",
|
||||||
|
tags: [{ t: "⚠ 高风险", c: C.red }, { t: "✓ 合规", c: C.green }],
|
||||||
|
liveBadge: false,
|
||||||
|
desc: "上传文件逐段风险评分,内嵌 Agent 对话针对具体条款实时问答,风险聚合仪表盘",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
features.forEach((f, i) => {
|
||||||
|
const cx = 0.5 + i * 4.22;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: 1.85, w: 4.0, h: 5.0,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: 1.85, w: 4.0, h: 2.0,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: f.bg[0] }, { position: 100, color: f.bg[1] }] },
|
||||||
|
line: { color: C.border, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(f.icon, {
|
||||||
|
x: cx + 1.4, y: 2.0, w: 1.2, h: 0.9,
|
||||||
|
fontSize: 32, align: "center", fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
let tx = cx + 0.15;
|
||||||
|
f.tags.forEach(tag => {
|
||||||
|
const tw = tag.t.length > 4 ? 0.85 : 0.7;
|
||||||
|
sl.addText(tag.t, {
|
||||||
|
x: tx, y: 3.05, w: tw, h: 0.22,
|
||||||
|
fontSize: 8, bold: true, color: tag.c,
|
||||||
|
fill: { color: tag.c, transparency: 88 },
|
||||||
|
line: { color: tag.c, width: 0.4, transparency: 70 },
|
||||||
|
align: "center", margin: [2, 4, 2, 4], fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
tx += tw + 0.05;
|
||||||
|
});
|
||||||
|
if (f.liveBadge) {
|
||||||
|
sl.addText("LIVE", {
|
||||||
|
x: cx + 3.15, y: 1.95, w: 0.65, h: 0.22,
|
||||||
|
fontSize: 8, bold: true, color: C.green,
|
||||||
|
fill: { color: C.green, transparency: 88 },
|
||||||
|
line: { color: C.green, width: 0.4, transparency: 70 },
|
||||||
|
align: "center", margin: [2, 4, 2, 4], fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
sl.addText(f.name, {
|
||||||
|
x: cx + 0.15, y: 3.45, w: 3.7, h: 0.35,
|
||||||
|
fontSize: 13, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(f.desc, {
|
||||||
|
x: cx + 0.15, y: 3.85, w: 3.7, h: 2.7,
|
||||||
|
fontSize: 11, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
lineSpacingMultiple: 1.4,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 5 — 核心功能演示 2/2
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "产品演示", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "核心功能一览(2/2)", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "Agent 对话核心链路真实运行(Milvus + LLM)· 监控模块已完成", 0.5, 1.4);
|
||||||
|
slideNum(sl, 5, 10);
|
||||||
|
|
||||||
|
// 左宽卡 — Agent 对话 (w=8.3)
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.5, y: 1.85, w: 8.3, h: 5.0,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.green, width: 1 },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.5, y: 1.85, w: 8.3, h: 1.8,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: "E8F5EF" }, { position: 100, color: "D0EDE2" }] },
|
||||||
|
line: { color: C.border, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText("💬", {
|
||||||
|
x: 0.8, y: 1.95, w: 0.8, h: 0.7,
|
||||||
|
fontSize: 26, fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
sl.addText('"GB 18384 对我们的 BMS 设计有什么影响?" → Agent 检索 Milvus → 流式回答 + 来源引用', {
|
||||||
|
x: 0.8, y: 2.78, w: 5.7, h: 0.5,
|
||||||
|
fontSize: 10, color: C.green,
|
||||||
|
fill: { color: C.green, transparency: 90 },
|
||||||
|
line: { color: C.green, width: 0.5, transparency: 70 },
|
||||||
|
margin: [4, 8, 4, 8], fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
// 右侧组件 badges
|
||||||
|
const agentBadges = ["Milvus 向量库", "MinIO 对象库", "Embedding 引擎", "Reranker", "Sessions 会话"];
|
||||||
|
agentBadges.forEach((b, i) => {
|
||||||
|
sl.addText(b, {
|
||||||
|
x: 6.55, y: 1.93 + i * 0.3, w: 2.05, h: 0.24,
|
||||||
|
fontSize: 8, color: C.green,
|
||||||
|
fill: { color: C.green, transparency: 90 },
|
||||||
|
line: { color: C.green, width: 0.4, transparency: 60 },
|
||||||
|
align: "center", margin: [2, 4, 2, 4], fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
sl.addText("法规 Agent 对话", {
|
||||||
|
x: 0.7, y: 3.82, w: 4.5, h: 0.35,
|
||||||
|
fontSize: 14, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("● 核心链路已通", {
|
||||||
|
x: 5.0, y: 3.86, w: 2.2, h: 0.28,
|
||||||
|
fontSize: 10, color: C.green, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("真实 Milvus 向量检索 + LLM 流式输出全链路贯通\n会话管理、来源归因卡片、多轮追问、法规类型筛选", {
|
||||||
|
x: 0.7, y: 4.25, w: 7.8, h: 0.9,
|
||||||
|
fontSize: 11, color: C.text2, fontFace: "Calibri Light", lineSpacingMultiple: 1.5,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右窄卡 — 系统监控 (w=3.9)
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 9.0, y: 1.85, w: 3.9, h: 5.0,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 9.0, y: 1.85, w: 3.9, h: 1.8,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: "F0ECFF" }, { position: 100, color: "E2D8FF" }] },
|
||||||
|
line: { color: C.border, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText("🖥️", {
|
||||||
|
x: 9.4, y: 2.0, w: 0.7, h: 0.65,
|
||||||
|
fontSize: 24, fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
const healthBadges = [
|
||||||
|
{ t: "Milvus ✓", c: C.green }, { t: "MinIO ✓", c: C.green }, { t: "LLM ✓", c: C.green },
|
||||||
|
];
|
||||||
|
healthBadges.forEach((b, i) => {
|
||||||
|
sl.addText(b.t, {
|
||||||
|
x: 9.05 + i * 1.25, y: 3.0, w: 1.2, h: 0.22,
|
||||||
|
fontSize: 8, bold: true, color: b.c,
|
||||||
|
fill: { color: b.c, transparency: 88 },
|
||||||
|
line: { color: b.c, width: 0.4, transparency: 70 },
|
||||||
|
align: "center", margin: [2, 4, 2, 4], fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
sl.addText("系统状态监控", {
|
||||||
|
x: 9.15, y: 3.82, w: 3.5, h: 0.35,
|
||||||
|
fontSize: 14, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("✓ 已完成", {
|
||||||
|
x: 9.15, y: 4.25, w: 2, h: 0.25,
|
||||||
|
fontSize: 10, bold: true, color: C.green, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("五项基础设施实时健康检查,文档统计,系统配置总览(LLM / Embedding / 解析引擎)", {
|
||||||
|
x: 9.15, y: 4.6, w: 3.6, h: 2.0,
|
||||||
|
fontSize: 11, color: C.text2, fontFace: "Calibri Light", lineSpacingMultiple: 1.4,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 6 — 系统分层架构
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "技术架构", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "系统分层架构", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "清洁架构 + Ports & Adapters,5 层分离,高内聚低耦合,可独立替换各层实现", 0.5, 1.4);
|
||||||
|
slideNum(sl, 6, 10);
|
||||||
|
|
||||||
|
const layers = [
|
||||||
|
{
|
||||||
|
grad: ["B0005A", "E20074"], icon: "👥", name: "用户层",
|
||||||
|
sub: "合规专员 / EHS 专员 / 审核员 / 管理员 / 查看员",
|
||||||
|
tags: ["法规感知", "文档分析", "EHS 合规", "API 集成", "报告生成"],
|
||||||
|
tagC: "E20074",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
grad: ["00A080", "00D4AA"], icon: "🖥️", name: "前端层",
|
||||||
|
sub: "React 19 · TypeScript · Vite · React Router v7",
|
||||||
|
tags: ["KeepAlive 路由", "三主题系统 (Dark/Dim/Light)", "shadcn/ui 组件库", "Tailwind v4"],
|
||||||
|
tagC: "00896A",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
grad: ["2060A0", "4A90D9"], icon: "⚡", name: "API 层",
|
||||||
|
sub: "FastAPI · kbmp-service · mcp-server · Worker 异步",
|
||||||
|
tags: ["知识库管理 API", "合规检查 API", "文档解析 API", "检索问答 API", "订阅推送 API"],
|
||||||
|
tagC: "2A68C8",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
grad: ["C05000", "FF8800"], icon: "🧠", name: "AI 引擎层",
|
||||||
|
sub: "Agent Orchestration · LLM · Embedding · Tool Use",
|
||||||
|
tags: ["Qwen / DeepSeek LLM", "Agent 协同编排", "向量知识检索", "工具调用 (Tool Use)", "阿里云 DocMind OCR"],
|
||||||
|
tagC: "CC6200",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
grad: ["5040B0", "7B68EE"], icon: "🗄️", name: "基础设施层",
|
||||||
|
sub: "Milvus · PostgreSQL · MinIO · Prometheus · Grafana",
|
||||||
|
tags: ["Milvus 向量数据库", "PostgreSQL 结构化存储", "对象存储 (文档/Markdown)", "Prometheus + Grafana"],
|
||||||
|
tagC: "5A46B4",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const layerH = 0.92;
|
||||||
|
const gap = 0.08;
|
||||||
|
layers.forEach((lyr, i) => {
|
||||||
|
const ly = 1.75 + i * (layerH + gap);
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.5, y: ly, w: 12.3, h: layerH,
|
||||||
|
fill: { color: "FFFFFF" }, line: { color: lyr.tagC, width: 0.5, transparency: 60 },
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.5, y: ly, w: 3.2, h: layerH,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: lyr.grad[0] }, { position: 100, color: lyr.grad[1] }] },
|
||||||
|
line: { color: lyr.grad[0], width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(lyr.icon, {
|
||||||
|
x: 0.6, y: ly + 0.2, w: 0.55, h: 0.55,
|
||||||
|
fontSize: 18, fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
sl.addText(lyr.name, {
|
||||||
|
x: 1.18, y: ly + 0.12, w: 1.7, h: 0.35,
|
||||||
|
fontSize: 13, bold: true, color: "FFFFFF", fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(lyr.sub, {
|
||||||
|
x: 1.18, y: ly + 0.52, w: 2.3, h: 0.28,
|
||||||
|
fontSize: 8, color: "FFFFFF", fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
let tx = 3.85;
|
||||||
|
lyr.tags.forEach(tag => {
|
||||||
|
const tw = Math.max(tag.length * 0.12 + 0.2, 1.1);
|
||||||
|
sl.addText(tag, {
|
||||||
|
x: tx, y: ly + 0.32, w: tw, h: 0.24,
|
||||||
|
fontSize: 9, bold: true, color: lyr.tagC,
|
||||||
|
fill: { color: lyr.tagC, transparency: 88 },
|
||||||
|
line: { color: lyr.tagC, width: 0.4, transparency: 70 },
|
||||||
|
align: "center", margin: [2, 6, 2, 6], fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
tx += tw + 0.12;
|
||||||
|
});
|
||||||
|
if (i < layers.length - 1) {
|
||||||
|
sl.addText("↕", {
|
||||||
|
x: 6.3, y: ly + layerH, w: 0.7, h: gap + 0.04,
|
||||||
|
fontSize: 10, color: "E20074", align: "center", fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 7 — 业务价值(含布局修正,不超出 7.5" 高度)
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "业务价值", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "有与没有的差距", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "量化对比:AI 智能中枢 vs 传统人工合规方式", 0.5, 1.4);
|
||||||
|
slideNum(sl, 7, 10);
|
||||||
|
|
||||||
|
// 左侧框(传统方式)
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0.5, y: 1.85, w: 5.6, h: 3.5,
|
||||||
|
fill: { color: "FDF0F0" }, line: { color: "E8C0C0", width: 0.5 }, shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addText("❌ 传统人工方式", {
|
||||||
|
x: 0.75, y: 2.02, w: 5.1, h: 0.32,
|
||||||
|
fontSize: 12, bold: true, color: C.red, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
[
|
||||||
|
["数周", "法规解读 + 影响评估周期"],
|
||||||
|
["人工检索", "依赖专家经验,易遗漏"],
|
||||||
|
["碎片化", "各系统数据孤岛,无法联动"],
|
||||||
|
["高成本", "合规专家时间大量消耗"],
|
||||||
|
["被动响应", "法规变化后才开始评估"],
|
||||||
|
].forEach(([kw, txt], i) => {
|
||||||
|
sl.addText(kw, {
|
||||||
|
x: 0.75, y: 2.42 + i * 0.52, w: 1.4, h: 0.28,
|
||||||
|
fontSize: 10, bold: true, color: C.red, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("— " + txt, {
|
||||||
|
x: 2.2, y: 2.42 + i * 0.52, w: 3.7, h: 0.28,
|
||||||
|
fontSize: 10, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 中间箭头
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 6.15, y: 1.85, w: 0.9, h: 3.5,
|
||||||
|
fill: { color: C.bgHover }, line: { color: C.border, width: 0.5 },
|
||||||
|
});
|
||||||
|
sl.addText("→", {
|
||||||
|
x: 6.15, y: 3.35, w: 0.9, h: 0.5,
|
||||||
|
fontSize: 22, color: C.accent, align: "center", fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右侧框(AI 平台)
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 7.1, y: 1.85, w: 5.7, h: 3.5,
|
||||||
|
fill: { color: "F0FAF6" }, line: { color: "A0D8C0", width: 0.5 }, shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addText("✅ AI + 合规智能中枢", {
|
||||||
|
x: 7.35, y: 2.02, w: 5.2, h: 0.32,
|
||||||
|
fontSize: 12, bold: true, color: C.green, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
[
|
||||||
|
["分钟级", "法规发布即自动解读,影响秒级评估"],
|
||||||
|
["Agent 智能协同", "多步推理,精准定位条款"],
|
||||||
|
["统一平台", "多源法规、多系统数据融合"],
|
||||||
|
["降低重复劳动 70%+", "专家聚焦高价值判断"],
|
||||||
|
["主动预警", "订阅推送,法规变化即刻触达"],
|
||||||
|
].forEach(([kw, txt], i) => {
|
||||||
|
sl.addText(kw, {
|
||||||
|
x: 7.35, y: 2.42 + i * 0.52, w: 2.3, h: 0.28,
|
||||||
|
fontSize: 10, bold: true, color: C.green, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("— " + txt, {
|
||||||
|
x: 9.7, y: 2.42 + i * 0.52, w: 2.8, h: 0.28,
|
||||||
|
fontSize: 10, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 底部 4 KPI 卡(y=5.6,不超出 7.5" 边界)
|
||||||
|
[
|
||||||
|
{ num: "70%+", label: "重复性工作减少", color: C.accent },
|
||||||
|
{ num: "分钟级", label: "法规响应时间", color: C.green },
|
||||||
|
{ num: "6+", label: "法规源统一管理", color: C.orange },
|
||||||
|
{ num: "5", label: "业务场景覆盖", color: C.blue },
|
||||||
|
].forEach((k, i) => {
|
||||||
|
const kx = 0.5 + i * 3.2;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: kx, y: 5.6, w: 3.0, h: 1.55,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 }, shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: kx, y: 5.6, w: 3.0, h: 0.05,
|
||||||
|
fill: { color: k.color }, line: { color: k.color, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(k.num, {
|
||||||
|
x: kx + 0.15, y: 5.72, w: 2.7, h: 0.65,
|
||||||
|
fontSize: 28, bold: true, color: k.color, fontFace: "Calibri", align: "center",
|
||||||
|
});
|
||||||
|
sl.addText(k.label, {
|
||||||
|
x: kx + 0.15, y: 6.4, w: 2.7, h: 0.3,
|
||||||
|
fontSize: 10, color: C.text3, fontFace: "Calibri Light", align: "center",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 8 — 四阶段路线图
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "发展路线", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "四阶段推进计划", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "当前处于第二阶段“Demo 打磨”,核心 Agent 链路已通,正在补全剩余模块", 0.5, 1.4);
|
||||||
|
slideNum(sl, 8, 10);
|
||||||
|
|
||||||
|
// 时间线底线
|
||||||
|
sl.addShape("rect", { x: 1.5, y: 2.35, w: 2.5, h: 0.05, fill: { color: C.green }, line: { color: C.green, width: 0 } });
|
||||||
|
sl.addShape("rect", { x: 4.0, y: 2.35, w: 2.5, h: 0.05, fill: { color: C.accent }, line: { color: C.accent, width: 0 } });
|
||||||
|
sl.addShape("rect", { x: 6.5, y: 2.35, w: 5.3, h: 0.05, fill: { color: C.border }, line: { color: C.border, width: 0 } });
|
||||||
|
|
||||||
|
const phases = [
|
||||||
|
{
|
||||||
|
icon: "✓", iconBg: C.green, borderC: C.green, borderW: 1,
|
||||||
|
label: "阶段 01 · 已完成", title: "技术验证 POC",
|
||||||
|
items: ["清洁架构 + Ports & Adapters", "Agent 协同框架搭建", "Milvus 向量检索链路打通", "前后端项目结构建立"],
|
||||||
|
cardBg: "F0FAF6", cardBorder: "A0D8C0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "⟳", iconBg: C.accent, borderC: C.accent, borderW: 2,
|
||||||
|
label: "阶段 02 · 进行中 ◀ 当前", title: "Demo 打磨",
|
||||||
|
items: ["5 页面前端已上线", "法规 Agent 对话全通", "Pipeline 已通,OCR 联调中", "EHS 合规 & 监控开发中"],
|
||||||
|
cardBg: "FEF0F6", cardBorder: "E20074",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "3", iconBg: C.text3, borderC: C.border, borderW: 1,
|
||||||
|
label: "阶段 03 · 待启动", title: "生产部署",
|
||||||
|
items: ["PLM/ERP/MES 集成", "Agent 能力扩展", "Milvus 集群化部署", "合规 & 监控完善"],
|
||||||
|
cardBg: C.bgCard, cardBorder: C.border,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "4", iconBg: C.text3, borderC: C.border, borderW: 1,
|
||||||
|
label: "阶段 04 · 待启动", title: "规模推广",
|
||||||
|
items: ["多租户 & 权限体系", "主动预警 & 订阅", "1-2 行业试点推广", "数据治理 & 安全合规"],
|
||||||
|
cardBg: C.bgCard, cardBorder: C.border,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
phases.forEach((p, i) => {
|
||||||
|
const cx = 0.6 + i * 3.1;
|
||||||
|
sl.addShape("ellipse", {
|
||||||
|
x: cx + 0.85, y: 2.1, w: 0.55, h: 0.55,
|
||||||
|
fill: { color: p.iconBg }, line: { color: p.iconBg, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(p.icon, {
|
||||||
|
x: cx + 0.85, y: 2.12, w: 0.55, h: 0.5,
|
||||||
|
fontSize: 11, bold: true, color: "FFFFFF", align: "center", fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: 2.75, w: 2.85, h: 4.35,
|
||||||
|
fill: { color: p.cardBg }, line: { color: p.cardBorder, width: p.borderW },
|
||||||
|
shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addText(p.label, {
|
||||||
|
x: cx + 0.12, y: 2.9, w: 2.6, h: 0.24,
|
||||||
|
fontSize: 8, bold: true, color: i === 1 ? C.accent : C.text3, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(p.title, {
|
||||||
|
x: cx + 0.12, y: 3.18, w: 2.6, h: 0.38,
|
||||||
|
fontSize: 14, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
p.items.forEach((item, j) => {
|
||||||
|
sl.addText("▸ " + item, {
|
||||||
|
x: cx + 0.12, y: 3.65 + j * 0.6, w: 2.62, h: 0.38,
|
||||||
|
fontSize: 10, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 9 — 下阶段重点 & 分工
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.bg }, line: { color: C.bg, width: 0 },
|
||||||
|
});
|
||||||
|
topBar(sl);
|
||||||
|
sectionLabel(sl, "下一步", 0.5, 0.55);
|
||||||
|
sectionTitle(sl, "下阶段重点 & 角色分工", 0.5, 0.85);
|
||||||
|
sectionSub(sl, "Demo 收尾为核心目标,同步推进业务对齐与技术准备", 0.5, 1.4);
|
||||||
|
slideNum(sl, 9, 10);
|
||||||
|
|
||||||
|
const actions = [
|
||||||
|
{ icon: "🎯", title: "Demo 收尾", items: ["补全 parse/embed Pipeline", "接入 1-2 个真实文档场景", "Mock 替换为真实 LLM 调用"] },
|
||||||
|
{ icon: "🤝", title: "业务对齐", items: ["确认演示场景与业务方", "收集业务方反馈", "需求优先级排序"] },
|
||||||
|
{ icon: "🔧", title: "技术债清理", items: ["RBAC 权限设计实现", "接入 DocMind 正式账号", "前端性能优化 & KeepAlive"] },
|
||||||
|
{ icon: "📋", title: "资源 & 决策", items: ["GPU / 算力需求评估", "确认生产 LLM 方案", "确定生产环境部署规划"] },
|
||||||
|
];
|
||||||
|
|
||||||
|
actions.forEach((a, i) => {
|
||||||
|
const col = i % 2;
|
||||||
|
const row = Math.floor(i / 2);
|
||||||
|
const cx = 0.5 + col * 4.25;
|
||||||
|
const cy = 1.85 + row * 2.65;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: cy, w: 4.0, h: 2.45,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 }, shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: cx, y: cy, w: 4.0, h: 0.05,
|
||||||
|
fill: { color: C.accent }, line: { color: C.accent, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText(a.icon, {
|
||||||
|
x: cx + 0.18, y: cy + 0.15, w: 0.55, h: 0.5,
|
||||||
|
fontSize: 18, fontFace: "Segoe UI Emoji",
|
||||||
|
});
|
||||||
|
sl.addText(a.title, {
|
||||||
|
x: cx + 0.75, y: cy + 0.2, w: 3.1, h: 0.38,
|
||||||
|
fontSize: 13, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
a.items.forEach((item, j) => {
|
||||||
|
sl.addText("▸ " + item, {
|
||||||
|
x: cx + 0.18, y: cy + 0.7 + j * 0.52, w: 3.6, h: 0.35,
|
||||||
|
fontSize: 10, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 右侧角色分工栏
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 9.1, y: 1.85, w: 3.8, h: 5.25,
|
||||||
|
fill: { color: C.bgCard }, line: { color: C.border, width: 0.5 }, shadow: makeShadow(),
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 9.1, y: 1.85, w: 3.8, h: 0.05,
|
||||||
|
fill: { color: C.blue }, line: { color: C.blue, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText("角色分工", {
|
||||||
|
x: 9.3, y: 2.0, w: 3.4, h: 0.35,
|
||||||
|
fontSize: 13, bold: true, color: C.text, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
[
|
||||||
|
{ role: "前端工程师", tasks: "法规感知 UI / 文档管理 / 性能优化" },
|
||||||
|
{ role: "后端工程师", tasks: "Pipeline 补全 / API 稳定性 / RBAC" },
|
||||||
|
{ role: "AI 工程师", tasks: "Agent 调优 / LLM 接入 / Embedding" },
|
||||||
|
{ role: "全栈 / 架构", tasks: "合规分析模块 / 系统集成 / 文档" },
|
||||||
|
].forEach((r, i) => {
|
||||||
|
const ry = 2.55 + i * 1.12;
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 9.25, y: ry, w: 3.5, h: 0.9,
|
||||||
|
fill: { color: C.bgHover }, line: { color: C.border, width: 0.4 },
|
||||||
|
});
|
||||||
|
sl.addText(r.role, {
|
||||||
|
x: 9.4, y: ry + 0.1, w: 3.2, h: 0.28,
|
||||||
|
fontSize: 10, bold: true, color: C.blue, fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText(r.tasks, {
|
||||||
|
x: 9.4, y: ry + 0.42, w: 3.2, h: 0.36,
|
||||||
|
fontSize: 9, color: C.text2, fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
// Slide 10 — 结语 & Q&A
|
||||||
|
// ════════════════════════════════════════════════════════
|
||||||
|
{
|
||||||
|
const sl = prs.addSlide();
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: "100%",
|
||||||
|
fill: { color: C.darkBg }, line: { color: C.darkBg, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 0, y: 0, w: "100%", h: 0.06,
|
||||||
|
fill: { type: "grad", stops: [{ position: 0, color: C.accent }, { position: 100, color: C.accentDk }] },
|
||||||
|
line: { color: C.accent, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText("感谢聆听", {
|
||||||
|
x: 1.5, y: 1.8, w: 10.3, h: 1.0,
|
||||||
|
fontSize: 48, bold: true, color: "FFFFFF", align: "center", fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("AI + 合规智能中枢 · 团队阶段性汇报", {
|
||||||
|
x: 1.5, y: 2.9, w: 10.3, h: 0.4,
|
||||||
|
fontSize: 14, color: C.text3, align: "center", fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
sl.addShape("rect", {
|
||||||
|
x: 4.5, y: 3.5, w: 4.33, h: 0.02,
|
||||||
|
fill: { color: C.accent, transparency: 40 }, line: { color: C.accent, width: 0 },
|
||||||
|
});
|
||||||
|
sl.addText("Q & A", {
|
||||||
|
x: 1.5, y: 3.7, w: 10.3, h: 0.85,
|
||||||
|
fontSize: 44, bold: true, color: C.accent, align: "center", fontFace: "Calibri",
|
||||||
|
});
|
||||||
|
sl.addText("欢迎提问与交流", {
|
||||||
|
x: 1.5, y: 4.6, w: 10.3, h: 0.4,
|
||||||
|
fontSize: 15, color: "FFFFFF", align: "center", fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
sl.addText("T-Systems · AI 合规项目组 · 2026.05 · INTERNAL CONFIDENTIAL", {
|
||||||
|
x: 1.0, y: 6.9, w: 11.33, h: 0.28,
|
||||||
|
fontSize: 9, color: C.text3, align: "center", fontFace: "Calibri Light",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 保存 ────────────────────────────────────────────────
|
||||||
|
const OUT = "C:/Projects/AIProjects/AIRegulations/AIRegulation-DocAnalysis-Demo/team-report.pptx";
|
||||||
|
prs.writeFile({ fileName: OUT })
|
||||||
|
.then(() => console.log("✅ 生成完成:", OUT))
|
||||||
|
.catch(e => { console.error("❌ 生成失败:", e); process.exit(1); });
|
||||||
Reference in New Issue
Block a user