feat: team-report PPT slides 6-7 architecture and value

This commit is contained in:
2026-05-27 18:27:16 +08:00
parent 91651682a3
commit dd850f1023

View File

@@ -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 & Adapters5 层分离,高内聚低耦合,可独立替换各层实现", 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 })