fcc-core
Version:
Fusion communication center.
116 lines (112 loc) • 5.31 kB
JavaScript
/**
* 音频点呼
*/
import { changeEmployeeICPStatus, validateStatus, getUserInfoByAccount, addPhoneCallRecord, addOPTRecord, changeOPTRecord, changePhoneCallRecord, addMonitorRecordSnapShot, formatDate } from '../pointCall'
// 呼叫主体
export default async function (xw, params) {
await xw.validate(params, {
'userAccount': { type: 'string', required: true },
'location': { type: 'object' }
})
await new Promise(async (resolve, reject) => {
// 获取被叫人员的信息
let sendUserInfo = await getUserInfoByAccount({ 'USER_ACCOUNT': params.userAccount }, xw)
if (!sendUserInfo || !sendUserInfo.ICP_CODE) {
reject(new xw.BaseException(417, '呼叫对象不存在或账号错误'))
return false
}
// 检测状态
let resultState = await validateStatus(xw, sendUserInfo)
if (resultState !== 0) {
reject(new xw.BaseException(resultState))
return false
}
let queryParam = {
isVideo: '0',
callId: sendUserInfo.ICP_CODE, // 对方的icp_code
callType: '0', // voip呼叫
userName: sendUserInfo.USER_NAME
}
if (params.location) {
queryParam.locX = params.location.locX || ''
queryParam.locY = params.location.locY || ''
queryParam.scale = params.location.scale || '1'
}
// 开始呼叫
xw.exe.emit('PhoneCall', queryParam)
xw.SEND_ICP_CODE = sendUserInfo.ICP_CODE
let phoneCallWaterCode = '' // 语音流水
let trafficWaterCode = '' // 话务流水
let handleOnCallConnected = data => {
handleOnCallConnectedFormat(xw, data, phoneCallWaterCode, trafficWaterCode)
}
let handleOnUpload = data => {
handleOnUploadFormat(xw, data, phoneCallWaterCode)
}
// 呼叫回调
xw.exe.once('PhoneCall', async data => {
// 呼叫成功
if (data.resultCode === 0) {
changeEmployeeICPStatus('2', xw) // 广播并且修改agent_state状态 忙碌
}
// 无论成功失败,都要新增流水
phoneCallWaterCode = await addPhoneCallRecord({ // 添加语音通话流水
USER_CODE: sendUserInfo.USER_CODE,
OPPO_NO: sendUserInfo.ICP_CODE, // 对方的ICP_CODE
MEDIA_TYPE: '9', // 5 = voip语音呼叫
CALL_CHNL: '52', // 52 = voip语音呼叫
CALL_TYPE: '3', // 3 = 内部呼叫
CALL_REMARK: '添加语音通话流水'
}, xw)
trafficWaterCode = await addOPTRecord({ // 新增话务操作流水
USER_CODE: sendUserInfo.USER_CODE,
IS_SUCCESS: '0',
AGENT_OPT_TYPE: '90', // 90 = 点对点语音呼叫
CALL_OBJ_ID: '2', // 2 = 内部呼叫 员工编号
REMARK: '添加话务流水'
}, xw)
})
xw.exe.on('OnUpload', handleOnUpload)
xw.exe.on('OnCallConnected', handleOnCallConnected)
// 挂机
xw.exe.once('OnCallEnd', data => {
changeEmployeeICPStatus('1', xw) // 广播并且修改agent_state状态 空闲
xw.exe.off('OnCallConnected', handleOnCallConnected)
xw.exe.off('OnUpload', handleOnUpload)
setTimeout(() => {
phoneCallWaterCode && changePhoneCallRecord(phoneCallWaterCode, { CALL_DURATION: 0, HANGUP_TYPE: data.data.endType, CLAA_REMARK: '修改话务流水记录时长' }, xw)
trafficWaterCode && changeOPTRecord(trafficWaterCode, { OPT_DURATION: 0, REMARK: '修改话务流水记录时长' }, xw)
phoneCallWaterCode = ''
trafficWaterCode = ''
}, 2000)
})
})
}
// 接通处理
let handleOnCallConnectedFormat = (xw, data, phoneCallWaterCode, trafficWaterCode) => {
if (data.resultCode === 0) {
if (phoneCallWaterCode && trafficWaterCode) {
changePhoneCallRecord(phoneCallWaterCode, { CALLOUT_SUC: '1', IS_SUCCESS: '1', REMARK: '修改通话流水呼出成功标志' }, xw) // 修改通话流水呼出成功标志
changeOPTRecord(trafficWaterCode, { IS_SUCCESS: '1', REMARK: '修改话务流水成功标志' }, xw) // 修改话务流水成功标志
return
}
setTimeout(() => {
changePhoneCallRecord(phoneCallWaterCode, { CALLOUT_SUC: '1', IS_SUCCESS: '1', REMARK: '修改通话流水呼出成功标志' }, xw) // 修改通话流水呼出成功标志
changeOPTRecord(trafficWaterCode, { IS_SUCCESS: '1', REMARK: '修改话务流水成功标志' }, xw) // 修改话务流水成功标志
}, 2000)
}
}
// 截录屏处理
let handleOnUploadFormat = (xw, data, phoneCallWaterCode) => {
if (data.resultCode === 0) {
addMonitorRecordSnapShot({ // 新增截屏流水
SNO: phoneCallWaterCode,
REC_CUT_OUT_ADD: data.data.path,
REC_SNO_TYPE: 3, // 1会议 2监控 3点对点
REC_TYPE: data.data.UPLOAD_TYPE, // 1截屏 2录屏
START_TIME: data.data.UPLOAD_TYPE === 2 ? formatDate(new Date(data.data.start_time * 1000), 'yyyy-MM-dd HH:mm:ss') : formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss'),
CUT_OUT_TIME: data.data.UPLOAD_TYPE === 2 ? formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss') : formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss'),
END_TIME: data.data.UPLOAD_TYPE === 2 ? formatDate(new Date(data.data.end_time * 1000), 'yyyy-MM-dd HH:mm:ss') : formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss')
}, xw)
}
}