1.1 接口说明

云客服系统提供通话记录推送功能(双向呼叫时,暂不支持推送通话记录;隐私呼叫时,目前只支持推送VOIP场景的通话记录)。云客服系统会请求第三方配置的url,并将通话记录数据以HTTP(POST)的方式推送给第三方系统,并且在请求配置的url时会自动追加type参数来区分推送的是calls(type=0时,推送的是通话记录片段),还是session(type=1时,推送的是通话记录数据信息)

  • 通话记录片段是来电时记录每个坐席处理本次通话的操作信息。比如来电时转接至技能组,技能组中A坐席挂断后转接至B坐席,此时会产生A、B坐席的通话记录片段信息。通话记录片段可能会存在多个,因此推送数据时会有多条。
  • 通话记录数据信息是通话结束后记录本次通话的始末信息。

注意:

  • 为了方便第三方系统对于通话记录数据的处理,云客服提供uin_callcenter_calls、uin_callcenter_sessions数据表结构以及通话记录数据查询的SQL语句示例。详情见本章节说明。
  • 通话记录推送数据包含满意度评价信息。

1.2 对接步骤

管理员坐席登陆云客服,点击左下角进入设置页面

第一步:设置 —> 对接 —> 接口对接 —> 添加

第二步:启用添加的通话记录推送接口

1.3 数据类型说明

非必填参数,调用接口时请传递参数名,参数值可为空

假设配置的url为:http://127.0.0.1:8080/call

序号 名称 类型 是否必填 说明
1 id String 通话Id
2 agent_call JSONObject 坐席呼叫信息
3 agent_id String 坐席编号
4 alterting_time LocalDateTime 振铃时间
5 ani String 主叫号码
6 ani_place String 主叫归属地
7 app_id String 应用编号
8 app_type String 应用类型(app:是IVR节点,queue:技能组,callmemory:来电记忆,agent:座席,loginout:登出)
9 assigned Boolean 分配状态 false 未分配 true 已分配
10 bussiness_num String 服务号码
11 call_direction String 呼入方向 0 呼入 1 呼出
12 call_in_channel String 呼入类型
13 customer_id String 客户编号
14 dnis String 被叫号码
15 dnis_place String 被叫归属地
16 is_repeat Boolean 是否重复来电 (false 不重复 true 重复)
17 is_transfer Boolean 是否转接 (false 不重复 true 重复)
18 multi_match Boolean 是否匹配多个客户 (false 否 true 是)
19 origin_id String 原归属坐席
20 queue_time Integer 排队时长(秒)
21 resp JSONObject 原始报文(通讯平台推送的原始call片段)
22 ringing_time Integer 振铃时长
23 service_start_time LocalDateTime 服务开始时间
24 service_stop_time LocalDateTime 服务结束时间
25 service_time Integer 服务时长(秒)
26 service_type String 服务类型(IVR: IVR, queue:技能组,agent:标识通话坐席来电业务,loginout:登出,dialout:标识坐席外呼业务)
27 session_id String 会话编号
28 skillgroup String 技能组名称
29 skillgroup_id String 技能组编号
30 skip Boolean 是否跳过质检 (false 否 true 是)
31 status Integer 状态 (0 未提交 1 已提交录音 2 撤销录音 3 已评分)
32 summary String 备注
33 tenant_id String 租户编号
34 qa_tag_id String 服务质量标签
35 service_id String 服务编号
36 satisfied_result JSONArray 满意度信息
37 app_node_list JSONObject ivr节点数据
38 tags JSONObject 通话标签
39 qa_id String 质检记录编号
40 created_at LocalDateTime 数据创建的时间
41 updated_at LocalDateTime 数据更新的时间
IVR节点样例:

{
“rows”:[
{
“id”:”5ba1f420-7f87-451d-9acb-c8b0d01fb045”,
“keys”:[
“3”
],
“command”:”uinOndtmf”,
“recDesc”:”an键3”,
“dtmftime”:”2023-05-08 11:04:18”,
“starttime”:”2023-05-08 11:04:14”
},
{
“id”:”60d5be46-1cac-43a8-853e-43ad718eb53c”,
“command”:”uinPlay”,
“recDesc”:”语音”,
“starttime”:”2023-05-08 11:04:18”
},
{
“id”:”d73aa485-7ac0-4541-b7b6-8fbf7b25f543”,
“command”:”uinTime”,
“recDesc”:”分时”,
“starttime”:”2023-05-08 11:04:19”
}
]
}

