123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736 |
- function guid() {
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
- var r = Math.random() * 16 | 0,
- v = c == 'x' ? r : (r & 0x3 | 0x8);
- return v.toString(16);
- });
- }
- var Meeting = function Meeting() {
- this.localUserInfo = {
- //创建会议的参数对象
- id: `MID${guid()}`,
- masterDomain: '3981f448463d4cdb8735083a5114e626',
- name: '', //会议名称
- // masterId: "", //主持人用户ID
- masterName: 'zhihui', //主持人名字
- masterNumber: '', //主持人号码
- region: '', //号码对应的PAAS域ID
- record: true, //是否录像录音true:录像录音 false:不录
- type: 'video', //会议类型“audio”: 音频会议 “video”: 音视频会议
- mode: 'group', //会议模式“p2p”:点对点“group”:群聊
- };
- this.InvitedMembers = {
- //邀请会议的参数对象
- id: "", //会议id
- inviteId: "", //邀请人ID
- inviteName: "", //邀请人名字
- inviteNumber: "", //邀请人号码
- member: [],
- };
- this.InvitedMembersSingle = {
- //单兵
- id: "", //会议id
- inviteId: "", //邀请人ID
- inviteName: "", //邀请人名字
- inviteNumber: "", //邀请人号码
- member: [],
- };
- this.InvitedMembersVehicle = {
- //车载
- id: "", //会议id
- inviteId: "", //邀请人ID
- inviteName: "", //邀请人名字
- inviteNumber: "", //邀请人号码
- member: [],
- };
- this.InvitedMembersUav = {
- //无人机
- id: "", //会议id
- inviteId: "", //邀请人ID
- inviteName: "", //邀请人名字
- inviteNumber: "", //邀请人号码
- member: [],
- };
- this.InvitedMembersTalkie = {
- //对讲机
- id: "", //会议id
- inviteId: "", //邀请人ID
- inviteName: "", //邀请人名字
- inviteNumber: "", //邀请人号码
- member: [],
- };
- this.inviteSelf = {
- inviteId: '',
- department: '',
- inviteName: '',
- inviteDomain:'',
- region: '',
- inviteNumber: '',
- type: 'client',
- };
- this.meetingInfoback = ""; //各个接口返回信息
- this.$Message = {
- warning: (data) => {
- console.log(data);
- // alert(data)
- }
- };
- this.targetid = "vPlayArea"
- };
- Meeting.prototype = {
- initSocket(userCode, callback) {
- const self = this;
- //初始websocket实例,保存在window中方便调用。一个浏览器tab页面只能初始化一次。所有的控件窗口,通过该websocket实例去生成不同的窗口实例,不同的控件窗口通过自己的窗口实例去调用初始化、关闭、隐藏等
- window.theSocket = this.theSocket = new InitWebSocketClass(
- userCode,
- localStorage.getItem('token'),
- {
- //客户端登陆成功通知;
- loginSuccess: (v) => {
- console.log('loginSuccess-->', v);
- // self.initWnd();
- },
- //客户端窗口被拉起通知
- onCreateVideoSuccess: (v) => {
- console.log('客户端onCreateVideoSuccess-----', v);
- },
- //重点:统一分发客户端ws消息;vue 可以统一用$bus分发.第三方消息分发自定
- onSocketBackInfos: (data) => {
- //视频窗口创建成功通知
- if (
- data &&
- data.method === 'createVideoDialogReuslt' &&
- data.params.result === 0
- ) {
- if (data.params.handleName === '#' + this.targetid) {
- //客户端窗口创建好后,界面显示窗口;
- callback && callback();
- self[self.targetid].resize();
- this.$Message.warning('视频窗口创建成功!');
- }
- }
- },
- },
- );
- //socket实例初始化websocket回调方法;
- window.theSocket
- .initWebSocket()
- .then((v) => {
- if (v) {
- this.$Message.warning('视频插件登陆完成!');
- }
- callback();
- })
- .catch((v) => {
- this.$Message.warning(
- '若要观看实时视频,请先安装视频插件大华应急指挥调度实战平台客户端打开失败, 请尝试刷新页面重试',
- );
- });
- },
- //初始化视频窗口实例,先获取自己用户code,再初始化窗口,严格按照封装参数传,别漏了
- getUserCode(callback) {
- let self = this;
- $.ajax({
- type: 'GET',
- url: setting.URL + '/ras/user/info',
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: (xhr) => {
- xhr.setRequestHeader('X-Subject-Token', localStorage.getItem('token'));
- xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
- },
- success: (res) => {
- if (typeof res === 'string') {
- res = JSON.parse(res);
- }
- console.log(res && res.userCode);
- //obj
- if (res && res.userCode) {
- let { userCode } = res;
- //初始化websocket;
- return self.initSocket(userCode, callback);
- }
- },
- });
- },
- //初始化视频窗口-dom
- initWnd() {
- //左边窗口类型参数 分割 2行2列
- const typeObj = {
- rows: 1,
- cols: 1,
- wndSpaceing: 0,
- embedVideoMode: true,
- playerCtrlBarEnable: false,
- displayMode: 3,
- playMode: 0,
- playParams: {},
- webControlExpend: true,
- };
- if (window[this.targetid] && window[this.targetid] instanceof VideoPlay) {
- this[this.targetid] = window[this.targetid];
- return;
- }
- //左边窗口实例
- window[this.targetid] = this[this.targetid] = new VideoPlay(
- '#' + this.targetid,
- window.theSocket.websocket, //一个浏览器tab页面公用一个
- window.theSocket.socketCode, //一个浏览器tab页面公用一个
- typeObj,
- );
- //左边窗口初始化
- this[this.targetid].init();
- },
- //播放视频
- playVideo(item) {
- if (!window.theSocket.websocket) {
- this.$Message.warning('请先打开视频插件');
- return;
- }
- if (item.type == 'client') {
- this.slectOptionmini(item.userId).then((arr) => {
- if (arr) {
- this[this.targetid].openAppVideo(arr);
- }
- });
- } else if (item.type == 'single') {
- //播放单兵视频
- this.pullFlow(item.channelId);
- } else if (item.type == 'vehicle') {
- //播放车载视频
- this.pullFlow(item.channelId);
- } else if (item.type == 'uav_dev') {
- //播放无人机视频
- this.pullFlow(item.channelId);
- }
- },
- // setDesignDivision(rows, cols) {
- // // console.log(this.localUserInfo);
- // const params = JSON.stringify({
- // loginIp: setting.URL,
- // method: "SetDesignDivision",
- // userCode: this.localUserInfo.masterId,
- // params: {
- // handleName:'#vPlayArea',
- // rows: Number(rows),
- // cols: Number(cols)
- // },
- // socketCode: window.theSocket.socketCode
- // });
- // console.log(params);
- // this.webSocketSend(params);
- // },
- //设备视频拉流
- pullFlow(chinnelId) {
- if (chinnelId) {
- if (this[this.targetid]) {
- this[this.targetid].showBrower(true,this.targetid);
- this[this.targetid].dragResize(0, 0, 0, 0);
- }
- window[this.targetid] &&
- window[this.targetid].realTimeVideo &&
- window[this.targetid].realTimeVideo([
- {
- channelId: chinnelId,
- },
- ]);
- }
- },
- /* 创建会商 */
- async creatMeeting() {
- let _this = this;
- if (!_this.localUserInfo.name) {
- _this.$Message.warning('请创建会商名称');
- return;
- }
- // debugger
- await $.ajax({
- type: 'POST',
- url: setting.URL + '/mcu/meeting',
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- data: JSON.stringify(_this.localUserInfo),
- beforeSend: function (xhr) {
- xhr.setRequestHeader('X-Subject-Token', localStorage.getItem('token'));
- xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
- //xhr.setRequestHeader("Origin",null);
- },
- success: function (res) {
- //obj
- _this.InvitedMembers.id = res.id; //创建了会议id,保存起来,为了邀请成员;
- _this.InvitedMembersSingle.id = res.id; //单兵;
- _this.InvitedMembersVehicle.id = res.id; //车载;
- _this.InvitedMembersUav.id = res.id; //无人机;
- _this.InvitedMembersTalkie.id = res.id; //单兵;
- _this.meetingId = res.id;
- localStorage.setItem('meetingId', res.id);
- _this._debug('创建会商返回的信息', res);
- // _this.searchMeetingMember(); //add创建会商然后,开始查会议成员显示在列表中;
- },
- error: function (data) {},
- });
- },
- /* 邀请会商成员 */
- startInvite(member) {
- let _this = this;
- _this.InvitedMembers.member = [
- _this.inviteSelf,
- ...([member] || []),
- // {
- // type: "tandemPhone",
- // number: _this.outLinenum,
- // userName: _this.outLinenum,
- // region: _this.paasId,
- // },
- ];
- $.ajax({
- type: 'POST',
- url: setting.URL + '/mcu/meeting/member',
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- data: JSON.stringify(_this.InvitedMembers),
- beforeSend: function (xhr) {
- xhr.setRequestHeader('X-Subject-Token', localStorage.getItem('token'));
- xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
- },
- success: function (res) {
- //obj
- _this._debug('邀请会商成后的信息', res);
- //_this.searchMeetingMember(); //add创建会商然后,开始查会议成员显示在列表中;
- },
- error: function (data) {
- if (data.responseJSON.code == 'mcuIdNotExist') {
- _this.$Message.warning('未创建会商');
- } else if (data.responseJSON.code == 'mcuIdInvalid') {
- _this.$Message.warning('会议ID无效');
- } else if (data.responseJSON.code == 'mcuMeetingMemMax') {
- _this.$Message.warning('会议用户数满');
- }
- },
- });
- },
- /* 关闭会商操作 */
- deleteMeeting() {
- debugger
- try {
- let _this = this;
- let deleteMeetingId = _this.meetingId;
- if (!deleteMeetingId) {
- _this.$Message.warning('未创建会商');
- _this._debug('未创建会商', '');
- return;
- }
- $.ajax({
- type: 'DELETE',
- url: setting.URL + '/mcu/meeting/' + deleteMeetingId,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- data: JSON.stringify(_this.localUserInfo),
- beforeSend: function (xhr) {
- xhr.setRequestHeader(
- 'X-Subject-Token',
- localStorage.getItem('token'),
- );
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/json;charset=UTF-8',
- );
- },
- success: function (res) {
- //obj
- _this._debug('关闭会议成功', res);
- localStorage.removeItem('meetingId');
- _this.meetingId = ''; //置空
- _this.meetMemberList = []; //置空
- _this.meetMemberList2 = []; //置空
- },
- error: function (data) {
- //obj
- _this._debug('关闭会议错误提示', data);
- if (data.responseJSON.code === 'mcuIdNotExist') {
- _this.$Message.warning('未创建会商');
- }
- },
- });
- } catch (E) {}
- },
- deleteAllMeeting(callback) {
- let _this = this;
- let s = '?';
- var index = 0;
- var doindex = 0;
- let searchParams = {
- userDomain: '',
- userId: localStorage.getItem('userId'),
- local: '0',
- };
- for (let k in searchParams) {
- s = s + k + '=' + searchParams[k] + '&';
- }
- s = s.substr(0, s.length - 1);
- //console.log(s);
- $.ajax({
- type: 'GET',
- url: setting.URL + '/imu/group/list' + s,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: function (xhr) {
- xhr.setRequestHeader('X-Subject-Token', localStorage.getItem('token'));
- xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
- //xhr.setRequestHeader("Origin",null);
- },
- success: function (res) {
- //string
- if (res) {
- _this.allGroupColumnsData = JSON.parse(res).results;
- _this._debug('查询所有该用户参与的群组信息success', res);
- //所有与我有关的会商;
- let allRelateMeeting = [];
- if (JSON.parse(res).results !== null) {
- JSON.parse(res).results.forEach((item) => {
- if (item.meetId) {
- index++;
- allRelateMeeting.push(item);
- $.ajax({
- type: 'DELETE',
- url: setting.URL + '/mcu/meeting/' + item.meetId,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- data: JSON.stringify(_this.localUserInfo),
- beforeSend: function (xhr) {
- xhr.setRequestHeader(
- 'X-Subject-Token',
- localStorage.getItem('token'),
- );
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/json;charset=UTF-8',
- );
- },
- success: function (res) {
- //obj
- doindex++;
- if (doindex == index) {
- callback();
- }
- },
- error: function (data) {
- //obj
- doindex++;
- if (doindex == index) {
- callback();
- }
- },
- });
- }
- });
- } else {
- callback();
- }
- _this._debug('查询所有该用户参与的会商success', allRelateMeeting);
- }
- },
- error: function (data) {
- callback();
- },
- });
- },
- /* 通过deviceCode查询设备channelId */
- searchChinnelId(deviceCode, deviceType) {
- let _this = this;
- return new Promise((resolve) => {
- $.ajax({
- type: 'GET',
- url: setting.URL + '/videoService/devicesManager/devices/' + deviceCode,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: function (xhr) {
- xhr.setRequestHeader(
- 'X-Subject-Token',
- localStorage.getItem('token'),
- );
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/json;charset=UTF-8',
- );
- //xhr.setRequestHeader("Origin",null);
- },
- success: function (res) {
- //obj
- if (res) {
- if (deviceType == 'single') {
- //单兵
- _this.channelId = res.encoderUnit.channels[0].channelId;
- resolve(res.encoderUnit.channels[0].channelId);
- _this._debug(
- '单兵channelId',
- res.encoderUnit.channels[0].channelId,
- );
- } else if (deviceType == 'vehicle') {
- //车载
- _this.channelId = res.encoderUnit.channels[0].channelId;
- resolve(res.encoderUnit.channels[0].channelId);
- _this._debug(
- '车载channelId',
- res.encoderUnit.channels[0].channelId,
- );
- } else if (deviceType == 'uav') {
- //无人机
- _this.channelId = res.encoderUnit.channels[0].channelId;
- resolve(res.encoderUnit.channels[0].channelId);
- _this._debug(
- '无人机channelId',
- res.encoderUnit.channels[0].channelId,
- );
- } else if (deviceType == 'talkie') {
- //对讲机
- if (res.encoderUnit.channels[0].channelId) {
- _this.channelId = res.encoderUnit.channels[0].channelId;
- resolve(res.encoderUnit.channels[0].channelId);
- }
- _this._debug(
- '对讲机channelId',
- res.devAudioUnit.channels[0].channelId,
- );
- }
- }
- },
- error: function (data) {
- //
- },
- });
- });
- },
- queryUser(userCode) {
- let _this = this;
- return new Promise((resolve) => {
- $.ajax({
- type: 'GET',
- url: setting.URL + '/ras/user/' + userCode,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: function (xhr) {
- xhr.setRequestHeader(
- 'X-Subject-Token',
- localStorage.getItem('token'),
- );
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/json;charset=UTF-8',
- );
- },
- success: function (res) {
- //obj
- if (res) {
- resolve(JSON.parse(res));
- }
- },
- error: function (data) {
- // debugger
- },
- });
- });
- },
- queryDevice(deviceCode) {
- let _this = this;
- return new Promise((resolve) => {
- $.ajax({
- type: 'GET',
- url: setting.URL + '/videoService/devicesManager/devices/' + deviceCode,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: function (xhr) {
- xhr.setRequestHeader(
- 'X-Subject-Token',
- localStorage.getItem('token'),
- );
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/json;charset=UTF-8',
- );
- },
- success: (res) => {
- if (res) {
- try {
- // $.ajax({
- // type: 'POST',
- // url: setting.URL + '/rvsl/ecd',
- // contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- // dateType: 'json',
- // data: JSON.stringify({ deviceCode: [res.deviceCode] }),
- // beforeSend: function (xhr) {
- // xhr.setRequestHeader(
- // 'X-Subject-Token',
- // localStorage.getItem('token'),
- // );
- // xhr.setRequestHeader(
- // 'Content-Type',
- // 'application/json;charset=UTF-8',
- // );
- // },
- // success: function (res1) {
- // _this.localUserInfo.masterDomain = res1.data[0].ecdId;
- // resolve(res);
- // },
- // error: function (data) {},
- // });
- } catch (error) {
- // resolve(res);
- } finally {
- resolve(res);
- }
-
- //obj
- }
- },
- error: function (data) {
- // debugger
- },
- });
- });
- },
- /* app拉流 */
- slectOptionmini(userCode) {
- let _this = this;
- return new Promise((resolve) => {
- $.ajax({
- type: 'GET',
- url: setting.URL + '/ras/user/' + userCode,
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: function (xhr) {
- xhr.setRequestHeader(
- 'X-Subject-Token',
- localStorage.getItem('token'),
- );
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/json;charset=UTF-8',
- );
- },
- success: function (res) {
- //obj
- if (res && res.chnId) {
- let arr = [
- {
- channelId: res.chnId,
- userCode: res.userCode,
- regionId: res.paasId,
- domainId: '',
- },
- ];
- resolve(arr);
- }
- },
- error: function (data) {},
- });
- });
- },
- /* 打开客户端 */
- async openClient(callback) {
- return this.getUserCode(callback);
- },
- closeClient() {
- try {
- this.theSocket &&
- this.theSocket.closeClient &&
- this.theSocket.closeClient();
- } catch (E) {}
- },
- closeVideo() {
- try {
- // this.theSocket.closeAllVideo && this.theSocket.closeAllVideo();
- this[this.targetid].closeAllVideo();
- this[this.targetid].showBrower(false, this.targetid);
- setTimeout(() => {
- this[this.targetid].showBrower(false, this.targetid);
- }, 100);
- } catch (E) {}
- },
- /* 获取群聊fromName */
- async getLocalUserInfo() {
- let _this = this;
- await $.ajax({
- type: 'GET',
- url: setting.URL + '/ras/user/info',
- contentType: 'application/json', //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
- dateType: 'json',
- beforeSend: function (xhr) {
- xhr.setRequestHeader('X-Subject-Token', localStorage.getItem('token'));
- xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
- },
- success: function (res) {
- if ( !(res instanceof Object)){
- res = JSON.parse(res);
- }
- //obj
- _this.loginPassword = res.loginPassword; //获取登录为密码.为登录用户话机注册做准备(需要res解密)
- _this.localUserInfo.masterName = res.userName;
- // _this.localUserInfo.masterId = res.userCode;
- _this.localUserInfo.masterNumber = res.userPhone;
- _this.localUserInfo.region = res.paasId;
- _this.InvitedMembers.inviteId = res.userCode;
- _this.InvitedMembers.inviteName = res.userName;
- _this.InvitedMembers.inviteDomain = '3981f448463d4cdb8735083a5114e626';
- _this.InvitedMembers.inviteNumber = res.userPhone;
- // _this.inviteSelf = {
- // inviteName: res.userName + '(系统APP接入)',
- // department: res.deptName,
- // inviteDomain: '3981f448463d4cdb8735083a5114e626',
- // inviteId: res.userCode,
- // region: res.paasId,
- // inviteNumber: res.userPhone,
- // type: 'client',
- // };
- //单兵
- _this.InvitedMembersSingle.inviteId = res.userCode;
- _this.InvitedMembersSingle.inviteName = res.userName;
- _this.InvitedMembersSingle.inviteNumber = res.userPhone;
- //车载
- _this.InvitedMembersVehicle.inviteId = res.userCode;
- _this.InvitedMembersVehicle.inviteName = res.userName;
- _this.InvitedMembersVehicle.inviteNumber = res.userPhone;
- //无人机
- _this.InvitedMembersUav.inviteId = res.userCode;
- _this.InvitedMembersUav.inviteName = res.userName;
- _this.InvitedMembersUav.inviteNumber = res.userPhone;
- //对讲机
- _this.InvitedMembersTalkie.inviteId = res.userCode;
- _this.InvitedMembersTalkie.inviteName = res.userName;
- _this.InvitedMembersTalkie.inviteNumber = res.userPhone;
- // debugger
- },
- error: function (data) {
- _this.$Message.error('获取视屏用户失败');
- },
- });
- },
- _debug(tip, res) {
- let _this = this;
- _this.meetingInfoback += tip + '--》 ' + JSON.stringify(res) + '\n\n';
- // let container = _this.$el.querySelector("#meetResBack textarea");
- // container.scrollTop = container.scrollHeight;
- },
- settargetId(id) {
- let _this = this;
- if (id != '') {
- _this.targetid = id;
- }
- _this.initWnd();
- },
- };
|