Files
kefu_cloud/docs/spec/P0-00-开发需求文档-v1.0.html
T
yml2213 b424dfb9a0 docs: 设计稿按优先级重命名并调整目录归属
按需求文档模块优先级为 HTML 设计稿增加 P0/P1/P2 中文命名,
并将数据统计、系统设置从 admin 移至 agent,与客服端职责一致。
2026-07-15 10:57:38 +08:00

1026 lines
50 KiB
HTML
Raw 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.
<!-- Generated by Trae Work -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>在线客服系统(客服云)开发需求文档</title>
<style>
@font-face {
font-family: 'InstrumentSans';
src: url('./_shared/fonts/InstrumentSans-Regular.ttf') format('truetype');
font-weight: 400;
}
@font-face {
font-family: 'InstrumentSans';
src: url('./_shared/fonts/InstrumentSans-Bold.ttf') format('truetype');
font-weight: 700;
}
@font-face {
font-family: 'JetBrainsMono';
src: url('./_shared/fonts/JetBrainsMono-Regular.ttf') format('truetype');
font-weight: 400;
}
@font-face {
font-family: 'JetBrainsMono';
src: url('./_shared/fonts/JetBrainsMono-Bold.ttf') format('truetype');
font-weight: 700;
}
</style>
<style>
:root {
--bg: #ffffff;
--bg2: #f8fafc;
--ink: #0f172a;
--muted: #64748b;
--rule: #e2e8f0;
--accent: #2563eb;
--accent2: #0891b2;
--success: #16a34a;
--warning: #d97706;
--error: #dc2626;
--font: 'InstrumentSans', 'PingFang SC', 'Microsoft YaHei', -apple-system, BlinkMacSystemFont, sans-serif;
--font-mono: 'JetBrainsMono', 'Fira Code', 'Consolas', monospace;
--max: 980px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { font-size: 16px; scroll-behavior: smooth; }
body {
font-family: var(--font);
color: var(--ink);
background: var(--bg);
line-height: 1.7;
padding: 2rem 1rem;
font-size: 15px;
}
article.page {
max-width: var(--max);
margin: 0 auto;
}
header.doc-header {
padding: 3rem 0 2.5rem;
border-bottom: 1px solid var(--rule);
margin-bottom: 2.5rem;
}
header.doc-header h1 {
font-size: 2.25rem;
font-weight: 700;
line-height: 1.25;
margin-bottom: 0.75rem;
letter-spacing: -0.02em;
}
header.doc-header .subtitle {
color: var(--muted);
font-size: 1.05rem;
margin-bottom: 1.5rem;
}
header.doc-header .meta-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
gap: 0.75rem 1.5rem;
font-size: 0.9rem;
color: var(--muted);
}
header.doc-header .meta-grid strong {
color: var(--ink);
font-weight: 600;
}
main section {
margin-bottom: 3rem;
}
h2 {
font-size: 1.5rem;
font-weight: 700;
margin: 2.5rem 0 1rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid var(--accent);
display: inline-block;
letter-spacing: -0.01em;
}
h3 {
font-size: 1.2rem;
font-weight: 700;
margin: 2rem 0 0.75rem;
color: var(--ink);
}
h4 {
font-size: 1.05rem;
font-weight: 700;
margin: 1.5rem 0 0.5rem;
color: var(--ink);
}
p {
margin-bottom: 0.9rem;
color: var(--ink);
}
p.lead {
font-size: 1.05rem;
color: var(--muted);
margin-bottom: 1.25rem;
}
ul, ol {
margin: 0.75rem 0 1rem 1.5rem;
}
li {
margin-bottom: 0.45rem;
}
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
mark.key {
background: none;
color: var(--accent);
font-weight: 600;
}
.callout {
background: var(--bg2);
border-left: 4px solid var(--accent);
padding: 1rem 1.25rem;
margin: 1.25rem 0;
border-radius: 0 6px 6px 0;
}
.callout p:last-child { margin-bottom: 0; }
.callout.warning { border-left-color: var(--warning); }
.callout.error { border-left-color: var(--error); }
.callout.success { border-left-color: var(--success); }
.table-wrap {
overflow-x: auto;
overflow-y: auto;
max-height: 600px;
border: 1px solid var(--rule);
border-radius: 6px;
margin: 1rem 0 1.5rem;
}
table {
width: 100%;
border-collapse: collapse;
min-width: 640px;
font-size: 0.9rem;
}
th, td {
padding: 0.65rem 0.85rem;
text-align: left;
border-bottom: 1px solid var(--rule);
vertical-align: top;
}
th {
background: var(--bg2);
font-weight: 700;
color: var(--ink);
position: sticky;
top: 0;
z-index: 1;
}
tr:last-child td { border-bottom: none; }
tbody tr:hover { background: rgba(37, 99, 235, 0.03); }
code, .mono {
font-family: var(--font-mono);
font-size: 0.88em;
background: var(--bg2);
padding: 0.15rem 0.35rem;
border-radius: 4px;
color: var(--accent);
}
pre {
font-family: var(--font-mono);
background: var(--bg2);
padding: 1rem;
border-radius: 6px;
overflow-x: auto;
font-size: 0.85rem;
line-height: 1.6;
margin: 1rem 0;
border: 1px solid var(--rule);
}
.badge {
display: inline-block;
padding: 0.15rem 0.5rem;
border-radius: 999px;
font-size: 0.78rem;
font-weight: 600;
line-height: 1.4;
}
.badge-p0 { background: #fee2e2; color: #991b1b; }
.badge-p1 { background: #ffedd5; color: #9a3412; }
.badge-p2 { background: #dbeafe; color: #1e40af; }
figure.diagram {
margin: 1.5rem 0;
text-align: center;
}
figure.diagram figcaption {
font-size: 0.85rem;
color: var(--muted);
margin-top: 0.75rem;
}
.mermaid {
background: var(--bg2);
padding: 1rem;
border-radius: 6px;
border: 1px solid var(--rule);
}
.two-col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
margin: 1rem 0;
}
.two-col ul { margin-left: 1.25rem; }
.feature-card {
border: 1px solid var(--rule);
border-radius: 8px;
padding: 1.25rem;
margin: 1rem 0;
background: var(--bg);
}
.feature-card h4 { margin-top: 0; }
.feature-card p:last-child { margin-bottom: 0; }
.kpi-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 1rem;
margin: 1rem 0;
}
.kpi-card {
background: var(--bg2);
border: 1px solid var(--rule);
border-radius: 8px;
padding: 1rem;
}
.kpi-card .label {
font-size: 0.8rem;
color: var(--muted);
margin-bottom: 0.35rem;
}
.kpi-card .value {
font-size: 1.35rem;
font-weight: 700;
color: var(--accent);
}
footer {
margin-top: 4rem;
padding-top: 2rem;
border-top: 1px solid var(--rule);
color: var(--muted);
font-size: 0.85rem;
}
@media (max-width: 768px) {
body { padding: 1rem 0.75rem; font-size: 14px; }
header.doc-header h1 { font-size: 1.65rem; }
h2 { font-size: 1.25rem; }
.two-col { grid-template-columns: 1fr; }
}
@media print {
body { padding: 0; }
header.doc-header, section { page-break-inside: avoid; }
.callout { break-inside: avoid; }
}
</style>
</head>
<body>
<article class="page">
<header class="doc-header">
<h1>在线客服系统(客服云)开发需求文档</h1>
<p class="subtitle">基于设计稿的 SaaS 多租户客服平台产品需求规格说明书</p>
<div class="meta-grid">
<div><strong>文档版本</strong> v1.0</div>
<div><strong>编写日期</strong> 2026-07-11</div>
<div><strong>产品名称</strong> 客服云</div>
<div><strong>交付形态</strong> SaaS / 多租户</div>
<div><strong>目标读者</strong> 产品经理、前端/后端工程师、测试、UI 设计师</div>
<div><strong>需求深度</strong> 中等偏重</div>
</div>
</header>
<main>
<section id="overview">
<h2>1 项目概述</h2>
<p class="lead">客服云是一款面向中小企业及大型组织的 SaaS 多租户在线客服平台,帮助企业通过网页聊天窗口、微信公众号、APP 内嵌、电话工单、邮件等统一渠道接待访客,并配套客服工作台、客户管理、知识库、数据统计与平台运营管理能力。</p>
<h3>1.1 产品定位</h3>
<p>产品采用 <mark class="key">多租户隔离</mark> 架构,每个租户拥有独立的客服团队、客户数据、知识库、渠道配置和统计报表。平台运营方通过管理端进行租户开通、套餐定价、系统运维监控和运营数据分析。客服端与管理端共享同一套账号与权限体系,但功能入口和数据范围完全不同。</p>
<h3>1.2 业务目标</h3>
<ul>
<li>为租户提供 <mark class="key">全渠道、实时、可配置</mark> 的客户服务能力,缩短访客等待时间并提升首次解决率。</li>
<li>为客服主管提供可视化的 <mark class="key">服务数据与绩效报表</mark>,支持基于数据的团队管理与流程优化。</li>
<li>为平台运营方提供 <mark class="key">租户生命周期管理、订阅计费与系统运维</mark> 能力,支撑 SaaS 商业化运转。</li>
</ul>
<h3>1.3 范围边界</h3>
<div class="two-col">
<div>
<h4>范围内</h4>
<ul>
<li>客服工作台实时会话</li>
<li>访客端聊天 Widget</li>
<li>客户管理与标签体系</li>
<li>对话记录查询与审计</li>
<li>知识库与快捷回复</li>
<li>客服数据统计</li>
<li>渠道与系统设置</li>
<li>租户管理、套餐定价</li>
<li>运营概览与系统运维</li>
</ul>
</div>
<div>
<h4>范围外(本期不做)</h4>
<ul>
<li>AI 机器人自动回复(预留接口)</li>
<li>电话呼叫实时软交换</li>
<li>第三方支付对接</li>
<li>移动端原生 App</li>
<li>多语言国际化(仅中文)</li>
<li>私有化部署安装包</li>
</ul>
</div>
</div>
</section>
<section id="users">
<h2>2 用户角色与使用场景</h2>
<h3>2.1 角色定义</h3>
<div class="table-wrap">
<table>
<thead>
<tr><th>角色</th><th>使用端</th><th>主要职责</th><th>数据范围</th></tr>
</thead>
<tbody>
<tr><td>平台管理员</td><td>运营管理端</td><td>租户开通、套餐管理、系统运维、平台公告、运营监控</td><td>全平台租户与系统级数据</td></tr>
<tr><td>租户管理员</td><td>客服工作台 + 设置</td><td>渠道配置、客服账号管理、分配规则、工作时间、权限配置</td><td>本租户全部数据</td></tr>
<tr><td>客服主管</td><td>客服工作台 + 统计</td><td>实时监控会话、查看团队绩效、处理升级投诉、管理知识库</td><td>本租户全部客服数据</td></tr>
<tr><td>一线客服</td><td>客服工作台</td><td>接待访客、回复消息、标记客户、使用知识库、结束会话</td><td>自己被分配的会话与客户</td></tr>
<tr><td>网站访客</td><td>访客聊天窗口</td><td>发起咨询、查看欢迎语、选择快捷问题、收发文本/图片消息</td><td>个人会话数据</td></tr>
</tbody>
</table>
</div>
<h3>2.2 核心场景</h3>
<ol>
<li><strong>访客咨询</strong>:访客在租户网站点击聊天按钮 → Widget 加载欢迎语与快捷问题 → 访客发送消息 → 系统按分配规则转接给在线客服 → 客服回复并解决问题 → 访客收到满意度评价邀请。</li>
<li><strong>客服接待</strong>:客服登录工作台 → 在会话列表查看待处理/进行中的会话 → 点击会话进入聊天区 → 查看右侧客户资料 → 使用知识库/快捷回复回复 → 标记会话优先级 → 结束会话并填写备注。</li>
<li><strong>主管复盘</strong>:主管进入数据统计 → 查看总会话量、平均响应时长、满意度、首次解决率 → 下钻到客服绩效排行 → 针对响应慢的客服进行培训或调整排班。</li>
<li><strong>租户开通</strong>:平台管理员在租户管理点击「开通新账号」→ 填写公司、联系人、套餐、坐席数、时长 → 系统自动创建租户并发送登录信息 → 租户管理员登录后配置渠道与客服。</li>
</ol>
</section>
<section id="architecture">
<h2>3 系统架构概览</h2>
<p>系统由四个逻辑端组成:<mark class="key">访客端 Widget</mark><mark class="key">客服工作台</mark><mark class="key">运营管理端</mark><mark class="key">平台服务层</mark>。所有业务数据按租户隔离,平台管理员可跨租户查看运营汇总数据。</p>
<figure class="diagram">
<pre class="mermaid">
flowchart TB
subgraph 访客端
W[网页聊天 Widget]
WX[微信公众号]
APP[APP 内嵌 SDK]
end
subgraph 客服端
A[客服工作台]
S[系统设置]
ST[数据统计]
end
subgraph 管理端
OV[运营概览]
TN[租户管理]
PL[套餐定价]
OP[系统运维]
end
subgraph 平台服务层
GW[接入网关]
IM[实时消息服务]
CS[客服业务服务]
KB[知识库服务]
AN[分析服务]
DB[(租户隔离数据库)]
end
W --> GW
WX --> GW
APP --> GW
GW --> IM
IM --> CS
A --> IM
A --> CS
S --> CS
ST --> AN
OV --> AN
TN --> CS
PL --> CS
OP --> CS
CS --> DB
AN --> DB
</pre>
<figcaption>图 1:客服云四端逻辑架构</figcaption>
</figure>
<h3>3.1 关键设计约束</h3>
<ul>
<li><strong>租户隔离</strong>:每个租户拥有独立的数据空间,客服只能看到本租户的访客、客户和会话。</li>
<li><strong>实时消息</strong>:访客与客服之间的消息通过 WebSocket 长连接推送,断线后支持消息补发与重连。</li>
<li><strong>渠道抽象</strong>:网页、微信、APP 等渠道统一抽象为「会话来源」,客服工作台以一致界面接待。</li>
<li><strong>套餐配额</strong>:租户可用的坐席数、知识库容量、对话记录保存时长、报表功能受套餐限制。</li>
</ul>
</section>
<section id="features-overview">
<h2>4 功能需求总览</h2>
<p>下表汇总了本期需要实现的全部功能模块。每个模块在后续章节中给出详细的业务逻辑、交互规则、字段约束与边界说明。</p>
<div class="table-wrap">
<table>
<thead>
<tr><th style="width:50px">#</th><th style="width:120px">模块</th><th>功能描述</th><th style="width:80px">优先级</th></tr>
</thead>
<tbody>
<tr><td>1</td><td>客服工作台</td><td>三栏式工作台:左侧会话列表(按紧急/等待/进行中分组并显示未读数)、中间聊天区(文本/图片消息、输入状态、工具栏)、右侧客户信息面板(资料、标签、备注、活跃数据)。支持会话优先级标记、转接、结束会话与内部备注。</td><td><span class="badge badge-p0">P0</span></td></tr>
<tr><td>2</td><td>访客聊天窗口</td><td>可嵌入任意网页的浮动聊天组件,尺寸约 400×600 px,支持欢迎语、快捷问题、文本/图片输入、客服头像与名称展示、正在输入提示、满意度评价入口。通过一行脚本代码接入。</td><td><span class="badge badge-p0">P0</span></td></tr>
<tr><td>3</td><td>客户管理</td><td>客户列表支持按标签、状态、来源筛选与搜索;列表展示客户名称、联系方式、标签、对话次数、满意度、待处理数;右侧 360 px 抽屉展示客户详情、会话历史、备注与标签编辑。</td><td><span class="badge badge-p1">P1</span></td></tr>
<tr><td>4</td><td>对话记录</td><td>按渠道、客服、状态、日期筛选历史会话;左侧会话卡片展示访客摘要、最后消息、状态;右侧详情面板展示完整消息流、客服操作记录、满意度评分与文字评价。</td><td><span class="badge badge-p1">P1</span></td></tr>
<tr><td>5</td><td>知识库</td><td>左侧分类树(产品常见问题、售后服务、技术支持、政策条款、快捷回复模板),右侧知识条目列表展示标题、状态、使用频率、更新时间;支持新建/编辑/发布/草稿/删除。</td><td><span class="badge badge-p1">P1</span></td></tr>
<tr><td>6</td><td>数据统计</td><td>首页展示 4 个 KPI 卡片(总会话量、平均响应时长、客户满意度、首次解决率)与 4 个图表(会话量趋势折线图、响应时长分布柱状图、渠道来源占比环形图、客服绩效排行条形图)。支持时间范围切换。</td><td><span class="badge badge-p1">P1</span></td></tr>
<tr><td>7</td><td>系统设置</td><td>左侧设置分类导航,包含基本设置、渠道管理、客服分配规则、权限管理、自动回复、工作时间、通知设置。渠道管理展示渠道类型、状态、接入代码与配置入口。</td><td><span class="badge badge-p1">P1</span></td></tr>
<tr><td>8</td><td>运营概览</td><td>平台级首页,展示租户总数、活跃租户、平台月收入、系统可用率 4 个 KPI;租户增长趋势图、套餐分布图、最近操作记录列表。</td><td><span class="badge badge-p2">P2</span></td></tr>
<tr><td>9</td><td>租户管理</td><td>租户列表展示公司名称、联系人、套餐、坐席数、开通/到期日期、状态;支持按状态筛选、搜索、查看、编辑、续费、暂停;右侧抽屉开通新账号表单。</td><td><span class="badge badge-p2">P2</span></td></tr>
<tr><td>10</td><td>套餐定价</td><td>展示基础版、专业版、企业版三类套餐卡片,列明坐席数量、对话记录保存、知识库容量、报表、API、渠道、自定义品牌、专属客服等权益;支持上下架与定价规则配置。</td><td><span class="badge badge-p2">P2</span></td></tr>
<tr><td>11</td><td>系统运维</td><td>服务状态看板(API、WebSocket、数据库、消息队列、CDN)、系统负载(CPU/内存/磁盘)、API 请求量与错误率折线图、操作日志、平台公告管理。</td><td><span class="badge badge-p2">P2</span></td></tr>
</tbody>
</table>
</div>
</section>
<section id="features-detail">
<h2>5 功能模块详细说明</h2>
<p>本章按模块给出业务逻辑、交互规则、字段约束与边界说明。每个模块均对应设计稿中的具体页面,页面布局与信息结构以设计稿为准。</p>
<h3>5.1 客服工作台</h3>
<figure class="diagram">
<pre class="mermaid">
flowchart LR
subgraph 左侧会话列表
A[紧急会话] --> B[等待中会话]
B --> C[进行中会话]
end
subgraph 中间聊天区
D[消息流] --> E[输入框/工具栏]
end
subgraph 右侧客户面板
F[客户资料] --> G[标签/备注]
G --> H[活跃数据]
end
A --> D
D --> F
</pre>
<figcaption>图 2:客服工作台三栏布局</figcaption>
</figure>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>客服登录后,工作台默认展示「我的会话」列表。会话按优先级分为 <strong>紧急</strong><strong>等待中</strong><strong>进行中</strong> 三类。系统根据分配规则将会话推送给客服;客服可手动领取等待中的会话,或将当前会话转接给其他在线客服。</p>
<p>会话状态流转:等待中 → 进行中 → 已结束。客服结束会话时需选择结束原因(已解决、无人回复、访客离开、转接等)。会话结束后,访客端仍可重新发起新会话。</p>
</div>
<div class="feature-card">
<h4>交互规则</h4>
<ul>
<li>点击左侧会话卡片,中间聊天区加载该会话的消息流,并滚动至最新消息。</li>
<li>新消息到达时,会话卡片显示未读数并高亮;当前选中的会话自动标记已读。</li>
<li>输入框支持 Enter 发送、Shift+Enter 换行;支持粘贴图片与点击上传图片。</li>
<li>右侧客户面板展示客户名称、联系方式、来源渠道、标签、备注、对话次数、满意度、待处理数。</li>
<li>工具栏提供快捷回复、知识库搜索、转接、结束会话、优先级标记。</li>
</ul>
</div>
<div class="feature-card">
<h4>字段与约束</h4>
<ul>
<li>文本消息:单条最多 2000 字符,支持换行。</li>
<li>图片消息:单张不超过 5 MB,支持 jpg/png/gif,发前压缩预览。</li>
<li>内部备注:仅客服可见,每条最多 500 字符,按时间倒序展示。</li>
<li>会话优先级:紧急(红色)、等待中(黄色)、进行中(蓝色),客服可手动调整。</li>
</ul>
</div>
<h3>5.2 访客聊天窗口</h3>
<p>访客端 Widget 是一段可嵌入任意网页的脚本,通过 <code>script</code> 标签加载,传入租户渠道 ID 即可初始化。Widget 采用浮动窗口形态,默认右下角展开/收起。</p>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>Widget 加载后首先展示欢迎语与一组快捷问题。访客点击快捷问题或输入消息后,系统根据当前在线客服与分配规则建立会话。若当前无客服在线,展示「当前无客服在线,请留言」提示并收集联系方式。</p>
</div>
<div class="feature-card">
<h4>交互规则</h4>
<ul>
<li>展开尺寸约 400×600 px,收起状态为圆形悬浮按钮。</li>
<li>访客消息右侧蓝色气泡,客服消息左侧灰色气泡。</li>
<li>客服输入时,访客端显示「正在输入…」动画。</li>
<li>会话结束后弹出满意度评分(1–5 星)与文字评价输入框。</li>
<li>支持发送文本与图片,图片预览支持点击查看大图。</li>
</ul>
</div>
<div class="feature-card">
<h4>接入示例</h4>
<pre>&lt;script src="https://cs.example.com/widget.js" data-id="WK_8a3f2e"&gt;&lt;/script&gt;</pre>
</div>
<h3>5.3 客户管理</h3>
<p>客户管理用于沉淀访客信息,将匿名访客转化为可识别的客户资产。列表与详情抽屉组合展示,便于客服快速了解客户背景。</p>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>当访客在 Widget 中留下联系方式(手机/邮箱/微信)或客服手动完善资料后,系统自动创建或更新客户记录。客户状态包括 <strong>在线</strong><strong>离线</strong><strong>忙碌</strong>。系统根据最近一次交互时间自动计算沉默/活跃标签。</p>
</div>
<div class="feature-card">
<h4>交互规则</h4>
<ul>
<li>列表支持按客户名称、手机号、邮箱搜索。</li>
<li>筛选条件:标签(VIP、新客户、活跃、沉默、企业客户)、状态、来源渠道。</li>
<li>点击行进入右侧 360 px 详情抽屉,展示客户资料、历史会话、标签编辑、备注。</li>
<li>客服可在抽屉中为客户添加/移除标签,填写跟进备注。</li>
</ul>
</div>
<div class="feature-card">
<h4>字段与约束</h4>
<ul>
<li>客户名称:250 字符,必填。</li>
<li>手机号:中国大陆 11 位手机号格式校验。</li>
<li>邮箱:标准邮箱格式,非必填。</li>
<li>标签:多选,每个客户最多 10 个标签。</li>
<li>备注:最多 1000 字符,支持换行。</li>
</ul>
</div>
<h3>5.4 对话记录</h3>
<p>对话记录用于会话审计、质量抽检与纠纷追溯。所有客服与访客的往来消息、系统事件、客服操作均需持久化。</p>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>会话结束后,记录进入历史会话库。历史会话状态包括 <strong>进行中</strong><strong>已结束</strong><strong>已归档</strong>。主管可对重要会话进行归档,归档后不可再修改。</p>
</div>
<div class="feature-card">
<h4>交互规则</h4>
<ul>
<li>左侧会话卡片展示访客头像、昵称、最后消息、时间、状态标签。</li>
<li>筛选维度:渠道、客服、状态、日期范围。</li>
<li>右侧详情面板展示完整消息时间轴、客服转接/结束/备注等操作记录。</li>
<li>满意度评分与文字评价在详情底部展示。</li>
</ul>
</div>
<h3>5.5 知识库</h3>
<p>知识库为客服提供标准答案与快捷回复模板,降低培训成本并保证回复一致性。</p>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>知识条目归属一个分类,状态为 <strong>已发布</strong><strong>草稿</strong>。已发布条目可在客服工作台被搜索并一键插入聊天输入框。快捷回复模板是特殊的知识条目分类,用于高频话术。</p>
</div>
<div class="feature-card">
<h4>交互规则</h4>
<ul>
<li>左侧分类树支持展开/折叠,点击分类右侧展示该分类下条目。</li>
<li>条目列表展示标题、状态、使用频率进度条、更新时间。</li>
<li>支持新建/编辑/发布/撤回草稿/删除。</li>
<li>客服在工作台输入框敲击 <code>/</code> 可快速搜索快捷回复。</li>
</ul>
</div>
<div class="feature-card">
<h4>字段与约束</h4>
<ul>
<li>分类名称:2–30 字符,必填,不可重复。</li>
<li>条目标题:2100 字符,必填。</li>
<li>条目内容:最多 5000 字符,支持富文本(本期先支持纯文本)。</li>
<li>使用频率:按客服插入次数统计,按日/周/月更新。</li>
</ul>
</div>
<h3>5.6 数据统计</h3>
<p>数据统计面向客服主管与租户管理员,帮助其掌握服务负荷、团队绩效与访客满意度。</p>
<div class="kpi-grid">
<div class="kpi-card"><div class="label">总会话量</div><div class="value">12,580</div></div>
<div class="kpi-card"><div class="label">平均响应时长</div><div class="value">32s</div></div>
<div class="kpi-card"><div class="label">客户满意度</div><div class="value">4.8/5</div></div>
<div class="kpi-card"><div class="label">首次解决率</div><div class="value">86%</div></div>
</div>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>系统在会话生命周期中实时采集指标:会话量按小时/天聚合;首次响应时长取客服首次回复与访客首条消息的时间差;满意度取访客评价平均值;首次解决率取单次会话内即被解决且未再次发起的会话占比。</p>
</div>
<div class="feature-card">
<h4>图表与下钻</h4>
<ul>
<li>会话量趋势折线图:X 轴为时间,Y 轴为会话数,支持按日/周/月切换。</li>
<li>响应时长分布柱状图:分桶展示 0–10s、1030s、3060s、13min、>3min 的会话占比。</li>
<li>渠道来源占比环形图:网页、微信、APP、电话工单、邮件的会话占比。</li>
<li>客服绩效排行条形图:按接待量、平均响应时长、满意度排序。</li>
</ul>
</div>
<h3>5.7 系统设置</h3>
<p>系统设置是租户管理员配置服务规则与接入渠道的入口。</p>
<div class="feature-card">
<h4>设置分类</h4>
<ul>
<li><strong>基本设置</strong>:租户名称、Logo、客服昵称、时区、语言(本期仅中文)。</li>
<li><strong>渠道管理</strong>:网页聊天、微信公众号、APP 内嵌、电话客服、邮件工单的启用/禁用与接入配置。</li>
<li><strong>客服分配规则</strong>:轮询、负载均衡、熟客优先、指定客服。</li>
<li><strong>权限管理</strong>:角色创建、菜单权限、数据权限、操作权限。</li>
<li><strong>自动回复</strong>:欢迎语、离线留言提示、关键词自动回复(预留机器人扩展)。</li>
<li><strong>工作时间</strong>:每周工作时段、节假日设置、非工作时间提示语。</li>
<li><strong>通知设置</strong>:新会话提醒、离线消息通知、日报/周报推送。</li>
</ul>
</div>
<div class="feature-card">
<h4>渠道管理规则</h4>
<p>每个渠道生成唯一渠道 ID 与接入代码。网页聊天渠道提供一段 <code>script</code> 代码,租户将其复制到网站模板中即可生效。渠道启用/禁用即时生效,禁用后访客端提示「当前渠道已关闭」。</p>
</div>
<h3>5.8 运营概览(管理端)</h3>
<p>运营概览是平台管理员登录后的首页,展示平台级核心指标与趋势。</p>
<div class="kpi-grid">
<div class="kpi-card"><div class="label">租户总数</div><div class="value">156</div></div>
<div class="kpi-card"><div class="label">活跃租户</div><div class="value">138</div></div>
<div class="kpi-card"><div class="label">平台月收入</div><div class="value">¥89,400</div></div>
<div class="kpi-card"><div class="label">系统可用率</div><div class="value">99.95%</div></div>
</div>
<div class="feature-card">
<h4>展示内容</h4>
<ul>
<li>租户增长趋势折线图:近 30 天新增/累计租户数。</li>
<li>套餐分布图:各套餐租户占比。</li>
<li>最近操作记录:平台管理员的关键操作审计日志。</li>
</ul>
</div>
<h3>5.9 租户管理</h3>
<p>租户管理是 SaaS 平台运营的核心模块,覆盖租户从开通到续费、暂停、恢复的全生命周期。</p>
<div class="feature-card">
<h4>业务逻辑</h4>
<p>租户状态包括 <strong>正常</strong><strong>即将到期</strong><strong>已暂停</strong><strong>已过期</strong>。系统根据到期日期自动切换状态,并在到期前 7 天向租户管理员发送提醒。暂停/过期的租户无法登录客服端,但数据保留。</p>
</div>
<div class="feature-card">
<h4>开通新账号表单字段</h4>
<ul>
<li>公司名称:2–100 字符,必填,租户维度唯一。</li>
<li>联系人:230 字符,必填。</li>
<li>手机号:11 位手机号,必填,用于接收登录信息。</li>
<li>邮箱:标准邮箱格式,必填。</li>
<li>套餐:单选,来源套餐管理配置。</li>
<li>坐席数量:正整数,不得超过套餐上限,可额外购买。</li>
<li>开通时长:136 个月。</li>
<li>自动续费:开关,默认关闭。</li>
<li>备注:最多 500 字符,非必填。</li>
</ul>
</div>
<div class="feature-card">
<h4>操作权限</h4>
<ul>
<li>查看:打开租户详情抽屉,展示基本信息、套餐、到期时间、登录链接。</li>
<li>编辑:修改联系人、坐席数、备注,不可修改套餐与到期时间。</li>
<li>续费:延长到期时间或升级套餐,记录续费流水。</li>
<li>暂停/恢复:暂停后租户所有账号无法登录;恢复后即时生效。</li>
</ul>
</div>
<h3>5.10 套餐定价</h3>
<p>套餐定价定义租户可购买的商业化方案,不同套餐在功能权益与资源配额上存在差异。</p>
<div class="table-wrap">
<table>
<thead>
<tr><th>权益项</th><th>基础版</th><th>专业版</th><th>企业版</th></tr>
</thead>
<tbody>
<tr><td>月费参考</td><td>¥299/月</td><td>¥699/月</td><td>¥1999/月</td></tr>
<tr><td>坐席数量</td><td>2</td><td>10</td><td>50(可扩展)</td></tr>
<tr><td>对话记录保存</td><td>30 天</td><td>180 天</td><td>永久</td></tr>
<tr><td>知识库容量</td><td>50 条</td><td>500 条</td><td>不限</td></tr>
<tr><td>数据统计</td><td>基础报表</td><td>高级报表</td><td>自定义报表</td></tr>
<tr><td>API</td><td>不支持</td><td>基础 API</td><td>完整 API</td></tr>
<tr><td>渠道</td><td>网页</td><td>网页+微信+APP</td><td>全渠道</td></tr>
<tr><td>自定义品牌</td><td>不支持</td><td>支持</td><td>支持</td></tr>
<tr><td>专属客服</td><td>不支持</td><td>不支持</td><td>支持</td></tr>
</tbody>
</table>
</div>
<div class="feature-card">
<h4>定价规则</h4>
<ul>
<li>按月订阅,年付享受 8 折优惠。</li>
<li>超出套餐坐席按 ¥49/月/坐席 计费。</li>
<li>套餐支持上架/下架,下架后新租户不可购买,已购买租户可续费。</li>
<li>企业版可由平台管理员根据客户需求自定义报价。</li>
</ul>
</div>
<h3>5.11 系统运维</h3>
<p>系统运维面向平台技术团队,提供实时健康度监控、日志审计与平台公告能力。</p>
<div class="feature-card">
<h4>服务状态看板</h4>
<ul>
<li>监控项:API 服务、WebSocket 服务、数据库、消息队列、CDN。</li>
<li>状态:正常(绿色)、告警(黄色)、故障(红色)。</li>
<li>刷新频率:默认 30 秒,支持手动刷新。</li>
</ul>
</div>
<div class="feature-card">
<h4>系统负载与请求监控</h4>
<ul>
<li>CPU / 内存 / 磁盘使用率,超过阈值标红并触发告警。</li>
<li>API 请求量与错误率折线图,时间粒度 1 分钟/5 分钟/1 小时。</li>
</ul>
</div>
<div class="feature-card">
<h4>操作日志与公告</h4>
<ul>
<li>操作日志记录平台管理员的关键操作:租户开通、套餐修改、公告发布等。</li>
<li>平台公告支持发布、编辑、撤回;登录后首页弹窗展示最新未读公告。</li>
</ul>
</div>
</section>
<section id="data-model">
<h2>6 数据模型概览</h2>
<p>数据模型以租户 ID 作为全局隔离字段,所有业务表均包含 <code>tenant_id</code>。平台级管理表(套餐、平台管理员、系统运维)不包含租户字段。</p>
<figure class="diagram">
<pre class="mermaid">
erDiagram
TENANT ||--o{ USER : has
TENANT ||--o{ CHANNEL : owns
TENANT ||--o{ CUSTOMER : owns
TENANT ||--o{ SESSION : owns
TENANT ||--o{ KNOWLEDGE : owns
USER ||--o{ SESSION : serves
CUSTOMER ||--o{ SESSION : initiates
SESSION ||--o{ MESSAGE : contains
SESSION ||--o{ SESSION_EVENT : records
</pre>
<figcaption>图 3:核心实体关系</figcaption>
</figure>
<h3>6.1 核心实体说明</h3>
<div class="table-wrap">
<table>
<thead>
<tr><th>实体</th><th>关键字段</th><th>说明</th></tr>
</thead>
<tbody>
<tr><td>租户 Tenant</td><td>id, name, plan_id, seat_count, expire_at, status, contact_name, contact_phone, contact_email</td><td>SaaS 租户主表,决定数据隔离范围与套餐配额。</td></tr>
<tr><td>用户 User</td><td>id, tenant_id, role, username, password_hash, nickname, status, last_online_at</td><td>客服账号与平台管理员账号,通过 role 区分。</td></tr>
<tr><td>渠道 Channel</td><td>id, tenant_id, type, name, status, config, script_code</td><td>网页、微信、APP 等接入渠道配置。</td></tr>
<tr><td>客户 Customer</td><td>id, tenant_id, name, phone, email, tags, source, status, last_contact_at</td><td>访客沉淀后的客户资产。</td></tr>
<tr><td>会话 Session</td><td>id, tenant_id, channel_id, customer_id, agent_id, status, priority, satisfaction_score, created_at, ended_at</td><td>一次完整的客服接待过程。</td></tr>
<tr><td>消息 Message</td><td>id, session_id, sender_type, content, type, sent_at, seq</td><td>会话中的文本/图片/系统消息,seq 保证时序。</td></tr>
<tr><td>知识库 Knowledge</td><td>id, tenant_id, category_id, title, content, status, usage_count, created_at</td><td>知识条目与快捷回复模板。</td></tr>
<tr><td>套餐 Plan</td><td>id, name, price_monthly, seats, storage_days, kb_limit, features, status</td><td>平台级套餐定义。</td></tr>
</tbody>
</table>
</div>
<h3>6.2 租户隔离规则</h3>
<ul>
<li>所有客服端查询必须携带 <code>tenant_id</code> 过滤,禁止跨租户访问。</li>
<li>平台管理员查询运营数据时,可按租户聚合,但不暴露单笔客户/会话明细。</li>
<li>租户删除为软删除,数据保留 180 天后按合规策略清理。</li>
</ul>
</section>
<section id="interfaces">
<h2>7 接口需求概览</h2>
<p>接口按端划分为:访客端 SDK 接口、客服端业务接口、管理端运营接口、通用文件/消息接口。所有接口需鉴权并校验租户权限。</p>
<h3>7.1 接口分组</h3>
<div class="table-wrap">
<table>
<thead>
<tr><th>分组</th><th>典型接口</th><th>说明</th></tr>
</thead>
<tbody>
<tr><td>访客 Widget</td><td>初始化、发送消息、接收消息、上传图片、提交满意度</td><td>通过渠道 ID 鉴权,无需登录。</td></tr>
<tr><td>实时消息</td><td>WebSocket 连接、心跳、消息推送、已读回执、输入状态</td><td>使用 room 或 user 维度广播,按租户隔离。</td></tr>
<tr><td>会话管理</td><td>会话列表、会话详情、分配、转接、结束、备注</td><td>客服只能操作自己被分配的会话,主管可查看全部。</td></tr>
<tr><td>客户管理</td><td>客户 CRUD、标签管理、搜索筛选</td><td>手机号与邮箱格式校验。</td></tr>
<tr><td>知识库</td><td>分类 CRUD、条目 CRUD、搜索、插入统计</td><td>发布/草稿状态控制。</td></tr>
<tr><td>数据统计</td><td>KPI 查询、趋势图、分布图、绩效排行</td><td>支持按时间范围与维度聚合。</td></tr>
<tr><td>系统设置</td><td>租户配置、渠道配置、分配规则、权限角色</td><td>仅租户管理员及以上可操作。</td></tr>
<tr><td>租户管理</td><td>租户 CRUD、续费、暂停、恢复</td><td>仅平台管理员可操作。</td></tr>
<tr><td>系统运维</td><td>健康检查、负载查询、日志查询、公告管理</td><td>平台级接口。</td></tr>
</tbody>
</table>
</div>
<h3>7.2 通用要求</h3>
<ul>
<li>所有接口统一返回格式 <code>{ code, message, data }</code>,分页列表返回 <code>{ list, total, page, pageSize }</code></li>
<li>接口响应时间:P99 ≤ 500ms(不涉及大数据聚合的场景)。</li>
<li>文件上传接口返回 CDN 访问 URL,支持图片预览。</li>
<li>WebSocket 消息采用 JSON 格式,包含 <code>tenant_id</code><code>session_id</code><code>seq</code> 等字段。</li>
</ul>
</section>
<section id="metrics">
<h2>8 数据统计与埋点</h2>
<p>埋点服务于运营决策与产品优化,每个事件需明确触发时机与用途。</p>
<h3>8.1 核心指标定义</h3>
<div class="table-wrap">
<table>
<thead>
<tr><th>指标</th><th>定义</th><th>用途</th></tr>
</thead>
<tbody>
<tr><td>总会话量</td><td>选定时间范围内创建的会话总数</td><td>衡量租户服务负荷</td></tr>
<tr><td>平均响应时长</td><td>客服首次回复时间 − 访客首条消息时间,取平均值</td><td>衡量客服响应速度</td></tr>
<tr><td>客户满意度</td><td>访客评分总和 / 评分会话数,1–5 星</td><td>衡量服务质量</td></tr>
<tr><td>首次解决率</td><td>单次会话内解决且 24h 内未再次发起的会话占比</td><td>衡量一次解决能力</td></tr>
<tr><td>活跃租户数</td><td>当月产生过会话的租户数</td><td>衡量平台活跃度</td></tr>
<tr><td>系统可用率</td><td>(总时间 故障时间)/ 总时间</td><td>衡量平台稳定性</td></tr>
</tbody>
</table>
</div>
<h3>8.2 埋点事件</h3>
<ul>
<li><code>widget_open</code>:访客点击展开 Widget,用于分析入口转化。</li>
<li><code>message_sent</code>:访客/客服发送消息,携带消息类型与渠道。</li>
<li><code>session_assigned</code>:会话被分配,携带分配规则与等待时长。</li>
<li><code>session_ended</code>:会话结束,携带结束原因与满意度。</li>
<li><code>knowledge_used</code>:客服插入知识库条目,用于优化知识库内容。</li>
<li><code>tenant_created</code> / <code>tenant_renewed</code>:租户开通/续费,用于收入统计。</li>
</ul>
</section>
<section id="non-functional">
<h2>9 非功能性需求</h2>
<h3>9.1 性能</h3>
<ul>
<li>客服工作台首屏加载时间 ≤ 2 秒(千兆网络)。</li>
<li>访客 Widget 初始化时间 ≤ 1 秒,不影响宿主页面加载。</li>
<li>消息端到端延迟 ≤ 300ms(正常网络)。</li>
<li>单租户并发在线客服 ≥ 200 人,同时在线会话 ≥ 1000 个。</li>
</ul>
<h3>9.2 可用性与可靠性</h3>
<ul>
<li>平台级可用率目标 99.9%(月度)。</li>
<li>消息持久化后再推送,确保不丢消息。</li>
<li>支持 WebSocket 断线重连与消息补发。</li>
<li>核心数据每日备份,备份保留 30 天。</li>
</ul>
<h3>9.3 安全</h3>
<ul>
<li>所有接口使用 HTTPS/WSS,敏感字段传输加密。</li>
<li>账号密码加盐哈希存储,支持登录失败锁定。</li>
<li>租户数据严格隔离,接口层强制校验 <code>tenant_id</code></li>
<li>文件上传限制类型与大小,防止恶意文件。</li>
<li>操作日志完整记录管理员与客服的关键操作。</li>
</ul>
<h3>9.4 兼容性</h3>
<ul>
<li>客服工作台支持 Chrome、Firefox、Safari、Edge 最新两个主版本。</li>
<li>访客 Widget 支持 IE11 及以上现代浏览器。</li>
<li>响应式布局适配 1366×768 及以上分辨率。</li>
</ul>
</section>
<section id="roadmap">
<h2>10 风险、依赖与里程碑</h2>
<h3>10.1 主要风险</h3>
<div class="table-wrap">
<table>
<thead>
<tr><th>风险</th><th>影响</th><th>缓解措施</th></tr>
</thead>
<tbody>
<tr><td>WebSocket 高并发稳定性</td><td>消息延迟或掉线</td><td>使用成熟消息中间件,做压测与限流。</td></tr>
<tr><td>租户隔离逻辑遗漏</td><td>数据泄露</td><td>代码审查 + 自动化接口测试覆盖跨租户访问。</td></tr>
<tr><td>设计稿与实现偏差</td><td>返工</td><td>UI 还原检查清单,关键页面走查。</td></tr>
<tr><td>套餐配额校验遗漏</td><td>超卖或功能越权</td><td>在服务端统一校验套餐限制。</td></tr>
</tbody>
</table>
</div>
<h3>10.2 外部依赖</h3>
<ul>
<li>短信服务商:用于租户开通验证码与到期提醒。</li>
<li>邮件服务商:用于发送登录信息与日报。</li>
<li>对象存储/CDN:用于图片、文件、租户 Logo 存储。</li>
<li>微信公众号平台:用于微信渠道消息接入。</li>
</ul>
<h3>10.3 里程碑</h3>
<ol>
<li><strong>M1 需求评审</strong>:PRD 评审通过,输出接口定义与数据库设计。</li>
<li><strong>M2 核心会话</strong>:完成 WebSocket 消息、客服工作台、访客 Widget。</li>
<li><strong>M3 业务模块</strong>:完成客户管理、对话记录、知识库、数据统计。</li>
<li><strong>M4 平台能力</strong>:完成租户管理、套餐定价、系统设置、运营概览。</li>
<li><strong>M5 测试上线</strong>:完成集成测试、压力测试、安全审计,灰度发布。</li>
</ol>
</section>
<section id="acceptance">
<h2>11 验收标准</h2>
<p>以下条件作为本期交付的通过标准。</p>
<div class="table-wrap">
<table>
<thead>
<tr><th>#</th><th>验收项</th><th>通过标准</th></tr>
</thead>
<tbody>
<tr><td>1</td><td>访客咨询完整流程</td><td>访客发起 → 系统分配 → 客服回复 → 满意度评价,端到端无阻塞。</td></tr>
<tr><td>2</td><td>消息实时性</td><td>同一会话内,消息到达延迟 ≤ 300ms,断线重连后消息不丢失。</td></tr>
<tr><td>3</td><td>租户隔离</td><td>客服 A 无法查看/操作客服 B 所在租户的任何数据,接口返回 403。</td></tr>
<tr><td>4</td><td>套餐限制</td><td>基础版租户无法使用微信/APP 渠道,坐席数达到上限后无法新增客服。</td></tr>
<tr><td>5</td><td>数据统计准确性</td><td>KPI 数值与明细数据手工核对一致,图表数据与表格一致。</td></tr>
<tr><td>6</td><td>管理端租户生命周期</td><td>开通、续费、暂停、恢复流程正确,到期前提醒送达。</td></tr>
<tr><td>7</td><td>页面还原度</td><td>核心页面与设计稿一致度 ≥ 95%,交互状态完整。</td></tr>
<tr><td>8</td><td>性能</td><td>工作台首屏 ≤ 2s,Widget 初始化 ≤ 1s,核心接口 P99 ≤ 500ms。</td></tr>
</tbody>
</table>
</div>
</section>
<section id="appendix">
<h2>12 附录:设计稿对应关系</h2>
<p>下表列出 PRD 章节与设计稿 HTML 文件的对应关系,便于开发时快速查阅原始设计。</p>
<div class="table-wrap">
<table>
<thead>
<tr><th>设计稿文件</th><th>对应 PRD 章节</th><th>主要内容</th></tr>
</thead>
<tbody>
<tr><td>dashboard.html</td><td>5.1</td><td>客服工作台三栏布局</td></tr>
<tr><td>visitor-chat.html</td><td>5.2</td><td>访客端浮动聊天窗口</td></tr>
<tr><td>customer-management.html</td><td>5.3</td><td>客户列表与详情抽屉</td></tr>
<tr><td>chat-history.html</td><td>5.4</td><td>对话记录筛选与详情</td></tr>
<tr><td>knowledge-base.html</td><td>5.5</td><td>知识库分类与条目</td></tr>
<tr><td>statistics.html</td><td>5.6</td><td>KPI 与数据图表</td></tr>
<tr><td>settings.html</td><td>5.7</td><td>系统设置与渠道管理</td></tr>
<tr><td>admin-运营概览.html</td><td>5.8</td><td>平台运营概览</td></tr>
<tr><td>admin-tenants.html</td><td>5.9</td><td>租户管理</td></tr>
<tr><td>admin-plans.html</td><td>5.10</td><td>套餐定价</td></tr>
<tr><td>admin-ops.html</td><td>5.11</td><td>系统运维监控</td></tr>
<tr><td>admin-dashboard.html</td><td></td><td>空文件,未使用</td></tr>
</tbody>
</table>
</div>
</section>
</main>
<footer>
<p>文档版本 v1.0 · 2026-07-11 · 客服云产品团队</p>
</footer>
</article>
<script src="./_shared/js/mermaid.min.js"></script>
<script>
mermaid.initialize({ startOnLoad: true, theme: 'neutral', securityLevel: 'loose' });
</script>
</body>
</html>