Files
wecom_it_smart_desk/docs/01-产品文档/07-知识库/原型-REQ-知识-001-知识库闭环-v1.0.html
Simon 44e77dcb0e chore(docs): docs/ 目录全面重新编号 + 重组
**重构前**(旧编号 02-11):
- docs/02-产品需求/      → 00 产品规划/PRD
- docs/03-技术架构/      → 01-05 子目录散落
- docs/04-原型设计/      → 01-02 产品设计(HTML 原型)
- docs/05-原型设计/      → screens/
- docs/06-测试素材/      → 02-E2E / 03-功能 / 04-版本测试
- docs/07-项目管理/      → 任务说明书/日报/计划
- docs/08-安全审计/      → 审计报告
- docs/09-堡垒运维/      → toolbox / deploy
- docs/10-项目管理/      → 任务说明书(重复)
- docs/11-历史归档/      → deploy-nas-archived

**重构后**(新编号 00-07,语义化):
- docs/00-产品开发流程与文档管理规范.md
- docs/00-版本迭代总览.md
- docs/01-产品文档/      (PRD/原型/认证/会话/AI 服务/坐席/集成)
- docs/02-技术文档/      (技术方案/架构图/重构记录/前端改造/实现配置)
- docs/03-测试文档/      (E2E/功能用例/版本报告/缺陷单)
- docs/04-运维文档/      (部署运维/运维指南)
- docs/05-运营文档/      (品牌推广/用户手册)
- docs/06-安全审计/      (审计报告)
- docs/07-项目管理/      (任务说明书/日报/计划/看板)

**净收益**:
- 目录编号与产品文档管理规范对齐(按文档阶段 01-07 编号)
- 消除 02-产品需求 与 10-项目管理 的编号重叠
- 子目录按文档类型分组(如 01-产品文档/00-产品规划、01-产品文档/01-认证与登录)
- 把运维/安全/项目管理从 0X 散落改为 04/06/07

合计 494 文件 + 78495 行 / - 14076 行
2026-08-03 18:46:55 +08:00

