**文档版本**: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直接转接 │ │ │ │ │ │ 咨询转:先hold,originate咨询方,确认后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 | ---