command: IVR支持的节点命令枚举值如下
字段 说明
keys 按键信息,数组格式。只有按键节点才有此值
id 节点id编号
recDesc 节点id描述
command 节点id对应的命令,见command枚举
starttime 节点id命令开始执行的时间点
dtmftime 匹配按键菜单的时间点(离开按键节点的时间点)
command: IVR支持的节点命令枚举值如下
枚举值 说明
uinSatisfiednode 满意度节点命令
uinSwitch 条件路由节点命令
uinOndtmf 按键节点命令
uinPlay 播放语音节点命令
uinTime 分时节点命令
uinZone 分区节点命令
uinVoicemail 语音留言节点命令
uinGetdata 数据获取节点命令
uinBridgeagent 转接坐席节点命令
uinTransferPSTN 转接PSTN节点命令
uinHangup 挂机节点命令
uinBridgeQueue 转接技能组
  • 则实际请求时,当type=1,则请求的url为: http://127.0.0.1:8080/call?type=1 (type=1代表推送的是session)请求参数如下:
    非必填参数,调用接口时请传递参数名,参数值可为空
序号 名称 类型 是否必填 说明
1 id String 会话id,具有唯一性. 对应uin_calls消息中sessionid字段
2 ani String 主叫号码
3 dnis String 被叫号码
4 bussiness_num String 业务号码
5 agentnum String 座席编号
6 tenant_id String 租户的id
7 answer_time LocalDateTime 接听的时间
8 stop_time LocalDateTime 呼叫结束的时间
9 hangup_reason Integer 呼叫结果: 4 ivr; 3 已留言; 2 排队放弃; -1 外呼(来电)振铃未接听 ; 1 接听 ; -2 黑名单; 5 外呼失败
10 alterting_time LocalDateTime 访客来电的时间或者发起外呼的时间
11 call_direction String 呼入或者外呼标识 ‘call in’ 或者 ‘call out’
12 satisfaction String 满意度(默认是-2)
13 record_file String 录音地址(接听的通话才会有录音)
14 conference_time LocalDateTime 进入会议室的时间
15 fail_reason String 失败原因
16 manual_satisfy Integer 满意度标识 0 系统 1 坐席
17 resp JSONObject 原始报文(通讯平台推送的原始session片段)
18 created_at LocalDateTime 数据创建的时间
19 updated_at LocalDateTime 数据更新的时间
20 early_media_code String
空号类型码 点击查看空号类型码说明详情
430:空号
431:关机
432:停机
433:正在通话
434:无人接听
435:号码有误
436:号码过期
437:用户忙
438:暂停服务
439:呼叫等待
440:来电提醒
441:不方便接听
442:免打扰
443:本地号码
444:外地号码
445:呼转不成功/多次呼转
446:线路忙
447:欠费
448:网络忙
449:稍后再拨
450:线路故障
451:呼入限制
452:黑名单
453:呼叫超频
454:不在服务区
455:呼叫受限
457:振铃未接听
500:数据配置有误
501:通信异常
502:坐席未接听
503:频次限制
504:防骚扰拦截
505:业务号码状态异常
21 call_type String 外呼任务呼叫值为8; 语音播报值为4
22 remark String 自定义扩展业务参数
23 uincall_data JSONObject 内容为json对象,用于记录客户接起后,诸如按键操作等相关记录,报文如下:”uincall_data”: {“last_dtmf”:”3”},代表:客户接通后最后按键号码为3;

