fireWork.vue 19 KB

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