持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
依托现有账户体系实现多公司多通道客服渠道聚合
UC设计
简要描述一下:
- 通过内部管理系统IMS 以维护公司增值服务的动作来完成对于公司内极光账号的初始化,此处调用极光IM提供的
rest API里批量注册用户的接口,初始化公司客服账号,并进行持久化存储形成 公司-账户(通道) 表 - 维护公司菜单,添加客服管理列表菜单
- 在列表上,建立客服账号与用户之间的关联,并持久化存储 ,形成 用户-公司-账户表的关联表
- 在pc客户端,通过服务的统一鉴权认证,获取token
- 调用接口,获取当前账户所关联的客服通道列表
- 基于列表,初始化JIM实例,并进行登录操作,此处需要借助全局状态管理工具,将多实例维护在全局
- 注册全局消息接收发送处理
- 历史记录统一处理
多通道实例化及全局状态管理维护
// 伪代码
let msgInstanceMap = {}
msgArray.map(msg => {
let JIM = new JMessage({ debug: true })
// 根据返回的通道列表初始化极光IM SDK 并登录
JIM.login(....)
msgInstanceMap[msg.name] = JIM
this.SET_INSTANCE(msgInstanceMap)
})
统一收发消息
export function onMsgReceive () {
for (let JIM in msgInstanceMap) {
JIM.onMsgReceive((data) => {
// data.messages[]
// data.messages[].ctime_ms
// data.messages[].msg_type 会话类型
// data.messages[].msg_id
// data.messages[].from_appey 单聊有效
// data.messages[].from_username 单聊有效
// data.messages[].from_gid 群聊有效
// data.messages[].need_receipt
// data.messages[].content
// data.messages[].custom_notification.enabled
// data.messages[].custom_notification.title
// data.messages[].custom_notification.alert
// data.messages[].custom_notification.at_prefix
})
}
}
export function onMsgSend (JIM) {
JIM.sendSingleMsg({
'target_username': 'xiezefan',
'content': 'Hi, JiGuang '
}).onSuccess(function (data) {
// do something
}).onFail(function (data) {
// do something
}).onTimeout(function (data) {
if (data.response_timeout) {
// do something when response timeout
} else {
// do something when request timeout
}
}).onAck(function (data) {
// do something
})
}
// 拉取合并会话列表
export function mergeConversationList () {
let conversationList = []
for (let JIM in msgInstanceMap) {
JIM.getConversation().onSuccess((data) => {
// data.code 返回码
// data.message 描述
// data.conversations[] 会话列表,属性如下示例
// data.conversations[0].extras 附加字段
// data.conversations[0].unread_msg_count 消息未读数
// data.conversations[0].name 会话名称
// data.conversations[0].appkey appkey(单聊)
// data.conversations[0].username 用户名(单聊)
// data.conversations[0].nickname 用户昵称(单聊)
// data.conversations[0].avatar 头像 media_id
// data.conversations[0].mtime 会话最后的消息时间戳
// data.conversations[0].gid 群 id(群聊)
// data.conversations[0].type 会话类型(3 代表单聊会话类型,4 代表群聊会话类型)
conversationList.push(...data)
this.SET_CONVERSATION_LIST(conversationList)
}).onFail(function (data) {
// data.code 返回码
// data.message 描述
})
}
}
结语: 到这个时候,我们就完成了点对点聊天多通道的管理。