fireWork.vue 20 KB

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