fcc-core
Version:
Fusion communication center.
232 lines (222 loc) • 7.13 kB
JavaScript
import agentapi from '../api/agentApi'
import events from './eventsConfig'
import { extend } from '../util/util'
import { ignoreEvent } from './ignoreEvents'
import eventlife from './eventlife'
// import client from './websocket'
import client from '../../nats/fsnats'
import eventAnalysis from './eventAnalysis'
/**
* 事件获取及处理
* 目前支持华为平台 以及freeswitch 两个平台
* 华为平台获取事件通过轮询方式
* freeswitch 通过对接emq的websocket 方式获取
* 两者获取方法都在签入成功后 init 方法里面初始化启动
* 签出成功停止事件的获取
* 两者除获取事件方式不一致 其他逻辑完全一样
*/
class AgentEvents {
constructor (ucc) {
extend(AgentEvents.prototype, events)
this.ucc = ucc
this.stop = false
this.eventQueue = []
}
// 启动获取事件以及一些初始化的操作
init () {
this.stop = false
// 如果是agentgateway平台 则轮询获取事件
if (!this.ucc.isFS) {
this.getEvent()
} else {
const self = this
this.client = client
this.client.open(() => {
this.client.on(`callcenter.agentEvent.${this.ucc.userInfo.AGENT_ID}.>`, response => {
this.parseEvent.call(self, response)
eventAnalysis.analysis(response)
})
}, this.ucc.xw)
// this.client = client({
// agentId: this.ucc.userInfo.AGENT_ID,
// phonenum: this.ucc.userInfo.SIGNIN_CODE,
// cb: (client) => {
// let subscribe = 'callcenter.agentEvent.' + this.ucc.userInfo.AGENT_ID + '.>'
// client.nats.subscribe(subscribe, message => {
// this.parseEvent.call(self, JSON.parse(message))
// eventAnalysis.analysis(message)
// })
// }
// })
}
}
/**
* 轮询获取华为平台的事件
* 每次调用成功时
* 1.获取到事件,则立即递归方式调用自己
* 2.没有取到事件,则1S后重新获取,后台会挂起10S后再响应该请求
*/
getEvent () {
if (this.stop) {
return
}
const self = this
agentapi
.getAgentEvent()
.then(async data => {
const { event } = data
// 没有获取到事件 则600ms之后重新拉取事件
if (event === undefined) {
setTimeout(() => {
self.getEvent()
}, 1000)
} else {
this.parseEvent.call(self, event, self.getEvent)
}
})
.catch(e => {
console.error(e)
// 坐席没有登录
if (e === '100-006') {
return
}
self.getEvent()
})
}
/**
* websocket收到FS平台事件消息时
*/
onMessageArrived () {
return function (message) {
if (message) {
const obj = JSON.parse(message.payloadString)
if (!obj['content']) {
obj['content'] = ''
}
this.parseEvent.call(self, obj)
}
}
}
/**
* 解析平台事件
* @param event
* @param cb
*/
parseEvent (event, cb) {
const self = this
// 纠正坐席状态状态
self.checkedState()
// 执行下一个获取事件操作
cb && cb.call(this)
// 事件里面带来的参数
let { content: params } = event
self.ucc.db.addLog({
action: `收到事件`,
usercode: self.ucc.userInfo.USER_CODE,
interface: '获取事件接口',
state: self.ucc.agentState,
params: event
})
// 缓存callid
this.pushCallid(event)
const type = self.ucc.transType
// 如果存在转移操作 则屏蔽转移操作触发的事件
if (type && ignoreEvent(type, event.eventType)) {
return
}
params = typeof params === 'string' ? { content: params } : params
// 将平台事件转换成业务事件
const uccevent = typeof self[event.eventType] === 'function' ? self[event.eventType]() : ''
// 发射事件
self.emitEvent(uccevent, params, event.eventType)
}
/**
* 发射事件
* @param uccevent
*/
async emitEvent (uccevent, params = {}, eventType) {
if (uccevent) {
// 来电相关事件时,查询出随路数据 主要针对有通话的时候
let callData = await this.ucc.getCallData(eventType, params)
// 分发事件到组件
if (this.ucc.transType) {
this.emitEventToComponent(uccevent, params)
}
// 初始化每个事件数据对象
this.ucc.eventData[uccevent] = { time: new Date().getTime(), params: Object.assign(callData, params) }
// 判断事件队列里面是否存在 存在表示事件操作之后预期事件获取没有完成
if (this.eventQueue.length > 0) {
if (uccevent === this.eventQueue[0]) {
clearTimeout(this.ucc.eventTimer)
this.ucc.eventTimer = null
while (this.eventQueue.length > 0) {
this.executeChangebtn(this.eventQueue.shift())
}
} else {
this.eventQueue.push(uccevent)
}
return
}
// 执行按钮变化按钮
this.executeChangebtn(uccevent)
}
}
/**
*通过事件触发按钮的变化
* @param uccevent
*/
executeChangebtn (uccevent) {
// 事件触发前
eventlife[uccevent] && eventlife[uccevent]['beforeEvent'].call(this.ucc, uccevent)
// 执行对应事件的业务代码得到按钮变化所需要的事件
const btnevent = typeof this.ucc[uccevent] === 'function' && this.ucc[uccevent](uccevent)
// 事件触发后
eventlife[uccevent] && eventlife[uccevent]['afterEvent'].call(this.ucc, uccevent)
// 修改按钮的初始配置 触发按钮变化
/* if (btnevent) {
const btnconfig = this.ucc.btnctrl.getBtnConfig(btnevent)
extend(this.ucc.btnctrl.initConfig, btnconfig)
} */
}
/**
* 广播事件到组件
*/
emitEventToComponent (event, params) {
const components = this.ucc.components
for (let component in components) {
components[component]['emitEvent'] && components[component]['emitEvent'](event, params)
}
}
/**
*获取坐席状态并纠正
* @returns {Promise<void>}
*/
async checkedState () {
const {
result: { agentState }
} = await agentapi.getAgentStatusSync()
if (this.ucc.agentState === 4 && agentState !== 4) {
// 更新示闲话务操作流水
}
this.ucc.agentState = agentState
}
/**
* 缓存callid
* @param event
*/
pushCallid (event) {
if (event.eventType === 'AgentEvent_Talking') {
console.log('///', this)
const index = this.ucc.callids.indexOf(event.content.callId)
index < 0 && this.ucc.callids.push(event.content.callId)
this.ucc.transType && this.emitEventToComponent('OnAnswerSuccess')
}
}
/**
*停止获取事件
*/
stopGetEvent () {
this.stop = true
}
}
export default AgentEvents