internal-fire-bot.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. <template>
  2. <div class="internal-fire-bot">
  3. <div class="title">
  4. <div class="text">束管系统监测</div>
  5. <div class="select-box flex">
  6. <a-select v-model:value="selectData" style="width: 250px" @change="changeSelect">
  7. <a-select-option v-for="file in selectList" :key="file.label" :value="file.value">{{ file.label
  8. }}</a-select-option>
  9. </a-select>
  10. </div>
  11. </div>
  12. <div class="content">
  13. <div class="content-box">
  14. <div class="box-item" @click="getSgClick('O₂','(%)')">
  15. <div class="content-title">
  16. <span>O₂</span>
  17. <span> (%)</span>
  18. </div>
  19. <div class="content-item">
  20. <span>浓度 : </span>
  21. <span class="bolds">{{ bunData.o2 }}</span>
  22. </div>
  23. <div class="content-item">
  24. <span>时间 :</span>
  25. <span class="bolds">{{ bunData.o2time }}</span>
  26. </div>
  27. </div>
  28. <div class="box-item" @click="getSgClick('C₂H₄','(ppm)')">
  29. <div class="content-title">
  30. <span> C₂H₄</span>
  31. <span>(ppm)</span>
  32. </div>
  33. <div class="content-item">
  34. <span>浓度 :</span>
  35. <span class="bolds">{{ bunData.c2h4 }}</span>
  36. </div>
  37. <div class="content-item">
  38. <span>时间 :</span>
  39. <span class="bolds">{{ bunData.c2h4time }}</span>
  40. </div>
  41. </div>
  42. </div>
  43. <div class="content-box">
  44. <div class="box-item" @click="getSgClick('CO','(ppm)')" >
  45. <div class="content-title">
  46. <span>CO</span>
  47. <span> (ppm)</span>
  48. </div>
  49. <div class="content-item">
  50. <span>浓度 : </span>
  51. <span class="bolds">{{ bunData.co }}</span>
  52. </div>
  53. <div class="content-item">
  54. <span>时间 :</span>
  55. <span class="bolds">{{ bunData.cotime }}</span>
  56. </div>
  57. </div>
  58. <div class="box-item" @click="getSgClick('CH₄','(ppm)')">
  59. <div class="content-title">
  60. <span> CH₄</span>
  61. <span>(ppm)</span>
  62. </div>
  63. <div class="content-item">
  64. <span>浓度 :</span>
  65. <span class="bolds">{{ bunData.ch4 }}</span>
  66. </div>
  67. <div class="content-item">
  68. <span>时间 :</span>
  69. <span class="bolds">{{ bunData.ch4time }}</span>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="content-box">
  74. <div class="box-item" @click="getSgClick('CO₂','(%)')">
  75. <div class="content-title">
  76. <span>CO₂</span>
  77. <span> (%)</span>
  78. </div>
  79. <div class="content-item">
  80. <span>浓度 : </span>
  81. <span class="bolds">{{ bunData.co2 }}</span>
  82. </div>
  83. <div class="content-item">
  84. <span>时间 :</span>
  85. <span class="bolds">{{ bunData.co2time }}</span>
  86. </div>
  87. </div>
  88. <div class="box-item" @click="getSgClick('C₂H₂','(ppm)')">
  89. <div class="content-title">
  90. <span> C₂H₂</span>
  91. <span>(ppm)</span>
  92. </div>
  93. <div class="content-item">
  94. <span>浓度 :</span>
  95. <span class="bolds">{{ bunData.c2h2 }}</span>
  96. </div>
  97. <div class="content-item">
  98. <span>时间 :</span>
  99. <span class="bolds">{{ bunData.c2h2time }}</span>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. <div class="echart-box">
  105. <PredictionCurve v-if="shownChart === 'default'" :chart="curveConfig" />
  106. <echartLine1 v-if="shownChart === 'predict'" :echartDataSg="echartDataSg" :maxY="maxY1"
  107. :lengedDataName="echartDataSg.lengedDataName" />
  108. </div>
  109. </div>
  110. </template>
  111. <script setup lang="ts">
  112. import { ref, reactive, watch } from 'vue'
  113. import echartLine1 from './echartLine1.vue';
  114. import PredictionCurve from './predictionCurve.vue';
  115. let props = defineProps({
  116. internalFireBotData: {
  117. type: Array,
  118. default: () => {
  119. return []
  120. }
  121. }
  122. })
  123. const shownChart = ref('default');
  124. let selectData = ref('');//下拉选项数据
  125. let selectList = ref<any[]>([]);//下拉选项列表
  126. let bundletubeData = ref<any[]>([]);
  127. let bunData = reactive({
  128. o2: '--',
  129. o2time: '--',
  130. c2h4: '--',
  131. c2h4time: '--',
  132. co: '--',
  133. cotime: '--',
  134. ch4: '--',
  135. ch4time: '--',
  136. co2: '--',
  137. co2time: '--',
  138. c2h2: '--',
  139. c2h2time: '--',
  140. })
  141. //束管图表数据
  142. let echartDataSgList = ref<any[]>([]);
  143. //束管监测-图表数据
  144. let echartDataSg = reactive({
  145. xData: [],
  146. lengedDataName: '(%)',
  147. yData: [],
  148. lengedData: 'O₂',
  149. });
  150. let maxY1 = ref<any>(0);
  151. /** 预测曲线的配置,数据分别为平均、最大、最小、当前值 */
  152. const curveConfig = ref<any>({ id: '0', label: '', time: new Date(), data: [0, 0, 0, 0] });
  153. //下拉选项切换
  154. function changeSelect(val) {
  155. selectData.value = val;
  156. let data = bundletubeData.value.filter((v) => v.strinstallpos == selectData.value)[0];
  157. let time = data.readTime.substring(0, data.readTime.lastIndexOf(':'));
  158. bunData.o2 = data.readData.o2val
  159. bunData.o2time = time;
  160. bunData.c2h4 = data.readData.ch2val
  161. bunData.c2h4time = time;
  162. bunData.co = data.readData.coval;
  163. bunData.cotime = time;
  164. bunData.ch4 = data.readData.gasval;
  165. bunData.ch4time = time;
  166. bunData.co2 = data.readData.co2val;
  167. bunData.co2time = time;
  168. bunData.c2h2 = data.readData.chval;
  169. bunData.c2h2time = time;
  170. }
  171. //束管实时数据选项点击
  172. function getSgClick(title,dw) {
  173. echartDataSg.xData.length = 0;
  174. echartDataSg.yData.length = 0;
  175. echartDataSg.lengedData = title;
  176. echartDataSg.lengedDataName = dw;
  177. const data = bundletubeData.value.filter((v) => v.strinstallpos == selectData.value)[0];
  178. switch (title) {
  179. case 'O₂':
  180. echartDataSgList.value.forEach((el) => {
  181. echartDataSg.xData.push(el.time);
  182. echartDataSg.yData.push(el.o2val);
  183. });
  184. curveConfig.value = {
  185. id: 'o2',
  186. label: 'O₂',
  187. time: echartDataSg.xData,
  188. data: [
  189. // 氧气预测曲线
  190. data.avgParam?.avg_o2_value || 0,
  191. data.avgParam?.max_o2_value || 0,
  192. data.avgParam?.min_o2_value || 0,
  193. // data.readData?.o2val,
  194. ],
  195. monitorData: echartDataSg.yData,
  196. };
  197. getmaxY();
  198. break;
  199. case 'C₂H₄':
  200. echartDataSgList.value.forEach((el) => {
  201. echartDataSg.xData.push(el.time);
  202. echartDataSg.yData.push(el.ch2val);
  203. });
  204. curveConfig.value = {
  205. id: 'ch2',
  206. label: 'C₂H₄',
  207. time: echartDataSg.xData,
  208. data: [
  209. // 预测曲线
  210. data.avgParam?.avg_c2h4_value || 0,
  211. data.avgParam?.max_c2h4_value || 0,
  212. data.avgParam?.min_c2h4_value || 0,
  213. // data.readData?.ch2val,
  214. ],
  215. monitorData: echartDataSg.yData,
  216. };
  217. getmaxY();
  218. break;
  219. case 'CO':
  220. echartDataSgList.value.forEach((el) => {
  221. echartDataSg.xData.push(el.time);
  222. echartDataSg.yData.push(el.coval);
  223. });
  224. curveConfig.value = {
  225. id: 'co',
  226. label: 'CO',
  227. time: echartDataSg.xData,
  228. data: [
  229. // 预测曲线
  230. data.avgParam?.avg_co_value || 0,
  231. data.avgParam?.max_co_value || 0,
  232. data.avgParam?.min_co_value || 0,
  233. // data.readData?.coval,
  234. ],
  235. monitorData: echartDataSg.yData,
  236. };
  237. getmaxY();
  238. break;
  239. case 'CH₄':
  240. echartDataSgList.value.forEach((el) => {
  241. echartDataSg.xData.push(el.time);
  242. echartDataSg.yData.push(el.gasval);
  243. });
  244. curveConfig.value = {
  245. id: 'ch4',
  246. label: 'CH₄',
  247. time: echartDataSg.xData,
  248. data: [
  249. // 预测曲线
  250. data.avgParam?.avg_ch4_value || 0,
  251. data.avgParam?.max_ch4_value || 0,
  252. data.avgParam?.min_ch4_value || 0,
  253. // data.readData?.chval,
  254. ],
  255. monitorData: echartDataSg.yData,
  256. };
  257. getmaxY();
  258. break;
  259. case 'CO₂':
  260. echartDataSgList.value.forEach((el) => {
  261. echartDataSg.xData.push(el.time);
  262. echartDataSg.yData.push(el.co2val);
  263. });
  264. curveConfig.value = {
  265. id: 'co2',
  266. label: 'CO₂',
  267. time: echartDataSg.xData,
  268. data: [
  269. // 预测曲线
  270. data.avgParam?.avg_co2_value || 0,
  271. data.avgParam?.max_co2_value || 0,
  272. data.avgParam?.min_co2_value || 0,
  273. // data.readData?.co2val,
  274. ],
  275. monitorData: echartDataSg.yData,
  276. };
  277. getmaxY();
  278. break;
  279. case 'C₂H₂':
  280. echartDataSgList.value.forEach((el) => {
  281. echartDataSg.xData.push(el.time);
  282. echartDataSg.yData.push(el.chval);
  283. });
  284. curveConfig.value = {
  285. id: 'gas',
  286. label: 'C₂H₂',
  287. time: echartDataSg.xData,
  288. data: [
  289. // 预测曲线
  290. data.avgParam?.avg_c2h2_value || 0,
  291. data.avgParam?.max_c2h2_value || 0,
  292. data.avgParam?.min_c2h2_value || 0,
  293. // data.readData?.gasval,
  294. ],
  295. monitorData: echartDataSg.yData,
  296. };
  297. getmaxY();
  298. break;
  299. }
  300. }
  301. function getmaxY() {
  302. maxY1.value = echartDataSg.yData.reduce((acr, cur) => {
  303. return acr > cur ? acr : cur;
  304. });
  305. maxY1.value =
  306. maxY1.value.toString().indexOf('.') == -1 ? maxY1.value.toString() : maxY1.value.toString().substring(0, maxY1.value.toString().indexOf('.'));
  307. if (maxY1.value.length < 2 && Number(maxY1.value) < 1) {
  308. maxY1.value = 1;
  309. } else if (maxY1.value.length < 2 && Number(maxY1.value) >= 1) {
  310. maxY1.value = 10;
  311. } else if (maxY1.value.length < 3) {
  312. maxY1.value = (Number(maxY1.value[0]) + 1) * 10;
  313. } else if (maxY1.value.length < 4) {
  314. maxY1.value = (Number(maxY1.value[0]) + 1) * 100;
  315. } else if (maxY1.value.length < 5) {
  316. maxY1.value = (Number(maxY1.value[0]) + 1) * 1000;
  317. } else if (maxY1.value.length < 6) {
  318. maxY1.value = (Number(maxY1.value[0]) + 1) * 10000;
  319. }
  320. }
  321. watch(() => props.internalFireBotData, (newV, oldV) => {
  322. echartDataSg.xData.length = 0;
  323. echartDataSg.yData.length = 0;
  324. if (newV.length != 0) {
  325. bundletubeData.value = newV;
  326. //下拉选项列表
  327. selectList.value = bundletubeData.value.map((el) => {
  328. return { label: el.strinstallpos, value: el.strinstallpos };
  329. });
  330. //默认选中
  331. selectData.value = selectData.value ? selectData.value : selectList.value[0].value;
  332. let choiceData = selectData.value ? bundletubeData.value.filter((v) => v.strinstallpos == selectData.value)[0] : bundletubeData.value[0];
  333. let time = choiceData.readTime.substring(0, choiceData.readTime.lastIndexOf(':'));
  334. bunData.o2 = choiceData.readData.o2val
  335. bunData.o2time = time;
  336. bunData.c2h4 = choiceData.readData.ch2val
  337. bunData.c2h4time = time;
  338. bunData.co = choiceData.readData.coval;
  339. bunData.cotime = time;
  340. bunData.ch4 = choiceData.readData.gasval;
  341. bunData.ch4time = time;
  342. bunData.co2 = choiceData.readData.co2val;
  343. bunData.co2time = time;
  344. bunData.c2h2 = choiceData.readData.chval;
  345. bunData.c2h2time = time;
  346. echartDataSgList.value = choiceData.history;
  347. getSgClick(echartDataSg.lengedData,echartDataSg.lengedDataName);
  348. getmaxY();
  349. }
  350. }, { immediate: true })
  351. </script>
  352. <style lang="less" scoped>
  353. .internal-fire-bot {
  354. position: relative;
  355. width: 100%;
  356. height: 100%;
  357. .title {
  358. height: 35px;
  359. display: flex;
  360. justify-content: space-between;
  361. align-items: center;
  362. margin-bottom: 10px;
  363. .text {
  364. // height: 30px;
  365. // line-height: 30px;
  366. font-family: 'douyuFont';
  367. font-size: 14px;
  368. color: #fff;
  369. }
  370. }
  371. .content {
  372. height: calc(100% - 45px);
  373. display: flex;
  374. flex-direction: column;
  375. justify-content: space-between;
  376. .content-box {
  377. width: 100%;
  378. height: 29%;
  379. display: flex;
  380. justify-content: space-between;
  381. margin-top: 0px !important;
  382. .box-item {
  383. position: relative;
  384. width: 16%;
  385. height: 100%;
  386. background: var(--image-14174) no-repeat center;
  387. background-size: 100% 100%;
  388. cursor: pointer;
  389. .content-title {
  390. position: absolute;
  391. left: 50%;
  392. top: 0;
  393. transform: translate(-50%);
  394. color: #fff;
  395. font-size: 14px;
  396. }
  397. .content-item {
  398. position: absolute;
  399. width: 93%;
  400. height: 27%;
  401. display: flex;
  402. align-items: center;
  403. padding: 0px 10px;
  404. box-sizing: border-box;
  405. background: var(--image-contetn) no-repeat center;
  406. background-size: 100% 100%;
  407. color: #fff;
  408. font-size: 14px;
  409. &:nth-child(2) {
  410. left: 50%;
  411. top: 28%;
  412. transform: translate(-50%);
  413. display: flex;
  414. justify-content: space-between;
  415. }
  416. &:nth-child(3) {
  417. left: 50%;
  418. top: 62%;
  419. transform: translate(-50%);
  420. display: flex;
  421. justify-content: space-between;
  422. }
  423. .bolds {
  424. font-family: 'douyuFont';
  425. color: var(--vent-table-action-link);
  426. font-size: 12px;
  427. }
  428. }
  429. }
  430. }
  431. }
  432. .echart-box {
  433. position: absolute;
  434. left: 50%;
  435. top: 50px;
  436. transform: translate(-50%, 0);
  437. width: 66%;
  438. height: calc(100% - 50px);
  439. }
  440. }
  441. </style>