1.4 uin_callcenter_calls 建表SQL示例

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for uin_callcenter_calls
-- ----------------------------
DROP TABLE IF EXISTS `uin_callcenter_calls`;
CREATE TABLE `uin_callcenter_calls`  (
  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '记录编号',
  `tenant_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '租户编号',
  `agent_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '坐席编号',
  `assigned` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '分配状态 0 未分配 1 已分配',
  `origin_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原归属坐席',
  `customer_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '客户编号',
  `summary` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '备注',
  `session_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '会话编号',
  `ani` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主叫号码',
  `ani_place` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '主叫归属地',
  `dnis` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '被叫号码',
  `dnis_place` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '被叫归属地',
  `app_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '应用编号',
  `app_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'agent' COMMENT '应用类型',
  `service_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务编号',
  `service_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '服务类型',
  `service_time` int NOT NULL DEFAULT 0 COMMENT '服务时长(秒)',
  `queue_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排队时长(秒)',
  `service_start_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '服务开始时间',
  `service_stop_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '服务结束时间',
  `skillgroup` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '技能组',
  `skillgroup_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '技能组编号',
  `bussiness_num` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务号码',
  `alterting_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '振铃时间',
  `call_direction` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '呼入方向 0 呼入 1 呼出',
  `call_in_channel` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '呼入类型',
  `is_transfer` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否转接',
  `is_repeat` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否重复来电',
  `agent_call` json NULL COMMENT '坐席呼叫信息',
  `app_node_list` json NULL COMMENT '节点数据',
  `satisfied_result` json NULL COMMENT '满意度信息',
  `skip` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否跳过质检',
  `tags` json NULL COMMENT '通话标签',
  `qa_tag_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务质量标签',
  `qa_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '质检记录编号',
  `status` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态 0 未提交 1 已提交录音 2 撤销录音 3 已评分',
  `multi_match` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否匹配多个客户',
  `resp` json NULL COMMENT '原始报文',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `ringing_time` int UNSIGNED NULL DEFAULT 0 COMMENT '振铃时长',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `service_type`(`service_type`) USING BTREE,
  INDEX `session_id`(`session_id`) USING BTREE,
  INDEX `tenant_id`(`tenant_id`) USING BTREE,
  INDEX `service_stop_time`(`service_stop_time`) USING BTREE,
  INDEX `created_at`(`created_at`) USING BTREE,
  INDEX `dnis`(`dnis`) USING BTREE,
  INDEX `assigned`(`assigned`) USING BTREE,
  INDEX `ani`(`ani`) USING BTREE,
  INDEX `service_start_time`(`service_start_time`) USING BTREE,
  INDEX `bussiness_num`(`bussiness_num`) USING BTREE,
  INDEX `app_type`(`app_type`) USING BTREE,
  INDEX `INX_tenant_created`(`tenant_id`, `created_at`) USING BTREE COMMENT '【强制使用此索引 FORCE INDEX】适用于:今日统计',
  INDEX `agent_id`(`agent_id`) USING BTREE,
  INDEX `INX_agentId_tenantId_created`(`agent_id`, `tenant_id`, `created_at`) USING BTREE,
  INDEX `INX_tenantId_appType_serviceStartTime_agentId`(`tenant_id`, `app_type`, `service_start_time`, `agent_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '通话记录表' ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

1.5 uin_callcenter_sessions 建表SQL示例

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for uin_callcenter_sessions
-- ----------------------------
DROP TABLE IF EXISTS `uin_callcenter_sessions`;
CREATE TABLE `uin_callcenter_sessions`  (
  `oid` bigint NOT NULL AUTO_INCREMENT,
  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '会话编码',
  `tenant_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '租户编码',
  `agent_num` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '座席工号',
  `ani` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主叫',
  `dnis` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '被叫',
  `call_direction` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '呼叫类型',
  `bussiness_num` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务号码',
  `alterting_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '振铃时间',
  `answer_time` datetime DEFAULT NULL COMMENT '应答时间',
  `conference_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '会议时间',
  `stop_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '挂机时间',
  `hangup_reason` tinyint NOT NULL COMMENT '挂机原因:1有坐席已接听来电(不代表转接的坐席也接听来电);-1振铃未接听来电;-2黑名单导致来电挂断;2排队放弃;3已留言;4IVR;5外呼失败',
  `fail_reason` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '失败原因',
  `record_file` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '录音文件地址',
  `satisfaction` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '满意度',
  `manual_satisfy` tinyint NOT NULL DEFAULT 0 COMMENT '满意度标识 0 系统 1 坐席',
  `resp` json NOT NULL COMMENT '原始推送数据',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`oid`) USING BTREE,
  UNIQUE INDEX `id`(`id`) USING BTREE,
  INDEX `tenant_id`(`tenant_id`) USING BTREE,
  INDEX `created_at`(`created_at`) USING BTREE,
  INDEX `ani`(`ani`) USING BTREE,
  INDEX `agent_num`(`agent_num`) USING BTREE,
  INDEX `dnis`(`dnis`) USING BTREE,
  INDEX `INX_tenant_created_ani_direction`(`tenant_id`, `created_at`, `ani`, `call_direction`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 25033 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '通话会话记录信息表' ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

1.6 查询通话记录列表数据SQL示例

SELECT
    ccc.* 
FROM
    (
    SELECT
        cc.id,
        cc.bussiness_num,
        c.id AS customer_id,
        cc.ani,
        cc.ani_place,
        cc.dnis,
        cc.dnis_place,
        cc.call_direction,
        cc.is_transfer,
        cc.alterting_time,
        cc.app_type,
        cc.service_type,
        cc.call_in_channel,
        cc.queue_time,
        cc.service_time,
        cc.service_start_time,
        cc.service_stop_time,
        cc.agent_call,
        cc.assigned,
        cc.multi_match,
        (
        CASE

                WHEN c.id IS NULL THEN
                ( CASE cc.multi_match WHEN TRUE THEN '多个匹配客户' ELSE '未知客户' END ) ELSE IFNULL( c.truename, '未知客户' ) 
            END 
            ) AS truename,
            a.agent_name,
            a.agent_num,
            s.conference_time,
            IFNULL( cc.agent_call -> '$.callresult', s.hangup_reason ) AS hangup_reason,
            cc.created_at 
        FROM
            (
            SELECT
                id,
                tenant_id,
                session_id,
                agent_id,
                customer_id,
                bussiness_num,
                ani,
                ani_place,
                dnis,
                dnis_place,
                call_direction,
                is_transfer,
                alterting_time,
                app_type,
                service_type,
                call_in_channel,
                queue_time,
                service_time,
                service_start_time,
                service_stop_time,
                agent_call,
                assigned,
                multi_match,
                created_at 
            FROM
                uin_callcenter_calls 
            WHERE
                tenant_id = '租户Id' 
                AND app_type IN ( 'agent', 'app' ) 
                AND service_start_time BETWEEN '2022-03-16 00:00:00' AND '2022-03-22 23:59:59' 
            ) AS cc
            LEFT JOIN uin_callcenter_customers c ON cc.customer_id = c.id 
            AND c.deleted_at = 0
            LEFT JOIN uin_callcenter_agents a ON cc.agent_id = a.id
            LEFT JOIN uin_callcenter_sessions s ON s.id = cc.session_id 
        WHERE
            cc.tenant_id = '租户Id' 
        ) ccc 
ORDER BY
    ccc.created_at DESC;

1.7 查询通话记录详情数据SQL示例

SELECT
    cc.id,
    cc.is_transfer,
    cc.session_id,
    cc.customer_id,
    cc.service_type,
    cc.call_in_channel,
    cc.app_node_list,
    cc.bussiness_num,
    cc.alterting_time,
    cc.queue_time,
    cc.service_time,
    cc.service_start_time,
    cc.service_stop_time,
    cc.ani,
    cc.is_repeat,
    cc.ani_place,
    cc.dnis,
    cc.dnis_place,
    cc.call_direction,
    cc.app_type,
    cc.tags,
    cc.summary,
    IFNULL( cc.agent_call -> '$.callresult', s.hangup_reason ) AS hangup_reason,
    s.record_file,
    a.agent_name,
    a.agent_num,
    t.title,
    cc.STATUS,
    cc.agent_call,
    s.satisfaction,
    cc.multi_match,
    (
    CASE
            cu.deleted_at 
            WHEN 1 THEN
            '未知客户' ELSE (
            CASE

                    WHEN cu.truename IS NULL THEN
                    ( CASE cc.multi_match WHEN TRUE THEN '多个匹配客户' ELSE '未知客户' END ) ELSE IFNULL( cu.truename, '未知客户' ) 
                END 
                ) 
            END 
            ) AS customer_name,
            cc.ringing_time,
            cc.qa_tag_id,
            cu.deleted_at AS customer_deleted,
            (
            CASE

                    WHEN cc.call_direction = 'call in' THEN
                    (
                    SELECT
                        count( 1 ) 
                    FROM
                        (
                        SELECT
                            session_id 
                        FROM
                            uin_callcenter_calls ww 
                        WHERE
                            ww.ani = cc.ani 
                            AND ww.bussiness_num = cc.bussiness_num 
                            AND app_type IN ( 'agent', 'app' ) 
                            AND created_at <= cc.created_at 
                            AND ww.tenant_id = '租户Id' 
                        GROUP BY
                            session_id 
                        ) AS c 
                    ) ELSE NULL 
                END 
                ) AS call_in_all_num,
                (
                CASE

                        WHEN cc.call_direction = 'call in' THEN
                        (
                        SELECT
                            count( 1 ) 
                        FROM
                            (
                            SELECT
                                session_id 
                            FROM
                                uin_callcenter_calls ww 
                            WHERE
                                ww.ani = cc.ani 
                                AND ww.bussiness_num = cc.bussiness_num 
                                AND app_type IN ( 'agent', 'app' ) 
                                AND created_at BETWEEN DATE_FORMAT( CURDATE(), '%Y-%m-%d %H:%i:%s' ) AND cc.created_at 
                                AND ww.tenant_id = '租户Id' 
                            GROUP BY
                                session_id 
                            ) AS c 
                        ) ELSE NULL 
                    END 
                    ) AS call_in_today_num 
                FROM
                    uin_callcenter_calls cc
                    LEFT JOIN uin_callcenter_sessions s ON cc.session_id = s.id 
                    LEFT JOIN uin_callcenter_agents a ON cc.agent_id = a.id 
                    LEFT JOIN uin_callcenter_qa_tags t ON cc.qa_tag_id = t.id 
                    LEFT JOIN uin_callcenter_customers cu ON cc.customer_id = cu.id 
                WHERE
                cc.id = 'c719fe5e-4502-46bf-c670-9d4d06d*****' 
    AND cc.tenant_id = '租户Id';
文档更新时间: 2024-04-12 13:20   作者:admin