介绍
云联络中心支持在用户和座席双人通话的基础上,座席向其他座席,或技能组,或外线,发起“咨询”,待被咨询方接听后,三方进入通话流程。如下图所示:

API 列表
发起咨询
tccc.Call.invite(options): Promise
说明:
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话唯一标识。 |
| callee | Object | 是 | 被叫信息,须从下方三个属性中选择一个传入。 |
| allowQueue | Boolean | 否 | 默认 false,咨询时不排队。设置为 true 咨询时排队。 |
callee 内部属性(三选一)
属性名 | 类型 | 说明 |
userId | String | 被咨询方的 userId。 |
skillGroupId | Number | String | 技能组 ID。 |
phone | String | 外线电话号码。 |
// 咨询技能组let promise = tccc.Call.invite({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',callee: { skillGroupId: 81681 }});// 咨询指定座席let promise = tccc.Call.invite({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',callee: { userId: 'myemail@tencent.com' }});// 咨询外线let promise = tccc.Call.invite({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',callee: { phone: '185xxxx1935' }});promise.then(() => { // 发起咨询成功}).catch((error) => {if (error.code === '-7') {// 系统错误,会话不存在} else if (error.code === '-8001') {// 无成员在线} else if (error.code === '-8003') {// 成员全忙} else if (error.code === '-8002' || error.code === '-8004') {// 通知或转接失败} else if (error.code === '-999') {// 其它错误}// error.message 错误信息});
取回咨询
tccc.Call.reconnect(options): Promise
说明:
请提前监听
memberStateChanged 事件,获取 userId 对应的 memberId,调用接口时请传入 memberId。参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话唯一标识。 |
| memberId | String | 是 | 用户 X 的 memberId,取回时会取消对用户 X 的通话保持。 |
let promise = tccc.Call.reconnect({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',memberId: '6bcde1a7-975d-4a99-8831-8e21f566fbc0'});
取消保持
tccc.Call.unHold(options): Promise
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话唯一标识。 |
| memberId | String | 否 | 不传则默认取消对用户 X 的通话保持,设置后则取消对指定 member 的通话保持。 |
let promise = tccc.Call.unHold({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc'});
保持
tccc.Call.hold(options): Promise
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话唯一标识。 |
| memberId | String | 否 | 不传则默认对用户 X 的通话保持,设置后则对指定 member 的通话保持。 |
let promise = tccc.Call.hold({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc'});
转接
tccc.Call.transfer(options): Promise
座席 A 调用,留用户 X 与座席 B 通话(取消对 memberId 的通话保持,座席 B 成为 host),等同于座席 A 退出会议。
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话唯一标识。 |
| memberId | String | 是 | 用户 X 的 memberId。 |
let promise = tccc.Call.transfer({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',memberId: '6bcde1a7-975d-4a99-8831-8e21f566fbc0'});
挂断
tccc.Call.hangUp(options): Promise
座席 A 调用,留用户 X 与座席 B 通话(不会取消对 memberId 的通话保持,座席 B 成为 host),等同于座席 A 退出会议。座席 B 调用,则等同于座席 B 退出会议。
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话唯一标识. |
let promise = tccc.Call.hangUp({sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc'});
获取技能组列表
tccc.Agent.getSkillGroupList(options): Promise
参数 | 类型 | 必填 | 备注 | |
options | freeOnly | Boolean | 否 | 是否查找有空闲座席的技能组。 |
| fuzzingKeyWord | String | 否 | 模糊搜索技能组里的关键词。 |
| pageSize | String | 否 | 分页大小。 |
// 获取有空闲座席的,技能组名字里包含"售前"的技能组let promise = tccc.Agent.getSkillGroupList({ freeOnly: true,fuzzingKeyWord: "售前",pageSize: "100"});
获取座席列表
tccc.Agent.getStaffList(options): Promise
参数 | 类型 | 必填 | 备注 | |
options | userId | String | 否 | 用户 ID,通常为邮箱名,模糊查找。 |
| staffName | String | 否 | 姓名,模糊查找。 |
| roleId | String | 否 | 角色 ID,精确查找。 |
| mobile | String | 否 | 手机号,模糊查找。 |
| staffNo | String | 否 | 工号,精确查找。 |
| fuzzingStaffNo | String | 否 | 工号,模糊查找。 |
| skillGroupType | Number | 否 | 技能组类型,默认值填0。 |
| skillGroupId | String | 否 | 技能组 ID。 |
| notSkillGroupId | String | 否 | 排除技能组 ID。 |
| pageSize | String | 否 | 分页大小。 |
| pageNum | String | 否 | 页码,从0开始。 |
| orderField | String | 否 | 按 ctime/seat_status/staff_no 排序。 |
| orderType | String | 否 | asc 正序,desc 倒序。 |
| status | [] | 否 | 按状态筛选。 |
| isNeedStatus | boolean | 否 | 是否需要回包带上状态。 |
| fuzzingKeyWord | String | 否 | 模糊搜索名字或者邮箱里的关键词。 |
// 查询状态是空闲或者示忙的座席let promise = tccc.Agent.getStaffList({ status: [100, 700]});// 模糊搜索名字或者邮箱里包含"qiao",空闲或者示忙的座席,并且需要回包带上座席的状态let promise = tccc.Agent.getStaffList({fuzzingKeyWord: "qiao", status: [100, 700],isNeedStatus: true});// 回包的 staffNo 代表座席的工号
事件监听
座席端请监听
memberStateChanged 事件。tccc.on(tccc.events.memberStateChanged, (evt) => {const {userId,memberId,displayName,sessionId,serverType,isHost,isSelf,acceptedState,callState,acceptTimestamp,ringTimestamp,hungupParams } = evt;// displayName 技能组或者座席展示的名称// serverType// - staffSeat web 端座席// - customer 用户// - outboundSeat 外线座席// - staffExtensionSeat 话机座席// - queue 排队中// callState// - RINGING 振铃中// - END 已结束// - ACCEPTED 已接通const { MUTE, ON_HOLD } = acceptedState;// MUTE 是否静音// ON_HOLD 通话是否挂起// 当 callState 为 'ACCEPTED', acceptTimestamp 为接听时间戳// hungupParams 当通话结束,这个字段包含了挂断方,挂断原因等信息});if (serverType === 'queue' && ringTimestamp === 0) {// 咨询请求排队中}});