balancePressHome2.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. <template>
  2. <a-spin tip="Loading..." :spinning="loading">
  3. <div class="monitor-container">
  4. <ModuleCommon
  5. v-for="cfg in configs"
  6. :key="cfg.deviceType"
  7. :show-style="cfg.showStyle"
  8. :module-data="cfg.moduleData"
  9. :module-name="cfg.moduleName"
  10. :device-type="cfg.deviceType"
  11. :data="selectData"
  12. :chartData="mockData"
  13. :visible="true"
  14. /> </div
  15. ></a-spin>
  16. </template>
  17. <script setup lang="ts">
  18. import { ref, onMounted, onUnmounted, defineProps } from 'vue';
  19. import { mountedThree, destroy, setModelType, updateText, play } from '../balancePress.threejs';
  20. import { list, getO2PressData } from '../balancePress.api';
  21. import ModuleCommon from '../../../home/configurable/components/ModuleCommon.vue';
  22. import { useInitConfigs } from '../../../home/configurable/hooks/useInit';
  23. import { useGlobSetting } from '/@/hooks/setting';
  24. import ventBox1 from '/@/components/vent/ventBox1.vue';
  25. import CustomChart from '@/views/vent/home/configurable/components/detail/CustomChart.vue';
  26. import { PressO2Option, mockData1 } from '../balancePressO2.data';
  27. // import { Config } from '../../../deviceManager/configurationTable/types';
  28. const props = defineProps({
  29. deviceId: {
  30. type: String,
  31. require: true,
  32. },
  33. });
  34. const { sysOrgCode } = useGlobSetting();
  35. const loading = ref(false);
  36. // 监测数据
  37. const selectData = ref();
  38. const mockData = ref<{ chartData: { dateTime: string; o2Val: string; pressureVal: string }[] }>({
  39. chartData: [],
  40. });
  41. const O2PressDataFetched = ref(false);
  42. const modelsensorO2Data = ref<any[]>([]);
  43. // https获取监测数据
  44. let timer: any = null;
  45. function getMonitor(flag?) {
  46. if (Object.prototype.toString.call(timer) === '[object Null]') {
  47. timer = setTimeout(
  48. async () => {
  49. if (props.deviceId) {
  50. const data = await getDataSource(props.deviceId);
  51. // Object.assign(selectData, data);
  52. updateText(selectData);
  53. selectData.value = data;
  54. }
  55. if (timer) {
  56. timer = null;
  57. }
  58. await getMonitor();
  59. loading.value = false;
  60. },
  61. flag ? 0 : 1000
  62. );
  63. }
  64. }
  65. async function getDataSource(systemID) {
  66. const res = await list({ devicetype: 'sys', systemID });
  67. const result = Array.from(res.msgTxt).reduce(
  68. (obj: any, e: any) => {
  69. // if (true) {
  70. modelsensorO2Data.value = [];
  71. if (sysOrgCode === 'sdmtjtswmk') {
  72. if (e.type.startsWith('fanlocal')) {
  73. obj.fanlocal.datalist.push(...e.datalist);
  74. }
  75. if (e.type.startsWith('safetymonitor')) {
  76. e.datalist.forEach((ele) => {
  77. if (ele.strinstallpos.includes('风门')) {
  78. obj.gate.datalist.push(ele);
  79. } else if (ele.strinstallpos.includes('风窗')) {
  80. obj.window.datalist.push(ele);
  81. } else if (ele.strinstallpos.includes('工作面')) {
  82. obj.work_surface.datalist.push(ele);
  83. } else {
  84. obj.others.datalist.push(ele);
  85. }
  86. });
  87. }
  88. if (e.type.startsWith('avgpressure_lowoxygen')) {
  89. e.datalist.forEach((ele) => {
  90. ele.strinstallpos = ele.strinstallpos.replaceAll(' ', '');
  91. ele.strname = ele.strname.replaceAll(' ', '');
  92. });
  93. }
  94. }
  95. if (e.type.includes('modelsensor_o2')) {
  96. modelsensorO2Data.value.push(...e.datalist);
  97. console.log(modelsensorO2Data.value, '氧气数据');
  98. if (!O2PressDataFetched.value) {
  99. O2PressDataFetched.value = true;
  100. getO2Press(modelsensorO2Data.value);
  101. }
  102. }
  103. obj[e.type] = e;
  104. return obj;
  105. },
  106. {
  107. /** 用于归类fanlocal */
  108. fanlocal: { datalist: [] },
  109. /** 用于归类gate */
  110. gate: { datalist: [] },
  111. /** 用于归类window */
  112. window: { datalist: [] },
  113. /** 用于归类work_surface */
  114. work_surface: { datalist: [] },
  115. others: { datalist: [] },
  116. }
  117. );
  118. return result;
  119. }
  120. // const configs = ref<Config[]>([
  121. // {
  122. // deviceType: 'fanlocal',
  123. // moduleName: '局部风机',
  124. // pageType: 'balancePressHome',
  125. // moduleData: {
  126. // header: {
  127. // show: true,
  128. // readFrom: 'datalist',
  129. // selector: {
  130. // show: true,
  131. // value: '${deviceID}',
  132. // trans: {
  133. // '1910221332833665026': '主机',
  134. // '1910221283626090497': '备机',
  135. // },
  136. // },
  137. // slot: {
  138. // show: false,
  139. // value: '',
  140. // },
  141. // },
  142. // background: {
  143. // show: false,
  144. // type: 'image',
  145. // link: '',
  146. // },
  147. // layout: {
  148. // direction: 'column',
  149. // items: [
  150. // {
  151. // name: 'tabs',
  152. // basis: '100%',
  153. // },
  154. // ],
  155. // },
  156. // complex_list: [],
  157. // chart: [],
  158. // table: [],
  159. // gallery: [],
  160. // list: [],
  161. // tabs: [
  162. // {
  163. // type: 'K',
  164. // readFrom: '',
  165. // mapFromData: false,
  166. // items: [
  167. // {
  168. // title: '电机1',
  169. // contents: [
  170. // {
  171. // label: '输出功率',
  172. // value: '${readData.Fan1StartStatus}',
  173. // color: 'blue',
  174. // },
  175. // {
  176. // label: '输出电压',
  177. // value: '${readData.Fan1StartStatus}',
  178. // color: 'blue',
  179. // },
  180. // ],
  181. // },
  182. // {
  183. // title: '电机2',
  184. // contents: [
  185. // {
  186. // label: '输出功率',
  187. // value: '${readData.Fan2StartStatus}',
  188. // color: 'blue',
  189. // },
  190. // {
  191. // label: '输出电压',
  192. // value: '${readData.Fan2StartStatus}',
  193. // color: 'blue',
  194. // },
  195. // {
  196. // label: '输出电压',
  197. // value: '${readData.Fan2StartStatus}',
  198. // color: 'blue',
  199. // },
  200. // {
  201. // label: '输出电压',
  202. // value: '${readData.Fan2StartStatus}',
  203. // color: 'blue',
  204. // },
  205. // ],
  206. // },
  207. // ],
  208. // },
  209. // ],
  210. // gallery_list: [],
  211. // preset: [],
  212. // to: '',
  213. // },
  214. // showStyle: {
  215. // size: 'width:470px;height:260px;',
  216. // version: '原版',
  217. // position: 'top:20px;left:0;',
  218. // },
  219. // },
  220. // {
  221. // deviceType: '',
  222. // moduleName: '风门',
  223. // pageType: 'balancePressHome',
  224. // moduleData: {
  225. // header: {
  226. // show: false,
  227. // readFrom: '',
  228. // selector: {
  229. // show: false,
  230. // value: '',
  231. // },
  232. // slot: {
  233. // show: false,
  234. // value: '',
  235. // },
  236. // },
  237. // background: {
  238. // show: false,
  239. // type: 'image',
  240. // link: '',
  241. // },
  242. // layout: {
  243. // direction: 'column',
  244. // items: [
  245. // {
  246. // name: 'complex_list',
  247. // basis: '100%',
  248. // },
  249. // ],
  250. // },
  251. // complex_list: [
  252. // {
  253. // type: 'G',
  254. // readFrom: 'gate.datalist',
  255. // mapFromData: true,
  256. // items: [
  257. // {
  258. // title: '${deviceID}',
  259. // trans: {
  260. // '1915631893453004802': '22107胶运顺槽入口自动风门2',
  261. // '1915631893478170626': '22107胶运顺槽入口自动风门1',
  262. // '1915631897043329025': '22107辅回撤通道自动风门1',
  263. // '1915631895088783362': '22107辅回撤通道自动风门2',
  264. // },
  265. // contents: [
  266. // {
  267. // label: '状态',
  268. // value: '${readData.V}',
  269. // color: 'blue',
  270. // },
  271. // ],
  272. // },
  273. // ],
  274. // },
  275. // ],
  276. // chart: [],
  277. // table: [],
  278. // gallery: [],
  279. // list: [],
  280. // gallery_list: [],
  281. // preset: [],
  282. // to: '',
  283. // },
  284. // showStyle: {
  285. // size: 'width:470px;height:320px;',
  286. // version: '原版',
  287. // position: 'top:290px;left:0;',
  288. // },
  289. // },
  290. // {
  291. // deviceType: '',
  292. // moduleName: '综采工作面推进度',
  293. // pageType: 'balancePressHome',
  294. // moduleData: {
  295. // header: {
  296. // show: false,
  297. // readFrom: '',
  298. // selector: {
  299. // show: false,
  300. // value: '',
  301. // },
  302. // slot: {
  303. // show: false,
  304. // value: '',
  305. // },
  306. // },
  307. // background: {
  308. // show: false,
  309. // type: 'image',
  310. // link: '',
  311. // },
  312. // layout: {
  313. // direction: 'column',
  314. // items: [
  315. // {
  316. // name: 'list',
  317. // basis: '100%',
  318. // },
  319. // ],
  320. // },
  321. // complex_list: [],
  322. // chart: [],
  323. // table: [],
  324. // gallery: [],
  325. // list: [
  326. // {
  327. // type: 'K',
  328. // readFrom: '',
  329. // items: [
  330. // {
  331. // label: '进度',
  332. // value: '50%',
  333. // color: 'blue',
  334. // },
  335. // {
  336. // label: '埋深',
  337. // value: '2000km',
  338. // color: 'blue',
  339. // },
  340. // ],
  341. // },
  342. // ],
  343. // gallery_list: [],
  344. // preset: [],
  345. // to: '',
  346. // },
  347. // showStyle: {
  348. // size: 'width:470px;height:130px;',
  349. // version: '原版',
  350. // position: 'top:620px;left:0;',
  351. // },
  352. // },
  353. // {
  354. // deviceType: '',
  355. // moduleName: '重点监控传感器',
  356. // pageType: 'balancePressHome',
  357. // moduleData: {
  358. // header: {
  359. // show: false,
  360. // readFrom: '',
  361. // selector: {
  362. // show: false,
  363. // value: '',
  364. // },
  365. // slot: {
  366. // show: false,
  367. // value: '',
  368. // },
  369. // },
  370. // background: {
  371. // show: false,
  372. // type: 'image',
  373. // link: '',
  374. // },
  375. // layout: {
  376. // direction: 'column',
  377. // items: [
  378. // {
  379. // name: 'complex_list',
  380. // basis: '100%',
  381. // },
  382. // ],
  383. // },
  384. // complex_list: [
  385. // {
  386. // type: 'G',
  387. // readFrom: 'avgpressure_lowoxygen_normal.datalist',
  388. // mapFromData: true,
  389. // items: [
  390. // {
  391. // title: '${strinstallpos}',
  392. // contents: [
  393. // {
  394. // label: '网络状态',
  395. // value: '${readData.netStatus_str}',
  396. // color: 'blue',
  397. // },
  398. // ],
  399. // },
  400. // ],
  401. // },
  402. // ],
  403. // chart: [],
  404. // table: [],
  405. // gallery: [],
  406. // list: [],
  407. // gallery_list: [],
  408. // preset: [],
  409. // to: '',
  410. // },
  411. // showStyle: {
  412. // size: 'width:470px;height:230px;',
  413. // version: '原版',
  414. // position: 'top:20px;right:0;',
  415. // },
  416. // },
  417. // {
  418. // deviceType: '',
  419. // moduleName: '辅助巡检传感器',
  420. // pageType: 'balancePressHome',
  421. // moduleData: {
  422. // header: {
  423. // show: false,
  424. // readFrom: '',
  425. // selector: {
  426. // show: false,
  427. // value: '',
  428. // },
  429. // slot: {
  430. // show: false,
  431. // value: '',
  432. // },
  433. // },
  434. // background: {
  435. // show: false,
  436. // type: 'image',
  437. // link: '',
  438. // },
  439. // layout: {
  440. // direction: 'column',
  441. // items: [
  442. // {
  443. // name: 'complex_list',
  444. // basis: '100%',
  445. // },
  446. // ],
  447. // },
  448. // complex_list: [
  449. // {
  450. // type: 'G',
  451. // readFrom: 'others.datalist',
  452. // mapFromData: true,
  453. // items: [
  454. // {
  455. // title: '${strinstallpos}',
  456. // contents: [
  457. // {
  458. // label: '网络状态',
  459. // value: '${readData.netStatus_str}',
  460. // color: 'blue',
  461. // },
  462. // ],
  463. // },
  464. // ],
  465. // },
  466. // ],
  467. // chart: [],
  468. // table: [],
  469. // gallery: [],
  470. // list: [],
  471. // gallery_list: [],
  472. // preset: [],
  473. // to: '',
  474. // },
  475. // showStyle: {
  476. // size: 'width:470px;height:230px;',
  477. // version: '原版',
  478. // position: 'top:260px;right:0;',
  479. // },
  480. // },
  481. // {
  482. // deviceType: '',
  483. // moduleName: '地面大气压',
  484. // pageType: 'balancePressHome',
  485. // moduleData: {
  486. // header: {
  487. // show: false,
  488. // readFrom: '',
  489. // selector: {
  490. // show: false,
  491. // value: '',
  492. // },
  493. // slot: {
  494. // show: false,
  495. // value: '',
  496. // },
  497. // },
  498. // background: {
  499. // show: false,
  500. // type: 'image',
  501. // link: '',
  502. // },
  503. // layout: {
  504. // direction: 'column',
  505. // items: [
  506. // {
  507. // name: 'chart',
  508. // basis: '100%',
  509. // },
  510. // ],
  511. // },
  512. // complex_list: [],
  513. // chart: [
  514. // {
  515. // type: 'line_smooth',
  516. // readFrom: 'surface_history.datalist',
  517. // legend: { show: true },
  518. // xAxis: [{ show: true }],
  519. // yAxis: [
  520. // { show: true, name: '压力1(Pa)', position: 'left' },
  521. // { show: true, name: '压力2(Pa)', position: 'right' },
  522. // ],
  523. // series: [
  524. // { readFrom: '', xprop: 'time', yprop: 'pressure1', label: '压力1' },
  525. // // { readFrom: 'datalist', xprop: 'strinstallpos', yprop: 'readData.va', label: '风速' },
  526. // ],
  527. // },
  528. // ],
  529. // table: [],
  530. // gallery: [],
  531. // list: [],
  532. // gallery_list: [],
  533. // preset: [],
  534. // to: '',
  535. // },
  536. // showStyle: {
  537. // size: 'width:470px;height:250px;',
  538. // version: '原版',
  539. // position: 'top:500px;right:0;',
  540. // },
  541. // },
  542. // ]);
  543. async function getO2Press(params) {
  544. console.log(params[0]?.deviceID, 'ID数据');
  545. const deviceID = params[0]?.deviceID;
  546. const param = {
  547. deviceId: deviceID,
  548. };
  549. const res = await getO2PressData(param);
  550. const chartData = [...res?.o2HistoryDataList, ...res?.o2List];
  551. mockData.value = { chartData };
  552. O2PressDataFetched.value = true;
  553. }
  554. const { configs, fetchConfigs } = useInitConfigs();
  555. onMounted(async () => {
  556. // getMonitor()
  557. fetchConfigs('balancePressHome');
  558. loading.value = true;
  559. // mountedThree().then(async () => {
  560. // await setModelType('balancePressTun'); //balancePressBase
  561. // loading.value = false;
  562. // timer = null;
  563. // await getMonitor(true);
  564. // play('startSmoke', 'top', 30, 'open', 0);
  565. // });
  566. timer = null;
  567. await getMonitor(true);
  568. loading.value = false;
  569. });
  570. onUnmounted(() => {
  571. destroy();
  572. if (timer) {
  573. clearTimeout(timer);
  574. }
  575. });
  576. </script>
  577. <style lang="less" scoped>
  578. @import '/@/design/vent/modal.less';
  579. @import '../../comment/less/workFace.less';
  580. @ventSpace: zxm;
  581. .monitor-container {
  582. margin-top: 60px;
  583. }
  584. .lr {
  585. width: 340px !important;
  586. }
  587. .fix-box {
  588. margin-right: 19% !important;
  589. margin-top: 1% !important;
  590. }
  591. </style>