fireWork.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. <template>
  2. <div class="fireWork">
  3. <!-- 顶部区域 -->
  4. <div class="work-nav">
  5. <div class="nav" v-for="(item, index) in topList" :key="index">
  6. <div class="pic" v-if="item.imgSrc">
  7. <img :src="imgUrl" alt="" />
  8. </div>
  9. <div class="content" v-if="item.label && item.value">
  10. <span>{{ item.label }}</span>
  11. <span>{{ item.value }}</span>
  12. </div>
  13. <div class="text" v-if="item.text">{{ item.text }}</div>
  14. <div class="percent" v-if="item.list.length != 0">
  15. <div class="title">{{ item.label }}</div>
  16. <div class="value">
  17. <div class="content-box" v-for="(items, ind) in item.list" :key="ind">
  18. <span style="color: #b3b8cc">{{ `${items.label} :` }}</span>
  19. <span style="color: var(--vent-table-action-link); margin-left: 10px">{{ `${items.value}%` }}</span>
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. <!-- 中间区域 -->
  26. <div class="center-echart">
  27. <div class="nav-title">
  28. <div class="title">光纤测温系统温度实时监测</div>
  29. </div>
  30. <div class="echart-box">
  31. <echartLine :echartDataGq="echartDataGq" :maxY="maxY" :echartDw="echartDw" />
  32. </div>
  33. </div>
  34. <!-- 底部区域 -->
  35. <div class="bot-content">
  36. <div class="title">
  37. <div class="text">束管系统监测</div>
  38. <div class="select-box flex">
  39. <!-- <BaseTab
  40. style="width: 200px; color: var(--vent-font-color); margin-right: 10px"
  41. :tabs="[
  42. { name: '束管监测', id: 'default' },
  43. { name: '预测曲线', id: 'predict' },
  44. ]"
  45. v-model:id="shownChart"
  46. /> -->
  47. <a-select v-model:value="selectData" style="width: 250px" @change="changeSelect">
  48. <a-select-option v-for="file in selectList" :key="file.label" :value="file.value">{{ file.label }}</a-select-option>
  49. </a-select>
  50. </div>
  51. </div>
  52. <div class="content">
  53. <div class="content-box" v-for="(item, index) in contentList" :key="index">
  54. <div class="box-item" v-for="(items, ind) in item.list" :key="ind" @click="getSgClick(items)">
  55. <div class="content-title">
  56. <span> {{ items.title }}</span>
  57. <span> {{ items.dw }}</span>
  58. </div>
  59. <div class="content-item">
  60. <span>{{ items.label }}</span>
  61. <span class="bolds">{{ items.value }}</span>
  62. </div>
  63. <div class="content-item">
  64. <span>{{ items.label1 }}</span>
  65. <span class="bolds">{{ items.time }}</span>
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. <div class="echart-box">
  71. <PredictionCurve v-if="shownChart === 'default'" :chart="curveConfig" />
  72. <echartLine1 v-if="shownChart === 'predict'" :echartDataSg="echartDataSg" :maxY="maxY1" :lengedDataName="echartDataSg.lengedDataName" />
  73. </div>
  74. </div>
  75. </div>
  76. </template>
  77. <script lang="ts" setup>
  78. import { ref, reactive, watch, defineProps } from 'vue';
  79. import imgUrl from '/@/assets/images/fire/pie.png';
  80. import echartLine from './echartLine.vue';
  81. import echartLine1 from './echartLine1.vue';
  82. import PredictionCurve from './predictionCurve.vue';
  83. import { topList, contentList } from '../common.data';
  84. import BaseTab from '../../../gas/components/tab/baseTab.vue';
  85. import { monitorData } from '../../nitrogen/nitrogen.data';
  86. let props = defineProps({
  87. listData: Object,
  88. });
  89. const shownChart = ref('default');
  90. let selectSj = ref<any[]>([]);
  91. let selectData = ref('');
  92. let selectList = reactive<any[]>([]);
  93. let maxY1 = ref<any>(0);
  94. let maxY = ref(100);
  95. let echartDw = ref('(­°C)');
  96. //光钎测温-图表数据
  97. let echartDataGq = reactive<any>({
  98. curData: {
  99. lengedData: '实时温度',
  100. data: [],
  101. },
  102. maxData: {
  103. lengedData: '最大温度',
  104. data: [],
  105. },
  106. minData: {
  107. lengedData: '最小温度',
  108. data: [],
  109. },
  110. avgData: {
  111. lengedData: '平均温度',
  112. data: [],
  113. },
  114. xData: [],
  115. });
  116. //束管监测-图表数据
  117. let echartDataSg = reactive({
  118. xData: [],
  119. lengedDataName: '(%)',
  120. // curData: {
  121. // lengedData: '实时温度',
  122. // data: [],
  123. // },
  124. // maxData: {
  125. // lengedData: '最大温度',
  126. // data: [],
  127. // },
  128. // minData: {
  129. // lengedData: '最小温度',
  130. // data: [],
  131. // },
  132. // avgData: {
  133. // lengedData: '平均温度',
  134. // data: [],
  135. // },
  136. yData: [],
  137. lengedData: 'O₂',
  138. });
  139. let echartDataSgList = reactive<any[]>([]);
  140. function getmaxY() {
  141. maxY1.value = echartDataSg.yData.reduce((acr, cur) => {
  142. return acr > cur ? acr : cur;
  143. });
  144. maxY1.value =
  145. maxY1.value.toString().indexOf('.') == -1 ? maxY1.value.toString() : maxY1.value.toString().substring(0, maxY1.value.toString().indexOf('.'));
  146. if (maxY1.value.length < 2 && Number(maxY1.value) < 1) {
  147. maxY1.value = 1;
  148. } else if (maxY1.value.length < 2 && Number(maxY1.value) >= 1) {
  149. maxY1.value = 10;
  150. } else if (maxY1.value.length < 3) {
  151. maxY1.value = (Number(maxY1.value[0]) + 1) * 10;
  152. } else if (maxY1.value.length < 4) {
  153. maxY1.value = (Number(maxY1.value[0]) + 1) * 100;
  154. } else if (maxY1.value.length < 5) {
  155. maxY1.value = (Number(maxY1.value[0]) + 1) * 1000;
  156. } else if (maxY1.value.length < 6) {
  157. maxY1.value = (Number(maxY1.value[0]) + 1) * 10000;
  158. }
  159. }
  160. //束管实时数据选项点击
  161. function getSgClick(items) {
  162. debugger;
  163. echartDataSg.xData.length = 0;
  164. echartDataSg.yData.length = 0;
  165. echartDataSg.lengedData = items.title;
  166. echartDataSg.lengedDataName = items.dw;
  167. const data = selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0];
  168. switch (items.title) {
  169. case 'O₂':
  170. echartDataSgList.forEach((el) => {
  171. echartDataSg.xData.push(el.time);
  172. echartDataSg.yData.push(el.o2val);
  173. });
  174. curveConfig.value = {
  175. id: 'o2',
  176. label: 'O₂',
  177. time: echartDataSg.xData,
  178. data: [
  179. // 氧气预测曲线
  180. data.avgParams?.avg_o2_value || 0,
  181. data.avgParams?.max_o2_value || 0,
  182. data.avgParams?.min_o2_value || 0,
  183. // data.readData?.o2val,
  184. ],
  185. monitorData: echartDataSg.yData,
  186. };
  187. getmaxY();
  188. break;
  189. case 'C₂H₄':
  190. echartDataSgList.forEach((el) => {
  191. echartDataSg.xData.push(el.time);
  192. echartDataSg.yData.push(el.ch2val);
  193. });
  194. curveConfig.value = {
  195. id: 'ch2',
  196. label: 'C₂H₄',
  197. time: echartDataSg.xData,
  198. data: [
  199. // 预测曲线
  200. data.avgParams?.avg_ch2_value || 0,
  201. data.avgParams?.max_ch2_value || 0,
  202. data.avgParams?.min_ch2_value || 0,
  203. // data.readData?.ch2val,
  204. ],
  205. monitorData: echartDataSg.yData,
  206. };
  207. getmaxY();
  208. break;
  209. case 'CO':
  210. echartDataSgList.forEach((el) => {
  211. echartDataSg.xData.push(el.time);
  212. echartDataSg.yData.push(el.coval);
  213. });
  214. curveConfig.value = {
  215. id: 'co',
  216. label: 'CO',
  217. time: echartDataSg.xData,
  218. data: [
  219. // 预测曲线
  220. data.avgParams?.avg_co_value || 0,
  221. data.avgParams?.max_co_value || 0,
  222. data.avgParams?.min_co_value || 0,
  223. // data.readData?.coval,
  224. ],
  225. monitorData: echartDataSg.yData,
  226. };
  227. getmaxY();
  228. break;
  229. case 'CH₄':
  230. echartDataSgList.forEach((el) => {
  231. echartDataSg.xData.push(el.time);
  232. echartDataSg.yData.push(el.chval);
  233. });
  234. curveConfig.value = {
  235. id: 'ch',
  236. label: 'CH₄',
  237. time: new Date(),
  238. data: [
  239. // 预测曲线
  240. data.avgParams?.avg_ch_value || 0,
  241. data.avgParams?.max_ch_value || 0,
  242. data.avgParams?.min_ch_value || 0,
  243. // data.readData?.chval,
  244. ],
  245. monitorData: echartDataSg.yData,
  246. };
  247. getmaxY();
  248. break;
  249. case 'CO₂':
  250. echartDataSgList.forEach((el) => {
  251. echartDataSg.xData.push(el.time);
  252. echartDataSg.yData.push(el.co2val);
  253. });
  254. curveConfig.value = {
  255. id: 'co2',
  256. label: 'CO₂',
  257. time: echartDataSg.xData,
  258. data: [
  259. // 预测曲线
  260. data.avgParams?.avg_co2_value || 0,
  261. data.avgParams?.max_co2_value || 0,
  262. data.avgParams?.min_co2_value || 0,
  263. // data.readData?.co2val,
  264. ],
  265. monitorData: echartDataSg.yData,
  266. };
  267. getmaxY();
  268. break;
  269. case 'C₂H₂':
  270. echartDataSgList.forEach((el) => {
  271. echartDataSg.xData.push(el.time);
  272. echartDataSg.yData.push(el.gasval);
  273. });
  274. curveConfig.value = {
  275. id: 'gas',
  276. label: '',
  277. time: echartDataSg.xData,
  278. data: [
  279. // 预测曲线
  280. data.avgParams?.avg_gas_value || 0,
  281. data.avgParams?.max_gas_value || 0,
  282. data.avgParams?.min_gas_value || 0,
  283. // data.readData?.gasval,
  284. ],
  285. monitorData: echartDataSg.yData,
  286. };
  287. getmaxY();
  288. break;
  289. }
  290. }
  291. function changeSelect(val) {
  292. debugger;
  293. selectData.value = val;
  294. let data = selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0];
  295. contentList[0].list[0].value = data.readData.o2val;
  296. contentList[0].list[1].value = data.readData.ch2val;
  297. contentList[1].list[0].value = data.readData.coval;
  298. contentList[1].list[1].value = data.readData.chval;
  299. contentList[2].list[0].value = data.readData.co2val;
  300. contentList[2].list[1].value = data.readData.gasval;
  301. contentList.forEach((el) => {
  302. el.list.forEach((v) => {
  303. v.time = data.readTime.substring(0, data.readTime.lastIndexOf(':'));
  304. });
  305. });
  306. }
  307. /** 预测曲线的配置,数据分别为平均、最大、最小、当前值 */
  308. const curveConfig = ref<any>({ id: '0', label: '', time: new Date(), data: [0, 0, 0, 0] });
  309. watch(
  310. () => props.listData,
  311. (val: any, val1) => {
  312. echartDataGq.xData.length = 0;
  313. echartDataGq.curData.data.length = 0;
  314. echartDataGq.maxData.data.length = 0;
  315. echartDataGq.minData.data.length = 0;
  316. echartDataGq.avgData.data.length = 0;
  317. echartDataSgList.length = 0;
  318. echartDataSg.xData.length = 0;
  319. echartDataSg.yData.length = 0;
  320. selectList.length = 0;
  321. if (JSON.stringify(val) === '{}') return;
  322. if (val.fiber.length != 0) {
  323. const fiber: any = val.fiber[0];
  324. topList[0].value = fiber.readData.fmax;
  325. topList[1].value = fiber.readData.fmin;
  326. topList[2].value = fiber.readData.favg;
  327. topList[3].text = fiber.warnFlag ? '报警' : '正常';
  328. const arr: any[] = JSON.parse(fiber.readData.fibreTemperature);
  329. arr.forEach((el) => {
  330. echartDataGq.xData.push(el.pos);
  331. echartDataGq.curData.data.push(el.value);
  332. echartDataGq.maxData.data.push(fiber.avgParams?.max_temperature_value || 0);
  333. echartDataGq.minData.data.push(fiber.avgParams?.min_temperature_value || 0);
  334. echartDataGq.avgData.data.push(fiber.avgParams?.avg_temperature_value || 0);
  335. });
  336. } else {
  337. topList[0].value = '--';
  338. topList[1].value = '--';
  339. topList[2].value = '--';
  340. topList[3].text = '正常';
  341. }
  342. if (val.bundletube.length != 0) {
  343. selectSj.value = val.bundletube;
  344. selectSj.value.forEach((el) => {
  345. selectList.push({ label: el.strinstallpos, value: el.strinstallpos });
  346. });
  347. selectData.value = selectData.value ? selectData.value : selectList[0].value;
  348. let dataVal = selectData.value ? selectSj.value.filter((v) => v.strinstallpos == selectData.value)[0] : selectSj.value[0];
  349. contentList[0].list[0].value = dataVal.readData.o2val;
  350. contentList[0].list[1].value = dataVal.readData.ch2val;
  351. contentList[1].list[0].value = dataVal.readData.coval;
  352. contentList[1].list[1].value = dataVal.readData.chval;
  353. contentList[2].list[0].value = dataVal.readData.co2val;
  354. contentList[2].list[1].value = dataVal.readData.gasval;
  355. contentList.forEach((el) => {
  356. el.list.forEach((v) => {
  357. v.time = dataVal.readTime.substring(0, dataVal.readTime.lastIndexOf(':'));
  358. });
  359. });
  360. echartDataSgList = dataVal.history;
  361. getSgClick({
  362. title: echartDataSg.lengedData,
  363. dw: echartDataSg.lengedDataName,
  364. });
  365. getmaxY();
  366. } else {
  367. contentList[0].list[0].value = '--';
  368. contentList[0].list[1].value = '--';
  369. contentList[1].list[0].value = '--';
  370. contentList[1].list[1].value = '--';
  371. contentList[2].list[0].value = '--';
  372. contentList[2].list[1].value = '--';
  373. contentList.forEach((el) => {
  374. el.list.forEach((v) => {
  375. v.time = '--';
  376. });
  377. });
  378. }
  379. },
  380. { deep: true }
  381. );
  382. </script>
  383. <style lang="less" scoped>
  384. @import '/@/design/theme.less';
  385. @{theme-deepblue} {
  386. .fireWork {
  387. --image-bj1: url('/@/assets/images/themify/deepblue/fire/bj1.png');
  388. --image-max: url('/@/assets/images/themify/deepblue/fire/max.svg');
  389. --image-min: url('/@/assets/images/themify/deepblue/fire/min.svg');
  390. --image-pj: url('/@/assets/images/themify/deepblue/fire/pj.svg');
  391. --image-bj1: url('/@/assets/images/themify/deepblue/fire/bj1.png');
  392. --image-14174: url('/@/assets/images/themify/deepblue/fire/14174.png');
  393. --image-contetn: url('/@/assets/images/themify/deepblue/fire/contetn.png');
  394. }
  395. }
  396. .fireWork {
  397. --image-bj1: url('/@/assets/images/fire/bj1.png');
  398. --image-max: url('/@/assets/images/fire/max.svg');
  399. --image-min: url('/@/assets/images/fire/min.svg');
  400. --image-pj: url('/@/assets/images/fire/pj.svg');
  401. --image-bj1: url('/@/assets/images/fire/bj1.png');
  402. --image-14174: url('/@/assets/images/fire/14174.png');
  403. --image-contetn: url('/@/assets/images/fire/contetn.png');
  404. --border-image-2: linear-gradient(to bottom, transparent, #024688, transparent);
  405. width: 100%;
  406. height: 100%;
  407. padding: 20px;
  408. box-sizing: border-box;
  409. .work-nav {
  410. height: 15%;
  411. width: 100%;
  412. margin-bottom: 20px;
  413. background: var(--image-bj1) no-repeat center;
  414. background-size: 100% 100%;
  415. display: flex;
  416. justify-content: space-between;
  417. align-items: center;
  418. .nav {
  419. display: flex;
  420. justify-content: center;
  421. align-items: center;
  422. &:nth-child(1) {
  423. flex: 1;
  424. height: 100%;
  425. border-right: 2px solid;
  426. border-image: var(--border-image-2) 1 1 1;
  427. }
  428. &:nth-child(2) {
  429. flex: 1;
  430. height: 100%;
  431. border-right: 2px solid;
  432. border-image: var(--border-image-2) 1 1 1;
  433. }
  434. &:nth-child(3) {
  435. flex: 1;
  436. height: 100%;
  437. border-right: 2px solid;
  438. border-image: var(--border-image-2) 1 1 1;
  439. }
  440. &:nth-child(4) {
  441. flex: 0.6;
  442. color: #b3b8cc;
  443. font-size: 16px;
  444. height: 100%;
  445. border-right: 2px solid;
  446. border-image: var(--border-image-2) 1 1 1;
  447. }
  448. &:nth-child(5) {
  449. flex: 1.4;
  450. height: 100%;
  451. .percent {
  452. width: 100%;
  453. height: 82%;
  454. padding: 0px 20px;
  455. box-sizing: border-box;
  456. display: flex;
  457. flex-direction: column;
  458. justify-content: space-around;
  459. .title {
  460. font-size: 14px;
  461. padding: 5px 0px;
  462. color: #b3b8cc;
  463. text-align: center;
  464. }
  465. .value {
  466. display: flex;
  467. justify-content: space-between;
  468. span {
  469. font-family: 'douyuFont';
  470. font-size: 18px;
  471. }
  472. }
  473. }
  474. }
  475. .pic {
  476. width: 30%;
  477. height: 82%;
  478. img {
  479. width: 100%;
  480. height: 100%;
  481. }
  482. }
  483. .content {
  484. height: 82%;
  485. margin-left: 15px;
  486. color: #fff;
  487. display: flex;
  488. flex-direction: column;
  489. justify-content: space-around;
  490. span {
  491. font-size: 14px;
  492. &:nth-child(1) {
  493. padding: 5px 0px;
  494. color: #b3b8cc;
  495. }
  496. &:nth-child(2) {
  497. font-family: 'douyuFont';
  498. font-size: 16px;
  499. color: var(--vent-table-action-link);
  500. }
  501. }
  502. }
  503. }
  504. .nav:nth-child(1) .pic {
  505. background: var(--image-max) no-repeat center;
  506. background-size: 50% 50%;
  507. }
  508. .nav:nth-child(2) .pic {
  509. background: var(--image-min) no-repeat center;
  510. background-size: 50% 50%;
  511. }
  512. .nav:nth-child(3) .pic {
  513. background: var(--image-pj) no-repeat center;
  514. background-size: 50% 50%;
  515. }
  516. }
  517. .center-echart {
  518. width: 100%;
  519. height: 32%;
  520. padding: 10px;
  521. margin-bottom: 20px;
  522. box-sizing: border-box;
  523. background: var(--image-bj1) no-repeat center;
  524. background-size: 100% 100%;
  525. .nav-title {
  526. height: 30px;
  527. display: flex;
  528. justify-content: space-between;
  529. align-items: center;
  530. .title {
  531. font-family: 'douyuFont';
  532. font-size: 14px;
  533. color: #fff;
  534. // color: var(--vent-table-action-link);
  535. }
  536. }
  537. .echart-box {
  538. width: 100%;
  539. height: calc(100% - 30px);
  540. }
  541. }
  542. .bot-content {
  543. position: relative;
  544. width: 100%;
  545. height: calc(53% - 40px);
  546. padding: 10px 10px 0px 10px;
  547. box-sizing: border-box;
  548. background: var(--image-bj1) no-repeat center;
  549. background-size: 100% 100%;
  550. .title {
  551. height: 35px;
  552. display: flex;
  553. justify-content: space-between;
  554. align-items: center;
  555. margin-bottom: 10px;
  556. .text {
  557. // height: 30px;
  558. // line-height: 30px;
  559. font-family: 'douyuFont';
  560. font-size: 14px;
  561. color: #fff;
  562. }
  563. }
  564. .content {
  565. height: calc(100% - 45px);
  566. display: flex;
  567. flex-direction: column;
  568. justify-content: space-between;
  569. .content-box {
  570. width: 100%;
  571. height: 29%;
  572. display: flex;
  573. justify-content: space-between;
  574. margin-top: 0px !important;
  575. .box-item {
  576. position: relative;
  577. width: 16%;
  578. height: 100%;
  579. background: var(--image-14174) no-repeat center;
  580. background-size: 100% 100%;
  581. cursor: pointer;
  582. .content-title {
  583. position: absolute;
  584. left: 50%;
  585. top: 0;
  586. transform: translate(-50%);
  587. color: #fff;
  588. font-size: 14px;
  589. }
  590. .content-item {
  591. position: absolute;
  592. width: 93%;
  593. height: 27%;
  594. display: flex;
  595. align-items: center;
  596. padding: 0px 10px;
  597. box-sizing: border-box;
  598. background: var(--image-contetn) no-repeat center;
  599. background-size: 100% 100%;
  600. color: #fff;
  601. font-size: 14px;
  602. &:nth-child(2) {
  603. left: 50%;
  604. top: 28%;
  605. transform: translate(-50%);
  606. display: flex;
  607. justify-content: space-between;
  608. }
  609. &:nth-child(3) {
  610. left: 50%;
  611. top: 62%;
  612. transform: translate(-50%);
  613. display: flex;
  614. justify-content: space-between;
  615. }
  616. .bolds {
  617. font-family: 'douyuFont';
  618. color: var(--vent-table-action-link);
  619. font-size: 12px;
  620. }
  621. }
  622. }
  623. }
  624. }
  625. .echart-box {
  626. position: absolute;
  627. left: 50%;
  628. top: 50px;
  629. transform: translate(-50%, 0);
  630. width: 66%;
  631. height: calc(100% - 50px);
  632. }
  633. }
  634. }
  635. :deep(.zxm-select:not(.zxm-select-customize-input) .zxm-select-selector) {
  636. border: 1px solid #3ad8ff77 !important;
  637. background-color: #ffffff00 !important;
  638. }
  639. :deep(.zxm-select-selection-item) {
  640. color: #fff !important;
  641. }
  642. :deep(.zxm-select-arrow) {
  643. color: #fff;
  644. }
  645. </style>