在线客服系统中的排队机制设计方案
在线客服系统中的排队机制设计方案
1. 排队机制概述
排队机制是在线客服系统的核心功能之一,它能够有效地管理访客请求,确保客服资源合理分配,提升用户体验。本文将基于现有的数据库设计,提出一个简单但高效的排队机制实现方案。
演示网站:gofly.v1kf.com
2. 现有数据库分析
当前数据库已经包含了客服(user)、访客(visitor)、消息(message)等核心表,这些表可以作为排队机制的基础。我们需要在这些表的基础上进行扩展,添加必要的字段和表来支持排队功能。
3. 数据库扩展设计
3.1 在user表中添加字段
ALTER TABLE `user`
ADD COLUMN `max_visitors` INT NOT NULL DEFAULT 10 COMMENT '最大接待访客数',
ADD COLUMN `current_visitors` INT NOT NULL DEFAULT 0 COMMENT '当前接待访客数';
3.2 创建排队表
CREATE TABLE `queue` (
`id` INT NOT NULL AUTO_INCREMENT,
`visitor_id` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '访客ID',
`kefu_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '分配的客服账户',
`ent_id` INT NOT NULL DEFAULT 0 COMMENT '企业ID',
`queue_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '排队时间',
`start_time` TIMESTAMP NULL DEFAULT NULL COMMENT '开始服务时间',
`end_time` TIMESTAMP NULL DEFAULT NULL COMMENT '结束服务时间',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1排队中,2服务中,3已完成,4已取消',
`priority` TINYINT NOT NULL DEFAULT 1 COMMENT '优先级1-5,数字越大优先级越高',
`channel` VARCHAR(50) NOT NULL DEFAULT 'web' COMMENT '渠道:web,wechat,douyin等',
PRIMARY KEY (`id`),
KEY `visitor_id` (`visitor_id`),
KEY `kefu_name` (`kefu_name`),
KEY `ent_id` (`ent_id`),
KEY `status` (`status`),
KEY `queue_time` (`queue_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访客排队表';
4. 排队流程设计
4.1 访客进入排队
- 访客首次访问或发送消息时,系统检查该访客是否已有客服接待
- 如果没有,则创建排队记录
- 根据优先级算法分配客服
-- 示例SQL:创建排队记录
INSERT INTO `queue` (visitor_id, ent_id, status, priority, channel)
VALUES ('visitor123', 1, 1, 1, 'web');
4.2 客服分配算法
- 空闲客服优先:选择当前接待访客数最少的客服
- 轮询分配:按照客服列表顺序轮流分配
- 优先级分配:VIP访客可以优先分配
-- 示例SQL:查找空闲客服
SELECT `name` FROM `user`
WHERE `ent_id` = 1
AND `online_status` = 1
AND `status` = 0
AND `current_visitors` < `max_visitors`
ORDER BY `current_visitors` ASC, `rec_num` ASC
LIMIT 1;
4.3 开始服务
- 当客服准备接待新访客时,从队列中取出优先级最高的访客
- 更新排队记录状态为"服务中"
- 更新客服的当前接待访客数
-- 示例SQL:从队列中获取下一个访客
UPDATE `queue`
SET `kefu_name` = 'kefu2', `status` = 2, `start_time` = NOW()
WHERE `id` = (
SELECT id FROM `queue`
WHERE `ent_id` = 1 AND `status` = 1
ORDER BY `priority` DESC, `queue_time` ASC
LIMIT 1
);
-- 更新客服当前接待数
UPDATE `user`
SET `current_visitors` = `current_visitors` + 1
WHERE `name` = 'kefu2';
4.4 结束服务
- 当对话结束时,更新排队记录状态为"已完成"
- 减少客服的当前接待访客数
-- 示例SQL:结束服务
UPDATE `queue`
SET `status` = 3, `end_time` = NOW()
WHERE `visitor_id` = 'visitor123' AND `status` = 2;
-- 更新客服当前接待数
UPDATE `user`
SET `current_visitors` = `current_visitors` - 1
WHERE `name` = 'kefu2';
5. 排队状态监控
5.1 排队位置查询
-- 示例SQL:查询访客在队列中的位置
SELECT COUNT(*) AS position
FROM `queue`
WHERE `ent_id` = 1 AND `status` = 1
AND (`priority` > 1 OR (`priority` = 1 AND `queue_time` < (
SELECT `queue_time` FROM `queue` WHERE `visitor_id` = 'visitor123'
)));
5.2 平均等待时间统计
-- 示例SQL:计算平均等待时间
SELECT
AVG(TIMESTAMPDIFF(SECOND, `queue_time`, `start_time`)) AS avg_wait_seconds
FROM `queue`
WHERE `ent_id` = 1 AND `status` = 3
AND `queue_time` > DATE_SUB(NOW(), INTERVAL 1 DAY);
6. 高级功能扩展
6.1 超时处理
-- 示例SQL:处理长时间未响应的排队
UPDATE `queue`
SET `status` = 4, `end_time` = NOW()
WHERE `status` = 1
AND `queue_time` < DATE_SUB(NOW(), INTERVAL 10 MINUTE);
6.2 客服转移
-- 示例SQL:转移客服
-- 1. 结束当前服务
UPDATE `queue`
SET `status` = 3, `end_time` = NOW()
WHERE `visitor_id` = 'visitor123' AND `status` = 2;
-- 2. 原客服接待数减1
UPDATE `user`
SET `current_visitors` = `current_visitors` - 1
WHERE `name` = 'kefu2';
-- 3. 新客服接待数加1
UPDATE `user`
SET `current_visitors` = `current_visitors` + 1
WHERE `name` = 'kefu3';
-- 4. 创建新的排队记录
INSERT INTO `queue` (visitor_id, kefu_name, ent_id, status, start_time)
VALUES ('visitor123', 'kefu3', 1, 2, NOW());
7. 前端实现建议
- 排队状态显示:向访客显示当前排队位置和预计等待时间
- 客服面板:显示当前接待列表和排队列表
- 通知机制:当有访客进入队列或离开队列时通知客服
8. 性能优化
- 为常用查询字段添加索引
- 定期归档已完成的历史排队记录
- 使用缓存存储热点数据,如客服当前接待数
9. 总结
本文提出的排队机制设计方案基于现有数据库结构,通过添加必要的表和字段,实现了基本的排队功能。该方案具有以下特点:
- 简单易实现:最小化对现有系统的修改
- 灵活可扩展:支持优先级、多渠道等高级功能
- 高效:通过合理的索引和查询优化保证性能
实际实现时,可以根据具体业务需求进行调整和扩展,例如添加更复杂的分配算法、支持插队功能等。
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网
浙公网安备 33010602011771号