meeting.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. var Meeting = function Meeting() {
  2. this.localUserInfo = {
  3. //创建会议的参数对象
  4. name: "", //会议名称
  5. masterId: "", //主持人用户ID
  6. masterName: "", //主持人名字
  7. masterNumber: "", //主持人号码
  8. region: "", //号码对应的PAAS域ID
  9. record: true, //是否录像录音true:录像录音 false:不录
  10. type: "video", //会议类型“audio”: 音频会议 “video”: 音视频会议
  11. mode: "group", //会议模式“p2p”:点对点“group”:群聊
  12. };
  13. this.InvitedMembers = {
  14. //邀请会议的参数对象
  15. id: "", //会议id
  16. inviteId: "", //邀请人ID
  17. inviteName: "", //邀请人名字
  18. inviteNumber: "", //邀请人号码
  19. member: [],
  20. };
  21. this.InvitedMembersSingle = {
  22. //单兵
  23. id: "", //会议id
  24. inviteId: "", //邀请人ID
  25. inviteName: "", //邀请人名字
  26. inviteNumber: "", //邀请人号码
  27. member: [],
  28. };
  29. this.InvitedMembersVehicle = {
  30. //车载
  31. id: "", //会议id
  32. inviteId: "", //邀请人ID
  33. inviteName: "", //邀请人名字
  34. inviteNumber: "", //邀请人号码
  35. member: [],
  36. };
  37. this.InvitedMembersUav = {
  38. //无人机
  39. id: "", //会议id
  40. inviteId: "", //邀请人ID
  41. inviteName: "", //邀请人名字
  42. inviteNumber: "", //邀请人号码
  43. member: [],
  44. };
  45. this.InvitedMembersTalkie = {
  46. //对讲机
  47. id: "", //会议id
  48. inviteId: "", //邀请人ID
  49. inviteName: "", //邀请人名字
  50. inviteNumber: "", //邀请人号码
  51. member: [],
  52. };
  53. this.inviteSelf = {
  54. userName: "",
  55. department: "",
  56. userId: "",
  57. region: "",
  58. number: "",
  59. type: "client",
  60. };
  61. this.meetingInfoback = ""; //各个接口返回信息
  62. this.$Message = {
  63. warning: (data) => {
  64. console.log(data);
  65. }
  66. }
  67. };
  68. Meeting.prototype = {
  69. initSocket(userCode, callback) {
  70. const self = this;
  71. //初始websocket实例,保存在window中方便调用。一个浏览器tab页面只能初始化一次。所有的控件窗口,通过该websocket实例去生成不同的窗口实例,不同的控件窗口通过自己的窗口实例去调用初始化、关闭、隐藏等
  72. window.theSocket = this.theSocket = new InitWebSocketClass(
  73. userCode,
  74. localStorage.getItem("token"), {
  75. //客户端登陆成功通知;
  76. loginSuccess: (v) => {
  77. console.log("loginSuccess-->", v);
  78. self.initWnd();
  79. },
  80. //客户端窗口被拉起通知
  81. onCreateVideoSuccess: (v) => {
  82. console.log("客户端onCreateVideoSuccess-----", v);
  83. },
  84. //重点:统一分发客户端ws消息;vue 可以统一用$bus分发.第三方消息分发自定
  85. onSocketBackInfos: (data) => {
  86. //视频窗口创建成功通知
  87. if (
  88. data &&
  89. data.method === "createVideoDialogReuslt" &&
  90. data.params.result === 0
  91. ) {
  92. if (data.params.handleName === "#vPlayArea") {
  93. //客户端窗口创建好后,界面显示窗口;
  94. callback && callback()
  95. self.vPlayArea.resize();
  96. this.$Message.warning("视频窗口创建成功!");
  97. }
  98. }
  99. },
  100. }
  101. );
  102. //socket实例初始化websocket回调方法;
  103. this.theSocket
  104. .initWebSocket()
  105. .then((v) => {
  106. if (v) {
  107. this.$Message.warning("视频插件登陆完成!");
  108. }
  109. })
  110. .catch((v) => {
  111. this.$Message.warning("若要观看实时视频,请先安装视频插件");
  112. });
  113. },
  114. //初始化视频窗口实例,先获取自己用户code,再初始化窗口,严格按照封装参数传,别漏了
  115. getUserCode(callback) {
  116. let self = this;
  117. $.ajax({
  118. type: "GET",
  119. url: setting.URL + "/ras/user/info",
  120. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  121. dateType: "json",
  122. beforeSend: (xhr) => {
  123. xhr.setRequestHeader("X-Subject-Token", localStorage.getItem("token"));
  124. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  125. },
  126. success: (res) => {
  127. //obj
  128. if (res && res.userCode) {
  129. let {
  130. userCode
  131. } = res;
  132. //初始化websocket;
  133. return self.initSocket(userCode, callback);
  134. }
  135. },
  136. });
  137. },
  138. //初始化视频窗口-dom
  139. initWnd() {
  140. //左边窗口类型参数 分割 2行2列
  141. const typeObj = {
  142. rows: 2,
  143. cols: 2,
  144. wndSpaceing: 10,
  145. embedVideoMode: true,
  146. playerCtrlBarEnable: false,
  147. displayMode: 0,
  148. playMode: 0,
  149. playParams: {},
  150. };
  151. //左边窗口实例
  152. window.vPlayArea = this.vPlayArea = new VideoPlay(
  153. "#vPlayArea",
  154. window.theSocket.websocket, //一个浏览器tab页面公用一个
  155. window.theSocket.socketCode, //一个浏览器tab页面公用一个
  156. typeObj
  157. );
  158. //左边窗口初始化
  159. this.vPlayArea.init();
  160. },
  161. //播放视频
  162. playVideo(item) {
  163. console.log('++++++', 'playVideo');
  164. if (!this.theSocket.websocket) {
  165. this.$Message.warning("请先打开视频插件");
  166. return;
  167. }
  168. if (item.type == "client") {
  169. this.slectOptionmini(item.userId).then((arr) => {
  170. if (arr) {
  171. this.vPlayArea.openAppVideo(arr);
  172. }
  173. });
  174. } else if (item.type == "single") {
  175. //播放单兵视频
  176. this.pullFlow(item.channelId);
  177. } else if (item.type == "vehicle") {
  178. //播放车载视频
  179. this.pullFlow(item.channelId);
  180. } else if (item.type == "uav_dev") {
  181. //播放无人机视频
  182. this.pullFlow(item.channelId);
  183. }
  184. },
  185. //设备视频拉流
  186. pullFlow(chinnelId) {
  187. if (chinnelId) {
  188. window.vPlayArea && window.vPlayArea.realTimeVideo && window.vPlayArea.realTimeVideo([{
  189. "channelId": chinnelId
  190. }]);
  191. }
  192. },
  193. /* 创建会商 */
  194. async creatMeeting() {
  195. let _this = this;
  196. if (!_this.localUserInfo.name) {
  197. _this.$Message.warning("请创建会商名称");
  198. return;
  199. }
  200. await $.ajax({
  201. type: "POST",
  202. url: setting.URL + "/mcu/meeting",
  203. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  204. dateType: "json",
  205. data: JSON.stringify(_this.localUserInfo),
  206. beforeSend: function (xhr) {
  207. xhr.setRequestHeader("X-Subject-Token", localStorage.getItem("token"));
  208. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  209. //xhr.setRequestHeader("Origin",null);
  210. },
  211. success: function (res) {
  212. //obj
  213. _this.InvitedMembers.id = res.id; //创建了会议id,保存起来,为了邀请成员;
  214. _this.InvitedMembersSingle.id = res.id; //单兵;
  215. _this.InvitedMembersVehicle.id = res.id; //车载;
  216. _this.InvitedMembersUav.id = res.id; //无人机;
  217. _this.InvitedMembersTalkie.id = res.id; //单兵;
  218. _this.meetingId = res.id;
  219. localStorage.setItem("meetingId", res.id);
  220. _this._debug("创建会商返回的信息", res);
  221. // _this.searchMeetingMember(); //add创建会商然后,开始查会议成员显示在列表中;
  222. },
  223. error: function (data) {},
  224. });
  225. },
  226. /* 邀请会商成员 */
  227. startInvite(member) {
  228. let _this = this;
  229. _this.InvitedMembers.member = [
  230. _this.inviteSelf,
  231. ...([member] || []),
  232. // {
  233. // type: "tandemPhone",
  234. // number: _this.outLinenum,
  235. // userName: _this.outLinenum,
  236. // region: _this.paasId,
  237. // },
  238. ];
  239. $.ajax({
  240. type: "POST",
  241. url: setting.URL + "/mcu/meeting/member",
  242. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  243. dateType: "json",
  244. data: JSON.stringify(_this.InvitedMembers),
  245. beforeSend: function (xhr) {
  246. xhr.setRequestHeader("X-Subject-Token", localStorage.getItem("token"));
  247. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  248. },
  249. success: function (res) {
  250. //obj
  251. _this._debug("邀请会商成后的信息", res);
  252. //_this.searchMeetingMember(); //add创建会商然后,开始查会议成员显示在列表中;
  253. },
  254. error: function (data) {
  255. if (data.responseJSON.code == "mcuIdNotExist") {
  256. _this.$Message.warning("未创建会商");
  257. } else if (data.responseJSON.code == "mcuIdInvalid") {
  258. _this.$Message.warning("会议ID无效");
  259. } else if (data.responseJSON.code == "mcuMeetingMemMax") {
  260. _this.$Message.warning("会议用户数满");
  261. }
  262. },
  263. });
  264. },
  265. /* 关闭会商操作 */
  266. deleteMeeting() {
  267. let _this = this;
  268. let deleteMeetingId = _this.meetingId;
  269. if (!deleteMeetingId) {
  270. _this.$Message.warning("未创建会商");
  271. _this._debug("未创建会商", "");
  272. return;
  273. }
  274. $.ajax({
  275. type: "DELETE",
  276. url: setting.URL + "/mcu/meeting/" + deleteMeetingId,
  277. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  278. dateType: "json",
  279. data: JSON.stringify(_this.localUserInfo),
  280. beforeSend: function (xhr) {
  281. xhr.setRequestHeader("X-Subject-Token", localStorage.getItem("token"));
  282. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  283. },
  284. success: function (res) {
  285. //obj
  286. _this._debug("关闭会议成功", res);
  287. localStorage.removeItem("meetingId");
  288. _this.meetingId = ""; //置空
  289. _this.meetMemberList = []; //置空
  290. _this.meetMemberList2 = []; //置空
  291. },
  292. error: function (data) {
  293. //obj
  294. _this._debug("关闭会议错误提示", data);
  295. if (data.responseJSON.code === "mcuIdNotExist") {
  296. _this.$Message.warning("未创建会商");
  297. }
  298. },
  299. });
  300. },
  301. /* 通过deviceCode查询设备channelId */
  302. searchChinnelId(deviceCode, deviceType) {
  303. let _this = this;
  304. return new Promise((resolve) => {
  305. $.ajax({
  306. type: "GET",
  307. url: setting.URL + "/videoService/devicesManager/devices/" + deviceCode,
  308. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  309. dateType: "json",
  310. beforeSend: function (xhr) {
  311. xhr.setRequestHeader(
  312. "X-Subject-Token",
  313. localStorage.getItem("token")
  314. );
  315. xhr.setRequestHeader(
  316. "Content-Type",
  317. "application/json;charset=UTF-8"
  318. );
  319. //xhr.setRequestHeader("Origin",null);
  320. },
  321. success: function (res) {
  322. //obj
  323. if (res) {
  324. if (deviceType == "single") {
  325. //单兵
  326. _this.channelId = res.encoderUnit.channels[0].channelId;
  327. resolve(res.encoderUnit.channels[0].channelId);
  328. _this._debug(
  329. "单兵channelId",
  330. res.encoderUnit.channels[0].channelId
  331. );
  332. } else if (deviceType == "vehicle") {
  333. //车载
  334. _this.channelId = res.encoderUnit.channels[0].channelId;
  335. resolve(res.encoderUnit.channels[0].channelId);
  336. _this._debug(
  337. "车载channelId",
  338. res.encoderUnit.channels[0].channelId
  339. );
  340. } else if (deviceType == "uav") {
  341. //无人机
  342. _this.channelId = res.encoderUnit.channels[0].channelId;
  343. resolve(res.encoderUnit.channels[0].channelId);
  344. _this._debug(
  345. "无人机channelId",
  346. res.encoderUnit.channels[0].channelId
  347. );
  348. } else if (deviceType == "talkie") {
  349. //对讲机
  350. if (res.encoderUnit.channels[0].channelId) {
  351. _this.channelId = res.encoderUnit.channels[0].channelId;
  352. resolve(res.encoderUnit.channels[0].channelId);
  353. }
  354. _this._debug(
  355. "对讲机channelId",
  356. res.devAudioUnit.channels[0].channelId
  357. );
  358. }
  359. }
  360. },
  361. error: function (data) {
  362. //
  363. },
  364. });
  365. });
  366. },
  367. queryUser(userCode) {
  368. let _this = this;
  369. return new Promise((resolve) => {
  370. $.ajax({
  371. type: "GET",
  372. url: setting.URL + "/ras/user/" + userCode,
  373. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  374. dateType: "json",
  375. beforeSend: function (xhr) {
  376. xhr.setRequestHeader(
  377. "X-Subject-Token",
  378. localStorage.getItem("token")
  379. );
  380. xhr.setRequestHeader(
  381. "Content-Type",
  382. "application/json;charset=UTF-8"
  383. );
  384. },
  385. success: function (res) {
  386. //obj
  387. if (res && res.chnId) {
  388. resolve(res);
  389. }
  390. },
  391. error: function (data) {},
  392. });
  393. });
  394. },
  395. /* app拉流 */
  396. slectOptionmini(userCode) {
  397. let _this = this;
  398. return new Promise((resolve) => {
  399. $.ajax({
  400. type: "GET",
  401. url: setting.URL + "/ras/user/" + userCode,
  402. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  403. dateType: "json",
  404. beforeSend: function (xhr) {
  405. xhr.setRequestHeader(
  406. "X-Subject-Token",
  407. localStorage.getItem("token")
  408. );
  409. xhr.setRequestHeader(
  410. "Content-Type",
  411. "application/json;charset=UTF-8"
  412. );
  413. },
  414. success: function (res) {
  415. //obj
  416. if (res && res.chnId) {
  417. let arr = [{
  418. channelId: res.chnId,
  419. userCode: res.userCode,
  420. regionId: res.paasId,
  421. domainId: "",
  422. }, ];
  423. resolve(arr);
  424. }
  425. },
  426. error: function (data) {},
  427. });
  428. });
  429. },
  430. /* 打开客户端 */
  431. async openClient(callback) {
  432. return this.getUserCode(callback);
  433. },
  434. closeClient() {
  435. this.theSocket && this.theSocket.closeClient && this.theSocket.closeClient();
  436. },
  437. closeVideo() {
  438. this.theSocket.closeAllVideo && this.theSocket.closeAllVideo();
  439. },
  440. /* 获取群聊fromName */
  441. async getLocalUserInfo() {
  442. let _this = this;
  443. await $.ajax({
  444. type: "GET",
  445. url: setting.URL + "/ras/user/info",
  446. contentType: "application/json", //如果提交的是json数据类型,则必须有此参数,表示提交的数据类型
  447. dateType: "json",
  448. beforeSend: function (xhr) {
  449. xhr.setRequestHeader("X-Subject-Token", localStorage.getItem("token"));
  450. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  451. },
  452. success: function (res) {
  453. //obj
  454. _this.loginPassword = res.loginPassword; //获取登录为密码.为登录用户话机注册做准备(需要res解密)
  455. _this.localUserInfo.masterName = res.userName;
  456. _this.localUserInfo.masterId = res.userCode;
  457. _this.localUserInfo.masterNumber = res.userPhone;
  458. _this.localUserInfo.region = res.paasId;
  459. _this.InvitedMembers.inviteId = res.userCode;
  460. _this.InvitedMembers.inviteName = res.userName;
  461. _this.InvitedMembers.inviteNumber = res.userPhone;
  462. _this.inviteSelf = {
  463. userName: res.userName + "(系统APP接入)",
  464. department: res.deptName,
  465. userId: res.userCode,
  466. region: res.paasId,
  467. number: res.userPhone,
  468. type: "client",
  469. };
  470. //单兵
  471. _this.InvitedMembersSingle.inviteId = res.userCode;
  472. _this.InvitedMembersSingle.inviteName = res.userName;
  473. _this.InvitedMembersSingle.inviteNumber = res.userPhone;
  474. //车载
  475. _this.InvitedMembersVehicle.inviteId = res.userCode;
  476. _this.InvitedMembersVehicle.inviteName = res.userName;
  477. _this.InvitedMembersVehicle.inviteNumber = res.userPhone;
  478. //无人机
  479. _this.InvitedMembersUav.inviteId = res.userCode;
  480. _this.InvitedMembersUav.inviteName = res.userName;
  481. _this.InvitedMembersUav.inviteNumber = res.userPhone;
  482. //对讲机
  483. _this.InvitedMembersTalkie.inviteId = res.userCode;
  484. _this.InvitedMembersTalkie.inviteName = res.userName;
  485. _this.InvitedMembersTalkie.inviteNumber = res.userPhone;
  486. },
  487. error: function (data) {},
  488. });
  489. },
  490. _debug(tip, res) {
  491. let _this = this;
  492. _this.meetingInfoback += tip + "--》 " + JSON.stringify(res) + "\n\n";
  493. // let container = _this.$el.querySelector("#meetResBack textarea");
  494. // container.scrollTop = container.scrollHeight;
  495. },
  496. };