562 lines
30 KiB
HTML
Raw Permalink 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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IT智能服务台 · 知识库迭代 v0.7.2 原型</title>
<style>
:root {
--accent: #07C160;
--accent-light: #e8f5e9;
--danger: #fa5151;
--warning: #ffc300;
--bg: #f5f5f5;
--card: #fff;
--border: #e5e5e5;
--text: #333;
--dim: #999;
--radius: 8px;
}
* { margin:0; padding:0; box-sizing:border-box; }
body { font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif; background:var(--bg); color:var(--text); }
h2 { font-size:1.1em; margin-bottom:12px; display:flex; align-items:center; gap:8px; }
h3 { font-size:0.95em; margin-bottom:8px; }
.section { max-width:1080px; margin:16px auto; background:var(--card); border-radius:var(--radius); padding:20px; box-shadow:0 1px 3px rgba(0,0,0,.06); }
.section-label { display:inline-block; font-size:0.72em; padding:2px 8px; border-radius:10px; background:var(--accent-light); color:var(--accent); margin-bottom:10px; font-weight:600; }
.grid { display:grid; gap:16px; }
.grid-2 { grid-template-columns:1fr 1fr; }
.grid-3 { grid-template-columns:repeat(3,1fr); }
.card { border:1px solid var(--border); border-radius:var(--radius); padding:14px; background:var(--card); }
.card-mock { min-height:300px; position:relative; overflow:hidden; border:1px solid var(--border); border-radius:var(--radius); }
/* Triage Card */
.triage-card { background:var(--card); border:1.5px solid var(--accent); border-radius:12px; padding:16px; position:relative; box-shadow:0 2px 12px rgba(7,193,96,.12); }
.triage-badge { position:absolute; top:-8px; left:16px; background:var(--accent); color:#fff; font-size:0.7em; padding:2px 10px; border-radius:10px; }
.triage-step { font-size:0.75em; color:var(--dim); margin-bottom:8px; }
.triage-title { font-weight:600; margin-bottom:12px; font-size:0.95em; }
.triage-option { display:flex; align-items:center; gap:10px; padding:10px 14px; border:1px solid var(--border); border-radius:8px; margin-bottom:8px; cursor:pointer; transition:all .15s; }
.triage-option:hover { border-color:var(--accent); background:var(--accent-light); }
.triage-option .prob { margin-left:auto; font-size:0.85em; color:var(--accent); font-weight:600; }
.triage-option .dot { width:18px; height:18px; border-radius:50%; border:2px solid var(--border); flex-shrink:0; }
.triage-option:hover .dot { border-color:var(--accent); background:var(--accent-light); }
.triage-footer { display:flex; justify-content:space-between; align-items:center; margin-top:10px; }
.triage-expert { font-size:0.75em; color:var(--dim); }
.triage-toggle { width:36px; height:20px; border-radius:10px; background:var(--border); position:relative; cursor:pointer; }
.triage-toggle.on { background:var(--accent); }
.triage-toggle::after { content:''; width:16px; height:16px; border-radius:50%; background:#fff; position:absolute; top:2px; left:2px; transition:.2s; }
.triage-toggle.on::after { left:18px; }
/* Confidence Banner */
.conf-banner { padding:12px 16px; border-radius:var(--radius); display:flex; align-items:center; gap:12px; margin-bottom:12px; }
.conf-banner.warn { background:#fff8e1; border:1px solid var(--warning); }
.conf-banner .conf-icon { font-size:1.3em; }
.conf-banner .conf-text { font-size:0.82em; flex:1; }
.conf-banner .conf-badge { background:var(--warning); color:#333; font-size:0.7em; padding:2px 8px; border-radius:8px; font-weight:600; }
.conf-banner .conf-transfer { color:var(--accent); font-size:0.78em; cursor:pointer; text-decoration:underline; white-space:nowrap; }
.conf-snapshot { background:#fafafa; padding:8px 12px; border-radius:6px; font-size:0.72em; color:var(--dim); margin-top:6px; }
/* Approval Card */
.approval-card { background:var(--card); border:1px solid var(--border); border-radius:var(--radius); padding:14px; }
.approval-card.pending { border-left:3px solid var(--warning); }
.approval-card.duplicate { border-left:3px solid var(--danger); }
.approval-card .approval-header { display:flex; align-items:center; gap:8px; margin-bottom:8px; }
.approval-card .approval-type { font-size:0.68em; padding:1px 8px; border-radius:8px; background:var(--accent-light); color:var(--accent); }
.approval-card .approval-type.duplicate-tag { background:#fde8e8; color:var(--danger); }
.approval-card .approval-title { font-weight:600; font-size:0.9em; }
.approval-card .approval-body { font-size:0.78em; color:#666; line-height:1.5; }
.approval-card .approval-actions { display:flex; gap:8px; margin-top:10px; }
.approval-card .approval-actions button { font-size:0.75em; padding:5px 14px; border-radius:6px; border:1px solid var(--border); cursor:pointer; background:#fff; }
.approval-card .approval-actions .btn-accept { background:var(--accent); color:#fff; border-color:var(--accent); }
.approval-card .approval-actions .btn-reject { color:var(--danger); border-color:var(--danger); }
.approval-card .approval-actions .btn-rewrite { color:#666; }
/* Duplicate warning */
.dup-warning { background:#fde8e8; border:1px solid var(--danger); border-radius:var(--radius); padding:10px 14px; margin-top:10px; font-size:0.75em; }
.dup-warning .dup-title { font-weight:600; color:var(--danger); margin-bottom:4px; }
.dup-item { display:flex; align-items:center; justify-content:space-between; padding:6px 0; border-bottom:1px solid #f5c6c6; }
.dup-item:last-child { border-bottom:none; }
.dup-sim { color:var(--danger); font-weight:600; font-size:0.85em; }
/* SVG Mini Topology */
.mini-topo { width:100%; height:80px; margin:6px 0; background:#fafafa; border-radius:6px; display:flex; align-items:center; justify-content:center; }
.mini-topo svg { max-height:70px; }
/* ECharts area */
.echarts-area { width:100%; height:300px; border:1px solid var(--border); border-radius:var(--radius); background:#fafafa; }
.echarts-placeholder { display:flex; align-items:center; justify-content:center; height:100%; color:var(--dim); font-size:0.85em; }
/* Knowledge List */
.kb-list { }
.kb-item { display:flex; align-items:center; padding:10px 12px; border-bottom:1px solid var(--border); gap:12px; }
.kb-item:last-child { border-bottom:none; }
.kb-item .kb-status { width:8px; height:8px; border-radius:50%; flex-shrink:0; }
.kb-item .kb-status.pending { background:var(--warning); }
.kb-item .kb-status.approved { background:var(--accent); }
.kb-item .kb-status.rejected { background:var(--danger); }
.kb-item .kb-info { flex:1; }
.kb-item .kb-name { font-weight:500; font-size:0.85em; }
.kb-item .kb-meta { font-size:0.7em; color:var(--dim); }
.kb-item .kb-actions { display:flex; gap:6px; }
.kb-item button { font-size:0.7em; padding:3px 10px; border-radius:4px; border:1px solid var(--border); cursor:pointer; background:#fff; }
.kb-item button:hover { border-color:var(--accent); }
/* View toggle */
.view-toggle { display:flex; gap:0; margin-bottom:12px; }
.view-toggle button { padding:6px 16px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:0.8em; }
.view-toggle button:first-child { border-radius:var(--radius) 0 0 var(--radius); }
.view-toggle button:last-child { border-radius:0 var(--radius) var(--radius) 0; }
.view-toggle button.active { background:var(--accent); color:#fff; border-color:var(--accent); }
/* Stats */
.stats { display:flex; gap:12px; margin-bottom:14px; }
.stat-item { flex:1; text-align:center; padding:10px; border-radius:var(--radius); background:var(--accent-light); }
.stat-item .stat-num { font-size:1.5em; font-weight:700; color:var(--accent); }
.stat-item .stat-label { font-size:0.7em; color:var(--dim); }
/* Merge Dialog */
.merge-dialog { background:var(--card); border:2px solid var(--warning); border-radius:12px; padding:18px; }
.merge-dialog .merge-title { font-weight:600; font-size:0.9em; margin-bottom:8px; display:flex; align-items:center; gap:6px; }
/* Chat mock */
.chat-area { background:#f0f0f0; border-radius:var(--radius); padding:20px; min-height:240px; }
.chat-msg { max-width:75%; margin-bottom:10px; }
.chat-msg.user { margin-left:auto; }
.chat-bubble { padding:8px 12px; border-radius:12px; font-size:0.82em; line-height:1.5; }
.chat-msg.user .chat-bubble { background:var(--accent); color:#fff; border-bottom-right-radius:4px; }
.chat-msg.bot .chat-bubble { background:#fff; border:1px solid #e0e0e0; border-bottom-left-radius:4px; }
.small-note { font-size:0.68em; color:var(--dim); margin-top:6px; }
</style>
</head>
<body style="padding:20px">
<!-- ============ H5 员工端 ============ -->
<div class="section">
<span class="section-label">H5 员工端</span>
<h2>📱 分诊交互 + 置信门控</h2>
<div class="grid grid-2">
<!-- 左侧:分诊置顶卡片 -->
<div class="card-mock" style="min-height:360px">
<div class="chat-area">
<!-- AI 回答 -->
<div class="chat-msg bot">
<div class="chat-bubble" style="position:relative">
<div style="display:flex;align-items:center;gap:6px;margin-bottom:4px">
<span style="font-size:0.65em;color:var(--dim)">AI 助手</span>
<span style="font-size:0.6em;margin-left:auto;color:#f0a000">🟡 72%</span>
</div>
您好!关于 Outlook 登录失败的问题,我先帮您分诊确认几个信息 👇
</div>
</div>
<!-- 置顶分诊卡片 -->
<div style="margin:10px 0">
<div class="triage-card">
<span class="triage-badge">🤖 AI 分诊</span>
<div class="triage-step">问题确认 · 第 1/3 步</div>
<div class="triage-title">Outlook 是否弹出了具体的错误提示?</div>
<div class="triage-option">
<div class="dot"></div>
<span>弹出了,提示「无法连接到服务器」</span>
<span class="prob">68%</span>
</div>
<div class="triage-option">
<div class="dot"></div>
<span>弹出了,提示「密码错误」</span>
<span class="prob">22%</span>
</div>
<div class="triage-option">
<div class="dot"></div>
<span>没有弹出任何提示,直接闪退</span>
<span class="prob">8%</span>
</div>
<div class="triage-option">
<div class="dot"></div>
<span>其他情况</span>
<span class="prob">2%</span>
</div>
<div class="triage-footer">
<span class="triage-expert">专家模式(一键多步)</span>
<div class="triage-toggle on"></div>
</div>
</div>
</div>
<!-- 转人工入口 -->
<div style="text-align:center;margin-top:8px;font-size:0.72em;color:var(--dim)">
没有匹配的选项?<a href="#" style="color:var(--accent)">🔔 转人工协助</a>
</div>
</div>
</div>
<!-- 右侧:置信门控横幅 -->
<div class="card-mock" style="min-height:360px">
<div class="chat-area">
<!-- 低置信场景 -->
<div class="chat-msg bot">
<div class="chat-bubble" style="position:relative">
<div style="display:flex;align-items:center;gap:6px;margin-bottom:4px">
<span style="font-size:0.65em;color:var(--dim)">AI 助手</span>
<span style="font-size:0.6em;margin-left:auto;color:var(--danger)">🔴 48%</span>
</div>
关于您描述的打印机故障,可能涉及硬件层面,我收集到以下上下文供坐席参考...
</div>
</div>
<!-- 置信门控横幅 -->
<div class="conf-banner warn">
<span class="conf-icon">⚠️</span>
<div>
<div class="conf-text">
<span class="conf-badge">置信度 48%</span>
低于安全阈值(70%),AI 可能无法准确回答
</div>
<div class="conf-snapshot">
已收集上下文:打印机型号 HP M404dn · 错误灯闪烁 · 最近更换过墨盒 · 网络连接正常
</div>
</div>
<span class="conf-transfer">转人工 →</span>
</div>
<!-- 已转人工确认 -->
<div class="chat-msg bot">
<div class="chat-bubble" style="background:#e8f5e9;border:1px solid var(--accent);color:var(--text);text-align:center">
✅ 已为您转接人工坐席<br>
<span style="font-size:0.72em;color:var(--dim)">预计等待 2 分钟,当前排队第 1 位</span>
</div>
</div>
</div>
<div class="small-note" style="padding:0 10px;">
📌 当 AI 置信度 &lt; 0.7 时置顶显示,含已收集的上下文快照
</div>
</div>
</div>
</div>
<!-- ============ 坐席端 ============ -->
<div class="section">
<span class="section-label">坐席端</span>
<h2>💬 内联审批卡片 + 拓扑预览 + 重复检测 + 代答排除</h2>
<!-- 审批卡片(带重复检测) -->
<div class="grid grid-3">
<div class="card-mock" style="min-height:320px">
<div style="font-size:0.78em;color:var(--dim);margin-bottom:8px">📋 会话中浮现的知识建议</div>
<div class="approval-card pending">
<div class="approval-header">
<span class="approval-type">💡 知识建议</span>
<span style="font-size:0.68em;color:var(--dim);margin-left:auto">置信 92%</span>
</div>
<div class="approval-title">Outlook 登录失败 → 检查密码是否过期</div>
<div class="approval-body">用户在 AD 域的密码每 90 天过期,需引导通过 CTRL+ALT+DEL → 更改密码。适用 Outlook 2019/365。</div>
<!-- 迷你拓扑 -->
<div class="mini-topo">
<svg viewBox="0 0 240 60" style="width:100%;height:60px">
<circle cx="60" cy="30" r="14" fill="#07C16020" stroke="#07C160" stroke-width="1.5"/>
<text x="60" y="34" text-anchor="middle" font-size="9" fill="#07C160">Issue</text>
<line x1="74" y1="30" x2="106" y2="30" stroke="#07C160" stroke-width="1.2" marker-end="url(#arrow)"/>
<circle cx="120" cy="30" r="14" fill="#ffc30020" stroke="#ffc300" stroke-width="1.5"/>
<text x="120" y="34" text-anchor="middle" font-size="9" fill="#b8860b">Action</text>
<line x1="134" y1="30" x2="166" y2="30" stroke="#07C160" stroke-width="1.2"/>
<circle cx="180" cy="30" r="14" fill="#e0e0e0" stroke="#999" stroke-width="1.5"/>
<text x="180" y="34" text-anchor="middle" font-size="9" fill="#666">Relation</text>
<defs><marker id="arrow" markerWidth="6" markerHeight="4" refX="6" refY="2" orient="auto"><polygon points="0 0, 6 2, 0 4" fill="#07C160"/></marker></defs>
</svg>
</div>
<div class="approval-actions">
<button class="btn-accept">✅ 采纳</button>
<button class="btn-reject">❌ 驳回</button>
<button class="btn-rewrite">✏️ 改写</button>
<select style="font-size:0.7em;margin-left:auto;padding:4px 8px;border-radius:4px;border:1px solid var(--border)">
<option>全员可见</option>
<option>仅坐席</option>
</select>
</div>
</div>
</div>
<!-- 重复检测卡片 -->
<div class="card-mock" style="min-height:320px">
<div style="font-size:0.78em;color:var(--dim);margin-bottom:8px">⚠️ 检测到重复知识</div>
<div class="approval-card duplicate">
<div class="approval-header">
<span class="approval-type duplicate-tag">⚠ 可能重复</span>
<span style="font-size:0.68em;color:var(--dim);margin-left:auto">置信 85%</span>
</div>
<div class="approval-title">Outlook 无法登录 → 密码重置</div>
<div class="approval-body">密码过期导致登录失败,需重置 AD 密码。覆盖 Outlook 2016/2019。</div>
<div class="dup-warning">
<div class="dup-title">⚠️ 发现 2 条相似知识</div>
<div class="dup-item">
<span>Outlook 登录失败 → 密码过期检查</span>
<span class="dup-sim">89%</span>
</div>
<div class="dup-item">
<span>邮箱密码过期重置流程</span>
<span class="dup-sim">76%</span>
</div>
</div>
<div class="approval-actions">
<button class="btn-accept">🔄 合并</button>
<button class="btn-reject">❌ 新建</button>
<button style="font-size:0.75em;padding:5px 14px;border-radius:6px;border:1px solid var(--border);cursor:pointer;background:#fff">✏️ 改写</button>
</div>
</div>
</div>
<!-- 代答排除 -->
<div class="card-mock" style="min-height:320px">
<div style="font-size:0.78em;color:var(--dim);margin-bottom:8px">✋ 坐席代答 + 排除控件</div>
<div style="padding:12px">
<div style="font-weight:600;font-size:0.85em;margin-bottom:8px">AI 推荐回复(1/3</div>
<div class="card" style="margin-bottom:8px;position:relative">
<div style="font-size:0.78em;line-height:1.5;padding-right:24px">
您好,Outlook 登录失败通常是密码过期导致的。请按 CTRL+ALT+DEL → 更改密码,新密码需包含大写、小写和数字。
</div>
<span style="position:absolute;top:6px;right:6px;cursor:pointer;font-size:0.8em;" title="排除此建议"></span>
</div>
<div class="card" style="margin-bottom:8px;opacity:0.6;position:relative">
<div style="font-size:0.78em;line-height:1.5;padding-right:24px;text-decoration:line-through">
请检查网络连接,确认可以 ping 通 exchange.servyou.com.cn。
</div>
<span style="position:absolute;top:6px;right:6px;cursor:pointer;font-size:0.8em;color:var(--danger)"></span>
<span style="font-size:0.6em;color:var(--danger)">已排除,不再推荐</span>
</div>
<div class="card" style="border:1px solid var(--accent);position:relative">
<div style="font-size:0.78em;line-height:1.5;padding-right:24px">
如果密码修改后仍无法登录,建议使用 Web 版 OWA 临时访问:https://mail.servyou.com.cn
</div>
<span style="position:absolute;top:6px;right:6px;cursor:pointer;color:var(--accent);font-size:0.8em" title="推荐此方案"></span>
</div>
<div class="small-note">Ctrl+1/2/3 快捷采纳 · 30s 倒计时 · ⭐ 标记为推荐</div>
</div>
</div>
</div>
</div>
<!-- ============ 管理后台 ============ -->
<div class="section">
<span class="section-label">管理后台</span>
<h2>⚙️ 知识迭代管理 · 图谱可视化 · 合并去重</h2>
<!-- 统计栏 -->
<div class="stats">
<div class="stat-item">
<div class="stat-num">12</div>
<div class="stat-label">待审核</div>
</div>
<div class="stat-item">
<div class="stat-num">47</div>
<div class="stat-label">已采纳</div>
</div>
<div class="stat-item">
<div class="stat-num">156</div>
<div class="stat-label">图中节点</div>
</div>
<div class="stat-item">
<div class="stat-num">3</div>
<div class="stat-label">重复待合并</div>
</div>
</div>
<!-- 视图切换 -->
<div class="view-toggle">
<button class="active">📋 列表视图</button>
<button>🔮 图谱视图</button>
</div>
<div class="grid grid-2">
<!-- 知识列表 -->
<div>
<div class="kb-list card">
<div class="kb-item">
<div class="kb-status pending"></div>
<div class="kb-info">
<div class="kb-name">Outlook 登录失败 → 密码过期检查</div>
<div class="kb-meta">置信 92% · 全员可见 · 3 分钟前</div>
</div>
<div class="kb-actions">
<button style="color:var(--accent)">审核</button>
</div>
</div>
<div class="kb-item">
<div class="kb-status pending"></div>
<div class="kb-info">
<div class="kb-name">打印机 HP M404 卡纸 → 清洁搓纸轮</div>
<div class="kb-meta">置信 85% · IT 设备 · 5 分钟前</div>
</div>
<div class="kb-actions">
<button style="color:var(--accent)">审核</button>
<button style="color:var(--danger);font-size:0.65em">⚠ 重复</button>
</div>
</div>
<div class="kb-item">
<div class="kb-status pending"></div>
<div class="kb-info">
<div class="kb-name">VPN 连接超时 → 切换协议 IKEv2</div>
<div class="kb-meta">置信 78% · 全员可见 · 12 分钟前</div>
</div>
<div class="kb-actions">
<button style="color:var(--accent)">审核</button>
</div>
</div>
<div class="kb-item">
<div class="kb-status approved"></div>
<div class="kb-info">
<div class="kb-name">WiFi 自动断开 → 更新网卡驱动</div>
<div class="kb-meta">已采纳 · 全员可见 · 1 小时前</div>
</div>
</div>
<div class="kb-item">
<div class="kb-status approved"></div>
<div class="kb-info">
<div class="kb-name">蓝屏 0x0000007B → 检查磁盘模式 AHCI</div>
<div class="kb-meta">已采纳 · IT 设备 · 2 小时前</div>
</div>
</div>
</div>
</div>
<!-- ECharts 图谱 -->
<div>
<div class="echarts-area">
<svg viewBox="0 0 400 300" style="width:100%;height:100%">
<!-- Connections -->
<line x1="200" y1="45" x2="80" y2="140" stroke="#07C16040" stroke-width="1.5"/>
<line x1="200" y1="45" x2="320" y2="140" stroke="#07C16040" stroke-width="1.5"/>
<line x1="80" y1="140" x2="80" y2="230" stroke="#f0a00040" stroke-width="1.5"/>
<line x1="320" y1="140" x2="320" y2="230" stroke="#07C16040" stroke-width="1.5"/>
<line x1="80" y1="230" x2="320" y2="230" stroke="#e0e0e0" stroke-width="1" stroke-dasharray="4"/>
<!-- Nodes -->
<circle cx="200" cy="45" r="22" fill="#07C160" opacity="0.15"/>
<circle cx="200" cy="45" r="22" fill="none" stroke="#07C160" stroke-width="2"/>
<text x="200" y="40" text-anchor="middle" font-size="8" fill="#666">问题</text>
<text x="200" y="55" text-anchor="middle" font-size="7" fill="#07C160">登录</text>
<circle cx="80" cy="140" r="20" fill="#ffc30020"/>
<circle cx="80" cy="140" r="20" fill="none" stroke="#f0a000" stroke-width="1.5"/>
<text x="80" y="136" text-anchor="middle" font-size="8" fill="#666">处置</text>
<text x="80" y="149" text-anchor="middle" font-size="7" fill="#b8860b">密码</text>
<circle cx="320" cy="140" r="20" fill="#07C16020"/>
<circle cx="320" cy="140" r="20" fill="none" stroke="#07C160" stroke-width="1.5"/>
<text x="320" y="136" text-anchor="middle" font-size="8" fill="#666">处置</text>
<text x="320" y="149" text-anchor="middle" font-size="7" fill="#07C160">OWA</text>
<circle cx="80" cy="230" r="16" fill="#e0e0e0"/>
<circle cx="80" cy="230" r="16" fill="none" stroke="#999" stroke-width="1"/>
<text x="80" y="233" text-anchor="middle" font-size="7" fill="#999">AD域</text>
<circle cx="320" cy="230" r="16" fill="#e0e0e0"/>
<circle cx="320" cy="230" r="16" fill="none" stroke="#999" stroke-width="1"/>
<text x="320" y="233" text-anchor="middle" font-size="7" fill="#999">Web版</text>
</svg>
</div>
<div class="small-note" style="text-align:center;margin-top:8px">
📌 Issue(蓝绿)→ Action(橙色)→ Relation(灰)| 拖拽可移动 · 滚轮缩放
</div>
</div>
</div>
<!-- 合并去重弹窗 -->
<div class="merge-dialog" style="margin-top:16px">
<div class="merge-title">⚠️ 检测到重复知识 — 建议合并</div>
<div class="grid grid-2" style="margin-top:10px">
<div class="card" style="background:#fafafa">
<div style="font-size:0.72em;color:var(--accent);margin-bottom:4px">源(保留)</div>
<div style="font-weight:500;font-size:0.82em">Outlook 登录失败 → 密码过期检查</div>
<div style="font-size:0.7em;color:var(--dim);margin-top:4px">置信 92% · 3 次采纳 · 标签: outlook, password, ad</div>
</div>
<div class="card" style="background:#fde8e8">
<div style="font-size:0.72em;color:var(--danger);margin-bottom:4px">目标(合并入)</div>
<div style="font-weight:500;font-size:0.82em">Outlook 无法登录 → 密码重置</div>
<div style="font-size:0.7em;color:var(--dim);margin-top:4px">置信 85% · 1 次采纳 · 标签: outlook, password</div>
<div style="font-size:0.7em;color:var(--danger);margin-top:2px">相似度: 89%</div>
</div>
</div>
<div style="text-align:right;margin-top:12px">
<button style="padding:6px 20px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer">取消</button>
<button style="padding:6px 20px;border-radius:6px;border:none;background:var(--accent);color:#fff;cursor:pointer;margin-left:8px">执行合并</button>
</div>
</div>
<!-- 审核弹窗中的图谱 -->
<div style="margin-top:16px;padding:14px;border:1px solid var(--border);border-radius:var(--radius)">
<div style="font-weight:600;font-size:0.85em;margin-bottom:8px">🔍 图谱编辑 — 审核知识条目</div>
<div style="display:flex;gap:16px">
<div style="flex:1">
<label style="font-size:0.72em;color:var(--dim)">Issue(问题节点)</label>
<input type="text" value="Outlook 登录失败" style="width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:4px;margin:4px 0;font-size:0.82em"/>
<label style="font-size:0.72em;color:var(--dim)">Action(处置方案)</label>
<input type="text" value="检查密码是否过期并引导重置" style="width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:4px;margin:4px 0;font-size:0.82em"/>
<label style="font-size:0.72em;color:var(--dim)">Relation(关联节点)</label>
<input type="text" value="AD域密码策略" style="width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:4px;margin:4px 0;font-size:0.82em"/>
<label style="font-size:0.72em;color:var(--dim)">Parent Issue(父问题)</label>
<input type="text" value="邮箱客户端问题" style="width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:4px;margin:4px 0;font-size:0.82em"/>
</div>
<div style="width:160px;background:#fafafa;border-radius:var(--radius);display:flex;align-items:center;justify-content:center">
<svg viewBox="0 0 140 200" style="width:100%">
<circle cx="70" cy="30" r="16" fill="#07C16020" stroke="#07C160" stroke-width="1.5"/>
<text x="70" y="34" text-anchor="middle" font-size="8" fill="#07C160">邮箱客户端</text>
<line x1="70" y1="46" x2="70" y2="74" stroke="#07C160" stroke-width="1.2"/>
<circle cx="70" cy="85" r="16" fill="#07C16020" stroke="#07C160" stroke-width="1.5"/>
<text x="70" y="89" text-anchor="middle" font-size="8" fill="#07C160">登录失败</text>
<line x1="70" y1="101" x2="70" y2="129" stroke="#f0a000" stroke-width="1.2"/>
<circle cx="70" cy="140" r="16" fill="#ffc30020" stroke="#f0a000" stroke-width="1.5"/>
<text x="70" y="144" text-anchor="middle" font-size="8" fill="#b8860b">密码重置</text>
<line x1="70" y1="156" x2="70" y2="179" stroke="#999" stroke-width="1"/>
<circle cx="70" cy="188" r="12" fill="#f0f0f0" stroke="#999" stroke-width="1"/>
<text x="70" y="191" text-anchor="middle" font-size="7" fill="#999">AD域</text>
</svg>
</div>
</div>
</div>
</div>
<!-- ============ 流程闭合 ============ -->
<div class="section">
<span class="section-label">全链路</span>
<h2>🔄 会话关闭 → 自动生成知识建议 → 训练师审核 → 写图</h2>
<div style="display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;padding:20px 0">
<div class="card" style="text-align:center;width:130px">
<div style="font-size:1.5em">💬</div>
<div style="font-weight:600;font-size:0.78em">会话关闭</div>
<div style="font-size:0.65em;color:var(--dim)">resolve API</div>
</div>
<span style="font-size:1.3em;color:var(--accent)"></span>
<div class="card" style="text-align:center;width:130px">
<div style="font-size:1.5em">🤖</div>
<div style="font-weight:600;font-size:0.78em">Dify 生成</div>
<div style="font-size:0.65em;color:var(--dim)">异步 ensure_future</div>
</div>
<span style="font-size:1.3em;color:var(--accent)"></span>
<div class="card" style="text-align:center;width:130px">
<div style="font-size:1.5em"></div>
<div style="font-weight:600;font-size:0.78em">Pending</div>
<div style="font-size:0.65em;color:var(--dim)">等待审核</div>
</div>
<span style="font-size:1.3em;color:var(--accent)"></span>
<div class="card" style="text-align:center;width:130px">
<div style="font-size:1.5em"></div>
<div style="font-weight:600;font-size:0.78em">审批通过</div>
<div style="font-size:0.65em;color:var(--dim)">训练师审核</div>
</div>
<span style="font-size:1.3em;color:var(--accent)"></span>
<div class="card" style="text-align:center;width:130px;border:1.5px solid var(--accent)">
<div style="font-size:1.5em">🔮</div>
<div style="font-weight:600;font-size:0.78em">写图</div>
<div style="font-size:0.65em;color:var(--dim)">Neo4j</div>
</div>
</div>
</div>
<p style="text-align:center;color:var(--dim);font-size:0.72em;margin:20px 0">
IT智能服务台 · 知识库迭代 v0.7.2 原型 v1 · 企微浅色风格 · accent=#07C160
</p>
</body>
</html>