diff --git a/generate-team-ppt.js b/generate-team-ppt.js index 909ebdb..48248e8 100644 --- a/generate-team-ppt.js +++ b/generate-team-ppt.js @@ -506,6 +506,204 @@ prs.defineLayout({ name: "LAYOUT_WIDE", width: 13.33, height: 7.5 }); }); } +// ════════════════════════════════════════════════════════ +// 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", + }); + }); +} + // ── 保存 ──────────────────────────────────────────────── const OUT = "C:/Projects/AIProjects/AIRegulations/AIRegulation-DocAnalysis-Demo/team-report.pptx"; prs.writeFile({ fileName: OUT })