fcc-core
Version:
Fusion communication center.
260 lines (254 loc) • 10.8 kB
JavaScript
/**
* 视频点呼
*/
import { formatDate, changeEmployeeICPStatus, validateStatus, getUserInfoByAccount, addPhoneCallRecord, addOPTRecord, changeOPTRecord, changePhoneCallRecord, addMonitorRecordSnapShot } from '../pointCall'
import { sendGlassPiontCallMessage, sendICPMeeting, callAccept } from '../../../utils/webServiceSocket/messageSocketApi'
// 呼叫主体
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
}
xw.SEND_ICP_CODE = sendUserInfo.ICP_CODE
// 检测状态
let resultState = await validateStatus(xw, sendUserInfo)
if (resultState !== 0) {
reject(new xw.BaseException(resultState))
return false
}
let phoneCallWaterCode = '' // 语音流水
let trafficWaterCode = '' // 话务流水
let functionName = ''
let callBackName = ''
let GLASS_NUM = ''
let queryParam = {}
let phoneCallRecordParams = { // 新增通话流水通用参数
USER_CODE: xw.userInfo.USER_CODE,
OPPO_NO: sendUserInfo.ICP_CODE, // 91 = 点对点视频
MEDIA_TYPE: '8', // 8 = 视频呼叫
CALL_CHNL: '52' // 52 = voip
}
// app 点呼走会议
console.log(sendUserInfo, xw.getSysParam('APP_PEER_TO_PEER'))
if (sendUserInfo.USER_TYPE === '4' && xw.getSysParam('APP_PEER_TO_PEER') === '1') {
if (xw.getSysParam('PLATFORM_VERSION') === '2') { // vc
let params = [
{
ICP_CODE: sendUserInfo.ICP_CODE,
OBJ_ID: sendUserInfo.USER_CODE,
OBJ_NAME: sendUserInfo.USER_NAME
},
{
ICP_CODE: xw.userInfo.ICP_CODE,
OBJ_ID: xw.userInfo.USER_CODE,
OBJ_NAME: xw.userInfo.USER_NAME
}
]
xw.exe.emit('SetVideoCallUseConf', {
isCaller: '1',
callId: sendUserInfo.ICP_CODE
})
await xw.ajaxRequest([{
service: 'E2601312',
ICP_USER: params
}]).then(res => {
if (res.code === '0') {
const result = res.data[0]
xw.exe.emit('SetVideoSerialNo', {
serailType: '3',
serialNo: result.CALL_SNO,
monitorResId: ''
})
// window.app.$store.commit('M_POINT_MEETING_PARAMS', { MEETING_ID: result.MEETING_ID, CALL_SNO: result.CALL_SNO, isCaller: '1' })
}
})
} else { // icp
xw.ajaxRequest([{
service: 'E2601501',
CREATE_MEET_FLAG: '1',
MEETING_NAME: '移动点呼会议',
MEETING_TYPE: 1, // 1 融合会议
MEDIAENCRYPTTYPE: 0,
DURATION: 1000,
HOST_USER: xw.userInfo.USER_CODE,
MEET_START_ID: xw.userInfo.USER_CODE,
MEMBERS: [{
OBJ_TYPE: '2',
OBJ_ID: String(xw.userInfo.USER_CODE),
OBJ_NAME: xw.userInfo.USER_NAME,
PART_DEV: '4',
PART_SNO: xw.userInfo.ICP_CODE,
GLASS_NUM: ''
}, {
OBJ_TYPE: '2',
OBJ_ID: String(sendUserInfo.USER_CODE),
OBJ_NAME: sendUserInfo.USER_NAME,
PART_DEV: '4',
PART_SNO: sendUserInfo.ICP_CODE
}], // 与会人员
CONTINUOUSPRESENCEMODE: '0'
}]).then(res => {
if (res.code === '0') {
const meetingData = res.data[0]
xw.exe.emit('CreateICPConfUseVideoCall', {
resId: xw.userInfo.ICP_CODE,
isVideo: '1',
memberInfo: [{
memberId: sendUserInfo.ICP_CODE,
memberName: sendUserInfo.USER_NAME,
isMute: '1',
isCamera: '0',
glassNum: '',
isWatchOnly: '0'
}]
}).once('OnCreateConf', result => {
if (result.resultCode === 0) {
meetingData.MEETING_ID = result.data.confId
sendICPMeeting(sendUserInfo.USER_CODE, meetingData, xw)
callAccept(sendUserInfo.USER_CODE, meetingData, xw)
}
})
}
})
}
} else {
if (sendUserInfo.USER_TYPE === '4') { // 一线人员
GLASS_NUM = await xw.ajaxRequest([{
service: 'E2601305',
OBJ_ID: sendUserInfo.USER_CODE
}]).then(res => {
if (res.code === '0') {
return res.data[0].GLASS_NUM
}
})
}
if (GLASS_NUM) {
functionName = 'CreateGlassConf'
callBackName = 'OnCreateGlassConf'
queryParam = { // 眼镜会议的exe参数
resId: xw.userInfo.ICP_CODE,
memberInfo: [{
memberId: xw.userInfo.ICP_CODE,
memberName: xw.userInfo.USER_NAME,
isMute: '1',
isCamera: '0',
isWatchOnly: '0',
glassNum: GLASS_NUM
}]
}
sendGlassPiontCallMessage(sendUserInfo.USER_CODE, xw) // 点呼之前发送信息给对端
} else {
functionName = 'PhoneCall'
callBackName = 'PhoneCall'
queryParam = {
isVideo: '1',
callId: sendUserInfo.ICP_CODE,
callType: '0',
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(functionName, queryParam)
xw.exe.once(callBackName, async (data) => {
if (data.resultCode === 0) {
if (callBackName === 'OnCreateGlassConf') { // 拉了眼鏡的,需要做闭音处理
phoneCallRecordParams = Object.assign(phoneCallRecordParams, { // 眼镜会议需要带上会议id
CALL_TYPE: '5', // 5 会议呼叫
MEETING_ID: data.data.confId,
REMARK: '添加眼镜会议视频通话流水'
})
xw.exe.on('OnConfMemberStatus', handleOnConfMemberStatus, this)
} else {
phoneCallRecordParams = Object.assign(phoneCallRecordParams, {
CALL_TYPE: '3', // 3 = 内部呼叫
REMARK: '新增视频点呼视频通话流水'
})
}
changeEmployeeICPStatus('2', xw) // 广播并且修改agentState状态 忙碌
phoneCallWaterCode = await addPhoneCallRecord(phoneCallRecordParams, xw) // 添加视频通话流水
trafficWaterCode = await addOPTRecord({ // 新增话务操作流水
USER_CODE: xw.userInfo.USER_CODE,
AGENT_OPT_TYPE: '91', // 91 = 点对点视频
CALL_OBJ_ID: '2', // 2 = 内部呼叫 员工编号
IS_SUCCESS: '0', // 1 = 成功
REMARK: '新增话务操作流水'
}, xw)
xw.exe.on('OnUpload', handleOnUpload, this)
}
})
}
// 回调函数
let handleOnUpload = (data) => {
handleOnUploadFormat(xw, data, phoneCallWaterCode, trafficWaterCode)
}
let handleOnConfMemberStatus = data => {
handleOnConfMemberStatusFormat(xw, data, sendUserInfo)
}
let handleOnCallConnected = data => {
handleOnCallConnectedFormat(xw, data, phoneCallWaterCode, trafficWaterCode)
}
// 接通
xw.exe.on('OnCallConnected', handleOnCallConnected, this)
// 挂断
xw.exe.once('OnCallEnd', data => {
changeEmployeeICPStatus('1', xw) // 广播并且修改agentState状态 空闲
xw.exe.off('OnUpload', handleOnUpload)
xw.exe.off('OnCallConnected', handleOnCallConnected)
if (callBackName === 'OnCreateGlassConf') xw.exe.off('OnConfMemberStatus', handleOnConfMemberStatus)
setTimeout(async () => {
trafficWaterCode && await changeOPTRecord(trafficWaterCode, { OPT_DURATION: 0, REMARK: '修改话务流水记录时长' }, xw) // 修改话务流水记录时长
phoneCallWaterCode && await changePhoneCallRecord(phoneCallWaterCode, { CALL_DURATION: 0, HANGUP_TYPE: data.data.endType, CALL_REMARK: '修改话务流水记录时长' }, xw)
trafficWaterCode = ''
phoneCallWaterCode = ''
}, 2000)
})
})
}
let handleOnUploadFormat = (xw, data, phoneCallWaterCode, trafficWaterCode) => {
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)
}
}
let handleOnConfMemberStatusFormat = async (xw, data, sendUserInfo) => {
if (data.resultCode === 0 && data.data.status === 1 && data.data.memberId === sendUserInfo.ICP_CODE) {
const obj = {}
obj.OBJ_TYPE = sendUserInfo.OBJ_TYPE
obj.OBJ_ID = sendUserInfo.USER_CODE
obj.OBJ_NAME = sendUserInfo.USER_NAME
obj.PART_DEV = sendUserInfo.PART_DEV
// obj.PART_SNO = this.ICP_CODE
obj.GLASS_NUM = sendUserInfo.GLASS_NUM
await xw.ajaxRequest([{
service: 'E2601103', // 闭音操作
MEETING_ID: data.data.confId,
MEETING_SNO: data.data.confId,
MEMBERS: [obj],
ISMUTE: 1
}])
}
}
let handleOnCallConnectedFormat = async (xw, data, phoneCallWaterCode, trafficWaterCode) => {
changePhoneCallRecord(phoneCallWaterCode, { CALLOUT_SUC: '1', CALL_REMARK: '修改通话流水呼出成功标志' }, xw) // 修改通话流水呼出成功标志
changeOPTRecord(trafficWaterCode, { IS_SUCCESS: '1', REMARK: '修改话务流水成功标志' }, xw) // 修改话务流水成功标志
changeEmployeeICPStatus('2', xw)
}