Files
training-system/cc-center/呼叫中心系统开发方案.txt
2026-05-12 12:24:11 +08:00

1321 lines
135 KiB
Plaintext
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.

**文档版本**V1.0
**编制日期**2024年1月
**项目周期**4个月17周
---
## 一、开发方案概述
### 1.1 项目背景回顾
| 项目要素 | 内容 |
|---------|------|
| 业务范围 | 道路救援、家政服务、代驾服务 |
| 坐席规模 | 150坐席 |
| 日话务量 | 50,000通 |
| 技术路线 | 自研基于FreeSWITCH |
| 部署方式 | 私有化 + 主备高可用 |
### 1.2 开发目标
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 系统能力目标 │
├─────────────────────────────────────────────────────────────────────────┤
│ ✓ 150坐席并发 ✓ 120路并发通话 ✓ 99.9%可用性 │
│ ✓ 7×24小时服务 ✓ 故障30秒内切换 ✓ API响应<200ms │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## 二、系统架构设计
### 2.1 整体架构
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 外部系统 │
│ CRM系统 业务系统 阿里云语音 │
└──────────┬───────────────────────┬────────────────────┬─────────────────┘
│ │ │
│ REST API / WebSocket │
│ │ │
┌──────────▼───────────────────────▼────────────────────▼─────────────────┐
│ CTI中间件层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ API网关 │ │ 坐席服务 │ │ 呼叫服务 │ │ 外呼引擎 │ │
│ │ (Gateway) │ │ (Agent) │ │ (Call) │ │ (Dialer) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ ACD服务 │ │ 队列服务 │ │ 监控服务 │ │ 机器人服务 │ │
│ │ (ACD) │ │ (Queue) │ │ (Monitor) │ │ (Robot) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ ESL连接池 │ │ 事件分发器 │ │
│ │ (ESL Pool) │ │ (Dispatcher)│ │
│ └──────┬──────┘ └──────┬──────┘ │
└─────────┼────────────────┼──────────────────────────────────────────────┘
│ │
│ ESL协议 │
│ │
┌─────────▼────────────────▼──────────────────────────────────────────────┐
│ FreeSWITCH 媒体层 │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │mod_sofia│ │mod_dptools│ │mod_record│ │mod_lua │ │mod_event│ │ │
│ │ │ (SIP) │ │(Dialplan)│ │ (录音) │ │ (IVR) │ │ (ESL) │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ FreeSWITCH Core │
└─────────────────────────────────┬───────────────────────────────────────┘
SIP Trunk
┌─────────────────────────────────▼───────────────────────────────────────┐
│ 运营商网络 │
│ 400号码 / SIP中继线路 │
└─────────────────────────────────────────────────────────────────────────┘
```
### 2.2 技术选型
| 层级 | 组件 | 技术选型 | 说明 |
|------|------|---------|------|
| **媒体层** | 软交换 | FreeSWITCH 1.10.x | 开源、稳定、功能完善 |
| | SIP协议 | mod_sofia | FreeSWITCH内置 |
| | IVR脚本 | Lua | 灵活、性能好 |
| **中间件层** | 开发语言 | Java 17 + Spring Boot 3 | 团队熟悉、生态成熟 |
| | ESL客户端 | 自研基于Netty | 更好的连接管理 |
| | API框架 | Spring WebFlux | 响应式、高性能 |
| | WebSocket | Spring WebSocket | 事件实时推送 |
| **数据层** | 关系数据库 | MySQL 8.0 | 主从复制、读写分离 |
| | 缓存 | Redis 7.0 | Sentinel高可用 |
| | 消息队列 | RabbitMQ | 异步解耦 |
| | 文件存储 | MinIO / NAS | 录音存储 |
| **前端** | 软电话条 | Vue 3 + TypeScript | 组件化、类型安全 |
| | 监控大屏 | Vue 3 + ECharts | 数据可视化 |
| **运维** | 容器化 | Docker + Docker Compose | 简化部署 |
| | 监控 | Prometheus + Grafana | 指标监控 |
| | 日志 | ELK Stack | 日志收集分析 |
| **外部服务** | ASR/TTS | 阿里云智能语音 | 按需调用 |
| | NLU | 指定对话平台 | 意图识别 |
### 2.3 模块划分
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 系统模块划分 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ callcenter-platform │ │
│ │ (父工程) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────┼──────────────────────────┐ │
│ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ common │ │ esl │ │ core │ │ api │ │ web │ │
│ │ (公共) │ │(ESL封装)│ │(核心业务)│ │(REST API)│ │(前端) │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │ │ │
│ └──────────────┴───────────┴───────────┴──────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ gateway │ │
│ │ (启动入口) │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
**模块职责:**
| 模块 | 职责 | 主要内容 |
|------|------|---------|
| **common** | 公共组件 | 工具类、常量、异常、通用模型 |
| **esl** | ESL封装 | ESL连接管理、命令封装、事件解析 |
| **core** | 核心业务 | 坐席管理、呼叫控制、ACD、队列、外呼、录音 |
| **api** | REST接口 | 对外API、WebSocket推送 |
| **web** | 前端工程 | 软电话条、监控大屏 |
| **gateway** | 应用入口 | 配置、启动类 |
---
## 三、功能模块设计
### 3.1 模块清单与优先级
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 功能模块优先级 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ P0 - 核心功能(必须完成) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ☐ ESL连接管理 ☐ 坐席签入签出 ☐ 呼入呼出控制 │ │
│ │ ☐ ACD话务分配 ☐ 技能组管理 ☐ 排队等待 │ │
│ │ ☐ 全程录音 ☐ 软电话条 ☐ API接口 │ │
│ │ ☐ 事件推送 ☐ CRM集成 ☐ 基础IVR │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ P1 - 重要功能(应该完成) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ☐ 预测式外呼 ☐ 机器人外呼 ☐ 语音识别IVR │ │
│ │ ☐ 呼入机器人 ☐ 班长监控 ☐ 实时监控大屏 │ │
│ │ ☐ 溢出策略 ☐ 主备高可用 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ P2 - 增强功能(尽量完成) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ☐ VIP优先 ☐ 黑名单 ☐ 满意度调查 │ │
│ │ ☐ 多轮对话 ☐ 话务预测 ☐ 密语功能 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 3.2 核心模块设计
#### 3.2.1 ESL模块
```
┌─────────────────────────────────────────────────────────────────────────┐
│ ESL模块设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ EslConnectionManager │ │
│ │ (连接管理器) │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ - connect() 建立ESL连接 │ │
│ │ - disconnect() 断开连接 │ │
│ │ - reconnect() 重连机制 │ │
│ │ - heartbeat() 心跳检测 │ │
│ │ - getConnection() 获取连接 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ EslCommandExecutor │ │
│ │ (命令执行器) │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ - api(cmd, args) 同步API命令 │ │
│ │ - bgapi(cmd, args) 异步API命令 │ │
│ │ - sendMsg(uuid, app) 发送消息 │ │
│ │ - originate(...) 发起呼叫 │ │
│ │ - bridge(uuid1, uuid2) 桥接通道 │ │
│ │ - hangup(uuid) 挂断通话 │ │
│ │ - transfer(uuid, dest) 转接 │ │
│ │ - hold/unhold(uuid) 保持/取回 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ EslEventDispatcher │ │
│ │ (事件分发器) │ │
│ ├───────────────────────────────────────────────────────────────────┤ │
│ │ - subscribe(events) 订阅事件 │ │
│ │ - addHandler(handler) 注册处理器 │ │
│ │ - dispatch(event) 分发事件 │ │
│ │ - filter(uuid) 过滤事件 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 关键事件处理: │
│ ┌────────────────┬────────────────────────────────────────────────┐ │
│ │ CHANNEL_CREATE │ → 创建呼叫记录呼入触发ACD排队 │ │
│ │ CHANNEL_ANSWER │ → 更新状态为已接听,开始计时 │ │
│ │ CHANNEL_BRIDGE │ → 更新状态为桥接,记录桥接信息 │ │
│ │ CHANNEL_HANGUP │ → 更新坐席状态,生成话单 │ │
│ │ DTMF │ → IVR按键处理满意度调查收集 │ │
│ └────────────────┴────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 3.2.2 坐席管理模块
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 坐席管理模块设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 坐席状态机: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────┐ │ │
│ │ │ OFFLINE │ ◄────────────────────────┐ │ │
│ │ └────┬────┘ │ │ │
│ │ │ signIn │ signOut │ │
│ │ ▼ │ │ │
│ │ ┌─────────┐ ready ┌────┴────┐ │ │
│ │ ┌───►│NOT_READY│─────────────────────►│ READY │◄───┐ │ │
│ │ │ └─────────┘ └────┬────┘ │ │ │
│ │ │ ▲ │ │ │ │
│ │ wrapUp │ │ notReady │ assign │ │ │
│ │ timeout│ │ ▼ │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ PAUSED │ │ RINGING │ │ │ │
│ │ │ │ (小休) │ └────┬────┘ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ │ │ │ answer │ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌─────────┐ │ │ │
│ │ │ │ BUSY │ │ │ │
│ │ │ │ (通话中) │ │ │ │
│ │ │ └────┬────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ │ hangup │ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌─────────┐ │ │ │
│ │ └────────────────────────────────────│ WRAP_UP │────┘ │ │
│ │ │ (后处理) │ │ │
│ │ └─────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 数据模型: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ Agent { │ │
│ │ id: String // 坐席ID │ │
│ │ name: String // 坐席姓名 │ │
│ │ extension: String // 分机号 │ │
│ │ skillGroups: List // 技能组列表 │ │
│ │ state: AgentState // 当前状态 │ │
│ │ stateTime: DateTime // 状态开始时间 │ │
│ │ currentCallUuid: String // 当前通话UUID │ │
│ │ signInTime: DateTime // 签入时间 │ │
│ │ } │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 存储设计Redis
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ agent:{agentId} → Hash 坐席详细信息 │ │
│ │ agents:online → Set 在线坐席ID集合 │ │
│ │ skillgroup:{name}:agents → Set 技能组坐席集合 │ │
│ │ agent:{agentId}:idle_time → String 空闲开始时间 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 3.2.3 ACD模块
```
┌─────────────────────────────────────────────────────────────────────────┐
│ ACD模块设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 分配流程: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 来电 ──► IVR ──► 确定技能组 ──► 入队 ──► 分配 ──► 振铃 ──► 接听 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────┐ │ │
│ │ │ 排队等待 │ │ │
│ │ │ 播放音乐 │ │ │
│ │ └──────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 分配策略(按优先级): │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. 历史服务优先 │ │
│ │ └─► 查找该客户上次服务的坐席,若空闲则分配 │ │
│ │ │ │
│ │ 2. 最长空闲优先 │ │
│ │ └─► 选择空闲时间最长的坐席 │ │
│ │ │ │
│ │ 3. 轮询分配 │ │
│ │ └─► 按顺序轮流分配 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 溢出策略: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 条件:技能组无空闲坐席 + 等待时间 > 阈值如60秒 │ │
│ │ │ │
│ │ 溢出配置: │ │
│ │ ┌─────────────┬─────────────┬───────────┐ │ │
│ │ │ 源技能组 │ 目标技能组 │ 等待阈值 │ │ │
│ │ ├─────────────┼─────────────┼───────────┤ │ │
│ │ │ rescue │ default │ 60秒 │ │ │
│ │ │ housekeeping│ default │ 90秒 │ │ │
│ │ │ driver │ default │ 60秒 │ │ │
│ │ └─────────────┴─────────────┴───────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 队列数据结构Redis Sorted Set
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ queue:{skillGroup} │ │
│ │ ┌──────────────────────────────────────────────────────────────┐│ │
│ │ │ Score = 优先级 × 10^9 + 入队时间戳 ││ │
│ │ │ Member = QueueItem(callUuid, callerNumber, enqueueTime...) ││ │
│ │ └──────────────────────────────────────────────────────────────┘│ │
│ │ │ │
│ │ 优先级越小越优先,同优先级按入队时间排序 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 3.2.4 呼叫控制模块
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 呼叫控制模块设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 呼叫状态机: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ CREATED │────►│ RINGING │────►│ ANSWERED│────►│ BRIDGED │ │ │
│ │ └─────────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ ▼ │ │
│ │ │ │ ┌─────────┐ │ │
│ │ │ │ │ HELD │ │ │
│ │ │ │ └────┬────┘ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌────────────────────────────────────────┐ │ │
│ │ │ HANGUP │ │ │
│ │ └────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 核心操作: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 点击外呼: │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ 1. 检查坐席状态必须READY │ │ │
│ │ │ 2. 更新坐席状态为BUSY │ │ │
│ │ │ 3. originate呼叫坐席分机 │ │ │
│ │ │ 4. 坐席接听后bridge呼叫客户 │ │ │
│ │ │ 5. 开始录音 │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 转接: │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ 盲转uuid_transfer直接转接 │ │ │
│ │ │ 咨询转先holdoriginate咨询方确认后bridge │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 三方通话: │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ 1. 创建会议室 conference │ │ │
│ │ │ 2. 将原通话双方加入会议 │ │ │
│ │ │ 3. originate第三方加入会议 │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 数据模型: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ Call { │ │
│ │ uuid: String // 呼叫唯一标识 │ │
│ │ direction: Enum // INBOUND/OUTBOUND │ │
│ │ callerNumber: String // 主叫号码 │ │
│ │ calleeNumber: String // 被叫号码 │ │
│ │ state: CallState // 呼叫状态 │ │
│ │ agentId: String // 服务坐席 │ │
│ │ skillGroup: String // 技能组 │ │
│ │ createTime: DateTime // 创建时间 │ │
│ │ answerTime: DateTime // 接听时间 │ │
│ │ hangupTime: DateTime // 挂断时间 │ │
│ │ duration: Long // 通话时长(秒) │ │
│ │ recordingPath: String // 录音路径 │ │
│ │ hangupCause: String // 挂断原因 │ │
│ │ } │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 3.2.5 外呼模块
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 外呼模块设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 预测式外呼流程: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 业务系统 ──► 创建任务 ──► 导入号码 ──► 启动任务 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌───────────────┐ │ │
│ │ │ 外呼循环 │ │ │
│ │ └───────┬───────┘ │ │
│ │ │ │ │
│ │ ┌───────────────────────────────────┴───────────────┐ │ │
│ │ │ │ │ │
│ │ ▼ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │
│ │ │ 计算拨打数 │───►│ 批量拨打 │───►│ 接通转坐席 │ │ │ │
│ │ │(预测算法) │ │ │ │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │
│ │ ▲ │ │ │ │
│ │ │ │ │ │ │
│ │ └──────────────────────────────────────┘ │ │ │
│ │ 循环 │ │ │
│ │ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 预测算法: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 目标:让坐席接听时刚好有客户接通,减少等待 │ │
│ │ │ │
│ │ 预测拨打数 = 空闲坐席数 / 历史接通率 × 超拨系数 │ │
│ │ │ │
│ │ 示例空闲5人接通率30%超拨系数1.2 │ │
│ │ 拨打数 = 5 / 0.3 × 1.2 ≈ 20 │ │
│ │ │ │
│ │ 动态调整:根据实时接通率动态调整拨打速度 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ 机器人外呼流程: │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 创建任务 │───►│ 生成TTS │───►│ 批量拨打 │───►│ 播放语音 │ │ │
│ │ │ (含话术) │ │ 音频文件 │ │ │ │ │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └────┬─────┘ │ │
│ │ │ │ │
│ │ ┌───────────┴───────┐ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌──────────┐ ┌──────────┐│
│ │ │ 纯播报 │ │ 收集按键 ││
│ │ │ 挂断 │ │ 回传结果 ││
│ │ └──────────┘ └──────────┘│
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 3.3 接口设计
#### 3.3.1 API接口清单
```
┌─────────────────────────────────────────────────────────────────────────┐
│ REST API 设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 坐席接口:/api/v1/agent │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ POST /signin 坐席签入 │ │
│ │ POST /signout 坐席签出 │ │
│ │ POST /ready 置闲 │ │
│ │ POST /not-ready 置忙 │ │
│ │ POST /pause 小休 │ │
│ │ GET /{agentId}/status 查询坐席状态 │ │
│ │ GET /list 查询坐席列表 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 呼叫接口:/api/v1/call │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ POST /originate 发起外呼 │ │
│ │ POST /{uuid}/answer 接听 │ │
│ │ POST /{uuid}/hangup 挂断 │ │
│ │ POST /{uuid}/hold 保持 │ │
│ │ POST /{uuid}/unhold 取回 │ │
│ │ POST /{uuid}/mute 静音 │ │
│ │ POST /{uuid}/unmute 取消静音 │ │
│ │ POST /{uuid}/transfer 转接 │ │
│ │ POST /{uuid}/conference 三方通话 │ │
│ │ GET /{uuid} 查询呼叫信息 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 外呼任务接口:/api/v1/task │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ POST /predictive 创建预测式外呼任务 │ │
│ │ POST /robot 创建机器人外呼任务 │ │
│ │ POST /{taskId}/start 启动任务 │ │
│ │ POST /{taskId}/pause 暂停任务 │ │
│ │ POST /{taskId}/resume 恢复任务 │ │
│ │ POST /{taskId}/stop 停止任务 │ │
│ │ GET /{taskId}/status 查询任务状态 │ │
│ │ GET /{taskId}/result 查询任务结果 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 监控接口:/api/v1/monitor │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ POST /spy 监听 │ │
│ │ POST /barge 强插 │ │
│ │ POST /hangup 强拆 │ │
│ │ GET /realtime 实时统计数据 │ │
│ │ GET /queue/{skillGroup} 队列状态 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 录音接口:/api/v1/recording │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ GET /list 录音列表查询 │ │
│ │ GET /{uuid}/url 获取录音下载地址 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 3.3.2 WebSocket事件推送
```
┌─────────────────────────────────────────────────────────────────────────┐
│ WebSocket 事件设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 连接地址ws://host:port/ws/events?token={token} │
│ │
│ 事件格式: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ { │ │
│ │ "eventType": "CALL_RINGING", │ │
│ │ "timestamp": 1704067200000, │ │
│ │ "data": { │ │
│ │ "uuid": "xxx", │ │
│ │ "callerNumber": "13800138000", │ │
│ │ "calleeNumber": "4001234567", │ │
│ │ ... │ │
│ │ } │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 事件类型: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 呼叫事件 │ │
│ │ ├── CALL_RINGING 来电振铃 │ │
│ │ ├── CALL_ANSWERED 通话接听 │ │
│ │ ├── CALL_BRIDGED 双方接通 │ │
│ │ ├── CALL_HANGUP 通话挂断 │ │
│ │ ├── CALL_TRANSFER 通话转接 │ │
│ │ └── CALL_HOLD 通话保持 │ │
│ │ │ │
│ │ 坐席事件 │ │
│ │ ├── AGENT_STATE_CHANGE 坐席状态变更 │ │
│ │ ├── AGENT_SIGNIN 坐席签入 │ │
│ │ └── AGENT_SIGNOUT 坐席签出 │ │
│ │ │ │
│ │ 话单事件 │ │
│ │ └── CDR_GENERATED 话单生成 │ │
│ │ │ │
│ │ DTMF事件 │ │
│ │ └── DTMF_RECEIVED 收到按键 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 3.4 数据库设计
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 数据库设计 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ cc_agent (坐席表) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ id BIGINT PRIMARY KEY │ │
│ │ agent_id VARCHAR(32) 坐席工号 │ │
│ │ agent_name VARCHAR(64) 坐席姓名 │ │
│ │ extension VARCHAR(16) 分机号 │ │
│ │ password VARCHAR(128) 密码 │ │
│ │ skill_groups VARCHAR(256) 技能组(逗号分隔) │ │
│ │ status TINYINT 状态(0禁用1启用) │ │
│ │ create_time DATETIME 创建时间 │ │
│ │ update_time DATETIME 更新时间 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ cc_skill_group (技能组表) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ id BIGINT PRIMARY KEY │ │
│ │ group_code VARCHAR(32) 技能组编码 │ │
│ │ group_name VARCHAR(64) 技能组名称 │ │
│ │ overflow_group VARCHAR(32) 溢出技能组 │ │
│ │ overflow_seconds INT 溢出等待秒数 │ │
│ │ status TINYINT 状态 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ cc_cdr (话单表) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ id BIGINT PRIMARY KEY │ │
│ │ uuid VARCHAR(64) 呼叫UUID │ │
│ │ direction VARCHAR(16) 呼叫方向 │ │
│ │ caller_number VARCHAR(32) 主叫号码 │ │
│ │ callee_number VARCHAR(32) 被叫号码 │ │
│ │ agent_id VARCHAR(32) 坐席ID │ │
│ │ skill_group VARCHAR(32) 技能组 │ │
│ │ queue_time INT 排队时长(秒) │ │
│ │ ring_time INT 振铃时长(秒) │ │
│ │ talk_time INT 通话时长(秒) │ │
│ │ start_time DATETIME 开始时间 │ │
│ │ answer_time DATETIME 接听时间 │ │
│ │ end_time DATETIME 结束时间 │ │
│ │ hangup_cause VARCHAR(32) 挂断原因 │ │
│ │ recording_path VARCHAR(256) 录音路径 │ │
│ │ business_type VARCHAR(32) 业务类型 │ │
│ │ create_time DATETIME 创建时间 │ │
│ │ INDEX idx_start_time (start_time) │ │
│ │ INDEX idx_agent (agent_id, start_time) │ │
│ │ INDEX idx_caller (caller_number, start_time) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ cc_dial_task (外呼任务表) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ id BIGINT PRIMARY KEY │ │
│ │ task_id VARCHAR(64) 任务ID │ │
│ │ task_name VARCHAR(128) 任务名称 │ │
│ │ task_type VARCHAR(16) 类型(PREDICTIVE/ROBOT) │ │
│ │ skill_group VARCHAR(32) 技能组 │ │
│ │ caller_id VARCHAR(32) 外显号码 │ │
│ │ total_count INT 总号码数 │ │
│ │ dialed_count INT 已拨打数 │ │
│ │ connected_count INT 接通数 │ │
│ │ state VARCHAR(16) 状态 │ │
│ │ start_time DATETIME 开始时间 │ │
│ │ end_time DATETIME 结束时间 │ │
│ │ create_time DATETIME 创建时间 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ cc_dial_detail (外呼明细表) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ id BIGINT PRIMARY KEY │ │
│ │ task_id VARCHAR(64) 任务ID │ │
│ │ phone VARCHAR(32) 号码 │ │
│ │ call_uuid VARCHAR(64) 呼叫UUID │ │
│ │ status VARCHAR(16) 状态 │ │
│ │ dial_time DATETIME 拨打时间 │ │
│ │ answer_time DATETIME 接听时间 │ │
│ │ hangup_time DATETIME 挂断时间 │ │
│ │ dtmf_result VARCHAR(16) 按键结果 │ │
│ │ retry_count INT 重试次数 │ │
│ │ INDEX idx_task (task_id) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## 四、开发计划
### 4.1 阶段划分
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 开发阶段划分17周
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 第一阶段基础环境与核心框架Week 1-4 │ │
│ │ │ │
│ │ Week 1-2: 环境搭建 + 技术预研 │ │
│ │ Week 3-4: ESL模块 + 基础框架 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 第二阶段核心功能开发Week 5-10 │ │
│ │ │ │
│ │ Week 5-6: 坐席管理 + 呼叫控制 │ │
│ │ Week 7-8: ACD分配 + 排队等待 │ │
│ │ Week 9-10: 录音 + 软电话条 + CRM集成 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 第三阶段高级功能开发Week 11-14 │ │
│ │ │ │
│ │ Week 11-12: 预测式外呼 + 机器人外呼 │ │
│ │ Week 13: IVR + 呼入机器人 │ │
│ │ Week 14: 监控大屏 + 班长监控 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 第四阶段集成测试与上线Week 15-17 │ │
│ │ │ │
│ │ Week 15: 集成联调 + 高可用部署 │ │
│ │ Week 16: 测试 + Bug修复 │ │
│ │ Week 17: 试运行 + 正式上线 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 4.2 详细开发计划
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 详细开发计划 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ═══════════════════════════════════════════════════════════════════ │
│ 第一阶段基础环境与核心框架Week 1-4
│ ═══════════════════════════════════════════════════════════════════ │
│ │
│ Week 1: 环境准备 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 服务器环境准备(开发、测试环境) │ │
│ │ □ FreeSWITCH安装配置 │ │
│ │ □ 开发环境搭建IDE、Git、Maven │ │
│ │ □ MySQL、Redis环境搭建 │ │
│ │ □ 测试SIP话机注册与基础通话 │ │
│ │ │ │
│ │ 交付物环境部署文档、FreeSWITCH基础配置 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 2: 技术预研 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ ESL协议学习与Demo开发 │ │
│ │ □ FreeSWITCH Dialplan配置学习 │ │
│ │ □ Lua IVR脚本编写测试 │ │
│ │ □ 项目工程结构搭建 │ │
│ │ □ 技术方案评审 │ │
│ │ │ │
│ │ 交付物技术预研报告、Demo代码 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 3-4: ESL模块开发 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ ESL连接管理连接池、心跳、重连 │ │
│ │ □ ESL命令封装API、SendMsg │ │
│ │ □ 事件订阅与分发机制 │ │
│ │ □ 常用命令测试验证 │ │
│ │ □ 基础API框架搭建 │ │
│ │ □ WebSocket服务搭建 │ │
│ │ │ │
│ │ 交付物ESL模块代码、单元测试 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ═══════════════════════════════════════════════════════════════════ │
│ 第二阶段核心功能开发Week 5-10
│ ═══════════════════════════════════════════════════════════════════ │
│ │
│ Week 5-6: 坐席管理 + 呼叫控制 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 坐席数据模型设计 │ │
│ │ □ 坐席签入/签出 │ │
│ │ □ 坐席状态管理(置闲、置忙、小休) │ │
│ │ □ 技能组管理 │ │
│ │ □ 点击外呼功能 │ │
│ │ □ 接听/挂断/保持/取回 │ │
│ │ □ 转接(盲转、咨询转) │ │
│ │ □ 坐席API接口 │ │
│ │ □ 呼叫API接口 │ │
│ │ │ │
│ │ 交付物:坐席模块、呼叫控制模块 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 7-8: ACD分配 + 排队等待 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 队列数据结构设计 │ │
│ │ □ 呼叫入队逻辑 │ │
│ │ □ 历史服务优先策略 │ │
│ │ □ 最长空闲优先策略 │ │
│ │ □ 轮询分配策略 │ │
│ │ □ 坐席选择与分配 │ │
│ │ □ 排队等待音乐 │ │
│ │ □ 溢出策略实现 │ │
│ │ □ 排队状态查询 │ │
│ │ │ │
│ │ 交付物ACD模块、队列管理模块 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 9-10: 录音 + 软电话条 + CRM集成 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 录音启动/停止控制 │ │
│ │ □ 录音文件存储管理 │ │
│ │ □ 录音查询与下载API │ │
│ │ □ 软电话条前端开发Vue组件 │ │
│ │ □ WebSocket事件接收与处理 │ │
│ │ □ 软电话条UI状态、按钮、来电显示 │ │
│ │ □ CRM弹屏集成事件推送 │ │
│ │ □ 话单推送至CRM │ │
│ │ □ 联调测试 │ │
│ │ │ │
│ │ 交付物录音模块、软电话条组件、CRM集成文档 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ═══════════════════════════════════════════════════════════════════ │
│ 第三阶段高级功能开发Week 11-14
│ ═══════════════════════════════════════════════════════════════════ │
│ │
│ Week 11-12: 预测式外呼 + 机器人外呼 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 外呼任务管理(创建、启动、暂停、停止) │ │
│ │ □ 号码导入与管理 │ │
│ │ □ 预测式拨号算法实现 │ │
│ │ □ 接通后转坐席逻辑 │ │
│ │ □ 外呼统计(接通率、坐席利用率) │ │
│ │ □ 阿里云TTS集成 │ │
│ │ □ 机器人外呼流程(播报、按键收集) │ │
│ │ □ 外呼结果回传 │ │
│ │ □ 任务API接口 │ │
│ │ │ │
│ │ 交付物:外呼引擎、机器人外呼模块 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 13: IVR + 呼入机器人 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ IVR Dialplan配置多业务线 │ │
│ │ □ 阿里云ASR集成 │ │
│ │ □ 语音识别导航实现 │ │
│ │ □ NLU对接意图识别 │ │
│ │ □ FAQ问答流程 │ │
│ │ □ 转人工逻辑 │ │
│ │ □ Lua脚本开发 │ │
│ │ │ │
│ │ 交付物IVR配置、呼入机器人模块 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 14: 监控大屏 + 班长监控 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 实时数据统计API │ │
│ │ □ 监控大屏前端开发 │ │
│ │ □ 坐席状态分布展示 │ │
│ │ □ 队列状态展示 │ │
│ │ □ 话务趋势图表 │ │
│ │ □ 监听功能实现 │ │
│ │ □ 强插功能实现 │ │
│ │ □ 强拆功能实现 │ │
│ │ │ │
│ │ 交付物:监控大屏、班长监控功能 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ═══════════════════════════════════════════════════════════════════ │
│ 第四阶段集成测试与上线Week 15-17
│ ═══════════════════════════════════════════════════════════════════ │
│ │
│ Week 15: 集成联调 + 高可用部署 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ CRM系统全流程联调 │ │
│ │ □ 业务系统对接联调 │ │
│ │ □ 运营商线路对接 │ │
│ │ □ 主备FreeSWITCH部署 │ │
│ │ □ Keepalived配置 │ │
│ │ □ 故障切换测试 │ │
│ │ □ 数据库主从配置 │ │
│ │ □ Redis Sentinel配置 │ │
│ │ │ │
│ │ 交付物:联调测试报告、高可用部署文档 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 16: 测试 + Bug修复 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 功能测试(全流程) │ │
│ │ □ 性能测试150坐席并发 │ │
│ │ □ 压力测试(峰值话务) │ │
│ │ □ 故障恢复测试 │ │
│ │ □ Bug修复 │ │
│ │ □ 性能优化 │ │
│ │ □ 上线检查清单确认 │ │
│ │ │ │
│ │ 交付物测试报告、Bug清单、优化记录 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Week 17: 试运行 + 正式上线 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ □ 生产环境部署 │ │
│ │ □ 数据初始化 │ │
│ │ □ 小范围试运行(一条业务线) │ │
│ │ □ 问题收集与修复 │ │
│ │ □ 全量上线 │ │
│ │ □ 运维交接 │ │
│ │ □ 用户培训 │ │
│ │ │ │
│ │ 交付物:上线报告、运维手册、培训材料 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 4.3 甘特图
```
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ 项目甘特图 │
├─────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 任务 │ W1 │ W2 │ W3 │ W4 │ W5 │ W6 │ W7 │ W8 │ W9 │W10│W11│W12│W13│W14│W15│W16│W17│
│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│
│ 第一阶段 │████│████│████│████│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ 环境搭建 │████│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ 技术预研 │ │████│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ ESL模块开发 │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│
│ 第二阶段 │ │ │ │ │████│████│████│████│████│███│ │ │ │ │ │ │ │
│ 坐席管理 │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │
│ 呼叫控制 │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │
│ ACD分配 │ │ │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │
│ 排队等待 │ │ │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │
│ 录音功能 │ │ │ │ │ │ │ │ │████│ │ │ │ │ │ │ │ │
│ 软电话条 │ │ │ │ │ │ │ │ │████│███│ │ │ │ │ │ │ │
│ CRM集成 │ │ │ │ │ │ │ │ │ │███│ │ │ │ │ │ │ │
│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│
│ 第三阶段 │ │ │ │ │ │ │ │ │ │ │███│███│███│███│ │ │ │
│ 预测式外呼 │ │ │ │ │ │ │ │ │ │ │███│███│ │ │ │ │ │
│ 机器人外呼 │ │ │ │ │ │ │ │ │ │ │███│███│ │ │ │ │ │
│ IVR+呼入机器人 │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ │
│ 监控大屏 │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │
│ 班长监控 │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │
│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│
│ 第四阶段 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│███│███│
│ 集成联调 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │
│ 高可用部署 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │
│ 测试+Bug修复 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │
│ 试运行 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │██ │
│ 正式上线 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ██│
│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│
│ 里程碑 │ │ M1 │ │ M2 │ │ │ │ │ │M3 │ │ │ │M4 │M5 │M6 │M7 │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ M1: 需求确认 │ │ ◆ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ M2: 环境就绪 │ │ │ │ ◆ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ M3: 核心功能完成 │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ │ │ │ │ │
│ M4: 全功能完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ │
│ M5: 联调测试完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ │
│ M6: 试运行完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │
│ M7: 正式上线 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 五、团队组织
### 5.1 团队配置
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 团队组织架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ 项目经理 │ │
│ │ (1人) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌─────────────────────┼─────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 开发组 │ │ 测试组 │ │ 运维组 │ │
│ │ (8-10人) │ │ (1-2人) │ │ (1人) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ├── 架构师 (1人) │
│ ├── 后端开发 (4-5人) │
│ ├── 前端开发 (2人) │
│ └── FreeSWITCH工程师 (1-2人) │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 5.2 角色职责
| 角色 | 人数 | 职责 | 技能要求 |
|------|------|------|---------|
| **项目经理** | 1 | 项目管理、进度控制、风险管理 | 项目管理经验、沟通协调能力 |
| **架构师** | 1 | 架构设计、技术选型、核心代码 | FreeSWITCH、分布式系统 |
| **后端开发** | 4-5 | 业务模块开发、API开发 | Java、Spring Boot、Redis |
| **前端开发** | 2 | 软电话条、监控大屏 | Vue3、TypeScript、WebSocket |
| **FS工程师** | 1-2 | FreeSWITCH配置、Lua脚本 | FreeSWITCH、SIP协议、Lua |
| **测试** | 1-2 | 功能测试、性能测试 | 测试用例设计、性能测试工具 |
| **运维** | 1 | 环境部署、监控运维 | Linux、Docker、运维经验 |
### 5.3 人员分工
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 开发任务分工 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 架构师 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 整体架构设计 │ │
│ │ • ESL模块核心代码 │ │
│ │ • ACD核心算法 │ │
│ │ • 技术难点攻关 │ │
│ │ • 代码Review │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 后端开发A (资深) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 坐席管理模块 │ │
│ │ • 呼叫控制模块 │ │
│ │ • WebSocket推送服务 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 后端开发B │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • ACD分配模块 │ │
│ │ • 队列管理模块 │ │
│ │ • 溢出策略 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 后端开发C │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 预测式外呼模块 │ │
│ │ • 机器人外呼模块 │ │
│ │ • TTS集成 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 后端开发D │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 录音管理模块 │ │
│ │ • 监控统计模块 │ │
│ │ • 班长监控功能 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 后端开发E (可选) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • API接口开发 │ │
│ │ • CRM集成对接 │ │
│ │ • 单元测试 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 前端开发A │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 软电话条组件开发 │ │
│ │ • WebSocket客户端 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 前端开发B │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 实时监控大屏 │ │
│ │ • 数据可视化图表 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ FreeSWITCH工程师 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • FreeSWITCH配置优化 │ │
│ │ • Dialplan编写 │ │
│ │ • Lua IVR脚本开发 │ │
│ │ • 线路对接 │ │
│ │ • 高可用部署 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## 六、风险控制
### 6.1 风险清单
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 风险清单 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 风险1: FreeSWITCH技术门槛高 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 等级: 高 │ │
│ │ 影响: 开发进度延迟,功能实现困难 │ │
│ │ 应对: │ │
│ │ • Week 1-2 集中学习FreeSWITCH和ESL │ │
│ │ • 考虑引入外部FreeSWITCH顾问 │ │
│ │ • 预留20%时间缓冲 │ │
│ │ • 简化复杂功能,优先实现核心流程 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 风险2: 运营商线路对接周期长 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 等级: 高 │ │
│ │ 影响: 无法进行真实环境测试,上线延迟 │ │
│ │ 应对: │ │
│ │ • 项目启动即开始申请线路 │ │
│ │ • 开发阶段使用模拟线路/测试线路 │ │
│ │ • 准备备选运营商 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 风险3: CRM系统对接复杂 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 等级: 中 │ │
│ │ 影响: 集成联调时间延长 │ │
│ │ 应对: │ │
│ │ • 提前与CRM团队沟通明确接口规范 │ │
│ │ • 提供详细API文档和示例代码 │ │
│ │ • 预留充足联调时间 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 风险4: 并发性能不达标 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 等级: 中 │ │
│ │ 影响: 系统无法支撑业务量 │ │
│ │ 应对: │ │
│ │ • Week 16 进行完整压力测试 │ │
│ │ • 预先设计水平扩展方案 │ │
│ │ • 关键代码Review避免性能瓶颈 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 风险5: ASR/TTS识别效果不佳 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 等级: 中 │ │
│ │ 影响: 机器人/IVR体验差 │ │
│ │ 应对: │ │
│ │ • 提前进行ASR效果测试 │ │
│ │ • 准备热词优化方案 │ │
│ │ • 设计按键兜底方案 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 风险6: 核心人员离职 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 等级: 中 │ │
│ │ 影响: 知识断层,进度受阻 │ │
│ │ 应对: │ │
│ │ • 重要模块双人备份 │ │
│ │ • 代码规范、文档完善 │ │
│ │ • 定期代码Review和知识分享 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 6.2 应急预案
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 应急预案 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 场景1: 开发进度严重滞后 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 触发条件: 核心功能延迟超过2周 │ │
│ │ 应对措施: │ │
│ │ • 评估是否可以简化功能范围 │ │
│ │ • 考虑增加外部资源支持 │ │
│ │ • 与业务方协商分阶段上线 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 场景2: FreeSWITCH关键问题无法解决 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 触发条件: 技术问题阻塞超过1周 │ │
│ │ 应对措施: │ │
│ │ • 联系FreeSWITCH社区或付费支持 │ │
│ │ • 寻求外部FreeSWITCH专家支援 │ │
│ │ • 评估替代方案可行性 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 场景3: 上线后系统不稳定 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 触发条件: 故障频发或性能严重不足 │ │
│ │ 应对措施: │ │
│ │ • 启用回退方案(如有旧系统) │ │
│ │ • 降级部分功能,保障核心业务 │ │
│ │ • 紧急扩容或优化 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## 七、交付物清单
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 项目交付物清单 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 阶段 │ 交付物 │ 负责人 │
│ ──────────────│───────────────────────────────────────│───────────│
│ │ │ │
│ 需求阶段 │ 需求规格说明书 │ 产品 │
│ │ 接口设计文档 │ 架构师 │
│ │ 数据库设计文档 │ 架构师 │
│ │ │ │
│ 开发阶段 │ 源代码Git仓库 │ 开发团队 │
│ │ 单元测试代码 │ 开发团队 │
│ │ API接口文档 │ 后端开发 │
│ │ 前端组件文档 │ 前端开发 │
│ │ │ │
│ 测试阶段 │ 测试用例文档 │ 测试 │
│ │ 测试报告 │ 测试 │
│ │ 性能测试报告 │ 测试 │
│ │ │ │
│ 部署阶段 │ 部署手册 │ 运维 │
│ │ 运维手册 │ 运维 │
│ │ 高可用配置文档 │ 运维 │
│ │ │ │
│ 上线阶段 │ 上线检查清单 │ 项目经理 │
│ │ 培训材料 │ 产品 │
│ │ 用户操作手册 │ 产品 │
│ │ 项目总结报告 │ 项目经理 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## 八、总结
### 8.1 方案要点总结
| 维度 | 要点 |
|------|------|
| **技术架构** | FreeSWITCH + Java中间件 + Vue前端ESL控制模式 |
| **开发周期** | 4个月17周分4阶段 |
| **团队配置** | 11-14人含项目经理、开发、测试、运维 |
| **核心功能** | 呼入呼出、ACD分配、预测式外呼、机器人、录音、监控 |
| **风险控制** | FreeSWITCH技术预研、线路提前申请、预留缓冲时间 |
### 8.2 关键成功因素
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 关键成功因素 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 技术准备充分 │
│ └─► Week 1-2 完成FreeSWITCH学习和技术预研 │
│ │
│ 2. 核心功能优先 │
│ └─► 先完成P0功能确保基础可用 │
│ │
│ 3. 持续集成测试 │
│ └─► 每完成一个模块立即测试,避免问题堆积 │
│ │
│ 4. CRM团队紧密配合 │
│ └─► 提前沟通接口,并行开发 │
│ │
│ 5. 线路提前就位 │
│ └─► 项目启动即申请运营商线路 │
│ │
│ 6. 分阶段上线 │
│ └─► 先上线一条业务线验证,再全量推广 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 8.3 下一步行动
| 序号 | 行动项 | 负责人 | 完成时间 |
|------|-------|-------|---------|
| 1 | 确认团队人员到位 | 项目经理 | 项目启动前 |
| 2 | 采购/准备开发测试环境 | 运维 | Week 1 |
| 3 | 启动运营商线路申请 | 项目经理 | Week 1 |
| 4 | 组织FreeSWITCH技术培训 | 架构师 | Week 1-2 |
| 5 | 与CRM团队召开接口对接会议 | 架构师 | Week 2 |
| 6 | 完成技术方案评审 | 架构师 | Week 2 |
---