UNPKG

fcc-core

Version:

Fusion communication center.

260 lines (254 loc) 10.8 kB
/** * 视频点呼 */ 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) }