index.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. import { defineComponent, onMounted, watchEffect, ref } from "vue";
  2. import { RouterView, useRoute, useRouter } from 'vue-router';
  3. import MarkerMap from '@/components/MarkerMap';
  4. import './index.scss';
  5. import { useIncidentStore, useDaHuaStore, useMainStore,useCommonStore } from '@/store';
  6. import { constants } from 'zlib';
  7. import clsx from "clsx";
  8. import moment from 'moment';
  9. // @ts-ignore
  10. import closeicon from '@/assets/icons/detail/close.png';
  11. moment.locale('zh-cn', {
  12. months:
  13. '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
  14. '_',
  15. ),
  16. monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
  17. weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
  18. weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
  19. weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
  20. longDateFormat: {
  21. LT: 'Ah点mm分',
  22. LTS: 'Ah点m分s秒',
  23. L: 'YYYY-MM-DD',
  24. LL: 'YYYY年MMMD日',
  25. LLL: 'YYYY年MMMD日Ah点mm分',
  26. LLLL: 'YYYY年MMMD日ddddAh点mm分',
  27. l: 'YYYY-MM-DD',
  28. ll: 'YYYY年MMMD日',
  29. lll: 'YYYY年MMMD日Ah点mm分',
  30. llll: 'YYYY年MMMD日ddddAh点mm分',
  31. },
  32. meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
  33. meridiemHour: function (h, meridiem) {
  34. let hour = h;
  35. if (hour === 12) {
  36. hour = 0;
  37. }
  38. if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
  39. return hour;
  40. } else if (meridiem === '下午' || meridiem === '晚上') {
  41. return hour + 12;
  42. } else {
  43. // '中午'
  44. return hour >= 11 ? hour : hour + 12;
  45. }
  46. },
  47. meridiem: function (hour, minute, isLower) {
  48. const hm = hour * 100 + minute;
  49. if (hm < 600) {
  50. return '凌晨';
  51. } else if (hm < 900) {
  52. return '早上';
  53. } else if (hm < 1130) {
  54. return '上午';
  55. } else if (hm < 1230) {
  56. return '中午';
  57. } else if (hm < 1800) {
  58. return '下午';
  59. } else {
  60. return '晚上';
  61. }
  62. },
  63. calendar: {
  64. sameDay: function () {
  65. return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
  66. },
  67. nextDay: function () {
  68. return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
  69. },
  70. lastDay: function () {
  71. return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
  72. },
  73. nextWeek: function () {
  74. let startOfWeek, prefix;
  75. startOfWeek = moment().startOf('week');
  76. prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
  77. return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
  78. },
  79. lastWeek: function () {
  80. let startOfWeek, prefix;
  81. startOfWeek = moment().startOf('week');
  82. prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
  83. return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
  84. },
  85. sameElse: 'LL',
  86. },
  87. ordinalParse: /\d{1,2}(日|月|周)/,
  88. ordinal: function (number, period) {
  89. switch (period) {
  90. case 'd':
  91. case 'D':
  92. case 'DDD':
  93. return number + '日';
  94. case 'M':
  95. return number + '月';
  96. case 'w':
  97. case 'W':
  98. return number + '周';
  99. default:
  100. return number;
  101. }
  102. },
  103. relativeTime: {
  104. future: '%s内',
  105. past: '%s前',
  106. s: '几秒',
  107. m: '1 分钟',
  108. mm: '%d 分钟',
  109. h: '1 小时',
  110. hh: '%d 小时',
  111. d: '1 天',
  112. dd: '%d 天',
  113. M: '1 个月',
  114. MM: '%d 个月',
  115. y: '1 年',
  116. yy: '%d 年',
  117. },
  118. week: {
  119. // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
  120. dow: 1, // Monday is the first day of the week.
  121. doy: 4, // The week that contains Jan 4th is the first week of the year.
  122. },
  123. });
  124. export default defineComponent({
  125. setup() {
  126. const route = useRoute();
  127. const router = useRouter();
  128. const store = useIncidentStore();
  129. const daHuaStore = useDaHuaStore();
  130. const mainStore = useMainStore();
  131. const commonstore = useCommonStore();
  132. const sqdh = ref(import.meta.env.VITE_DH_SERVER as string + "/index.html");
  133. const markmap = ref(null);
  134. console.log(sqdh.value);
  135. const handleDaHuaSystem = () => {
  136. daHuaStore.dahuaUserVisible = true;
  137. const DAHUA = document.getElementById('DAHUA') as HTMLIFrameElement;
  138. DAHUA?.contentWindow?.postMessage('creatMeeting', '*');
  139. };
  140. // console.log(daHuaStore.dhuser);
  141. // const list = computed(() => [
  142. // ]);
  143. // login da hua
  144. onMounted(() => {
  145. var dv = document.getElementsByClassName('videoifram')[0];
  146. var x = 0;
  147. var y = 0;
  148. var l = 0;
  149. var t = 0;
  150. var isDown = false;
  151. //鼠标按下事件
  152. dv.onmousedown = function (e) {
  153. //获取x坐标和y坐标
  154. x = e.clientX;
  155. y = e.clientY;
  156. //获取左部和顶部的偏移量
  157. l = dv.offsetLeft;
  158. t = dv.offsetTop;
  159. //开关打开
  160. isDown = true;
  161. //设置样式
  162. dv.style.cursor = 'move';
  163. }
  164. //鼠标移动
  165. window.onmousemove = function (e) {
  166. if (isDown == false) {
  167. return;
  168. }
  169. //获取x和y
  170. var nx = e.clientX;
  171. var ny = e.clientY;
  172. //计算移动后的左偏移量和顶部的偏移量
  173. var nl = nx - (x - l);
  174. var nt = ny - (y - t);
  175. dv.style.left = nl + 'px';
  176. dv.style.top = nt + 'px';
  177. setTimeout(() => {
  178. try{
  179. console.log(window.vPlayArea)
  180. if(window.vPlayArea){
  181. window.vPlayArea.dragResize(0,0,0,0)
  182. }
  183. }catch(E){
  184. console.log(E)
  185. }
  186. }, 1);
  187. }
  188. //鼠标抬起事件
  189. dv.onmouseup = function () {
  190. //开关关闭
  191. isDown = false;
  192. dv.style.cursor = 'default';
  193. }
  194. // if (!localStorage.getItem('DAHUA_token')) {
  195. // daHuaStore.DAHUALogin();
  196. // } else {
  197. // daHuaStore.KEEPAlive(); //保活 //获取当前用户信息
  198. // daHuaStore.DAHUAUserInfo().then((res) => {
  199. // console.log(res);
  200. // daHuaStore.DAHUACreateMeet(res).then((data) => {
  201. // //创建会议
  202. // console.log(data);
  203. // let obj = {
  204. // user: res,
  205. // meetId: data.id,
  206. // member: [
  207. // {
  208. // userName: res.userName,
  209. // userId: res.userCode,
  210. // region: res.paasId,
  211. // type: 'client',
  212. // // speak:'true',
  213. // number: res.userPhone,
  214. // // department:'根组织'
  215. // },
  216. // ],
  217. // };
  218. // localStorage.setItem('meeting', JSON.stringify(obj));
  219. // // console.log(obj);
  220. // // daHuaStore.DAHUAMeetingMember(obj);
  221. // // daHuaStore.DAHUAMeetingUser(data.id);
  222. // // daHuaStore.DAHUADeleteMeet(data.id);
  223. // });
  224. // });
  225. // // console.log(dhUser);
  226. // daHuaStore.DAHUADeviceList('S4NbecfYB1DFLAIM9FFHQ8'); //测试执法记录仪
  227. // daHuaStore.DAHUADeviceList('S4NbecfYB1DGB68AN187Q8'); //执法人员设备列表
  228. // daHuaStore.DAHUADeviceList('S4NbecfYB1DGB68S6S0UFC'); //执法车辆列表
  229. // }
  230. // const DAHUA = document.getElementById('DAHUA') as HTMLIFrameElement;
  231. // if (!DAHUA) return
  232. // DAHUA.onload = function () {
  233. // // @ts-ignore
  234. // DAHUA.contentWindow.postMessage('onload', '*');
  235. // }
  236. // window.addEventListener('message', e => {
  237. // if (e.data === 'closeIframe') {
  238. // daHuaStore.dahuaUserVisible = false;
  239. // }
  240. // }, false);
  241. try {
  242. (yjzh_btn.value)?.addEventListener("click", () => {
  243. if(commonstore.isclick){
  244. return;
  245. }
  246. commonstore.isclick = true;
  247. if(window.theSocket){
  248. if(window.metting){
  249. setTimeout(() => {
  250. cremetting();
  251. }, 1000);
  252. }else{
  253. const meeting = new Meeting();
  254. meeting.settargetId("vPlayArea");
  255. window.metting = meeting;
  256. setTimeout(() => {
  257. cremetting();
  258. }, 1000);
  259. }
  260. }else{
  261. const meeting = new Meeting();
  262. meeting.openClient(() => {
  263. meeting.settargetId("vPlayArea");
  264. window.metting = meeting;
  265. setTimeout(() => {
  266. cremetting();
  267. }, 1000);
  268. });
  269. }
  270. async function cremetting(){
  271. try{
  272. window.metting.deleteAllMeeting(dothing);
  273. }catch(E){}
  274. async function dothing(){
  275. await window.metting.getLocalUserInfo();
  276. const res = await window.metting.queryUser(window.metting.inviteSelf.userId);
  277. // _this.localUserInfo.masterName = res.userName;
  278. // _this.localUserInfo.masterId = res.userCode;
  279. // _this.localUserInfo.masterNumber = res.userPhone;
  280. // _this.localUserInfo.region = res.paasId;
  281. const chartParams = {
  282. chatName: "测试会商名称",
  283. bOpenDirect: true,
  284. memberId: res.userCode, // 成员id
  285. memberName: res.name, // 成员名称
  286. regionId: res.paasId, // 成员的pass域id
  287. memberType: 4, // 成员类型,Integer ,1 单兵;2 普通电话;3 对讲机;4 app|客户端;6 可是话机; 7 汇接话机(PSTN、手机号码等); 8 车载;9 无人机喊话云台; 10 无人机地面站对讲平台; 11 ipc; 12 NVR
  288. memberCode: "", // 成员设备编码
  289. memberNumber: ""// 成员号码
  290. };
  291. window.theSocket&&window.theSocket.createGroupChat(chartParams);
  292. commonstore.isclick = false;
  293. }
  294. }
  295. })
  296. } catch (error) {
  297. }
  298. });
  299. const timetext = ref("-");
  300. const datetext = ref('-');
  301. const weektext = ref('-');
  302. // debugger
  303. setInterval(() => {
  304. datetext.value =
  305. moment().format('YYYY年MM月DD日');
  306. weektext.value = moment().format('dddd');
  307. timetext.value = moment().format('HH:mm:ss');
  308. }, 1000)
  309. const yjzh_btn = ref(null);
  310. return () => (
  311. <section class="base-layout-container">
  312. <iframe
  313. style={{ visibility: 'hidden', height: '100%', width: '100%' }}
  314. class={clsx('dahua-content', {
  315. ['display']: daHuaStore.dahuaUserVisible,
  316. })}
  317. id="DAHUA"
  318. name="DAHUA"
  319. src={sqdh.value}
  320. frameborder="0"
  321. />
  322. <div
  323. class="videoifram"
  324. style={mainStore.videoisshow ? 'display:block' : 'display:none'}
  325. >
  326. <div class="title">{mainStore.videotitle}</div>
  327. <div class="closebtn" onClick={() => {
  328. mainStore.videoisshow = false;
  329. if(window.metting){
  330. window.metting.closeVideo();
  331. if(window.isdanbing){
  332. window.metting.deleteMeeting();
  333. window.metting.closeClient()
  334. window.metting =false; window.theSocket = false;
  335. }
  336. }
  337. }}>
  338. <img src={closeicon} />
  339. </div>
  340. <div id="vPlayArea" ></div>
  341. </div>
  342. <header class="base-layout-title-contatisner">
  343. <div class="back-to-home " onClick={() => router.push('/home')}></div>
  344. <div class="time-text ">
  345. <span>{timetext.value}</span>
  346. <span>{datetext.value}</span>
  347. <span>{weektext.value}</span>
  348. </div>
  349. </header>
  350. <main>
  351. <RouterView />
  352. <MarkerMap
  353. readonly={route.path.includes('incidentDetail')}
  354. ref={markmap}
  355. // marker={store.incidentDetail}
  356. />
  357. <div class={"yjld_btn " + (commonstore.isclick?"animate__animated animate__rotateIn":"")} ref={yjzh_btn}></div>
  358. </main>
  359. </section>
  360. );
  361. },
  362. });