(() => { class UMPSDK { constructor(config) { this.appId = config.appId || ""; this.appSecret = config.appSecret || ""; this.url = config.url || ""; // 用于跨域代理 this.style = config.style || ""; // 来电卡片的style this.callback = config.callback; // 非必填 this.logCallback = config.logCallback; // 非必填 this.accessToken = ""; this.mdcIP = config.mdcIP || ""; this.isdn = config.isdn || ""; this.isdnPwd = config.isdnPwd || ""; this.disAccount = config.disAccount || ""; // 卡片样式集合 this.cardStyle = { voiceStyle: "", videoStyle: "", monitorStyle: "", }; // 计时器集合,数组对象{cid: cid, timer: timer} this.timer = { voiceTimer: [], videoTimer: [], monitorTimer: [], isCalling: false, }; // yuv的player实例集合 this.player = {}; // 订阅群组isdn集合,对象数组{cid: cid, groupId: groupId} this.subscribGroupIsdn = []; // 分发对象的集合对象 // 结示例{cid-xxx: [{isdn: isdn, isGroup: isGroup}]} this.dispatchArr = {}; this.voice = { style: "", }; // 点呼业务 this.video = {}; // 视频呼叫 this.windowShare = {}; // 共享桌面 this.monitor = {}; // 视频监控 this.group = { style: "", }; // 群组业务 this.msg = { fileName: "", authorizationHeader: "", // msgid: "", }; // 短彩信业务 this.metting = { // 会议业务 Attendees: "", // 主动入会的会议成员信息list数组 isJoin: false, // 主动结束和被动入会离开状态锚点 audience: false, // 会议静音状态锚点 unJoinMetting: [], // 呼叫失败人员集合 userInfoList: [], // 查询用户设备能力 layoutStatus: false, // 分屏弹窗状态锚点 macStatus: false, layoutType: [ { id: 0, icon: "ump-screen-layout-1", name: "1屏", type: "CP_1_1", number: 1, pic: 1, }, { id: 1, icon: "ump-screen-layout-2", name: "2屏", type: "CP_2_1", number: 2, pic: 2, }, { id: 2, icon: "ump-screen-layout-3", name: "3屏", type: "CP_3_4", number: 3, pic: 16, }, { id: 3, icon: "ump-screen-layout-4", name: "4屏", type: "CP_4_1", number: 4, pic: 4, }, { id: 4, icon: "ump-screen-layout-5", name: "5屏", type: "CP_5_1", number: 5, pic: 5, }, { id: 5, icon: "ump-screen-layout-6", name: "6屏", type: "CP_6_1", number: 6, pic: 9, }, { id: 6, icon: "ump-screen-layout-7-1", name: "7屏", type: "CP_7_1", number: 7, pic: 16, }, { id: 7, icon: "ump-screen-layout-7-2", name: "7屏", type: "CP_7_2", number: 7, pic: 16, }, { id: 8, icon: "ump-screen-layout-8", name: "8屏", type: "CP_8_1", number: 8, pic: 16, }, { id: 9, icon: "ump-screen-layout-9", name: "9屏", type: "CP_9_1", number: 9, pic: 9, }, { id: 10, icon: "ump-screen-layout-10-1", name: "10屏", type: "CP_10_1", number: 10, pic: 16, }, { id: 11, icon: "ump-screen-layout-10-2", name: "10屏", type: "CP_10_5", number: 10, pic: 16, }, { id: 12, icon: "ump-screen-layout-13", name: "13屏", type: "CP_13_5", number: 13, pic: 16, }, { id: 13, icon: "ump-screen-layout-16", name: "16屏", type: "CP_16_1", number: 16, pic: 16, }, ], // 分屏模式 choseLayoutType: "CP_4_1", // 存储用户选择的画面多屏布局模式,默认四屏 memberList: [], // 多画面广播成员列表, girdNum: [1, 2, 3, 4], // 会场布局网格数量, gridClassName: ["grid0", "grid1", "grid2", "grid3"], // 布局的网格类名集合, setGridPerson: [], // 页面渲染的选中布局的入会人员 setPageGridPerson: [], // 存储点击保存的选中布局的入会人员 style: "", cid: "", // 会议计时器cid }; // 会议业务 this.gis = {}; // gis订阅 this.subscribe = {}; // 订阅用户 this.department = {}; // 部门 this.icp = {}; // 返回上层实例对象 this.getTokenIntervalTimer = null; // 获取token计时器 this.getTokenTime = 0; // 获取token的时间 this.isUMPUserOut = false; // 用户是否被踢出 this.wedcSDK = ""; this.Emergency = []; //紧急组呼 this.isUMPUserOutTimer = null; // 用户是否被踢出计时器 this.downloadUrl = "http://171.221.254.50:8009/mspversion/"; this.init(); } // 初始化 async init() { // 显示版本号 var sdkVersion = "022.650.191"; // document.getElementById("ump-demo-version").innerHTML ="版本号:" + sdkVersion; if (!this.logCallback) { this.logCallback = (info) => { console.log(info); }; } console.log(909090); this.initEnum(); this.initICPSDK(); // 本地缓存通话记录 let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")) || []; localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); // 本地缓存会议记录 let meetingHistory = JSON.parse(localStorage.getItem("meetingHistory")) || []; localStorage.setItem("meetingHistory", JSON.stringify(meetingHistory)); } // 初始化icpsdk initICPSDK() { window.onfocus = () => { clearTimeout(this.isUMPUserOutTimer); this.isUMPUserOutTimer = setTimeout(() => { console.log("页面聚焦", this.isUMPUserOut, this); if (this.isUMPUserOut) { this.isUMPUserOut = false; this.initICPSDK(); } }, 500); }; let config = { serverWSPort: "8002", serverAddress: "171.221.254.50", serverHttpPort: "8002", debugMode: "false", mode: "wssflow", mediaType: "2", ringFlag: "0", ssl_enable: true, videoConfLocalWindow: false, }; config["sdkStatusNotify"] = (data) => { console.log(data, "+++++++++++++++++++++++++++++"); if (data.status === "0") { this.modifyMdcIp(); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "🚀等待udc登录,初始化icpsdk成功:" + JSON.stringify(data) ) ); } } else if (data.status === "1") { // if (this.callback) { // this.callback('❗初始化icpsdk异常') // } this.showMessage( "❗通信插件异常,请点击【下载】后,进行【解压安装】,确认右下角MSP🌱点亮", "error", "showHrefID", "targetID" ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "❗初始化icpsdk异常:" + JSON.stringify(data) ) ); } } else if (data.status === "2") { // if (this.callback) { // this.callback('❗初始化icpsdk异常') // } this.showMessage( "❗通信插件异常,请点击【下载】后,进行【解压安装】,确认右下角MSP🌱点亮", "error", "showHrefID", "targetID" ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "❗初始化icpsdk异常:" + JSON.stringify(data) ) ); } } else if (data.status === "3") { // if (this.callback) { // this.callback('❗初始化icpsdk异常') // } this.showMessage( "❗通信插件异常,请点击【下载】后,进行【解压安装】,确认右下角MSP🌱点亮", "error", "showHrefID", "targetID" ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "❗初始化icpsdk异常:" + JSON.stringify(data) ) ); } } else { // if (this.callback) { // this.callback('❗初始化icpsdk异常') // } this.showMessage( "❗通信插件异常,请点击【下载】后,进行【解压安装】,确认右下角MSP🌱点亮", "error", "showHrefID", "targetID" ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "❗初始化icpsdk异常:" + JSON.stringify(data) ) ); } } }; this.wedcSDK = new ICPSDK(config); window.ICPSDK = this.wedcSDK; this.initSDKEvent(); } // 修改mdcip modifyMdcIp() { cloudICP.dispatch.webSocket.getLocalIp({ callback: (data) => { let currentIp = data.mdcip; console.log( this.wedcSDK.config.mspVersion, data.mspVersion, "*****************" ); if (this.wedcSDK.config.mspVersion == data.mspVersion) { this.removeMsgDom(); } else { this.downloadUrl = this.downloadUrl + data.mspVersion + "/eSDK_ICP_MSP.zip"; this.showMessage( "❗通信插件异常,请点击【下载】后,进行【解压安装】,确认右下角MSP🌱点亮", "error", "showHrefID", "targetID" ); } if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "当前地址:" + currentIp + "服务器地址:" + this.mdcIP ) ); } if (this.mdcIP && this.mdcIP !== currentIp) { cloudICP.dispatch.webSocket.ModifyMdcIp({ mdcip: this.mdcIP, callback: (data) => { if (data.mdc_result === 0) { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("🚀修改mdcip成功,初始化成功!") ); } } else { // if (this.callback) { // this.callback('❗修改mdcip失败') // } this.showMessage( "修改mdcip失败,请重新安装插件,或联系管理员!!!", "error", "showHrefID" ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("❗修改mdcip失败,初始化失败!") ); } } }, }); } else { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("🚀mdcip无需修改,初始化成功!") ); } } // 根据传入disAccount指定参数,判断是否调用迪艾斯查询账户密码接口 if (this.disAccount && this.disAccount.length > 0) { fetch("/oauth/v2/getUserInfoByDs", { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json, text/plain, */*", }, body: JSON.stringify({ dsAccount: this.disAccount, }), }) .then((response) => response.json()) .then((data) => { if (data.data) { this.showMessage("账号密码查询成功!", "success"); console.log("迪艾斯账号密码查询成功:", data); this.isdn = data.data.isdn; this.isdnPwd = data.data.password; this.loginUdc(); } }) .catch((error) => { console.error("迪艾斯账号密码查询失败:", error); this.showMessage("账号密码查询失败!", "error"); }); } else { this.loginUdc(); } }, }); } // 登录udc loginUdc() { console.log( this.isdn, this.isdnPwd, "查看迪艾斯账户密码是否赋值成功-unifiedLogin()" ); cloudICP.dispatch.auth.unifiedLogin({ user: this.isdn, password: this.isdnPwd, force: "true", callback: (rsp) => { if (rsp.rsp === "0") { this.initVoiceHandler(); this.initVideoHandler(); this.initWindowShare(); this.initMonitorHandler(); this.initGroupHandler(); this.initMessageHandler(); this.initMetingHandler(); this.initGis(); this.initSubscribeUserStatus(); this.initQueryGroup(); this.initDepartment(); this.initIcp(); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("🚀登录udc成功" + JSON.stringify(rsp)) ); this.queryingTheConferenceStatus(); // this.getUserInfo() } if (this.callback) { this.callback(rsp); } } else { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("❗登录udc失败" + JSON.stringify(rsp)) ); } if (this.callback) { this.callback(rsp); } } }, }); } //登出 logout() { cloudICP.dispatch.auth.unifiedLogout({ callback: (data) => { if (data.rsp == 0) { if (this.logCallback) { this.wedcSDK = null; window.ICPSDK = null; loadICPSDKScript(); this.logCallback( UMPSDK.logInfoFormat("🚀退出udc成功" + JSON.stringify(data)) ); this.showMessage("🚀退出udc成功", "success"); } } else { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("🚀退出登录udc失败" + JSON.stringify(data)) ); this.showMessage("🚀退出udc失败", "error"); } } }, }); } // ==================================工具函数================================== /** * 执行注册事件 * @param {Object} obj {eventType: string, eventName: string, callback: function} */ static sdkRegister(obj) { const findIndex = UMPSDK.eventList.findIndex( (ite) => ite.eventType === obj.eventType && ite.eventName === obj.eventName ); if (findIndex !== -1) { UMPSDK.splice(findIndex, 1, obj); } else { UMPSDK.eventList.push(obj); } } sdkRegisterHandler(eventType, eventName, data) { const findItem = UMPSDK.eventList.find( (ite) => ite.eventType === eventType && ite.eventName === eventName ); if (findItem && typeof findItem.callback === "function") { findItem.callback(data); } } // 处理时间格式 00:00:00 static timeHandler(time) { if (time || time === 0) { const hours = Math.floor(time / (60 * 60)); const minutes = Math.floor((time % (60 * 60)) / 60); const remainingSeconds = time % 60; return ( (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (remainingSeconds < 10 ? "0" + remainingSeconds : remainingSeconds) ); } else { return ""; } } // 格式化时间 YYYY=年2019 YY=年19 MM=月 DD=天 hh:时 mm:分 ss:秒 static dateFormat(type, val) { const date = val ? new Date(/^[0-9]*$/g.test(val) ? Number(val) : val) : new Date(); const YYYY = String(date.getFullYear()); const YY = String(date.getFullYear()).substring(2); const m = date.getMonth() + 1; const MM = m > 9 ? String(m) : "0" + m; const d = date.getDate(); const DD = d > 9 ? String(d) : "0" + d; const h = date.getHours(); const hh = h > 9 ? String(h) : "0" + h; const $m = date.getMinutes(); const mm = $m > 9 ? String($m) : "0" + $m; const s = date.getSeconds(); const ss = s > 9 ? String(s) : "0" + s; const obj = { YYYY, YY, MM, DD, hh, mm, ss }; return type.replace( /(YYYY)|(MM)|(DD)|(hh)|(mm)|(ss)/g, (key) => obj[key] ); } // 格式化日志信息 static logInfoFormat(text) { return `[${UMPSDK.dateFormat("YYYY-MM-DD hh:mm:ss")}]:${text}`; } //查询用户信息 getUserInfo() { let param = { limit: "5000", callback: (data) => { if (data.rsp === "0") { this.metting.userInfoList = [...data.list]; if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询用户信息" + JSON.stringify(data)) ); } } else { this.logCallback( UMPSDK.logInfoFormat("查询用户信息" + JSON.stringify(data)) ); } }, }; cloudICP.dispatch.query.queryUserListV1(param); } // ==================================工具函数================================== // ===================================枚举===================================== initEnum() { this.CommunicateStatusEnum = { "OnDialOutProceeding-2005": "连接中", "OnDialOutProceeding-3004": "连接中", "OnDialOutRinging-2006": "振铃中", "OnDialOutRinging-3005": "振铃中", "OnCallConnect-2003": "通话中", "OnCallConnect-2007": "通话中", "OnDialOutFailure-2013": "被叫忙", "OnDialOutFailure-2016": "没有权限外呼", "OnDialOutFailure-2017": "被叫没有应答,超时", "OnDialOutFailure-2018": "被叫号码不存在", "OnDialOutFailure-2024": "被叫号码未在线或被叫号码挂断呼叫", "OnDialOutFailure-2049": "对端不支持该操作", "OnDialOutFailure-2052": "被叫号码没有呼入权限", "OnDialOutFailure-2023": "对端不支持所需的音频格式", "OnDialOutFailure-2033": "远程断电", "OnDialOutFailure-2048": "本端不支持该操作", "OnDialOutFailure-3013": "对端忙", "OnDialOutFailure-3014": "没有视频点呼权限", "OnDialOutFailure-3015": "对端超时", "OnDialOutFailure-3016": "对端号码不存在", "OnDialOutFailure-3021": "对端未在线或被对端挂断呼叫", "OnDialOutFailure-3044": "本端不支持该操作", "OnDialOutFailure-3045": "对端不支持该操作,可能是没有权限,或者是不支持该分辨率", "OnDialOutFailure-3048": "对端没有权限", "OnDialInRinging-2002": "语音呼叫", "OnDialInRinging-3002": "视频呼叫", "OnConfDialInRinging-3002": "视频会议", "OnDialInRinging-3011": "视频分发", "OnSendDispSMSResult-1": "业务不支持,如对方不支持加密短信或无权限等", "OnSendDispSMSResult-2": "VPN权限非法", "OnSendDispSMSResult-3": "对方号码不存在", "OnSendDispSMSResult-5": "号码被锁定", "OnSendDispMMSResult-1": "业务不支持,如对方不支持加密短信或无权限等", "OnSendDispMMSResult-2": "VPN权限非法", "OnSendDispMMSResult-3": "对方号码不存在", "OnSendDispMMSResult-5": "号码被锁定", "OnSendDispMMSResult-6": "无效msgid", "OnVideoDispatchFailure-40097": "服务器端返回错误, 操作被调度机拒绝", "OnVideoDispatchFailure-40106": "已经存在,重复分发", "OnVideoDispatchFailure-40107": "该用户不存在", "OnVideoDispatchFailure-40108": "该用户没有注册", "OnVideoDispatchFailure-40109": "定时器调度失败", "OnVideoDispatchFailure-40110": "调度机转接失败", "OnVideoDispatchFailure-40117": "版本不匹配", "OnVideoDispatchFailure-40121": "目标正在通话中,拒绝调度台抢话", "OnVideoDispatchFailure-40122": "该视频源转发的数量已经超过系统限制", "OnVideoDispatchFailure-40124": "版本不支持", "OnVideoDispatchFailure-40126": "号码错误", "OnVideoDispatchFailure-40134": "本地IP地址无效", "OnVideoDispatchFailure-40151": "视频分发或转接失败:vpn不支持", "OnVideoDispatchFailure-40154": "转码繁忙,请尝试不转码发送", "OnVideoDispatchFailure-40155": "调度机取消转接未允许", "OnVideoDispatchFailure-40156": "调度机已完成取消转接", "OnVideoDispatchFailure-40157": "调度机取消转接失败", "OnVideoDispatchFailure-40158": "无权限", "OnVideoDispatchFailure-40159": "用户不支持", "OnVideoDispatchFailure-40164": "会话存在", "OnVideoDispatchFailure-40166": "操作不被接受,因为正在请求保持呼叫中", "OnVideoDispatchStatusNotify-4021": "connection", "OnVideoDispatchStatusNotify-4022": "calling", "OnVideoDispatchStatusNotify-4023": "holdup", }; } // ===================================枚举===================================== // ==================================公共组件================================== /** * 消息提示 * @param text 提示内容 * @param type message的类型,可选success、warning、error */ showMessage(text, type = "success", showHrefID, targetID) { const tipDomNum = $(".ump-sdk-message").length || 0; const targetDom = $(`#ump-sdk-message-${targetID}`); if (targetDom.length && targetID) return; const tipDom = $(`
${text}
MSP下载链接:点击下载MSP
`); $("body").append(tipDom); if (showHrefID && targetID) return; setTimeout(() => { tipDom.remove(); const tipDomArr = Array.from( document.getElementsByClassName("ump-sdk-message") ); tipDomArr.forEach((ite, idx) => { ite.style.top = `${(idx + 1) * 40}px`; }); }, 3000); } removeMsgDom() { setTimeout(() => { const targetDom = document.getElementById("ump-sdk-message-targetID"); if (targetDom) { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("🚗🚗🚗执行移除-检测版本匹配弹窗") ); } console.log( targetDom, "=============检测版本匹配弹窗移除是否执行=========(获取节点成功)" ); targetDom.remove(); } else { console.log( targetDom, "=============检测版本匹配弹窗移除是否执行=========(获取节点失败)" ); } }, 400); } createYuvPlayer(data, el) { const wsUrl = data["value"]["wssUrl"]; const playerConfig = { wsUrl, el, //播放器挂载的 DOM sharpType: { width: 800, height: 450, }, cid: data["value"]["cid"], }; try{ msp_player = new MSP_PLAYER(playerConfig); } catch(error) { console.log("msp_player",msp_player); } return msp_player; } // 拖动函数 draggable(elementId) { const draggableElement = document.getElementById(elementId); let isDragging = false; let startX = 0; let startY = 0; draggableElement.addEventListener("mousedown", function (event) { if (isDraggingEnabled()) { isDragging = true; startX = event.clientX - draggableElement.offsetLeft; startY = event.clientY - draggableElement.offsetTop; } }); document.addEventListener("mousemove", function (event) { if (isDragging) { var newX = event.clientX - startX; var newY = event.clientY - startY; draggableElement.style.left = newX + "px"; draggableElement.style.top = newY + "px"; } }); document.addEventListener("mouseup", function () { isDragging = false; }); function isDraggingEnabled() { // 添加你的条件判断逻辑来决定是否允许拖动 // 返回 true 表示允许拖动,返回 false 表示禁用拖动 return true; } return { disableDragging: function () { isDraggingEnabled = function () { return false; }; draggableElement.style = ""; // 移除内联样式 }, enableDragging: function () { isDraggingEnabled = function () { return true; }; }, }; } // ==================================公共组件================================== // 清除timer clearTimerHandler(type, cid) { const findItem = this.timer[type].find((ite) => ite.cid === cid); if (findItem) { clearInterval(findItem.timer); } } // 注册事件 initSDKEvent() { let that = this; // ===========================MSPNotify媒体状态事件================================== // 开始共享桌面结果通知 cloudICP.dispatch.event.register({ eventType: "MSPNotify", eventName: "OnStartWindowShare", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("MSPNotify", "OnStartWindowShare", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "开始共享桌面结果通知OnStartWindowShare" + JSON.stringify(data) ) ); } if (data.rsp === "0") { this.showMessage("开始共享桌面成功✔✔✔", "successs"); } else if (data.rsp === "1") { this.showMessage( "开始共享桌面失败-未检测到本地摄像头❌❌❌", "error" ); } else if (data.rsp === "3") { this.showMessage("开始共享桌面失败-会话cid 不存在❌❌❌", "error"); } else if (data.rsp === "4") { this.showMessage("开始共享桌面失败-窗口不可见❌❌❌", "error"); } else if (data.rsp === "6") { this.showMessage( "开始共享桌面失败-找不到指定的共享窗口名❌❌❌", "error" ); } }, }); // 停止共享桌面结果通知(620版本未提供) // cloudICP.dispatch.event.register({ // eventType: 'MSPNotify', // eventName: 'OnStopWindowShare', // callback: (data)=>{ // // UMPSDK触发注册事件 // this.sdkRegisterHandler('VoiceNotify', 'OnUserStatusNotify', data) // if (this.logCallback) { // this.logCallback( // UMPSDK.logInfoFormat('停止共享桌面结果通知OnStopWindowShare' + JSON.stringify(data)) // ) // } // } // }) // ===========================VoiceNotify语音状态事件================================== // 用户状态通知 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnUserStatusNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnUserStatusNotify", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "用户状态通知OnUserStatusNotify" + JSON.stringify(data) ) ); } }, }); // 注册外呼呼出事件 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnDialOutProceeding", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnDialOutProceeding", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "呼出事件OnDialOutProceeding" + JSON.stringify(data) ) ); } // 语音点呼外呼 if (data.rsp === "2005" && data.value.calltype === "voice") { this.openVoiceDialog(data, this.cardStyle.voiceStyle); // 向本地添加呼出记录 let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); data.value.startTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm:ss"); data.value.status = true; data.value.callState = 0; // 呼出 phoneHistory.push(data.value); localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); } // 视频点呼外呼 if (data.rsp === "3004" && data.value.calltype === "video") { this.openVideoDialog(data, this.cardStyle.videoStyle); } // 监控发起 if (data.rsp === "3004" && data.value.calltype === "monitor") { this.openMonitorDialog(data, this.cardStyle.monitorStyle); } }, }); // 注册呼出失败事件 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnDialOutFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnDialOutFailure", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "呼出失败事件OnDialOutFailure" + JSON.stringify(data) ) ); } // 语音呼出失败 if (data.value.calltype === "voice") { this.openVoiceDialog(data); setTimeout(() => { const voiceDom = $(`#ump-sdk-voice-out-dialog-${data.value.cid}`); this.timer.isCalling = false; voiceDom && voiceDom.remove(); }, 10000); // 呼出失败,修改通话记录状态,并记录结束时间 let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); phoneHistory.map((item) => { if (item.cid === data.value.cid) { item.endTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); item.status = false; } }); localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); } // 视频呼出失败 if (data.value.calltype === "video") { this.openVideoDialog(data); setTimeout(() => { const videoDom = $(`#ump-sdk-video-out-dialog-${data.value.cid}`); this.timer.isCalling = false; videoDom && videoDom.remove(); }, 10000); } // 监控呼出失败 if (data.value.calltype === "monitor") { this.openMonitorDialog(data); } }, }); // 注册呼出回铃事件 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnDialOutRinging", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnDialOutRinging", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "呼出振铃事件OnDialOutRinging" + JSON.stringify(data) ) ); } // 语音点呼呼出振铃 if (data.rsp === "2006" && data.value.calltype === "voice") { this.openVoiceDialog(data, this.voice.style); } // 视频点呼呼出振铃 if (data.rsp === "3005" && data.value.calltype === "video") { this.openVideoDialog(data, this.voice.style); } // 监控呼出振铃 if (data.rsp === "3005" && data.value.calltype === "monitor") { this.openMonitorDialog(data); } }, }); // 注册呼入振铃事件 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnDialInRinging", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnDialInRinging", data); // 向本地添加呼入记录 let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); data.value.startTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); data.value.status = true; data.value.callState = 1; // 呼入 phoneHistory.push(data.value); localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "呼入振铃事件OnDialInRinging" + JSON.stringify(data) ) ); } if (this.timer.isCalling) { const { cid, calltype } = data.value; switch (calltype) { case "voice": cloudICP.dispatch.voice.reject({ cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "拒接语音点呼" + JSON.stringify(rsp) ) ); // 向本地添加拒听呼入记录 let phoneHistory = JSON.parse( localStorage.getItem("phoneHistory") ); phoneHistory.map((item) => { if (item.cid === cid) { item.endTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); item.status = false; } }); localStorage.setItem( "phoneHistory", JSON.stringify(phoneHistory) ); } }, }); break; case "video": cloudICP.dispatch.video.reject({ cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "拒接视频点呼" + JSON.stringify(rsp) ) ); } }, }); break; case "dispatch": cloudICP.dispatch.video.reject({ cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "拒接视频分发" + JSON.stringify(rsp) ) ); } }, }); break; } return; } this.callerCard(data); }, }); // 注册通话事件 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnCallConnect", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnCallConnect", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "建立连接事件OnCallConnect" + JSON.stringify(data) ) ); } // 语音呼入或呼出 if ( ["2003", "2007"].includes(data.rsp) && data.value.calltype === "voice" ) { this.openVoiceDialog(data, this.voice.style); } // 视频呼叫呼入或者呼出 if ( ["3003", "3006"].includes(data.rsp) && data.value.calltype === "video" ) { this.openVideoDialog(data, this.cardStyle.videoStyle); } // 监控呼入或呼出连接 if ( ["3003", "3006"].includes(data.rsp) && ["monitor", "dispatch"].includes(data.value.calltype) ) { this.openMonitorDialog(data, this.cardStyle.monitorStyle); } }, }); // 注册通话挂机事件 cloudICP.dispatch.event.register({ eventType: "VoiceNotify", eventName: "OnCallRelease", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("VoiceNotify", "OnCallRelease", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "通话挂机OnCallRelease" + JSON.stringify(data) ) ); } this.timer.isCalling = false; const callerCardDom = $(`#ump-sdk-caller-card-${data.value.cid}`); callerCardDom && callerCardDom.remove(); // 语音非本端挂机 if (data.rsp === "2009" && data.value.calltype === "voice") { this.clearTimerHandler("voiceTimer", data.value.cid); const voiceDom = $(`#ump-sdk-voice-out-dialog-${data.value.cid}`); voiceDom && voiceDom.remove(); // 语音挂机,修改通话记录状态,并记录结束时间 let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); phoneHistory.map((item) => { if (item.cid === data.value.cid) { item.endTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); item.status = true; } }); localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); } if (data.rsp === "2010" && data.value.calltype === "voice") { // 语音挂机,修改通话记录状态,并记录结束时间 let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); phoneHistory.map((item) => { if (item.cid === data.value.cid) { item.endTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); item.status = true; } }); localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); } if (data.rsp === "2011" && data.value.calltype === "voice") { let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); phoneHistory.map((item) => { if (item.cid === data.value.cid) { item.endTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); item.status = false; } }); localStorage.setItem("phoneHistory", JSON.stringify(phoneHistory)); } // 视频呼叫非本端挂机 if (data.rsp === "3008" && data.value.calltype === "video") { const videoOutDom = $( `#ump-sdk-video-out-dialog-${data.value.cid}` ); videoOutDom && videoOutDom.remove(); this.clearTimerHandler("videoTimer", data.value.cid); const videoDom = $(`#ump-sdk-video-box-${data.value.cid}`); videoDom && videoDom.remove(); if (this.player[`player${data.value.cid}`]) { this.player[`player${data.value.cid}`].stop(); this.player[`player${data.value.cid}`] = null; delete this.player[`player${data.value.cid}`]; } } // 视频监控非本端挂机 if ( data.rsp === "3008" && ["dispatch", "monitor"].includes(data.value.calltype) ) { const videoOutDom = $( `#ump-sdk-video-out-dialog-${data.value.cid}` ); videoOutDom && videoOutDom.remove(); this.clearTimerHandler("monitorTimer", data.value.cid); delete this.dispatchArr[data.value.cid]; const monitorDom = $( `#ump-sdk-monitor-out-dialog-${data.value.cid}` ); const dispatchDom = $( `#ump-sdk-monitor-out-dialog-dispatch-dialog-mask-${data.value.cid}` ); monitorDom && monitorDom.remove(); dispatchDom && dispatchDom.remove(); if (this.player[`player${data.value.cid}`]) { this.player[`player${data.value.cid}`].stop(); this.player[`player${data.value.cid}`] = null; delete this.player[`player${data.value.cid}`]; } } }, }); // ===========================VoiceNotify语音状态事件================================== // ===========================VideoNotify视频分发相关================================== // 视频分发成功事件 cloudICP.dispatch.event.register({ eventType: "VideoNotify", eventName: "OnVideoDispatchSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "VideoNotify", "OnVideoDispatchSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频分发成功事件OnVideoDispatchSuccess" + JSON.stringify(data) ) ); } if (data.rsp === "0") { this.showMessage("视频分发成功", "success"); } }, }); // 视频分发成功事件 cloudICP.dispatch.event.register({ eventType: "VideoNotify", eventName: "OnVideoDispatchFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "VideoNotify", "OnVideoDispatchFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频分发失败事件OnVideoDispatchFailure" + JSON.stringify(data) ) ); } const des = this.CommunicateStatusEnum[`OnVideoDispatchFailure${data.rsp}`]; this.showMessage("视频分发失败:" + des, "error"); }, }); // 视频取消分发成功事件 cloudICP.dispatch.event.register({ eventType: "VideoNotify", eventName: "OnCancelVideoDispatchSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "VideoNotify", "OnCancelVideoDispatchSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频取消分发成功事件OnVideoDispatchSuccess" + JSON.stringify(data) ) ); } if (data.rsp === "0") { this.showMessage("视频取消分发成功", "success"); } }, }); // 视频取消分发失败事件 cloudICP.dispatch.event.register({ eventType: "VideoNotify", eventName: "OnCancelVideoDispatchFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "VideoNotify", "OnCancelVideoDispatchFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频取消分发失败事件OnVideoDispatchFailure" + JSON.stringify(data) ) ); } const des = this.CommunicateStatusEnum[`OnVideoDispatchFailure${data.rsp}`]; this.showMessage("视频取消分发失败:" + des, "error"); }, }); // 视频分发状态 cloudICP.dispatch.event.register({ eventType: "VideoNotify", eventName: "OnVideoDispatchStatusNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "VideoNotify", "OnVideoDispatchStatusNotify", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频分发状态OnVideoDispatchStatusNotify" + JSON.stringify(data) ) ); } const status = this.CommunicateStatusEnum[ `OnVideoDispatchStatusNotify-${data.rsp}` ]; this.changeDispatchLiDomStatus(data, status); }, }); // ===========================VideoNotify视频分发相关================================== //===============================MsNotify短信相关====================================== // 短信发送通知 cloudICP.dispatch.event.register({ eventType: "MsNotify", eventName: "OnSendDispSMSResult", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("MsNotify", "OnSendDispSMSResult", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "短信发送通知OnSendDispSMSResult" + JSON.stringify(data) ) ); } if (data.rsp === "0") { this.showMessage("短信发送成功", "success"); } else { const des = this.CommunicateStatusEnum[`OnSendDispSMSResult-${data.rsp}`]; if (des) { this.showMessage("短信发送失败:" + des, "error"); } else { this.showMessage("短信发送失败", "error"); } } }, }); //短信接收 cloudICP.dispatch.event.register({ eventType: "MsNotify", eventName: "OnRecvDispSMSNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("MsNotify", "OnRecvDispSMSNotify", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "短信接收通知OnRecvDispSMSNotify" + JSON.stringify(data) ) ); } }, }); // 彩信发送通知 cloudICP.dispatch.event.register({ eventType: "MsNotify", eventName: "OnSendDispMMSResult", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("MsNotify", "OnSendDispMMSResult", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "彩信发送通知OnSendDispMMSResult" + JSON.stringify(data) ) ); } if (data.rsp === "0") { this.showMessage("彩信发送成功", "success"); } else { const des = this.CommunicateStatusEnum[`OnSendDispMMSResult-${data.rsp}`]; if (des) { this.showMessage("彩信发送失败:" + des, "error"); } else { this.showMessage("彩信发送失败", "error"); } } }, }); //彩信接收通知 cloudICP.dispatch.event.register({ eventType: "MsNotify", eventName: "OnRecvDispMMSNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("MsNotify", "OnRecvDispMMSNotify", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "彩信接收通知OnRecvDispMMSNotify" + JSON.stringify(data) ) ); } }, }); //===============================MsNotify短信相关====================================== //============================GroupCallNotify群组相关================================== // 注册组呼开始事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGroupCallPTTStart", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGroupCallPTTStart", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼开始OnTalkingGroupCallPTTStart" + JSON.stringify(data) ) ); } this.Emergency.push("普通组呼"); this.openGroupDialog(data, this.group.style); this.subscribGroupIsdn.forEach((ite) => { if (ite.groupId === data.value.grpid) { ite.cid = data.value.cid; } }); }, }); // 注册紧急组呼开始事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGourpEmergencyCallStart", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGourpEmergencyCallStart", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "紧急组呼开始OnTalkingGourpEmergencyCallStart" + JSON.stringify(data) ) ); } this.Emergency.push("紧急组呼"); this.openGroupDialog(data, this.group.style); this.subscribGroupIsdn.forEach((ite) => { if (ite.groupId === data.value.grpid) { ite.cid = data.value.cid; } }); }, }); // 注册组呼发起失败事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGroupCallFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGroupCallFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼发起失败OnTalkingGroupCallFailure" + JSON.stringify(data) ) ); } this.showMessage("组呼发起失败", "error"); }, }); // 注册组呼抢权或放权失败事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGroupCallPTTFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGroupCallPTTFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼抢权或放权失败OnTalkingGroupCallPTTFailure" + JSON.stringify(data) ) ); } this.showMessage("组呼抢权或放权失败", "error"); }, }); // 注册组呼权限更新事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGroupCallPTTNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGroupCallPTTNotify", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼权限更新OnTalkingGroupCallPTTNotify" + JSON.stringify(data) ) ); } this.openGroupDialog(data, this.group.style); }, }); // 注册组呼资源通知 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnGroupCallStatusNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnGroupCallStatusNotify", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼资源通知OnGroupCallStatusNotify" + JSON.stringify(data) ) ); } }, }); // 注册组呼空闲事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGroupCallPTTIdle", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGroupCallPTTIdle", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼空闲OnTalkingGroupCallPTTIdle" + JSON.stringify(data) ) ); } this.Emergency = []; this.openGroupDialog(data, this.group.style); }, }); // 注册组呼抢权或放权成功事件 cloudICP.dispatch.event.register({ eventType: "GroupCallNotify", eventName: "OnTalkingGroupCallPTTSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "GroupCallNotify", "OnTalkingGroupCallPTTSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "组呼抢权或放权成功OnTalkingGroupCallPTTSuccess" + JSON.stringify(data) ) ); } this.openGroupDialog(data, this.group.style); }, }); //============================PhoneConfNotify会议相关================================== // 增加与会成员成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnAddConfMembersSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnAddConfMembersSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "增加与会成员成功OnAddConfMembersSuccess" + JSON.stringify(data) ) ); that.showMessage( "增加与会成员成功,请等待用户接听📞📞📞", "success" ); } }, }); // 增加与会成员失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnAddConfMembersFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnAddConfMembersFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "增加与会成员失败OnAddConfMembersFailure" + JSON.stringify(data) ) ); that.showMessage( `❌❌❌增加与会成员失败,错误码:${data.rsp}`, "error" ); } }, }); // 创建音视频会议成功通知 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnCreateConfSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnCreateConfSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "音视频会议创建成功OnCreateConfSuccess" + JSON.stringify(data) ) ); } this.metting.infoMation = data; }, }); // 创建音视频会议失败通知 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnCreateConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnCreateConfFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "音视频会议创建失败OnCreateConfFailure" + JSON.stringify(data) ) ); } if (data.rsp === "-40205") { this.showMessage("音视频会议SMC接口调用失败", "error"); } else if (data.rsp === "-40200") { this.showMessage("会议不存在", "error"); } else if (data.rsp === "-40206") { this.showMessage("会议系统断开", "error"); } else if (data.rsp === "-40204") { this.showMessage("正在创建会议", "error"); } else if (data.rsp === "-40203") { this.showMessage("不是会议主席", "error"); } else if (data.rsp === "-40202") { this.showMessage("未加入会议", "error"); } else { } }, }); // 会议状态通知 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfStatusNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnConfStatusNotify", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "会议状态通知OnConfStatusNotify" + JSON.stringify(data) ) ); } if (data.rsp === "0") { this.metting.Attendees = Object.assign({}, data.value); let confMembersList = data.value.confMembersStatus; this.metting.memberList = []; $(".ump-sdk-metting-right-userList-top").remove(); if (confMembersList && confMembersList.length > 0) { confMembersList.map((items, index) => { // 将主持人置顶 if (items.number == data.value.confStatus.chair) { confMembersList.unshift(confMembersList.splice(index, 1)[0]); } if (items.participantStatus === "Connected") { // 收集入会人员用于多屏广播 let result = this.metting.memberList.every((item) => { return item.number !== items.number; }); if (result) { this.metting.memberList.push(items); } } }); this.metting.unJoinMetting = []; confMembersList.forEach((item, index) => { if (item.participantStatus === "Disconnected") { // 获取未入会成员集合 this.metting.unJoinMetting.push(item.number); } const Dom = $(`
主持人${item.number}
  • 转让主席
  • 重新呼叫
  • 移除会场
`); $("#ump-sdk-metting-right-userList-otherUser").append(Dom); // 获取dom节点,根据会议状态通知,更新dom节点渲染内容 const Emcee = document.getElementsByClassName( `ump-sdk-metting-right-user-Emcee-${item.number}` )[0]; if (Emcee) { if (item.number == data.value.confStatus.chair) { // 会议主席 Emcee.style.display = "block"; } else { Emcee.style.display = "none"; } } const chairperson = document.getElementsByClassName( `ump-sdk-meeting-right-userList-menu-${item.number}` )[0]; if (chairperson) { if ( data.value.confStatus.chair === this.isdn && item.number !== this.isdn ) { chairperson.style.display = "block"; } else { chairperson.style.display = "none"; } } const Horne = document.getElementsByClassName( `ump-sdk-metting-right-userList-Horne-${item.number}` )[0]; if (Horne) { if (item.number == data.value.confStatus.broadcast) { // 正在被广播的成员 Horne.style.display = "block"; } else { Horne.style.display = "none"; } } const MIC = document.getElementsByClassName( `ump-sdk-metting-right-userList-MIC-${item.number}` )[0]; const talking = document.getElementsByClassName( `ump-sdk-metting-right-userList-talking-${item.number}` )[0]; if (MIC && talking) { if (item.isMute == 1) { // 是否静音 MIC.style.display = "block"; talking.style.display = "none"; } else { MIC.style.display = "none"; talking.style.display = "block"; } if (item.participantStatus === "Disconnected") { MIC.style.display = "none"; talking.style.display = "none"; } } const unconnected = document.getElementsByClassName( `ump-sdk-metting-right-userList-unconnected-${item.number}` )[0]; if (unconnected) { if (item.participantStatus === "Disconnected") { // 是否入会 unconnected.style.display = "block"; } else { unconnected.style.display = "none"; } const audio = document.getElementsByClassName( "ump-sdk-metting-audio" )[0]; const mute = document.getElementsByClassName( "ump-sdk-metting-mute" )[0]; if (item.number == this.isdn) { if (item.isMute === "1") { this.metting.MicTarget = false; audio.style.display = "none"; mute.style.display = "block"; } else { this.metting.MicTarget = true; audio.style.display = "block"; mute.style.display = "none"; } } } const mettingOnlineDom = document.getElementById( "ump-sdk-metting-right-participant-online" ); const mettingTotleDom = document.getElementById( "ump-sdk-metting-right-participant-totle" ); if (mettingTotleDom) { mettingTotleDom.innerText = confMembersList.length ? confMembersList.length : 0; } if (mettingOnlineDom) { mettingOnlineDom.innerText = confMembersList.length ? confMembersList.length - this.metting.unJoinMetting.length : 0; } }); } let dom = document.getElementById("ump-sdk-metting-endConference"); //根据Id获取元素 if (this.isdn == data.value.confStatus.chair) { if (dom) { dom.innerText = "结束会议"; } } else { if (dom) { dom.innerText = "离开会议"; } } // 根据本端是否为主席进行模块展示和隐藏 const meetRightActionDom = document.getElementsByClassName( "ump-sdk-metting-right-userList-fotterAction" )[0]; const meetlayoutSetDom = document.getElementsByClassName( "ump-sdk-metting-headerInfo-TimesBox-videoLayout-set" )[0]; const meetActiveDom = document.getElementsByClassName( "ump-sdk-metting-requests" )[0]; if (data.value.confStatus.chair !== this.isdn) { meetRightActionDom.style.display = "none"; meetlayoutSetDom.style.display = "none"; meetActiveDom.style.display = "none"; } else { if (meetRightActionDom && meetlayoutSetDom && meetActiveDom) { meetRightActionDom.style.display = "flex"; meetlayoutSetDom.style.display = "block"; meetActiveDom.style.display = "block"; } } } }, }); // 结束会议成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnEndConfSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnEndConfSuccess", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "结束会议成功OnEndConfSuccess" + JSON.stringify(data) ) ); } }, }); // 结束会议失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnEndConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnEndConfFailure", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "结束会议失败OnEndConfFailure" + JSON.stringify(data) ) ); } }, }); // 订阅会议成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnSubscribeConfSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnSubscribeConfSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "订阅会议成功OnSubscribeConfSuccess" + JSON.stringify(data) ) ); } }, }); // 订阅会议失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnSubscribeConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnSubscribeConfFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "订阅会议失败OnSubscribeConfFailure" + JSON.stringify(data) ) ); } }, }); // 去订阅会议成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnUnsubscribeConfSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnUnsubscribeConfSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "去订阅会议成功OnUnsubscribeConfSuccess" + JSON.stringify(data) ) ); } }, }); // 去订阅会议失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnUnsubscribeConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnUnsubscribeConfFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "去订阅会议失败OnUnsubscribeConfFailure" + JSON.stringify(data) ) ); } }, }); // 会议呼出回铃事件 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfDialOutRinging", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnConfDialOutRinging", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "会议呼出回铃事件OnConfDialOutRinging" + JSON.stringify(data) ) ); } }, }); // 会议呼入振铃事件 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfDialInRinging", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnConfDialInRinging", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "会议呼入振铃事件OnConfDialInRinging" + JSON.stringify(data) ) ); } if (data.rsp === "3002") { // 视频会议呼入振铃事件 this.callerCard(data); } }, }); // 会议通话事件 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfConnect", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnConfConnect", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "会议通话事件OnConfConnect" + JSON.stringify(data) ) ); } if (data.rsp === "3006" || data.rsp === "2007") { // 视频呼入会议通话事件 this.openMettingDialog(data, this.metting.style); let dom = document.getElementById("ump-sdk-metting-endConference"); //根据Id获取元素 if (dom) { dom.innerText = "离开会议"; } } if (data.rsp === "3003" || data.rsp === "2003") { // 视频呼出会议通话事件 this.openMettingDialog(data, this.metting.style); console.log( this.metting.infoMation, "==========infoMation=========" ); let dom = document.getElementById("ump-sdk-metting-endConference"); //根据Id获取元素 if (dom && this.metting.isJoin) { dom.innerText = "结束会议"; } // this.conferenceVideoWall(data) // 广播会议 } let meetingHistory = JSON.parse( localStorage.getItem("meetingHistory") ); data.value.creater = `${data.value.caller} 创建会议`; data.value.startTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); meetingHistory.push(data.value); localStorage.setItem( "meetingHistory", JSON.stringify(meetingHistory) ); }, }); // 会议释放事件 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfRelease", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnConfRelease", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "会议释放事件OnConfRelease" + JSON.stringify(data) ) ); } if (data.rsp === "3008") { // 视频非本端挂机事件 UMPSDK.logInfoFormat("视频非本端挂机事件" + JSON.stringify(data)); const dom = document.getElementById( `ump-sdk-metting-out-dialog-${data.value.confId}` ); if (dom) { dom.remove(); } this.showMessage("会议已结束 ❗❗❗", "warning"); } if (data.rsp === "3009") { // 视频本端挂机事件 UMPSDK.logInfoFormat("视频本端挂机事件" + JSON.stringify(data)); } if (data.rsp === "3010") { // 视频请求被取消 UMPSDK.logInfoFormat("视频本端挂机事件" + JSON.stringify(data)); } if (data.rsp === "3013") { // 视频对端正忙 UMPSDK.logInfoFormat("视频对端正忙" + JSON.stringify(data)); } }, }); // 会议通话失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnConfFailure", data); if (this.logCallback) { const des = this.CommunicateStatusEnum[`OnDialOutFailure-${data.rsp}`]; this.logCallback( UMPSDK.logInfoFormat( `${des}-OnConfFailure` + JSON.stringify(data) ) ); } }, }); // 静音会议成员成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnMuteConfMemberSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnMuteConfMemberSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "静音会议成员成功OnMuteConfMemberSuccess" + JSON.stringify(data) ) ); } }, }); // 静音会议成员失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnMuteConfMemberFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnMuteConfMemberFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "静音会议成员失败OnMuteConfMemberFailure" + JSON.stringify(data) ) ); } }, }); // 取消静音会议成员成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnUnmuteConfMemberSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnUnmuteConfMemberSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "取消静音会议成员成功OnUnmuteConfMemberSuccess" + JSON.stringify(data) ) ); } }, }); // 取消静音会议成员失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnUnmuteConfMemberFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnUnmuteConfMemberFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "取消静音会议成员失败OnUnmuteConfMemberFailure" + JSON.stringify(data) ) ); } }, }); // 静音会议成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnMuteConfSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnMuteConfSuccess", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "静音会议成功OnMuteConfSuccess" + JSON.stringify(data) ) ); } }, }); // 静音会议失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnMuteConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("PhoneConfNotify", "OnMuteConfFailure", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "静音会议失败OnMuteConfFailure" + JSON.stringify(data) ) ); } }, }); // 取消静音会议成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnUnmuteConfSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnUnmuteConfSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "取消静音会议成功OnUnmuteConfSuccess" + JSON.stringify(data) ) ); } }, }); // 取消静音会议失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnUnmuteConfFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnUnmuteConfFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "取消静音会议失败OnUnmuteConfFailure" + JSON.stringify(data) ) ); } }, }); // 查看调度员所在的会议信息结果 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnQueryConfListByAttendeeResult", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnQueryConfListByAttendeeResult", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "查看调度员所在的会议信息结果OnQueryConfListByAttendeeResult" + JSON.stringify(data) ) ); } if (data.rsp === "0") { let list = data.value.confInfos; if (list.length > 0) { list.forEach((item) => { // 清空用户未结束会议,然后再创建新的会议 let param = { confId: item.confId, callback: function (data) {}, }; console.log( "清空用户未结束会议,然后再创建新的会议❌❌❌❌❌❌" ); cloudICP.dispatch.conf.endConf(param); }); } } }, }); // 查询会议列表结果-成功事件 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnRecvConfListNotifySuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnRecvConfListNotifySuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "查询会议列表结果-成功事件OnRecvConfListNotifySuccess" + JSON.stringify(data) ) ); } if (data.rsp === "0") { if (data.value.length > 0) { } else { this.showMessage("该会议的详细信息为空", "error"); } } }, }); // 查询会议列表结果-失败事件 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnRecvConfListNotifyFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnRecvConfListNotifyFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "查询会议列表结果-失败事件OnRecvConfListNotifyFailure" + JSON.stringify(data) ) ); } }, }); // 广播与会者成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnBroadcastConfMemberSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnBroadcastConfMemberSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "广播与会者成功OnBroadcastConfMemberSuccess" + JSON.stringify(data) ) ); } }, }); // 广播与会者失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnBroadcastConfMemberFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnBroadcastConfMemberFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "广播与会者失败OnBroadcastConfMemberFailure" + JSON.stringify(data) ) ); } }, }); // 重呼成员成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnCallConfMemberSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnCallConfMemberSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "重呼成员成功OnCallConfMemberSuccess" + JSON.stringify(data) ) ); } }, }); // 重呼成员失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnCallConfMemberFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnCallConfMemberFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "重呼成员失败OnCallConfMemberFailure" + JSON.stringify(data) ) ); } }, }); // 切换会议主席成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfSetChairmanSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnConfSetChairmanSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "切换会议主席成功OnConfSetChairmanSuccess" + JSON.stringify(data) ) ); } }, }); // 切换会议主席失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnConfSetChairmanFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnConfSetChairmanFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "切换会议主席失败OnConfSetChairmanFailure" + JSON.stringify(data) ) ); } }, }); // 删除成员成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnDelConfMembersSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnDelConfMembersSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "删除成员成功OnDelConfMembersSuccess" + JSON.stringify(data) ) ); } }, }); // 删除成员失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnDelConfMembersFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnDelConfMembersFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "删除成员失败OnDelConfMembersFailure" + JSON.stringify(data) ) ); } }, }); // 广播多画面成功 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnBroadcastMixPictureSuccess", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnBroadcastMixPictureSuccess", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "广播多画面成功OnBroadcastMixPictureSuccess" + JSON.stringify(data) ) ); } }, }); // 广播多画面失败 cloudICP.dispatch.event.register({ eventType: "PhoneConfNotify", eventName: "OnBroadcastMixPictureFailure", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "PhoneConfNotify", "OnBroadcastMixPictureFailure", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "广播多画面失败OnBroadcastMixPictureFailure" + JSON.stringify(data) ) ); } }, }); //============================ModuleNotify模块状态通知================================== // 模块掉线 cloudICP.dispatch.event.register({ eventType: "ModuleNotify", eventName: "OnDisConnection", callback: (data) => { this.removeMsgDom(); console.log("模块掉线", data); this.isUMPUserOut = true; // UMPSDK触发注册事件 this.sdkRegisterHandler("ModuleNotify", "OnDisConnection", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "模块掉线OnDisConnection" + JSON.stringify(data) ) ); } }, }); // 模块链接成功 cloudICP.dispatch.event.register({ eventType: "ModuleNotify", eventName: "OnConnection", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("ModuleNotify", "OnConnection", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "模块连接成功OnConnection" + JSON.stringify(data) ) ); } }, }); // 用户被踢出 cloudICP.dispatch.event.register({ eventType: "ModuleNotify", eventName: "OnDispatchKickOutNotifyEvent", callback: (data) => { console.log("用户被踢出", data); // UMPSDK触发注册事件 this.sdkRegisterHandler( "ModuleNotify", "OnDispatchKickOutNotifyEvent", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "用户被踢出OnDispatchKickOutNotifyEvent" + JSON.stringify(data) ) ); } }, }); // 账号被删除 cloudICP.dispatch.event.register({ eventType: "ModuleNotify", eventName: "OnDeleteAccountNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler( "ModuleNotify", "OnDeleteAccountNotify", data ); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "账号被删除OnDeleteAccountNotify" + JSON.stringify(data) ) ); } }, }); //============================ModuleNotify模块状态通知================================== //============================GisNotify-GIS状态通知================================== // GIS上报通知 cloudICP.dispatch.event.register({ eventType: "GisNotify", eventName: "OnRecvGISNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("GisNotify", "OnRecvGISNotify", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "GIS上报通知OnRecvGISNotify" + JSON.stringify(data) ) ); } }, }); cloudICP.dispatch.event.register({ eventType: "GisNotify", eventName: "OnRecvGISTrackNotify", callback: (data) => { // UMPSDK触发注册事件 this.sdkRegisterHandler("GisNotify", "OnRecvGISTrackNotify", data); if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "终端gis历史轨迹通知OnRecvGISNotify" + JSON.stringify(data) ) ); } }, }); //============================GisNotify-GIS状态通知================================== } // 来电卡片 callerCardStyle(style) { this.voice.style = style ? style : ""; this.cardStyle.voiceStyle = style ? style : ""; } callerCard(data) { this.timer.isCalling = true; const style = this.voice.style; const cardDom = $( `
${ data.value.calltype === "dispatch" ? data.value.src : data.value.caller }
${ this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] }-来电
` ); $("body").append(cardDom); $(".ump-sdk-caller-card-answer").click(() => { cardDom.remove(); // 语音呼入接听场景 if (data.rsp === "2002") { this.createVoiceDialogDom(data, this.cardStyle.voiceStyle); cloudICP.dispatch.voice.answer({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("语音接听来电" + JSON.stringify(rsp)) ); } }, }); } // 视频呼入接听场景 if (data.rsp === "3002") { if (data.eventName === "OnConfDialInRinging") { // 如果事件类型是视频会议呼入 cloudICP.dispatch.conf.acceptVideoConf({ cid: data.value.cid, windowInfo: { width: 800, height: 450, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频会议被动入会接受" + JSON.stringify(rsp) ) ); } }, }); } else { // 如果事件类型是其他 cloudICP.dispatch.video.answer({ cid: data.value.cid, windowInfo: { width: 800, height: 450, videoConfLocalWindow: false, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("视频接听来电" + JSON.stringify(rsp)) ); } }, }); } } // 视频分发接听场景 if (data.rsp === "3011") { this.createMonitorDialogDom(data, this.cardStyle.monitorStyle); cloudICP.dispatch.video.answer({ cid: data.value.cid, windowInfo: { width: 800, height: 450, videoConfLocalWindow: false, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("视频分发来电" + JSON.stringify(rsp)) ); } }, }); } }); $(".ump-sdk-caller-card-hang-up").click(() => { this.timer.isCalling = false; cardDom.remove(); // 语音呼入拒接场景 if (data.rsp === "2002") { cloudICP.dispatch.voice.reject({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("语音拒接来电" + JSON.stringify(rsp)) ); // 拒绝来电,修改通话记录状态,并记录结束时间 let phoneHistory = JSON.parse( localStorage.getItem("phoneHistory") ); phoneHistory.map((item) => { if (item.cid === data.value.cid) { item.endTime = UMPSDK.dateFormat("YYYY-MM-DD hh:mm"); item.status = false; } }); localStorage.setItem( "phoneHistory", JSON.stringify(phoneHistory) ); } }, }); } // 视频呼入拒接场景 if (data.rsp === "3002") { if (data.eventName === "OnConfDialInRinging") { // 如果事件类型是视频会议呼入 cloudICP.dispatch.conf.rejectVideoConf({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频会议被动入会拒绝" + JSON.stringify(rsp) ) ); } }, }); } else { cloudICP.dispatch.video.reject({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("视频拒接来电" + JSON.stringify(rsp)) ); } }, }); } } // 视频分发拒接场景 if (data.rsp === "3011") { cloudICP.dispatch.video.reject({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("视频分发拒接" + JSON.stringify(rsp)) ); } }, }); } }); } // 语音点呼 initVoiceHandler() { /** * 打开语音呼叫组件 * @param target 对端号码 * @param style 卡片样式 */ this.voice.dial = (target, style, id) => { this.voice.id = id; // 传入id时,为内嵌模式,获取id if (this.timer.isCalling) { this.showMessage("正在通话中,请稍后再试", "warning"); return; } if (!target) { this.showMessage("请输入对端isdn号码", "warning"); return; } const param = { to: target, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("发起语音点呼" + JSON.stringify(rsp)) ); } this.cardStyle.voiceStyle = style; this.voice.style = style; }, }; cloudICP.dispatch.voice.dial(param); }; } createVoiceDialogDom(data, style) { let id = this.voice.id || ""; // 内嵌模式获取id this.timer.isCalling = true; this.style = style; // 保持主题变更时,主叫和被叫卡片风格保持一致 const divDom = $( `
${data.value.callee}
语音呼叫-${ data.rsp === "2002" ? "连接中" : this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] }
` ); if (id) { // 传入id,则弹窗嵌入到此id所在DOM内 $(`#${id}`).append(divDom); } else { // 无id,则弹窗嵌入到body内 $("body").append(divDom); } this.voice.id = ""; // 重置id this.voice.Dom = divDom; this.voice.cid = data.value.cid; $(".ump-sdk-voice-out-dialog-hang-up").click(() => { this.clearTimerHandler("voiceTimer", data.value.cid); this.timer.isCalling = false; divDom.remove(); cloudICP.dispatch.voice.release({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("语音主动挂断" + JSON.stringify(rsp)) ); } }, }); }); } // 外部调用,移除语音通话组件 reMoveVioceCallDom() { if (!this.voice.Dom) return; this.clearTimerHandler("voiceTimer", this.voice.cid); this.timer.isCalling = false; this.voice.Dom.remove(); cloudICP.dispatch.voice.release({ cid: this.voice.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("语音主动挂断" + JSON.stringify(rsp)) ); } }, }); } openVoiceDialog(data, style) { switch (data.eventName) { // 呼出事件 case "OnDialOutProceeding": this.createVoiceDialogDom(data, style); break; // 呼出失败 case "OnDialOutFailure": const tipDomFail = $( `#ump-sdk-voice-out-dialog-${data.value.cid} .ump-sdk-voice-out-dialog-tip` ); tipDomFail.text( this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] ); break; // 振铃事件 case "OnDialOutRinging": const tipDomRinging = $( `#ump-sdk-voice-out-dialog-${data.value.cid} .ump-sdk-voice-out-dialog-tip` ); tipDomRinging.text( "语音呼叫-" + this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] ); break; // 通话建立 case "OnCallConnect": const timer = setInterval(() => { const tipDom = $( `#ump-sdk-voice-out-dialog-${data.value.cid} .ump-sdk-voice-out-dialog-tip` ); const timeNum = Number(tipDom.attr("data-time")) + 1; tipDom.attr("data-time", timeNum); tipDom.text( `${ this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] }-${UMPSDK.timeHandler(timeNum)}` ); }, 1000); const obj = { cid: data.value.cid, timer, }; this.timer.voiceTimer.push(obj); break; } } // 创建语音记录卡片 initPhoneHistoryCard( phoneCaller, phoneCallee, phoneStartTime, phoneEnd, phoneState, style ) { const DOM = document.getElementById( "ump-sdk-communicate-phoneHistory-card" ); if (DOM) { DOM.remove(); } let phoneHistory = JSON.parse(localStorage.getItem("phoneHistory")); let filterArray = []; if (!phoneCaller && !phoneCallee && !phoneStartTime && !phoneEnd) { // 如果没有任何筛选条件,直接根据isdn筛选 filterArray = phoneHistory.filter( (phone) => this.isdn == phone.caller || this.isdn == phone.callee ); } else { // 进行条件筛选 filterArray = phoneHistory.filter((phone) => { const phoneStart = new Date(phone.startTime); const phoneEndTime = new Date(phone.endTime); let matches = true; // 判断是否是当前登录isdn if (this.isdn != phone.caller && this.isdn != phone.callee) { matches = false; } // 根据 主叫 筛选 if (phoneCaller && phone.caller.indexOf(phoneCaller) === -1) { matches = false; } // 根据 被叫 筛选 if (phoneCallee && phone.callee.indexOf(phoneCallee) === -1) { matches = false; } // 根据 开始时间 筛选 if (phoneStartTime && phoneStart < new Date(phoneStartTime)) { matches = false; } // 根据 结束时间 筛选 if (phoneEnd && phoneEndTime > new Date(phoneEnd)) { matches = false; } // 过滤出开始时间和结束时间在传入范围内的记录 if (phoneStartTime && phoneEnd) { const startRange = new Date(phoneStartTime); const endRange = new Date(phoneEnd); // 判断通话是否在给定的时间范围内 if ( !(phoneStart >= startRange && phoneStart <= endRange) && // 开始时间在范围内 !(phoneEndTime >= startRange && phoneEndTime <= endRange) // 结束时间在范围内 ) { matches = false; } } return matches; }); } console.log( phoneState, typeof phoneState, filterArray, "======phoneState=====" ); if (phoneState !== "9") { filterArray = filterArray.filter((item) => { return item.callState == phoneState; }); } console.log(phoneState, filterArray, "======phoneState111111====="); filterArray.reverse(); if (filterArray.length > 0) { const historyDom = $(`
通话记录
${filterArray .map((item) => { return `
主叫:${ item.caller } 被叫:${ item.callee } ${ item.startTime } ${ item.endTime }
`; }) .join("")}
`); $("body").append(historyDom); } else { this.showMessage("查询数据为空、请重新输入查询条件"); } // 关闭弹窗 $("#ump-sdk-phoneHistory-title-esc").click(() => { const DOMCard = document.getElementById( "ump-sdk-communicate-phoneHistory-card" ); if (DOMCard) { DOMCard.remove(); } }); } // 创建会议记录卡片 initMeetingHistoryCard(meetingCaller, meetingStartTime, meetingEnd, style) { const DOM = document.getElementById( "ump-sdk-communicate-meetingHistory-card" ); if (DOM) { DOM.remove(); } let meetingHistory = JSON.parse(localStorage.getItem("meetingHistory")); let filterArray = []; if (!meetingCaller && !meetingStartTime && !meetingEnd) { filterArray = meetingHistory.filter( (meeting) => this.isdn == meeting.caller ); } else { filterArray = meetingHistory.filter((meeting) => { const meetingStart = new Date(meeting.startTime); // 转换会议的开始时间为 Date 对象 let matches = true; //判断是否是当前登录isdn if (this.isdn != meeting.caller) { matches = false; } // 根据 会议标题 筛选 if (meetingCaller && meeting.creater.indexOf(meetingCaller) === -1) { matches = false; } // 根据 开始时间 筛选 if (meetingStartTime && meetingStart < new Date(meetingStartTime)) { matches = false; } // 根据 结束时间 筛选 if (meetingEnd && meetingStart > new Date(meetingEnd)) { matches = false; } return matches; }); } if (filterArray.length > 0) { const historyDom = $(`
会议记录
${filterArray .map((item) => { return `
会议主题:${item.creater}
会议主席:${item.caller}
会议开始时间:${item.startTime}
`; }) .join("")}
`); $("body").append(historyDom); } else { this.showMessage("查询数据为空、请重新输入查询条件"); } // 关闭弹窗 $("#ump-sdk-meetingHistory-title-esc").click(() => { const DOMCard = document.getElementById( "ump-sdk-communicate-meetingHistory-card" ); if (DOMCard) { DOMCard.remove(); } }); } // 视频呼叫 initVideoHandler() { this.queryCameraAbility().then((res) => { this.video.dial = (target, style, id) => { this.video.id = id; // 传入id时,为内嵌模式,保存id if (this.timer.isCalling) { this.showMessage("正在通话中,请稍后再试", "warning"); return; } if (!target) { this.showMessage("请输入对端isdn号码", "warning"); return; } const param = { to: target, dialVideoParam: { fmt: res, showToolbar: 1, mode: "wssflow", width: 800, height: 450, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("发起视频点呼" + JSON.stringify(rsp)) ); } this.cardStyle.videoStyle = style; }, }; cloudICP.dispatch.video.dialVideo(param); }; }); } // 共享桌面 initWindowShare() { this.windowShare.dial = (cid, windowName) => { const param = { cid: cid, windowName: windowName, callback: (data) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("开始共享桌面" + JSON.stringify(data)) ); } }, }; cloudICP.dispatch.device.startWindowShare(param); }; this.windowShare.stop = (cid) => { const param = { cid: cid, callback: (data) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("停止共享桌面" + JSON.stringify(data)) ); } }, }; cloudICP.dispatch.device.stopWindowShare(param); }; } queryCameraAbility(type) { // 查询摄像头能力 return new Promise((resolve, reject) => { let param = { callback: (data) => { if (data.rsp === "0") { let abilityNum = data.camera_ability; let numStr = ""; switch (true) { case abilityNum == 1: numStr = "QCIF"; break; case abilityNum > 1 && abilityNum <= 3: numStr = "CIF"; break; case abilityNum > 3 && abilityNum <= 7: numStr = "D1"; break; case abilityNum > 7 && abilityNum <= 15: numStr = "720P"; break; case abilityNum > 15 && abilityNum <= 31: numStr = "1080P"; break; case abilityNum > 31 && abilityNum <= 63: numStr = "2K"; break; case abilityNum > 63 && abilityNum <= 127: numStr = "4K"; break; default: numStr = type === "monitor" ? "4K" : "1080P"; break; } resolve(numStr); } else { resolve(type === "monitor" ? "4K" : "1080P"); } }, }; cloudICP.dispatch.device.queryCameraAbility(param); }); } createVideoDialogDom(data, style) { let id = this.video.id || ""; // 内嵌模式获取id this.timer.isCalling = true; const divDom = $( `
${data.value.callee}
视频呼叫-${ this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] }
` ); if (id) { // 传入id,则弹窗嵌入到此id所在DOM内 $(`#${id}`).append(divDom); } else { // 无id,则弹窗嵌入到body内 $("body").append(divDom); } this.video.Dom = divDom; this.video.cid = data.value.cid; $(".ump-sdk-video-out-dialog-hang-up").click(() => { divDom.remove(); cloudICP.dispatch.video.release({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("视频主动挂断" + JSON.stringify(rsp)) ); } }, }); }); } openVideoDialog(data, style) { switch (data.eventName) { // 呼出事件 case "OnDialOutProceeding": this.createVideoDialogDom(data, style); break; // 呼出失败 case "OnDialOutFailure": const tipDomFail = $( `#ump-sdk-video-out-dialog-${data.value.cid} .ump-sdk-video-out-dialog-tip` ); tipDomFail.text( this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] ); break; // 振铃事件 case "OnDialOutRinging": const tipDomRinging = $( `#ump-sdk-video-out-dialog-${data.value.cid} .ump-sdk-video-out-dialog-tip` ); tipDomRinging.text( "视频呼叫-" + this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] ); break; // 通话建立 case "OnCallConnect": const videoPlayerDom = $( `
${ data.rsp == "3003" ? data.value.callee : data.value.caller }
50
` ); if (this.video.id) { // 传入id,则弹窗嵌入到此id所在DOM内 $(`#${this.video.id}`).append(videoPlayerDom); } else { // 无id,则弹窗嵌入到body内 $("body").append(videoPlayerDom); } const draggableInstance = this.draggable( "ump-sdk-video-box-" + data.value.cid ); if (this.video.id) { draggableInstance.disableDragging(); } const playerDom = document.getElementById( `ump-sdk-video-player-${data.value.cid}` ); const hangingUpDom = document.getElementById( `ump-sdk-video-out-dialog-${data.value.cid}` ); try{ this.player[`player${data.value.cid}`] = this.createYuvPlayer( data, playerDom ); } catch(error) { console.log("MSP_Player",error) } this.video.data = data; this.video.cid = data.value.cid; // 建立通话直接移除右下角小卡片 hangingUpDom && hangingUpDom.remove(); $(".ump-sdk-video-close").click(() => { // 关闭视频呼叫 this.closeVideo( data, document.getElementById(`ump-sdk-video-box-${data.value.cid}`) ); }); $(".ump-sdk-video-hanging-up").click(() => { // 挂断视频呼叫 this.closeVideo( data, document.getElementById(`ump-sdk-video-box-${data.value.cid}`) ); }); $(".ump-sdk-video-mute").click(() => { // 静音 const param = { cid: data.value.cid, callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频通话静音操作" + JSON.stringify(res) ) ); } }, }; cloudICP.dispatch.device.muteMic(param); const unMuteDemo = document.getElementById( `ump-sdk-video-unMute-${data.value.cid}` ); const MuteDemo = document.getElementById( `ump-sdk-video-mute-${data.value.cid}` ); MuteDemo.style.display = "none"; unMuteDemo.style.display = "block"; }); $(".ump-sdk-video-unMute").click(() => { // 取消静音 const param = { cid: data.value.cid, callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频通话取消静音操作" + JSON.stringify(res) ) ); } }, }; cloudICP.dispatch.device.unmuteMic(param); const unMuteDemo = document.getElementById( `ump-sdk-video-unMute-${data.value.cid}` ); const MuteDemo = document.getElementById( `ump-sdk-video-mute-${data.value.cid}` ); MuteDemo.style.display = "block"; unMuteDemo.style.display = "none"; }); $(".ump-sdk-video-volume").click(() => { // 音量组件控制 const volumeDom = document.getElementById( `ump-sdk-video-volume-volume-range-box-${data.value.cid}` ); if (volumeDom && volumeDom.dataset.show === "1") { volumeDom.dataset.show = "0"; volumeDom.style.display = "none"; } else { volumeDom.dataset.show = "1"; volumeDom.style.display = "block"; } }); $(".ump-sdk-video-range").click((e) => { e.stopPropagation(); }); $(".ump-sdk-video-range").mousedown((e) => { e.stopPropagation(); }); $(".ump-sdk-video-range").mouseup((e) => { // 音量调节 e.stopPropagation(); const param = { cid: data.value.cid, volume: $(`#ump-sdk-video-volume-range-${data.value.cid}`).val(), callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("音量调节" + JSON.stringify(res)) ); } }, }; cloudICP.dispatch.device.setVolume(param); }); $(".ump-sdk-video-zoomIn").click(() => { // 全屏 draggableInstance.disableDragging(); const width = document.body.clientWidth; const height = document.body.clientHeight; const zoomOut = document.getElementById( `ump-sdk-video-zoomOut-${data.value.cid}` ); const zoomIn = document.getElementById( `ump-sdk-video-zoomIn-${data.value.cid}` ); const box = document.getElementById( `ump-sdk-video-box-${data.value.cid}` ); box.style.width = width + "px"; box.style.height = height + "px"; zoomOut.style.display = "block"; zoomIn.style.display = "none"; if (this.video.id) { // 传入id,则弹窗嵌入到此id所在DOM内 box.style.position = "fixed"; // box.style.top = '0'; // box.style.left = '0'; // box.style.right = 'unset'; // box.style.bottom = 'unset'; // box.style.transform = 'unset'; $("body").append(box); } this.player[`player${data.value.cid}`].changeVideResolution({ width: parseInt(width), height: parseInt(height), }); }); $(".ump-sdk-video-zoomOut").click(() => { // 退出全屏 if (this.video.id) { draggableInstance.disableDragging(); } else { draggableInstance.enableDragging(); } const zoomOut = document.getElementById( `ump-sdk-video-zoomOut-${data.value.cid}` ); const zoomIn = document.getElementById( `ump-sdk-video-zoomIn-${data.value.cid}` ); const box = document.getElementById( `ump-sdk-video-box-${data.value.cid}` ); if (!this.video.id) { box.style.width = style.width ? style.width : "800px"; box.style.height = style.height ? style.height : "450px"; } else { console.log("视频点呼传入的style", style); } zoomOut.style.display = "none"; zoomIn.style.display = "block"; let styleWidth = style.width ? style.width.replace("px", "") : ""; let styleHeight = style.height ? style.height.replace("px", "") : ""; if (this.video.id) { // 传入id,则弹窗嵌入到此id所在DOM内 box.style.position = "relative"; // box.style.top = '50%'; // box.style.left = '50%'; // box.style.right = 'unset'; // box.style.bottom = 'unset'; // box.style.transform = 'translate(-50%,-50%)'; $(`#${this.video.id}`).append(box); } this.player[`player${data.value.cid}`].changeVideResolution({ width: style.width ? parseInt(styleWidth) : 800, height: parseInt(style.height) ? styleHeight : 450, }); }); const videoTimer = setInterval(() => { // 通话计时 const tipDom = $(`.ump-sdk-video-timeTip`); const timeNum = Number(tipDom.attr("data-time")) + 1; tipDom.attr("data-time", timeNum); tipDom.text(`${UMPSDK.timeHandler(timeNum)}`); }, 1000); const obj = { cid: data.value.cid, timer: videoTimer, }; let styleWidth = style.width ? style.width.replace("px", "") : ""; let styleHeight = style.width ? style.height.replace("px", "") : ""; this.timer.videoTimer.push(obj); this.player[`player${data.value.cid}`].changeVideResolution({ width: style.width ? parseInt(styleWidth) : 800, height: parseInt(style.height) ? styleHeight : 450, }); break; } } closeVideo(data, el) { this.video.id = ""; // 重置id // 主动关闭、挂断视频 this.clearTimerHandler("videoTimer", data.value.cid); this.timer.isCalling = false; el.remove(); cloudICP.dispatch.video.release({ cid: data.value.cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("视频主动挂断" + JSON.stringify(rsp)) ); } if (this.player[`player${data.value.cid}`]) { this.player[`player${data.value.cid}`].stop(); this.player[`player${data.value.cid}`] = null; delete this.player[`player${data.value.cid}`]; } }, }); } // 外部调用,移除视频通话组件 reMoveMoniterCallDom() { this.closeVideo( this.video.data, document.getElementById(`ump-sdk-video-box-${this.video.cid}`) ); } // 视频监控 initMonitorHandler() { this.monitor.dial = (target, fmt, mute, confirm, camera, style, id) => { this.monitor.id = id; // 传入id时,为内嵌模式,保存id const monitorDialog = document.getElementsByClassName( `ump-sdk-monitor-out-dialog-src-${target}` ); if (monitorDialog.length) { this.showMessage("该摄像头监控已打开", "warning"); return; } if (!target) { this.showMessage("请输入对端isdn号码", "warning"); return; } const param = { to: target, monitorParam: { fmt: fmt || "4K", mute: mute || "0", confirm: confirm || "0", camera: camera || "0", mode: "wssflow", width: 800, height: 450, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("发起视频监控" + JSON.stringify(rsp)) ); } this.cardStyle.monitorStyle = style ? style : ""; }, }; cloudICP.dispatch.video.monitorVideo(param); }; } createMonitorDialogDom(data, style) { // 有id时,屏蔽全屏按钮与关闭按钮, 内嵌弹窗时使用id let id = this.monitor.id || ""; const callee = data.value.calltype === "dispatch" ? data.value.src : data.value.callee; const divDom = $(`
${ this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] }
${callee}
    `); if (id) { // 传入id,则弹窗嵌入到此id所在DOM内 $(`#${id}`).append(divDom); } else { // 无id,则弹窗嵌入到body内 $("body").append(divDom); } // this.monitor.id = ''; // 重置id // 初始化拖拽 const draggableInstance = this.draggable( "ump-sdk-monitor-out-dialog-" + data.value.cid ); if (id) { // 传入id,则弹窗禁用拖拽功能 draggableInstance.disableDragging(); } // 初始化分发对象 this.dispatchArr[`cid-${data.value.cid}`] = []; // 关闭弹窗 const closeMonitorHandler = (cid, dialogDom) => { this.clearTimerHandler("monitorTimer", cid); delete this.dispatchArr[cid]; dialogDom.remove(); this.monitor.id = ""; // 重置id cloudICP.dispatch.video.release({ cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("监控主动挂断" + JSON.stringify(rsp)) ); } if (this.player[`player${cid}`]) { this.player[`player${cid}`].stop(); this.player[`player${cid}`] = null; delete this.player[`player${cid}`]; } }, }); }; $(`#ump-sdk-monitor-out-dialog-hang-up-${data.value.cid}`).click(() => { closeMonitorHandler(data.value.cid, divDom); }); $(`#ump-sdk-monitor-out-dialog-title-tool-close-${data.value.cid}`).click( () => { closeMonitorHandler(data.value.cid, divDom); } ); // 全屏 $(`#ump-sdk-monitor-out-dialog-title-tool-full-${data.value.cid}`).click( () => { const monitorCardDom = $( `#ump-sdk-monitor-out-dialog-${data.value.cid}` ); const fullDom = $( `#ump-sdk-monitor-out-dialog-title-tool-full-${data.value.cid}` ); const notFullDom = $( `#ump-sdk-monitor-out-dialog-title-tool-not-full-${data.value.cid}` ); monitorCardDom.addClass("ump-sdk-monitor-card-full-width-height"); fullDom.attr("style", "display: none"); notFullDom.attr("style", "display: block"); // 全屏后禁止拖动,并且清空内联样式 draggableInstance.disableDragging(); if (this.monitor.id) { // 传入id,则弹窗嵌入到此id所在DOM内 const targetDom = document.getElementById( `ump-sdk-monitor-out-dialog-${data.value.cid}` ); targetDom.style.position = "fixed"; targetDom.style.top = "0"; targetDom.style.left = "0"; targetDom.style.right = "unset"; targetDom.style.bottom = "unset"; targetDom.style.transform = "unset"; $("body").append(targetDom); } if (this.player[`player${data.value.cid}`]) { this.player[`player${data.value.cid}`].changeVideResolution({ width: parseInt(monitorCardDom.width()), height: parseInt(monitorCardDom.height()), }); } } ); // 退出全屏 $( `#ump-sdk-monitor-out-dialog-title-tool-not-full-${data.value.cid}` ).click(() => { if (this.monitor.id) { // 传入id,则弹窗嵌入到此id所在DOM内 draggableInstance.disableDragging(); } else { // 还原后可以拖动 draggableInstance.enableDragging(); } const monitorCardDom = $( `#ump-sdk-monitor-out-dialog-${data.value.cid}` ); const fullDom = $( `#ump-sdk-monitor-out-dialog-title-tool-full-${data.value.cid}` ); const notFullDom = $( `#ump-sdk-monitor-out-dialog-title-tool-not-full-${data.value.cid}` ); monitorCardDom.removeClass("ump-sdk-monitor-card-full-width-height"); fullDom.attr("style", "display: block"); notFullDom.attr("style", "display: none"); if (this.monitor.id) { // 传入id,则弹窗嵌入到此id所在DOM内 const targetDom = document.getElementById( `ump-sdk-monitor-out-dialog-${data.value.cid}` ); targetDom.style.position = "relative"; targetDom.style.top = "50%"; targetDom.style.left = "50%"; targetDom.style.right = "unset"; targetDom.style.bottom = "unset"; targetDom.style.transform = "translate(-50%,-50%)"; $(`#${this.monitor.id}`).append(targetDom); } if (this.player[`player${data.value.cid}`]) { this.player[`player${data.value.cid}`].changeVideResolution({ width: parseInt(monitorCardDom.width()), height: parseInt(monitorCardDom.height()), }); } }); // 静音与取消静音操作 const muteOrUnmuteHandlrt = (volume, cid) => { const muteDom = $(`#ump-sdk-monitor-out-dialog-mute-${cid}`); const unmuteDom = $(`#ump-sdk-monitor-out-dialog-unmute-${cid}`); if (volume === "0") { muteDom.attr("style", "display: none"); unmuteDom.attr("style", "display: block"); } else { muteDom.attr("style", "display: block"); unmuteDom.attr("style", "display: none"); } cloudICP.dispatch.device.setVolume({ cid, volume, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( (volume === "0" ? "静音扬声器" : "解除静音扬声器") + JSON.stringify(rsp) ) ); } }, }); }; // 静音 $(`#ump-sdk-monitor-out-dialog-mute-${data.value.cid}`).click(() => { muteOrUnmuteHandlrt("0", data.value.cid); }); // 取消静音 $(`#ump-sdk-monitor-out-dialog-unmute-${data.value.cid}`).click(() => { muteOrUnmuteHandlrt("100", data.value.cid); }); // 分发弹窗 $(`#ump-sdk-monitor-out-dialog-dispatch-${data.value.cid}`).click(() => { const dispatchDom = $(`
    视频分发
    `); $("body").append(dispatchDom); $(".ump-sdk-monitor-out-dialog-dispatch-dialog-close").click(() => { dispatchDom.remove(); }); $(".ump-sdk-monitor-out-dialog-dispatch-dialog-bottom").click(() => { const personValue = $( ".ump-sdk-monitor-out-dialog-dispatch-dialog-content .ump-sdk-monitor-out-dialog-dispatch-person" ) .val() .trim(); const groupValue = $( ".ump-sdk-monitor-out-dialog-dispatch-dialog-content .ump-sdk-monitor-out-dialog-dispatch-group" ) .val() .trim(); const dispatchCallbackHandler = ( dispatchRes, dispatchDom, personValue, groupValue ) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "视频分发操作" + JSON.stringify(dispatchRes) ) ); } if (dispatchRes.rsp === "0") { dispatchDom.remove(); if ( !$( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-dispatch-list` ).length ) { $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-dispatch` ).after( `
    ` ); $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-dispatch-list` ).click(() => { const containerDom = $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-dispatch-container` ); if (containerDom.attr("data-show") === "0") { containerDom.show(); containerDom.attr("data-show", "1"); } else { containerDom.hide(); containerDom.attr("data-show", "0"); } }); } const allItem = [ ...personValue .split(",") .filter((ele) => ele.trim()) .map((e) => ({ isdn: e, isGroup: false })), ...groupValue .split(",") .filter((ele) => ele.trim()) .map((e) => ({ isdn: e, isGroup: true })), ]; allItem.forEach((e) => { if ( !this.dispatchArr[`cid-${data.value.cid}`].some( (ele) => ele.isdn === e.isdn && ele.isGroup === e.isGroup ) ) { this.dispatchArr[`cid-${data.value.cid}`].push({ isdn: e.isdn, isGroup: e.isGroup, }); const dom = $(`
  • ${e.isdn}
  • `); $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-dispatch-container` ).append(dom); } // 针对群组的状态单独改变 if (e.isGroup) { const groupStatus = "calling"; const groupData = { eventName: "OnVideoDispatchStatusNotify", rsp: "4021", value: { src: callee, peerid: e.isdn, }, }; this.changeDispatchLiDomStatus(groupData, groupStatus); } }); } }; // 分发人员 if (personValue) { const dispatchPersonArr = personValue .split(",") .filter((ele) => ele.trim()) .map((e) => ({ isdn: e })); const param = { src: callee, fmt: "NO", dest: dispatchPersonArr, callback: (dispatchRes) => { dispatchCallbackHandler( dispatchRes, dispatchDom, personValue, groupValue ); }, }; cloudICP.dispatch.video.dispatchVideo(param); } // 分发群组 if (groupValue) { const dispatchGroupArr = groupValue .split(",") .filter((ele) => ele.trim()) .map((e) => ({ isdn: e })); const param = { src: callee, fmt: "CIF", dest: [], destGroups: dispatchGroupArr, callback: (dispatchRes) => { dispatchCallbackHandler( dispatchRes, dispatchDom, personValue, groupValue ); }, }; cloudICP.dispatch.video.dispatchVideo(param); } }); }); } removeMonitorDom(cid) { let dialogDom = document.getElementById( `ump-sdk-monitor-out-dialog-${cid}` ); this.clearTimerHandler("monitorTimer", cid); delete this.dispatchArr[cid]; dialogDom.remove(); this.monitor.id = ""; // 重置id cloudICP.dispatch.video.release({ cid, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("监控主动挂断" + JSON.stringify(rsp)) ); } if (this.player[`player${cid}`]) { this.player[`player${cid}`].stop(); this.player[`player${cid}`] = null; delete this.player[`player${cid}`]; } }, }); } changeDispatchLiDomStatus(data, status) { const liIcon = $( `.ump-sdk-monitor-out-dialog-src-${data.value.src} #ump-sdk-monitor-out-dialog-dispatch-item-${data.value.peerid} .ump-sdk-monitor-out-dialog-dispatch-item-status` ); liIcon.attr( "class", `ump-sdk-monitor-out-dialog-dispatch-item-status ump-sdk-monitor-out-dialog-dispatch-item-status-${status}` ); liIcon.attr("title", ""); liIcon.unbind("click"); if (status === "calling") { liIcon.attr("title", "取消视频分发"); liIcon.click(() => { const isGroup = liIcon.attr("data-isgroup"); let param = null; if (isGroup === "true") { param = { src: data.value.src, dest: "", destGroup: liIcon.attr("data-id"), callback: (resData) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "取消对群组分发" + JSON.stringify(resData) ) ); } if (resData.rsp === "0") { this.changeDispatchLiDomStatus(data, "holdup"); } }, }; } else { param = { src: data.value.src, dest: liIcon.attr("data-id"), callback: (resData) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "取消对人员设备分发" + JSON.stringify(resData) ) ); } }, }; } cloudICP.dispatch.video.cancelVideoDispatch(param); }); } } openMonitorDialog(data, style) { switch (data.eventName) { // 呼出事件 case "OnDialOutProceeding": this.createMonitorDialogDom(data, style); break; // 呼出失败 case "OnDialOutFailure": const tipDomFail = $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-tip` ); tipDomFail.text( this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] ); break; // 振铃事件 case "OnDialOutRinging": const tipDomRinging = $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-tip` ); tipDomRinging.text( this.CommunicateStatusEnum[data.eventName + "-" + data.rsp] ); break; // 通话建立 case "OnCallConnect": { const tipDomRinging = $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-tip` ); tipDomRinging.text(""); const timer = setInterval(() => { const tipDom = $( `#ump-sdk-monitor-out-dialog-${data.value.cid} .ump-sdk-monitor-out-dialog-title .ump-sdk-monitor-out-dialog-title-username` ); const timeNum = Number(tipDom.attr("data-time")) + 1; tipDom.attr("data-time", timeNum); tipDom.text( `${ data.value.calltype === "dispatch" ? data.value.src : data.value.callee } ${UMPSDK.timeHandler(timeNum)}` ); }, 1000); try{ this.player[`player${data.value.cid}`] = this.createYuvPlayer( data, document.getElementById( `${"ump-sdk-monitor-player-" + data.value.cid}` ) ); } catch(error) { console.log("MSP_Player",error) } const obj = { cid: data.value.cid, timer, }; this.timer.monitorTimer.push(obj); break; } } } // 短彩信业务 initMessageHandler() { /** * 初始化短彩信业务 * @param {Array} targets 对端isdn组成的数组 * @param {String} content 短信文本内容 * @param {Object} attchement 附件File对象 */ this.msg.send = async (targets, content, attchement) => { if (!targets || !targets.length) { this.showMessage("请输入对端isdn号码", "warning"); return; } if (!content && !attchement) { this.showMessage("请输入短彩信内容", "warning"); return; } // 短信发送 if (content) { const msgidArr = targets.map((ite, index) => { const currentTime = new Date(); return currentTime.getTime() + index; }); const param = { dest: targets.join(";"), msgid: msgidArr.join(";"), content, callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("短信发送结果" + JSON.stringify(res)) ); } }, }; cloudICP.dispatch.sms.sendDispSMS(param); } // 彩信发送 if (attchement) { if (attchement.size / 1024 / 1024 > 20) { this.showMessage("附件最大不超过20M", "warning"); return; } let fileBuffer; const reader = new FileReader(); // 文件读取成功后的回调函数 reader.onload = function (e) { // e.target.result为文件的二进制数据 fileBuffer = e.target.result; }; reader.readAsArrayBuffer(attchement); const attachThumb = await this.getAttachThumb(attchement); const authorization = await this.attachAuthorization(); const res = await this.uploadAttachment(attchement, fileBuffer); if (res == 200) { const dest = targets.map((ite) => { return { isdn: ite, msgid: this.msg.msgid, }; }); const param = { dest, content: "", attach: attchement.name, callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("彩信发送结果" + JSON.stringify(res)) ); } }, }; if (attachThumb) { param.attach_thumb = attachThumb; } cloudICP.dispatch.sms.sendDispMMS(param); } else { this.showMessage("彩信发送失败", "error"); } } }; } // 附件鉴权 async attachAuthorization() { // 鉴权 try { const postUrl = await fetch("/attachment", { method: "GET", }) .then((response) => { if (response.status === 401) { const wwwAuthenticate = response.headers.get("WWW-Authenticate"); // 解析 WWW-Authenticate 头部中的参数 this.parseWWWAuthenticate(wwwAuthenticate); return null; } }) .catch((err) => { console.log(err); }); } catch (err) { console.log("请求失败"); } } async uploadAttachment(file, fileBuffer) { const formData = new FormData(); formData.append("file", new Blob([fileBuffer])); formData.append("userid", this.isdn); const uploadtTime = String(new Date().getTime()); this.msg.msgid = uploadtTime; formData.append("date", uploadtTime); formData.append("msgid", uploadtTime); return new Promise((resolve) => { fetch("/attachment", { method: "POST", headers: { Authorization: this.msg.authorizationHeader, }, body: formData, }).then((response) => { if (response.status == 200) { if (this.logCallback) { this.logCallback(UMPSDK.logInfoFormat("🚀附件上传成功")); } resolve(response.status); } else { if (this.logCallback) { this.logCallback(UMPSDK.logInfoFormat("❗附件上传失败")); } resolve(""); } }); }); } // 处理返回的wwwAuthenticate parseWWWAuthenticate(header) { const params = {}; const parts = header.split(","); // 根据逗号分隔多个参数 parts[1] = parts[1] + "," + parts[2]; parts.splice(2, 1); parts.forEach((part) => { const [key, value] = part.split("="); params[key.trim()] = value.replace(/"/g, "").trim(); // 去掉引号 }); // return params; this.handleAuthorization(params); } // 处理鉴权 handleAuthorization(params) { const username = this.isdn; const password = this.isdnPwd; const method = "POST"; const uri = "/attachment"; // 请求的 URI const qop = "auth"; const algorithm = "SHA-256"; // 计算 A1 和 A2 const A1 = `${username}:${params["Digest realm"]}:${password}`; const A2 = `${method}:${uri}`; // 计算响应 const nonceCount = "00000001"; // 计数器,通常是 1 const cnonce = this.generateCnonce(); // 客户端生成的 nonce // const qop = 'auth'; // 质量保护 const response = sha256( `${sha256(A1)}:${params.nonce}:${nonceCount}:${cnonce}:${qop}:${sha256( A2 )}` ); // 生成 Authorization 头部 const authorizationHeader = `Digest username="${username}", realm="${params["Digest realm"]}", nonce="${params.nonce}", uri="${uri}", algorithm="${algorithm}", qop=${qop}, nc=${nonceCount}, cnonce="${cnonce}", response="${response}", opaque="${params.opaque}"`; this.msg.authorizationHeader = authorizationHeader; } // 在浏览器环境中使用window.cryptoAPI 生成conce generateCnonce(length = 16) { const array = new Uint8Array(length); window.crypto.getRandomValues(array); return Array.from(array, (byte) => ("0" + byte.toString(16)).slice(-2) ).join(""); } getAttachThumb(attchement) { return new Promise((resolve) => { if (["image/jpeg", "image/png"].includes(attchement.type)) { // 获取图片缩略图 const reader = new FileReader(); reader.readAsDataURL(attchement); // 调整缩略图尺寸或者质量,防止出现请求体过大的问题 reader.onload = function (e) { const img = document.createElement("img"); img.src = e.target.result; img.crossOrigin = "anonymous"; // 添加跨域属性 img.onload = function () { const canvas = document.createElement("canvas"); const { naturalWidth, naturalHeight } = img; const targetWidth = 200; // 设置缩略图的宽度 const targetHeight = Math.round( (targetWidth * naturalHeight) / naturalWidth ); // 按比例计算缩略图的高度 canvas.width = targetWidth; canvas.height = targetHeight; const context = canvas.getContext("2d"); context.drawImage(img, 0, 0, targetWidth, targetHeight); const arr = canvas.toDataURL("image/jpeg").split("base64,"); resolve(arr[1] || ""); }; }; } else if (["video/mp4"].includes(attchement.type)) { // 获取视频缩略图 const url = URL.createObjectURL(attchement); const video = document.createElement("video"); video.setAttribute("crossOrigin", "anonymous"); video.setAttribute("preload", "metadata"); video.setAttribute("src", url); video.currentTime = 1; // 视频开始可能是黑屏状态 video.addEventListener("loadeddata", function () { const canvas = document.createElement("canvas"); const { videoWidth, videoHeight } = video; canvas.width = videoWidth; canvas.height = videoHeight; canvas .getContext("2d") .drawImage(video, 0, 0, videoWidth, videoHeight); const arr = canvas.toDataURL("image/jpeg").split("base64,"); resolve(arr[1] || ""); }); } else { resolve(""); } }); } // 群组业务 GroupCardStyle(style) { this.group.style = style; } initGroupHandler() { /** * 初始化群组业务 * @param {String} groupId 群组isdn * @param {String} style 卡片样式 */ this.group.open = (groupId, style) => { if (!groupId) { this.showMessage("请输入群组的isdn", "warning"); return; } if (this.subscribGroupIsdn.some((ite) => ite.groupId === groupId)) { this.showMessage("该群组已订阅", "warning"); return; } const param = { grpid: groupId, callback: (res) => { if (res.rsp === "0") { this.subscribGroupIsdn.push({ cid: "", groupId }); const obj = { isInit: true, value: { grpid: groupId, }, }; this.openGroupDialog(obj, style); } else { this.showMessage("群组订阅失败" + res.desc, "error"); } if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("群组订阅操作" + JSON.stringify(res)) ); } }, }; cloudICP.dispatch.group.subjoinTalkingGroup(param); // 订阅并自动加入组呼 }; } openGroupDialog(data, style) { console.log(data, style); console.log(this.Emergency); if (data.isInit) { const groupDom = $( `
    群组:${data.value.grpid}
    ${ data.value.speaker } 主讲中
    展开成员
    ` ); // 点击 SVG 时,只显示 .ump-sdk-group-card-content groupDom.find("svg").on("click", function () { $(this) .closest(".ump-sdk-group-card") .css({ width: "70px", height: "70px", }) .find( ".ump-sdk-group-card-tip, .ump_sdk_group_card_speaker, .ump-sdk-group-card-expansion-box, .ump-sdk-group-card-member-box" ) .hide(); }); // 点击 .ump-sdk-group-card-content 时,恢复之前的内容 groupDom.find(".ump-sdk-group-card-content").on("click", function () { const parentCard = $(this).closest(".ump-sdk-group-card"); parentCard .css({ width: "260px", height: "auto", }) .find( ".ump-sdk-group-card-tip, .ump_sdk_group_card_speaker, .ump-sdk-group-card-expansion-box, .ump-sdk-group-card-member-box" ) .show(); }); groupDom .find(".ump-sdk-group-card-btn-no-speaker") .on("click", function (event) { event.stopPropagation(); }); $("body").append(groupDom); this.draggable(`ump-sdk-group-card-${data.value.grpid}`); // 关闭群组卡片 $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-close-btn` ).click(async () => { this.unsubscribeTalkingGroup(data.value.grpid, groupDom); }); // 组呼发起 $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-btn` ).mousedown(() => { $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-btn` ).addClass("ump-sdk-group-card-btn-speaker"); $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-btn-talking` ).attr("style", "display: block;"); const param = { grpid: data.value.grpid, callback: (res) => { if (res.rsp !== "0") { this.showMessage("组呼发起失败" + res.desc, "error"); } if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("组呼发起" + JSON.stringify(res)) ); } }, }; cloudICP.dispatch.group.pttTalkingGroup(param); }); // 组呼放权 $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-btn` ).mouseup(() => { $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-btn` ).removeClass("ump-sdk-group-card-btn-speaker"); $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-btn-talking` ).attr("style", "display: none;"); const param = { grpid: data.value.grpid, callback: (res) => { if (res.rsp !== "0") { this.showMessage("组呼放权失败" + res.desc, "error"); } if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("组呼放权" + JSON.stringify(res)) ); } }, }; cloudICP.dispatch.group.pttreleaseTalkingGroup(param); }); // 展开成员 $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-expansion-btn` ).click(async () => { const expansionBtnDom = $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-expansion-btn` ); const memberBoxDom = $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-member-box` ); if (expansionBtnDom.attr("data-isExpansion") === "0") { expansionBtnDom.text("收起成员"); expansionBtnDom.attr("data-isExpansion", "1"); memberBoxDom.children().remove(); // const resArr = await this.getGroupMember(data.value.grpid) let params = { grpid: data.value.grpid, callback: (data) => { console.log(data, "========data============"); if (data.rsp === "0") { const resArr = data.list; this.logCallback( UMPSDK.logInfoFormat( "查询群组成员成功" + JSON.stringify(data) ) ); if (resArr && resArr.length > 0) { resArr.forEach((ite) => { const childrenDom = $( `

    ${ite.isdn}

    ` ); memberBoxDom.append(childrenDom); }); } } else { this.logCallback( UMPSDK.logInfoFormat( "查询群组成员失败" + JSON.stringify(data) ) ); } }, }; cloudICP.dispatch.query.queryTalkingGroupMembersV1(params); // 无法对派接组进行查询 } else { expansionBtnDom.text("展开成员"); expansionBtnDom.attr("data-isExpansion", "0"); memberBoxDom.children().remove(); } }); } else if (data && data.value && data.value.speaker) { $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-speaker` ).attr("style", "opacity: 1;"); $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-speaker-name` ).text(`${data.value.speaker} 主讲中`); if (this.Emergency.includes("紧急组呼")) { $(`#ump-sdk-group-card-${data.value.grpid}`) .addClass("border-red") .removeClass("border-none"); } } else if (data && data.value && !data.value.speaker) { $( `#ump-sdk-group-card-${data.value.grpid} .ump-sdk-group-card-speaker` ).attr("style", "opacity: 0;"); if (!this.Emergency.includes("紧急组呼")) { $(`#ump-sdk-group-card-${data.value.grpid}`) .addClass("border-none") .removeClass("border-red"); } } } unsubscribeTalkingGroup(grpid, groupDom) { // 去订阅 const param = { grpid, callback: (result) => { if (result.rsp === "0") { groupDom.remove(); this.subscribGroupIsdn = this.subscribGroupIsdn.filter( (ite) => ite.groupId !== grpid ); this.showMessage("群组去订阅成功", "success"); } else { this.showMessage("群组去订阅失败" + result.desc, "error"); } if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("群组去订阅操作" + JSON.stringify(result)) ); } }, }; cloudICP.dispatch.group.unsubscribeTalkingGroup(param); } getGroupMember(groupId) { return new Promise((resolve) => { fetch(this.url + "/api/v2/resource/groups/" + groupId, { method: "GET", headers: { Authorization: "token " + this.accessToken, }, }) .then((response) => response.json()) .then((data) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("获取群组成员:" + JSON.stringify(data)) ); } if (data && data.data && Array.isArray(data.data.member)) { resolve(data.data.member); } else { resolve([]); } }) .catch((error) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "❗获取群组成员失败:" + JSON.stringify(error) ) ); } resolve([]); }); }); } //============================会议相关业务代码================================== // 会议初始化构造函数 meetingCardStyle(style) { this.metting.style = style; } initMetingHandler() { this.metting.dial = (mettingType, obj, style) => { console.log(obj, "----------------------"); this.metting.style = style; const mettingDialog = document.getElementsByClassName( `ump-sdk-metting-out-dialog` ); if (mettingDialog.length) { this.showMessage("会议已存在", "warning"); return; } let param = ""; this.metting.isJoin = false; this.metting.carmerStatus = obj.carmerStatus; this.metting.macStatus = obj.macStatus; obj.memberInfos.forEach((ite, index) => { let result = this.metting.userInfoList.find( (item) => item.isdn === ite.number ); if (result) { if (result.category === "1") { ite.isCamera = "true"; } else { ite.isCamera = "false"; } if (result.category === "1") { ite.h265 = "true"; } else { ite.h265 = "false"; } } else { ite.isCamera = "false"; ite.h265 = "false"; } }); console.log( obj.memberInfos, "=============根据用户能力设置isCamera、h265的值================" ); if (mettingType === "immediately") { // 即时会议 param = { isVideo: String(obj.carmerStatus), confRate: obj.confRate || "", memberInfos: obj.memberInfos || [], windowInfo: obj.windowInfo || { mode: "wssflow", width: 800, height: 450, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("发起即时会议" + JSON.stringify(rsp)) ); } this.cardStyle.monitorStyle = obj.style; }, }; console.log(param, "==========即时会议参数============"); cloudICP.dispatch.conf.createConf(param); } else if (mettingType === "appoint") { // 预约会议 param = { isVideo: "true", confRate: "", time: obj.time || "", timeZone: obj.timeZone || "", timeZoneName: obj.timeZoneName || "", memberInfos: obj.memberInfos || [], windowInfo: obj.windowInfo || { mode: "wssflow", width: 800, height: 450, showToolbar: 0, posX: 0, posY: 0, }, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("发起预约会议" + JSON.stringify(rsp)) ); } this.cardStyle.monitorStyle = obj.style; }, }; console.log(param, "==========预约会议参数============"); cloudICP.dispatch.conf.createConf(param); } }; } /*静音会议*/ muteConference(data) { let param = { confId: data.value.confId, isMute: JSON.stringify(this.metting.macStatus), number: this.isdn, callback: (data) => {}, }; cloudICP.dispatch.conf.muteConfMember(param); } /*会议上墙*/ conferenceVideoWall(data) { if (this.metting.carmerStatus) { let param = { confId: data.value.confId, number: this.isdn, callback: (data) => {}, }; cloudICP.dispatch.conf.broadcastConfMember(param); } } // 主动入会 async activeMetting(obj, style) { this.metting.style = style; let param = { confId: obj.confId, unifiedAccessCode: obj.unifiedAccessCode, passcode: obj.passcode, isVideo: "true", windowInfo: { width: 800, height: 450, }, callback: (data) => { if (data.rsp === "0") { this.logCallback( UMPSDK.logInfoFormat("主动入会成功" + JSON.stringify(data)) ); } else { this.logCallback( UMPSDK.logInfoFormat("主动入会失败" + JSON.stringify(data)) ); } }, }; this.metting.Attendees = []; // 主动入会的会议成员信息list数组 this.metting.isJoin = true; // 加入会议和创建会议都会进入3003状态码,因此采用锚点进行区分 cloudICP.dispatch.conf.joinConf(param); } // 查询调度员调度员是否存在未退出会议 queryingTheConferenceStatus() { let param = { callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( "查询当前登录坐席是否存在会议" + JSON.stringify(rsp) ) ); } }, }; cloudICP.dispatch.conf.queryConfListByAttendee(param); } closeMetting(data) { let dom = document.getElementsByClassName( "ump-sdk-metting-endConference" )[0]; if (dom.innerHTML === "离开会议") { let param = { cid: data.value.cid, callback: (res) => { if (res.rsp === "0") { UMPSDK.logInfoFormat("离开会议成功" + JSON.stringify(res)); } else { UMPSDK.logInfoFormat("离开会议失败" + JSON.stringify(res)); } }, }; console.log("主动离开会议,容器移除❌❌❌"); cloudICP.dispatch.conf.exitVideoConf(param); const dom = document.getElementById( `ump-sdk-metting-out-dialog-${data.value.confId}` ); if (dom) { dom.remove(); } } else { let param = { confId: data.value.confId, callback: (res) => { if (res.rsp === "0") { UMPSDK.logInfoFormat("主动结束成功" + JSON.stringify(res)); } else { UMPSDK.logInfoFormat("主动结束失败" + JSON.stringify(res)); } }, }; console.log("主动结束会议,容器移除❌❌❌"); cloudICP.dispatch.conf.endConf(param); const dom = document.getElementById( `ump-sdk-metting-out-dialog-${data.value.confId}` ); if (dom) { dom.remove(); } } this.clearTimerHandler("videoTimer", this.metting.cid); this.metting.setGridPerson = []; this.metting.setPageGridPerson = []; this.metting.cid = null; } // 根据画面布局,设置会场布局生成的网格数量 getGirdNum(type) { switch ( type // 会场布局样式与画面布局保持一致,设置布局网格 ) { case "CP_1_1": return (this.metting.girdNum = [1]); break; case "CP_2_1": return (this.metting.girdNum = [1, 2]); break; case "CP_3_4": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_4_1": return (this.metting.girdNum = [1, 2, 3, 4]); break; case "CP_5_1": return (this.metting.girdNum = [1, 2, 3, 4, 5]); break; case "CP_6_1": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_7_1": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_7_2": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_8_1": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_9_1": return (this.metting.girdNum = [1, 2, 3, 4, 5, 6, 7, 8, 9]); break; case "CP_10_1": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_10_5": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_13_5": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; case "CP_16_1": return (this.metting.girdNum = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ]); break; } } // 根据type类型获取不同布局的网格类名集合 getGridClassName(type) { switch ( type // 会场布局样式与画面布局保持一致,设置布局网格 ) { case "CP_1_1": return (this.metting.gridClassName = ["grid0"]); break; case "CP_2_1": return (this.metting.gridClassName = ["grid0", "grid1"]); break; case "CP_3_4": return (this.metting.gridClassName = ["grid0", "grid1", "grid2"]); break; case "CP_4_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", ]); break; case "CP_5_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", ]); break; case "CP_6_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", ]); break; case "CP_7_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", ]); break; case "CP_7_2": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", ]); break; case "CP_8_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", "grid7", ]); break; case "CP_9_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", "grid7", "grid8", ]); break; case "CP_10_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", "grid7", "grid8", "grid9", ]); break; case "CP_10_5": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", "grid7", "grid8", "grid9", ]); break; case "CP_13_5": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", "grid7", "grid8", "grid9", "grid10", "grid11", "grid12", ]); break; case "CP_16_1": return (this.metting.gridClassName = [ "grid0", "grid1", "grid2", "grid3", "grid4", "grid5", "grid6", "grid7", "grid8", "grid9", "grid10", "grid11", "grid12", "grid13", "grid14", "grid15", ]); break; } } // 创建会议弹窗 openMettingDialog(data, style) { const callee = data.value.calltype === "dispatch" ? data.value.src : data.value.callee; let whetherToViewParticipants = true; const mettDom = $(`
    ${ data.value.caller } 创建会议
    会议信息:
    会议ID: ${this.metting.infoMation?.value.confId}
    会议类型: 视频会议
    会议密码: ${this.metting.infoMation?.value.passcode}
    接入号: ${ this.metting.infoMation?.value.unifiedAccessCode }
    会议已开始:
    画面布局
    ${this.metting.layoutType .map((item) => { return `
    ${item.name}
    `; }) .join("")}
    静音
    邀请
    查看与会者
    关闭与会者
    与会者(1/3
    全场静音
    一键呼叫
    会场布局
    会场设置
    与会成员列表
    会场布局预案
    一键清空
    `); $("body").append(mettDom); let that = this; const draggableInstance = this.draggable( `ump-sdk-metting-out-dialog-${data.value.confId}` ); const meetPlayerDom = document.getElementById( `${"ump-sdk-metting-player-" + data.value.cid}` ); const videoTimer = setInterval(() => { // 通话计时 const tipDom = $(`.ump-sdk-metting-headerInfo-TimesBox-timeNow`); const timeNum = Number(tipDom.attr("data-time")) + 1; tipDom.attr("data-time", timeNum); tipDom.text(`${UMPSDK.timeHandler(timeNum)}`); }, 1000); const obj = { cid: data.value.cid, timer: videoTimer, }; // 链接会议 this.timer.videoTimer.push(obj); this.metting.cid = data.value.cid; try{ this.player[`player${data.value.cid}`] = this.createYuvPlayer( data, meetPlayerDom ); } catch(error) { console.log("MSP_Player",error); }; try{ this.player[`player${data.value.cid}`].changeVideResolution({ width: 800, height: 450, }); } catch(error) { console.log("MSP_Player",error); } // 点击查看会议详情 let MettingInfoTarget = false; let MettingInfoCard = document.getElementsByClassName( "ump-sdk-metting-headerInfo-userCreate-info-showCard" )[0]; $(".ump-sdk-metting-headerInfo-userCreate-info").click(() => { MettingInfoTarget = !MettingInfoTarget; if (MettingInfoTarget) { MettingInfoCard.style.display = "block"; } else { MettingInfoCard.style.display = "none"; } }); // 按钮主动结束会议 $(".ump-sdk-metting-endConference").click(() => { this.closeMetting(data); }); // X按钮主动结束会议 $(".ump-sdk-metting-headerInfo-ActionsBox-close").click(() => { this.closeMetting(data); }); // 全屏会议 $(`#ump-sdk-metting-headerInfo-ActionsBox-square`).click(() => { const mettingCardDom = $( `#ump-sdk-metting-out-dialog-${data.value.confId}` ); const square = document.getElementById( `ump-sdk-metting-headerInfo-ActionsBox-square` ); const notsquare = document.getElementById( `ump-sdk-metting-headerInfo-ActionsBox-not-square` ); const headerBox = document.getElementsByClassName( "ump-sdk-metting-headerInfo" )[0]; const footerBox = document.getElementsByClassName( "ump-sdk-metting-footerActive" )[0]; const viewAttendees = document.getElementsByClassName( "ump-sdk-metting-viewAttendees" )[0]; const requests = document.getElementsByClassName( "ump-sdk-metting-requests" )[0]; mettingCardDom.addClass("ump-sdk-metting-card-full-width-height"); square.style.display = "none"; viewAttendees.style.display = "none"; requests.style.display = "none"; notsquare.style.display = "block"; headerBox.style.top = "0px"; headerBox.style.width = "100vw"; footerBox.style.bottom = "0px"; footerBox.style.width = "100vw"; footerBox.style.background = "rgba(0,0,0,0)"; headerBox.style.background = "rgba(0,0,0,0)"; // 全屏后禁止拖动,并且清空内联样式 draggableInstance.disableDragging(); console.log(mettingCardDom.width(), mettingCardDom.height()); if (this.player[`player${data.value.cid}`]) { this.player[`player${data.value.cid}`].changeVideResolution({ width: parseInt(mettingCardDom.width()), height: parseInt(mettingCardDom.height()), }); } }); // 结束全屏 $("#ump-sdk-metting-headerInfo-ActionsBox-not-square").click(() => { const mettingCardDom = $( `#ump-sdk-metting-out-dialog-${data.value.confId}` ); const square = document.getElementById( `ump-sdk-metting-headerInfo-ActionsBox-square` ); const notsquare = document.getElementById( `ump-sdk-metting-headerInfo-ActionsBox-not-square` ); const headerBox = document.getElementsByClassName( "ump-sdk-metting-headerInfo" )[0]; const footerBox = document.getElementsByClassName( "ump-sdk-metting-footerActive" )[0]; const viewAttendees = document.getElementsByClassName( " ump-sdk-metting-viewAttendees" )[0]; const requests = document.getElementsByClassName( "ump-sdk-metting-requests" )[0]; square.style.display = "block"; viewAttendees.style.display = "block"; requests.style.display = "block"; notsquare.style.display = "none"; headerBox.style.top = "-50px"; footerBox.style.bottom = "-100px"; footerBox.style.width = style.width ? style.width : "800px"; footerBox.style.background = style.bgColor ? style.bgColor : "#044069"; headerBox.style.background = style.bgColor ? style.bgColor : "#044069"; if (this.metting.viewAttendeesTarget) { let styleWidth = style.width ? style.width.replace("px", "") : ""; headerBox.style.width = style.width ? `${styleWidth + 200}px` : "1000px"; } else { headerBox.style.width = style.width ? style.width : "800px"; } draggableInstance.enableDragging(); mettingCardDom.removeClass("ump-sdk-metting-card-full-width-height"); if (this.player[`player${data.value.cid}`]) { let styleWidth = style.width ? style.width.replace("px", "") : ""; let styleHeight = style.height ? style.height.replace("px", "") : ""; this.player[`player${data.value.cid}`].changeVideResolution({ width: style.width ? parseInt(styleWidth) : 800, height: style.height ? parseInt(styleHeight) : 450, }); } }); // 点击查看与会者、关闭与会者 const viewAttendeesOpen = document.getElementsByClassName( "ump-sdk-metting-viewAttendees-open" )[0]; const viewAttendeesClose = document.getElementsByClassName( "ump-sdk-metting-viewAttendees-close" )[0]; const AttendeesRightCard = document.getElementsByClassName( "ump-sdk-metting-right" )[0]; const headerBox = document.getElementsByClassName( "ump-sdk-metting-headerInfo" )[0]; this.metting.viewAttendeesTarget = false; $(".ump-sdk-metting-viewAttendees").click(() => { this.metting.viewAttendeesTarget = !this.metting.viewAttendeesTarget; if (this.metting.viewAttendeesTarget) { let styleWidth = style.width ? style.width.replace("px", "") : ""; headerBox.style.width = style.width ? `${styleWidth + 200}px` : "1000px"; AttendeesRightCard.style.display = "block"; viewAttendeesOpen.style.display = "none"; viewAttendeesClose.style.display = "block"; } else { headerBox.style.width = style.width ? style.width : "800px"; AttendeesRightCard.style.display = "none"; viewAttendeesOpen.style.display = "block"; viewAttendeesClose.style.display = "none"; } }); // 复制会议信息 $( ".ump-sdk-metting-headerInfo-userCreate-info-showCard-meetInfo-copy" ).click(() => { const info = `会议id:${data.value.confId},会议类型:视频会议,会议密码:'',接入号:${data.value.caller}`; var aux = document.createElement("input"); aux.setAttribute("value", info); document.body.appendChild(aux); aux.select(); document.execCommand("copy"); document.body.removeChild(aux); this.showMessage("复制内容成功", "success"); }); // 开启、关闭麦克风静音 const audio = document.getElementsByClassName("ump-sdk-metting-audio")[0]; const mute = document.getElementsByClassName("ump-sdk-metting-mute")[0]; $(".ump-sdk-metting-Mic").click(() => { this.metting.MicTarget = this.metting.MicTarget; if (this.metting.MicTarget) { audio.style.display = "none"; mute.style.display = "block"; let param = { confId: data.value.confId, isMute: "true", number: this.isdn, callback: (res) => { // 回调处理:日志记录 if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( `禁用(${this.isdn})的麦克风` + JSON.stringify(res) ) ); } }, }; cloudICP.dispatch.conf.muteConfMember(param); } else { audio.style.display = "block"; mute.style.display = "none"; let param = { confId: data.value.confId, isMute: "false", number: this.isdn, callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat( `启用(${this.isdn})的麦克风` + JSON.stringify(res) ) ); } }, }; console.log(param, "=========param============"); cloudICP.dispatch.conf.muteConfMember(param); } }); // 邀请与会者 const requestsInput = document.getElementById( `ump-sdk-metting-requests-input-${data.value.caller}` ); let requestsTarget = false; $(".ump-sdk-metting-requests").click(() => { requestsTarget = !requestsTarget; if (requestsTarget) { requestsInput.style.display = "block"; } else { requestsInput.style.display = "none"; } }); $(".ump-sdk-metting-requests-input").blur(() => { requestsTarget = !requestsTarget; const requestsInput = document.getElementById( `ump-sdk-metting-requests-input-${data.value.caller}` ); if (requestsTarget) { requestsInput.style.display = "block"; } else { requestsInput.style.display = "none"; } let requestsInputValue = requestsInput.value.split(","); // 获取邀请成员的数组 let memberInfos = []; if (requestsInputValue.length == 0) { this.showMessage("请输入邀请入会者isdn"); return; } requestsInputValue.forEach((item) => { memberInfos.push({ number: item, name: item, isCamera: "true", isWatchOnly: "false", h265: "true", }); }); let param = { confId: data.value.confId, memberInfos: memberInfos, callback: (res) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat(`邀请成员入会` + JSON.stringify(res)) ); } }, }; cloudICP.dispatch.conf.addConfMembers(param); }); // 全场静音 $(".ump-sdk-metting-right-userList-fotterAction-audience").click(() => { let dom = document.getElementById( "ump-sdk-metting-right-userList-fotterAction-audience" ); //根据Id获取元素 this.metting.audience = !this.metting.audience; let param; if (this.metting.audience) { // 全场会议静音 param = { confId: data.value.confId, isMute: "true", callback: (data) => {}, }; if (dom) { dom.innerText = "解除静音"; } } else { // 全场会议静音取消 param = { confId: data.value.confId, isMute: "false", callback: (data) => {}, }; if (dom) { dom.innerText = "全场静音"; } } cloudICP.dispatch.conf.muteConf(param); }); // 一键呼叫 $(".ump-sdk-metting-right-userList-fotterAction-allcall").click(() => { this.metting.unJoinMetting.forEach((item) => { let param = { confId: data.value.confId, memberInfo: { number: item, }, callback: (data) => {}, }; cloudICP.dispatch.conf.callConfMember(param); }); }); // 禁用麦克风 $(document).on( "click", ".ump-sdk-metting-right-userList-MIC", function (e) { let dom = $(e.target); let isdn = dom.attr("isdn"); let chair = dom.attr("chair"); if (that.isdn === chair) { // 如果是主席才能使用此功能 let param = { confId: data.value.confId, isMute: "false", number: isdn, callback: (data) => {}, }; cloudICP.dispatch.conf.muteConfMember(param); } } ); $(document).on( "click", ".ump-sdk-metting-right-userList-talking", function (e) { let dom = $(e.target); let isdn = dom.attr("isdn"); let chair = dom.attr("chair"); if (that.isdn === chair) { // 如果是主席才能使用此功能 let param = { confId: data.value.confId, isMute: "true", number: isdn, callback: (data) => {}, }; cloudICP.dispatch.conf.muteConfMember(param); } } ); // 鼠标事件控制人员操作菜单组件显隐 $(document).on( "mouseenter", ".ump-sdk-meeting-right-userList-menu", function (e) { let dom = $(e.target); let index = dom.attr("index"); let menuDom = document.getElementsByClassName( "ump-sdk-metting-right-meetingContextMenu-box" )[index]; if (menuDom) { menuDom.style.display = "block"; } } ); $(document).on( "mouseleave", ".ump-sdk-meeting-right-userList-menu", function (e) { let dom = $(e.target); let index = dom.attr("index"); let menuDom = document.getElementsByClassName( "ump-sdk-metting-right-meetingContextMenu-box" )[index]; if (menuDom) { menuDom.style.display = "none"; } } ); $(document).on( "mouseleave", ".ump-sdk-metting-right-meetingContextMenu-box", function (e) { let dom = $(e.target); let index = dom.attr("index"); let menuDom = document.getElementsByClassName( "ump-sdk-metting-right-meetingContextMenu-box" )[index]; if (menuDom) { menuDom.style.display = "none"; } } ); // 转让主席 $(document).on( "click", ".ump-sdk-metting-right-meetingContextMenu-li-chairperson", function (e) { let dom = $(e.target); let isdn = dom.attr("isdn"); /*遍历用户信息,查询转让对象的能力*/ that.metting.userInfoList.map((item) => { if (item.isdn == isdn) { if (item.category == 0) { let param = { confId: data.value.confId, applier: isdn, callback: (data) => { that.logCallback( UMPSDK.logInfoFormat("转让主席:" + JSON.stringify(data)) ); }, }; cloudICP.dispatch.conf.setChairman(param); } else { that.showMessage( "不可转让主席给非坐席用户", "warning", null, "targetID" ); } } }); } ); // 重呼成员 $(document).on( "click", ".ump-sdk-metting-right-meetingContextMenu-li-Recall", function (e) { let dom = $(e.target); let isdn = dom.attr("isdn"); let param = { confId: data.value.confId, memberInfo: { number: isdn, }, callback: () => {}, }; cloudICP.dispatch.conf.callConfMember(param); } ); // 移除成员 $(document).on( "click", ".ump-sdk-metting-right-meetingContextMenu-li-Remove", function (e) { let dom = $(e.target); let isdn = dom.attr("isdn"); let param = { confId: data.value.confId, memberInfo: { number: isdn, }, callback: () => {}, }; cloudICP.dispatch.conf.delConfMember(param); } ); // 控制画面布局显隐 $(".ump-sdk-metting-headerInfo-TimesBox-videoLayout-icon").click(() => { this.metting.layoutStatus = !this.metting.layoutStatus; let dom = document.getElementsByClassName( "ump-sdk-metting-headerInfo-TimesBox-videoLayout-setLayout" )[0]; if (this.metting.layoutStatus) { dom.style.display = "block"; } else { dom.style.display = "none"; } }); // 设置画面布局 $( ".ump-sdk-metting-headerInfo-TimesBox-videoLayout-setLayout-icon" ).click((e) => { let layuot = document.getElementsByClassName( "ump-sdk-metting-headerInfo-TimesBox-videoLayout-setLayout" )[0]; let dom = $(e.target); let type = dom.attr("type"); this.metting.choseLayoutType = type; // 存储用户选择的画面布局模式,用于设置会场布局 this.getGirdNum(type); this.getGridClassName(type); let numberList = []; this.metting.memberList.forEach((item) => { numberList.push({ number: String(item.number) }); }); let param = { confId: data.value.confId, mixPictureType: type, memberInfos: numberList, callback: () => { this.metting.layoutStatus = false; layuot.style.display = "none"; }, }; console.log(param, "分屏被调用了"); cloudICP.dispatch.conf.broadcastMixPicture(param); }); // 打开设置会场布局弹窗 $(".ump-sdk-metting-right-userList-fotterAction-setLayout").click(() => { const isPersonDom = document.getElementsByClassName( "ump-sdk-meeting-layout-content-left-personBox-list" )[0]; if (isPersonDom) return; // 判断节点是否已添加,避免节点重复 const layoutDom = document.getElementsByClassName( "ump-sdk-meeting-layout" )[0]; layoutDom.style.display = "block"; // 添加入会人员节点 const personDom = $(`
    ${that.metting.memberList .map((item, index) => { return `
    ${item.number}
    `; }) .join("")}
    `); // 布局网格容器 const personDom2 = $(`
    ${that.metting.girdNum .map((item, index) => { return `
    `; }) .join("")}
    `); $("#ump-sdk-meeting-layout-content-left-personBox").append(personDom); $(".ump-sdk-meeting-layout-content-right-content").append(personDom2); //已保存的 console.log( that.metting.setPageGridPerson, "保存保存保存保存保存保存保存保存保存保存保存" ); console.log( that.metting.setGridPerson, "页面渲染页面渲染页面渲染页面渲染页面渲染页面渲染页面渲染" ); that.metting.setGridPerson = JSON.parse( JSON.stringify(that.metting.setPageGridPerson) ); if ( that.metting.setGridPerson && that.metting.setGridPerson.length > 0 ) { that.metting.setGridPerson.forEach((person, index) => { // 如果人员没有被添加过 if ( !document.getElementById( `ump-sdk-meeting-layout-content-left-personBox-list-line-${person}` ) ) { let personCard = $(`
    ${person}
    `); // 将新节点插入到对应位置 let gridIndex = that.metting.setGridPerson.indexOf(person); if (gridIndex === -1) { let emptySlotIndex = that.metting.setGridPerson.indexOf(0); // 查找空位 if (emptySlotIndex !== -1) { // 替换空位为当前人员 that.metting.setGridPerson[emptySlotIndex] = person; } else { // 如果没有空位,直接添加 that.metting.setGridPerson.push(person); } } // 根据人员位置插入到对应的布局 $(`.grid${gridIndex}`).append(personCard); // 设置布局背景图片容器 let gridDom = document.getElementsByClassName( `grid${gridIndex}` )[0]; // 设置布局背景图片容器的样式 gridDom.style.backgroundSize = 0; } else { that.showMessage("该人员已在布局中", "error"); } }); } }); // 关闭设置会场布局弹窗 $(".ump-sdk-meeting-layout-header-ESC").click(() => { const layoutDom = document.getElementsByClassName( "ump-sdk-meeting-layout" )[0]; layoutDom.style.display = "none"; const isPersonDom = document.getElementsByClassName( "ump-sdk-meeting-layout-content-left-personBox-list" )[0]; const layoutDomBox = document.getElementsByClassName( "ump-sdk-meeting-layout-content-right-content-box" )[0]; isPersonDom.remove(); layoutDomBox.remove(); this.metting.setGridPerson = []; }); $(".ump-sdk-meeting-layout-footer-cancel").click(() => { const layoutDom = document.getElementsByClassName( "ump-sdk-meeting-layout" )[0]; layoutDom.style.display = "none"; const isPersonDom = document.getElementsByClassName( "ump-sdk-meeting-layout-content-left-personBox-list" )[0]; const layoutDomBox = document.getElementsByClassName( "ump-sdk-meeting-layout-content-right-content-box" )[0]; isPersonDom.remove(); layoutDomBox.remove(); this.metting.setGridPerson = []; }); $(document).on( "dblclick", ".ump-sdk-meeting-layout-content-left-personBox-list-line-isdn", function (e) { let dom = $(e.target); let index = dom.attr("key"); let number = dom.attr("number"); // 布局添加的人员节点 let personCrad = $(`
    ${number}
    `); if ( that.metting.setGridPerson && that.metting.setGridPerson.length > 0 ) { let result = that.metting.setGridPerson.indexOf(Number(number)); if (result === -1) { // 添加确认是否已存在 let index = that.metting.setGridPerson.indexOf(0); // 确认上次操作是否删除了布局中的人员,删除操作会将原number变更为0 if (index === -1) { that.metting.setGridPerson.push(Number(number)); } else { // 未添加时,确认上次操作是否删除了布局中的人员,在空缺的布局中插入新数据 that.metting.setGridPerson.splice(index, 1, Number(number)); } $( `.grid${that.metting.setGridPerson.indexOf(Number(number))}` ).append(personCrad); // 布局背景图片容器 let gridDom = document.getElementsByClassName( `grid${that.metting.setGridPerson.indexOf(Number(number))}` )[0]; // 布局删除按钮 gridDom.style.backgroundSize = 0; } else { that.showMessage("该人员已在布局中", "error"); } } else { that.metting.setGridPerson.push(Number(number)); $( `.grid${that.metting.setGridPerson.indexOf(Number(number))}` ).append(personCrad); // 布局背景图片容器 let gridDom = document.getElementsByClassName( `grid${that.metting.setGridPerson.indexOf(Number(number))}` )[0]; gridDom.style.backgroundSize = 0; } console.log(that.metting.setGridPerson); } ); // 删除已布局人员 $(document).on( "click", ".ump-sdk-meeting-layout-content-right-content-cardmini-ESC", function (e) { let dom = $(e.target); let number = dom.attr("number"); let gridPerson = document.getElementById( `ump-sdk-meeting-layout-content-left-personBox-list-line-${Number( number )}` ); let gridDom = document.getElementsByClassName( `grid${that.metting.setGridPerson.indexOf(Number(number))}` )[0]; gridPerson.remove(); gridDom.style.backgroundSize = "16px"; let index = that.metting.setGridPerson.indexOf(Number(number)); // that.metting.setGridPerson.splice(index, 1, 0); that.metting.setGridPerson = that.metting.setGridPerson.filter( (v) => v != number ); console.log( that.metting.setGridPerson, "===========that.metting.setGridPerson============" ); } ); // 一键清空 $(`.ump-sdk-meeting-layout-content-right-header-clear`).click(() => { that.metting.setGridPerson.forEach((item) => { let gridPerson = document.getElementById( `ump-sdk-meeting-layout-content-left-personBox-list-line-${Number( item )}` ); let gridDom = document.getElementsByClassName( `grid${that.metting.setGridPerson.indexOf(Number(item))}` )[0]; gridDom.style.backgroundSize = "16px"; gridPerson.remove(); }); that.metting.setGridPerson = []; }); // 启用会场布局 $(document).on( "click", ".ump-sdk-meeting-layout-footer-sure", function (e) { let numberList = []; that.metting.setGridPerson.forEach((item) => { numberList.push({ number: String(item) }); }); let param = { confId: data.value.confId, mixPictureType: that.metting.choseLayoutType, memberInfos: numberList, callback: () => { // 移除添加的自定义容器 const layoutDom = document.getElementsByClassName( "ump-sdk-meeting-layout" )[0]; layoutDom.style.display = "none"; const isPersonDom = document.getElementsByClassName( "ump-sdk-meeting-layout-content-left-personBox-list" )[0]; const layoutDomBox = document.getElementsByClassName( "ump-sdk-meeting-layout-content-right-content-box" )[0]; isPersonDom.remove(); layoutDomBox.remove(); }, }; console.log(param, "画面布局被调用了"); cloudICP.dispatch.conf.broadcastMixPicture(param); that.metting.setPageGridPerson = that.metting.setGridPerson; } ); } // gis initGis() { // gis订阅 this.gis.subscribeGIS = (isdnList) => { let uelist = []; isdnList.forEach((isdn) => { uelist.push({ isdn: isdn }); }); const params = { uelist: uelist, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("订阅GIS" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.gis.subscribeGIS(params); }; // 查询终端历史轨迹 this.gis.queryTrack = ( ueid, begintime, endtime, offset, limit, policy, maxnum ) => { if (!ueid) { this.showMessage("请输入终端号码", "warning"); return; } let begin, end; if (begintime) { begin = this.convertDateToYYYYMMDDHHMMSS(begintime); } else { this.showMessage("请输入开始时间", "warning"); return; } if (endtime) { end = this.convertDateToYYYYMMDDHHMMSS(endtime); } else { this.showMessage("请输入结束时间", "warning"); return; } const days = Math.floor( (new Date(endtime).getTime() - new Date(begintime).getTime()) / (1000 * 60 * 60 * 24) ); if (days > 7) { this.showMessage("结束时间与开始时间相差不能超过7天", "warning"); return; } const params = { ueid: ueid, begintime: begin, endtime: end, offset: offset, limit: limit, policy: policy, maxnum: maxnum, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询GIS轨迹" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.query.queryGISTrack(params); }; } convertDateToYYYYMMDDHHMMSS(dateString) { const date = new Date(dateString); const year = date.getFullYear(); const month = ("0" + (date.getMonth() + 1)).slice(-2); const day = ("0" + date.getDate()).slice(-2); const hours = ("0" + date.getHours()).slice(-2); const minutes = ("0" + date.getMinutes()).slice(-2); const seconds = ("0" + date.getSeconds()).slice(-2); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // 订阅用户 initSubscribeUserStatus() { this.subscribe.userStatus = (isdnList) => { let reslist = []; isdnList.forEach((i) => reslist.push({ isdn: i })); const params = { reslist: reslist, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询用户状态" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.voice.subscribeUserStatus(params); }; } // 群组 initQueryGroup() { // 查询群组 this.group.queryList = (offset, limit, category) => { const params = { offset: offset, limit: limit, category: category, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询群组" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.query.queryTalkingGroupV1(params); }; // 查询群组成员 this.group.queryMembers = (grpid, offset, limit) => { const params = { grpid: grpid, offset: offset, limit: limit, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询群组成员" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.query.queryTalkingGroupMembersV1(params); }; } // 部门 initDepartment() { this.department.queryList = (name) => { const params = { name: name, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询部门" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.query.queryDepartmentList(params); }; this.department.queryMembers = (offset, limit, category) => { const params = { offset: offset, limit: limit, category: category, callback: (rsp) => { if (this.logCallback) { this.logCallback( UMPSDK.logInfoFormat("查询部门" + JSON.stringify(rsp)) ); } }, }; cloudICP.dispatch.query.queryUserListV1(params); }; } initIcp() { this.icp.getCloudICP = (parmar) => { parmar.callback({ cloudICP: cloudICP, }); }; } } UMPSDK.eventList = []; window.UMPSDK = UMPSDK; window.ICPUISDK = UMPSDK; })();