yuxin.vue 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516
  1. <template>
  2. <vue-fullscreen
  3. class="box-container"
  4. v-cloak
  5. v-model="isFullscreen"
  6. fullscreenClass="box-container"
  7. :exit-on-click-wrapper="false"
  8. :style="{ height: isFullscreen ? '100vh' : 'calc(100vh - 96px)' }"
  9. >
  10. <div class="header-section">
  11. <div class="box-header-scroll">
  12. <div class="logo">
  13. <el-select
  14. v-model="currentId"
  15. placeholder="请选择"
  16. class="custom-select"
  17. popper-class="custom-select-dropdown"
  18. @change="init"
  19. :popper-append-to-body="false"
  20. >
  21. <el-option
  22. v-for="item in selectOptions"
  23. :key="item.value"
  24. :label="item.label"
  25. :value="item.value"
  26. />
  27. </el-select>
  28. </div>
  29. <div class="header-center">
  30. <div class="title" style="margin-bottom: 20px">生产管控</div>
  31. </div>
  32. <div class="time">
  33. <div class="time-display">
  34. <span class="date-text">{{ date }}</span>
  35. <span class="time-text">{{ time }}</span>
  36. </div>
  37. <span class="fullscreen-toggle" @click.passive="onFullscreen">
  38. <i
  39. v-if="isFullscreen"
  40. title="取消全屏"
  41. class="el-icon-_screen-restore"
  42. />
  43. <i v-else title="全屏" class="el-icon-_screen-full" />
  44. </span>
  45. </div>
  46. </div>
  47. </div>
  48. <!-- 主体内容 -->
  49. <div class="main-content">
  50. <!-- 燃烧系统 -->
  51. <div class="system-panel combustion-panel">
  52. <div class="panel-title">
  53. <div class="panel-icon"></div>
  54. 燃烧系统
  55. </div>
  56. <div class="panel-body combustion-body">
  57. <div class="bg-image combustion-bg"></div>
  58. <!-- 文字标签覆盖层 -->
  59. <div class="overlay-labels">
  60. <!-- 1#给煤机区域 -->
  61. <div class="label device-name" style="left: -0.1%; top: 45%"
  62. >1#给煤机</div
  63. >
  64. <div class="label data-box" style="left: 7%; top: 41%">{{
  65. gmj1.频率.value.value + ' ' + gmj1.频率.value.unit
  66. }}</div>
  67. <!-- 2#给煤机区域 -->
  68. <div class="label device-name" style="left: -0.1%; top: 65%"
  69. >2#给煤机</div
  70. >
  71. <div class="label data-box" style="left: 7%; top: 59.5%">{{
  72. gmj2.频率.value.value + ' ' + gmj2.频率.value.unit
  73. }}</div>
  74. <!-- 锅炉顶部 -->
  75. <div class="label data-box" style="left: 13%; top: 8%">{{
  76. lt.炉膛温度左.value.value + ' ' + lt.炉膛温度左.value.unit
  77. }}</div>
  78. <div class="label data-box" style="left: 19%; top: 8%">{{
  79. lt.炉膛出口温度右.value.value + ' ' + lt.炉膛出口温度右.value.unit
  80. }}</div>
  81. <!-- 锅炉上部 -->
  82. <!-- <div class="label data-box" style="left: 15.5%; top: 22%"
  83. >+104 Pa</div
  84. > -->
  85. <!-- 锅炉中部 -->
  86. <div class="label data-box" style="left: 15.5%; top: 38%">{{
  87. lt.炉膛出口压力.value.value + ' ' + lt.炉膛出口压力.value.unit
  88. }}</div>
  89. <!-- 锅炉右侧 -->
  90. <!-- <div class="label data-box" style="left: 15.5%; top: 53%"
  91. >+392 Pa</div
  92. > -->
  93. <!-- 锅炉下部温度组 -->
  94. <div class="label data-box" style="left: 13.7%; top: 57.5%">{{
  95. lt.下端温度左.value.value + ' ' + lt.下端温度左.value.unit
  96. }}</div>
  97. <div class="label data-box" style="left: 13.7%; top: 64%">{{
  98. lt.沸中温度左.value.value + ' ' + lt.沸中温度左.value.unit
  99. }}</div>
  100. <div class="label data-box" style="left: 13.7%; top: 71%">{{
  101. lt.沸下温度左.value.value + ' ' + lt.沸下温度左.value.unit
  102. }}</div>
  103. <!-- <div class="label data-box" style="left: 15.8%; top: 79%">87%</div> -->
  104. <div class="label data-box" style="left: 13%; top: 81%">{{
  105. lc.料层差压左.value.value + ' ' + lc.料层差压左.value.unit
  106. }}</div>
  107. <div class="label data-box" style="left: 17.5%; top: 81%">{{
  108. lc.料层差压右.value.value + ' ' + lc.料层差压右.value.unit
  109. }}</div>
  110. <div class="label data-box" style="left: 17.5%; top: 57.5%">{{
  111. lt.下端温度右.value.value + ' ' + lt.下端温度右.value.unit
  112. }}</div>
  113. <div class="label data-box" style="left: 17.5%; top: 64%">{{
  114. lt.沸中温度右.value.value + ' ' + lt.沸中温度右.value.unit
  115. }}</div>
  116. <div class="label data-box" style="left: 17.5%; top: 71%">{{
  117. lt.沸下温度右.value.value + ' ' + lt.沸下温度右.value.unit
  118. }}</div>
  119. <!-- 除尘器 -->
  120. <div class="label data-box" style="left: 45.4%; top: 0"
  121. >后烟压:{{
  122. ccq.后烟压.value.value + ' ' + ccq.后烟压.value.unit
  123. }}</div
  124. >
  125. <div class="label data-box" style="left: 45.4%; top: 6%"
  126. >出口烟温:{{
  127. ccq.出口烟温.value.value + ' ' + ccq.出口烟温.value.unit
  128. }}</div
  129. >
  130. <div
  131. class="label device-name"
  132. style="left: 46.6%; top: 12.6%; color: #333; text-shadow: none"
  133. >除尘器</div
  134. >
  135. <!-- 二次风机 -->
  136. <div class="label device-name" style="left: 59%; top: 43%"
  137. >二次风机</div
  138. >
  139. <div class="label data-box" style="left: 59%; top: 70%"
  140. >二次风压:
  141. {{ ecfj.风压.value.value + ' ' + ecfj.风压.value.unit }}</div
  142. >
  143. <!-- 一次风机 -->
  144. <div class="label device-name" style="left: 48%; top: 70%"
  145. >一次风机</div
  146. >
  147. <!-- 底部功率 -->
  148. <div class="label data-box" style="left: 48%; top: 94%"
  149. >频率:{{
  150. ycfj.频率.value.value + ' ' + ycfj.频率.value.unit
  151. }}</div
  152. >
  153. <!-- 引风机 -->
  154. <div class="label device-name" style="left: 72%; top: 31%"
  155. >引风机</div
  156. >
  157. <div class="label data-box" style="left: 71%; top: 56%"
  158. >功率: {{ yfj.频率.value.value + ' ' + yfj.频率.value.unit }}</div
  159. >
  160. </div>
  161. </div>
  162. </div>
  163. <!-- 汽水系统 -->
  164. <div class="system-panel steam-panel">
  165. <div class="panel-title">
  166. <div class="panel-icon"></div>
  167. 汽水系统
  168. </div>
  169. <div class="panel-body steam-body">
  170. <div class="bg-image steam-bg"></div>
  171. <!-- 文字标签覆盖层 -->
  172. <div class="overlay-labels">
  173. <!-- 左侧仪表参数 -->
  174. <div class="label data-box" style="left: 6.5%; top: 0%"
  175. >主蒸汽压力:{{
  176. zzq.主蒸汽压力.value.value + ' ' + zzq.主蒸汽压力.value.unit
  177. }}</div
  178. >
  179. <div class="label data-box" style="left: 6.5%; top: 24%"
  180. >主蒸汽温度:
  181. {{
  182. zzq.主蒸汽温度.value.value + ' ' + zzq.主蒸汽温度.value.unit
  183. }}</div
  184. >
  185. <!-- 高温过热器 -->
  186. <!-- <div class="label data-box" style="left: 21%; top: 1%"
  187. >温度:
  188. {{
  189. gwgrq.出口温度.value.value + ' ' + gwgrq.出口温度.value.unit
  190. }}</div
  191. >
  192. <div class="label data-box" style="left: 20.8%; top: 7%"
  193. >压力:{{
  194. gwgrq.进口蒸汽压力.value.value +
  195. ' ' +
  196. gwgrq.进口蒸汽压力.value.unit
  197. }}</div
  198. > -->
  199. <div
  200. class="label device-name"
  201. style="
  202. left: 22%;
  203. top: 25%;
  204. font-size: 18px;
  205. color: #000;
  206. text-shadow: none;
  207. "
  208. >高温</div
  209. >
  210. <div
  211. class="label device-name"
  212. style="
  213. left: 21.5%;
  214. top: 29%;
  215. font-size: 18px;
  216. color: #000;
  217. text-shadow: none;
  218. "
  219. >过热器</div
  220. >
  221. <!-- 低温过热器 -->
  222. <div class="label data-box" style="left: 35.9%; top: 0"
  223. >温度:{{
  224. dwgrq.进口温度.value.value + ' ' + dwgrq.进口温度.value.unit
  225. }}</div
  226. >
  227. <div class="label data-box" style="left: 35.7%; top: 5%"
  228. >压力:
  229. {{
  230. dwgrq.低温过热器前烟压.value.value +
  231. ' ' +
  232. dwgrq.低温过热器前烟压.value.unit
  233. }}</div
  234. >
  235. <div
  236. class="label device-name"
  237. style="
  238. left: 37%;
  239. top: 25%;
  240. font-size: 18px;
  241. color: #000;
  242. text-shadow: none;
  243. "
  244. >低温</div
  245. >
  246. <div
  247. class="label device-name"
  248. style="
  249. left: 36.6%;
  250. top: 29%;
  251. font-size: 18px;
  252. color: #000;
  253. text-shadow: none;
  254. "
  255. >过热器</div
  256. >
  257. <!-- 气包 -->
  258. <div
  259. class="label device-name"
  260. style="
  261. left: 53.2%;
  262. top: 34%;
  263. font-size: 18px;
  264. color: #000;
  265. text-shadow: none;
  266. "
  267. >汽包</div
  268. >
  269. <div class="label data-box" style="left: 53%; top: 40%"
  270. >汽包液位:{{
  271. qp.汽包液位.value.value + ' ' + qp.汽包液位.value.unit
  272. }}</div
  273. >
  274. <!-- 气包右侧参数 -->
  275. <div class="label data-box" style="left: 54%; top: 9%"
  276. >汽包进口温度:{{
  277. qp.汽包进口温度.value.value + ' ' + qp.汽包进口温度.value.unit
  278. }}</div
  279. >
  280. <div class="label data-box" style="left: 54%; top: 19%"
  281. >汽包出口温度:{{
  282. qp.汽包出口温度.value.value + ' ' + qp.汽包出口温度.value.unit
  283. }}</div
  284. >
  285. <!-- 省煤器 -->
  286. <div class="label device-name" style="left: 71%; top: 37%"
  287. >省煤器</div
  288. >
  289. <div class="label data-box" style="left: 70%; top: 6%"
  290. >出口水温:
  291. {{
  292. smq.出口水温.value.value + ' ' + smq.出口水温.value.unit
  293. }}</div
  294. >
  295. <!-- 给水箱 -->
  296. <div class="label data-box" style="left: 36%; top: 67%"
  297. >水位:{{
  298. sxyw.水位.value.value + ' ' + sxyw.水位.value.unit
  299. }}</div
  300. >
  301. <!-- 给水泵 -->
  302. <div class="label device-name" style="left: 60%; top: 87%"
  303. >给水泵</div
  304. >
  305. <div class="label data-box" style="left: 78%; top: 80%"
  306. >压力:
  307. {{ gs.给水压力.value.value + ' ' + gs.给水压力.value.unit }}</div
  308. >
  309. <div class="label data-box" style="left: 78%; top: 91%"
  310. >出口流量:
  311. {{ gs.出口流量.value.value + ' ' + gs.出口流量.value.unit }}</div
  312. >
  313. <!-- 左下角给水 -->
  314. <div class="label device-name" style="left: 2%; top: 87.6%"
  315. >给水</div
  316. >
  317. <div class="label data-box" style="left: 4%; top: 82%"
  318. >进口流量:
  319. {{
  320. zgs.进口流量.value.value + ' ' + zgs.进口流量.value.unit
  321. }}</div
  322. >
  323. </div>
  324. <!-- 右侧排放数据面板 -->
  325. <div class="emission-panel">
  326. <div class="emission-item">
  327. <span class="emission-label">颗粒物:</span>
  328. <span class="emission-value">{{
  329. yqpf.颗粒物.value.value + ' ' + yqpf.颗粒物.value.unit
  330. }}</span>
  331. </div>
  332. <div class="emission-item">
  333. <span class="emission-label">NOX:</span>
  334. <span class="emission-value">{{
  335. yqpf.NOX.value.value + ' ' + yqpf.NOX.value.unit
  336. }}</span>
  337. </div>
  338. <div class="emission-item">
  339. <span class="emission-label">O2:</span>
  340. <span class="emission-value">{{
  341. yqpf.O2.value.value + ' ' + yqpf.O2.value.unit
  342. }}</span>
  343. </div>
  344. <div class="emission-item">
  345. <span class="emission-label">排烟温度:</span>
  346. <span class="emission-value">{{
  347. yqpf.排烟温度.value.value + ' ' + yqpf.排烟温度.value.unit
  348. }}</span>
  349. </div>
  350. <div class="emission-item">
  351. <span class="emission-label">SO2:</span>
  352. <span class="emission-value">{{
  353. yqpf.SO2.value.value + ' ' + yqpf.SO2.value.unit
  354. }}</span>
  355. </div>
  356. </div>
  357. </div>
  358. </div>
  359. </div>
  360. </vue-fullscreen>
  361. </template>
  362. <script>
  363. import { component } from 'vue-fullscreen';
  364. import { getRealData } from '@/api/pcsData/index.js';
  365. import { values } from 'lodash';
  366. export default {
  367. name: 'PcsDataDashboard',
  368. components: {
  369. VueFullscreen: component
  370. },
  371. data() {
  372. return {
  373. //烟气排放
  374. yqpf: {
  375. deviceId: {
  376. 5: '2036027830998446082',
  377. 6: '2036033114630303745',
  378. 7: '2036020851676590081'
  379. },
  380. 颗粒物: {
  381. 5: 'AI0014',
  382. 6: 'AI0014',
  383. 7: 'AI0040',
  384. value: {
  385. value: '',
  386. unit: ''
  387. }
  388. },
  389. NOX: {
  390. 5: 'AI0018',
  391. 6: 'AI0018',
  392. 7: 'AI0046',
  393. value: {
  394. value: '',
  395. unit: ''
  396. }
  397. },
  398. O2: {
  399. 5: 'AI0019',
  400. 6: 'AI0019',
  401. 7: 'AI0047',
  402. value: {
  403. value: '',
  404. unit: ''
  405. }
  406. },
  407. 排烟温度: {
  408. 5: 'AI0042',
  409. 6: 'AI0042',
  410. 5: 'AI0019',
  411. value: {
  412. value: '',
  413. unit: ''
  414. }
  415. },
  416. SO2: {
  417. 5: 'AI0067',
  418. 6: 'AI0042',
  419. 7: 'AI0045',
  420. value: {
  421. value: '',
  422. unit: ''
  423. }
  424. }
  425. },
  426. //水箱液位
  427. sxyw: {
  428. deviceId: {
  429. 5: '2008477438320357378',
  430. 6: '2008477438257442817',
  431. 7: '2008477438190333954'
  432. },
  433. 水位: {
  434. 5: 'AI0074',
  435. 6: 'AI0070',
  436. 7: 'AI0009',
  437. value: {
  438. value: '',
  439. unit: ''
  440. }
  441. }
  442. },
  443. //主给水
  444. zgs: {
  445. deviceId: {
  446. 5: '2048945828386091010',
  447. 6: '2048945828440616962',
  448. 7: '2064913192936058881'
  449. },
  450. 进口流量: {
  451. 5: 'AI0043',
  452. 6: 'AI0024',
  453. 7: '0',
  454. value: {
  455. value: '',
  456. unit: ''
  457. }
  458. }
  459. },
  460. //给水
  461. gs: {
  462. deviceId: {
  463. 5: '2048945828327370754',
  464. 6: '2048945828289622018',
  465. 7: '2048945828251873282'
  466. },
  467. 给水压力: {
  468. 5: 'AI0013',
  469. 6: 'AI0013',
  470. 7: 'AI0009',
  471. value: {
  472. value: '',
  473. unit: ''
  474. }
  475. },
  476. 出口流量: {
  477. 5: 'AI0024',
  478. 6: 'AI0024',
  479. 7: 'AI0028',
  480. value: {
  481. value: '',
  482. unit: ''
  483. }
  484. }
  485. },
  486. //省煤器
  487. smq: {
  488. deviceId: {
  489. 5: '2036027830256054273',
  490. 6: '2036033113808220162',
  491. 7: '2036020850758037505'
  492. },
  493. 出口水温: {
  494. 5: 'AI0022',
  495. 6: 'AI0022',
  496. 7: 'AI0066',
  497. value: {
  498. value: '',
  499. unit: ''
  500. }
  501. }
  502. },
  503. //气泡
  504. qp: {
  505. deviceId: {
  506. 5: '2036027832722305025',
  507. 6: '2036033116354162689',
  508. 7: '0'
  509. },
  510. 汽包进口温度: {
  511. 5: 'AI0069',
  512. 6: '0',
  513. 7: '0',
  514. value: {
  515. value: '',
  516. unit: ''
  517. }
  518. },
  519. 汽包液位: {
  520. 5: 'AI0071',
  521. 6: 'AI0075',
  522. 7: '0',
  523. value: {
  524. value: '',
  525. unit: ''
  526. }
  527. },
  528. 汽包出口温度: {
  529. 5: 'AI0075',
  530. 6: '0',
  531. 7: '0',
  532. value: {
  533. value: '',
  534. unit: ''
  535. }
  536. }
  537. },
  538. //主蒸汽
  539. zzq: {
  540. deviceId: {
  541. 5: '2036027831287853057',
  542. 6: '2036033114848407554',
  543. 7: '2036020851353628674'
  544. },
  545. 主蒸汽压力: {
  546. 5: 'AI0023',
  547. 6: 'AI0023',
  548. 7: 'AI0014',
  549. value: {
  550. value: '',
  551. unit: ''
  552. }
  553. },
  554. 主蒸汽温度: {
  555. 5: 'AI0045',
  556. 6: 'AI0045',
  557. 7: 'AI0023',
  558. value: {
  559. value: '',
  560. unit: ''
  561. }
  562. }
  563. },
  564. //高温过热器
  565. gwgrq: {
  566. deviceId: {
  567. 5: '2036027830004396033',
  568. 6: '2036033113632059394',
  569. 7: '2036020850602848258'
  570. },
  571. 进口蒸汽压力: {
  572. 5: '0',
  573. 6: '0',
  574. 7: '0',
  575. value: {
  576. value: '',
  577. unit: ''
  578. }
  579. },
  580. 出口温度: {
  581. 5: '0',
  582. 6: '0',
  583. 7: '0',
  584. value: {
  585. value: '',
  586. unit: ''
  587. }
  588. }
  589. },
  590. //低温过热器
  591. dwgrq: {
  592. deviceId: {
  593. 5: '2036027829865984001',
  594. 6: '2036033113489453058',
  595. 7: '2036020850384744450'
  596. },
  597. 低温过热器前烟压: {
  598. 5: 'AI0006',
  599. 6: 'AI0006',
  600. 7: 'AI0006',
  601. value: {
  602. value: '',
  603. unit: ''
  604. }
  605. },
  606. 进口温度: {
  607. 5: 'AI0068',
  608. 6: 'AI0069',
  609. 7: '0',
  610. value: {
  611. value: '',
  612. unit: ''
  613. }
  614. }
  615. },
  616. //给煤机
  617. gmj1: {
  618. deviceId: {
  619. 5: '2036027831950553090',
  620. 6: '2036033115469164546',
  621. 7: '2036020852775497730'
  622. },
  623. 频率: {
  624. 5: 'AI0035',
  625. 6: 'AI0035',
  626. 7: 'AI0037',
  627. value: {
  628. value: '',
  629. unit: ''
  630. }
  631. }
  632. },
  633. gmj2: {
  634. deviceId: {
  635. 5: '2036027831766003713',
  636. 6: '2036033115326558209',
  637. 7: '2036020852607725570'
  638. },
  639. 频率: {
  640. 5: 'AI0036',
  641. 6: 'AI0036',
  642. 7: 'AI0038',
  643. value: {
  644. value: '',
  645. unit: ''
  646. }
  647. }
  648. },
  649. //料层
  650. lc: {
  651. deviceId: {
  652. 5: '2036027832571310081',
  653. 6: '2036033116027006978',
  654. 7: '2036020853366894594'
  655. },
  656. 料层差压左: {
  657. 5: 'AI0063',
  658. 6: 'AI0063',
  659. 7: 'AI0063',
  660. value: {
  661. value: '',
  662. unit: ''
  663. }
  664. },
  665. 料层差压右: {
  666. 5: 'AI0064',
  667. 6: 'AI0064',
  668. 7: 'AI0064',
  669. value: {
  670. value: '',
  671. unit: ''
  672. }
  673. }
  674. },
  675. //炉膛
  676. lt: {
  677. deviceId: {
  678. 5: '2036027829618520065',
  679. 6: '2036033113225211905',
  680. 7: '2036020850216972290'
  681. },
  682. 下端温度左: {
  683. 5: 'AI0053',
  684. 6: 'AI0053',
  685. 7: 'AI0053',
  686. value: {
  687. value: '',
  688. unit: ''
  689. }
  690. },
  691. 沸中温度左: {
  692. 5: 'AI0051',
  693. 6: 'AI0051',
  694. 7: 'AI0051',
  695. value: {
  696. value: '',
  697. unit: ''
  698. }
  699. },
  700. 沸下温度左: {
  701. 5: 'AI0049',
  702. 6: 'AI0049',
  703. 7: 'AI0049',
  704. value: {
  705. value: '',
  706. unit: ''
  707. }
  708. },
  709. 下端温度右: {
  710. 5: 'AI0054',
  711. 6: 'AI0054',
  712. 7: 'AI0054',
  713. value: {
  714. value: '',
  715. unit: ''
  716. }
  717. },
  718. 沸中温度右: {
  719. 5: 'AI0052',
  720. 6: 'AI0052',
  721. 7: 'AI0052',
  722. value: {
  723. value: '',
  724. unit: ''
  725. }
  726. },
  727. 沸下温度右: {
  728. 5: 'AI0050',
  729. 6: 'AI0050',
  730. 7: 'AI0050',
  731. value: {
  732. value: '',
  733. unit: ''
  734. }
  735. },
  736. 炉膛温度左: {
  737. 5: 'AI0066',
  738. 6: 'AI0066',
  739. 7: '0',
  740. value: {
  741. value: '',
  742. unit: ''
  743. }
  744. },
  745. 炉膛出口温度右: {
  746. 5: 'AI0055',
  747. 6: 'AI0055',
  748. 7: 'AI0055',
  749. value: {
  750. value: '',
  751. unit: ''
  752. }
  753. },
  754. 炉膛出口压力: {
  755. 5: 'AI0004',
  756. 6: 'AI0004',
  757. 7: 'AI0004',
  758. value: {
  759. value: '',
  760. unit: ''
  761. }
  762. }
  763. },
  764. //除尘器
  765. ccq: {
  766. deviceId: {
  767. 5: '2008477400542261249',
  768. 6: '2008477400445792258',
  769. 7: '2008477400353517569'
  770. },
  771. 后烟压: {
  772. 5: 'AI0011',
  773. 6: 'AI0011',
  774. 7: 'AI0011',
  775. value: {
  776. value: '',
  777. unit: ''
  778. }
  779. },
  780. 出口烟温: {
  781. 5: 'AI0020',
  782. 6: 'AI0020',
  783. 7: 'AI0020',
  784. value: {
  785. value: '',
  786. unit: ''
  787. }
  788. }
  789. },
  790. ycfj: {
  791. deviceId: {
  792. 5: '2008477365637263361',
  793. 6: '2008477365553377282',
  794. 7: '2008477365473685505'
  795. },
  796. 频率: {
  797. 5: 'AI0030',
  798. 6: 'AI0030',
  799. 7: 'AI0034',
  800. value: {
  801. value: '',
  802. unit: ''
  803. }
  804. }
  805. },
  806. ecfj: {
  807. deviceId: {
  808. 5: '2008477365368827905',
  809. 6: '2008477365305913345',
  810. 7: '2008477365238804481'
  811. },
  812. 风压: {
  813. 5: 'AI0012',
  814. 6: 'AI0012',
  815. 7: 'AI0012',
  816. value: {
  817. value: '',
  818. unit: ''
  819. }
  820. }
  821. },
  822. yfj: {
  823. deviceId: {
  824. 5: '2008477365154918402',
  825. 6: '2008477365087809538',
  826. 7: '2008477365029089281'
  827. },
  828. 频率: {
  829. 5: 'AI0029',
  830. 6: 'AI0029',
  831. 7: 'AI0033',
  832. value: {
  833. value: '',
  834. unit: ''
  835. }
  836. }
  837. },
  838. isFullscreen: false,
  839. isFlag: false,
  840. date: '',
  841. time: '',
  842. week: '',
  843. selectedValue: '',
  844. selectOptions: [
  845. {
  846. label: '5#场站',
  847. value: 5
  848. },
  849. {
  850. label: '6#场站',
  851. value: 6
  852. },
  853. {
  854. label: '7#场站',
  855. value: 7
  856. }
  857. ],
  858. comprehensiveList: [],
  859. currentId: 5,
  860. boilerData: [
  861. {
  862. title: '锅炉运行参数',
  863. params: []
  864. },
  865. {
  866. title: '注气检查记录',
  867. params: []
  868. },
  869. {
  870. title: '蒸汽质量检查记录',
  871. params: []
  872. }
  873. ],
  874. alertStatsData: [],
  875. alertLegend: [
  876. { name: '一般告警', percent: 45.2, color: '#3b82f6' },
  877. { name: '警告告警', percent: 35.3, color: '#f59e0b' },
  878. { name: '严重告警', percent: 4.7, color: '#ef4444', value: 58 },
  879. { name: '紧急告警', percent: 15.2, color: '#ef4444' }
  880. ],
  881. alertConfig: {},
  882. unitValue: '',
  883. unitOptions: [
  884. { label: '1#机组', value: '1' },
  885. { label: '2#机组', value: '2' },
  886. { label: '3#机组', value: '3' },
  887. { label: '4#机组', value: '4' }
  888. ],
  889. energyTabs: [
  890. { label: '水', value: '1' },
  891. { label: '煤', value: '2' }
  892. ],
  893. activeEnergyTab: '1',
  894. charts: {},
  895. stationId: ''
  896. };
  897. },
  898. watch: {
  899. isFullscreen: {
  900. handler() {
  901. this.handleResize();
  902. },
  903. immediate: true
  904. }
  905. },
  906. created() {
  907. this.init();
  908. },
  909. mounted() {
  910. this.updateTimer = setInterval(this.updateTime, 1000);
  911. this.initTimer = setInterval(() => {
  912. this.init();
  913. }, 180000);
  914. // 初始化时同步头部宽度
  915. // this.$nextTick(() => {
  916. // this.syncHeaderWidth();
  917. // });
  918. },
  919. beforeDestroy() {
  920. clearInterval(this.updateTimer);
  921. clearInterval(this.initTimer);
  922. window.removeEventListener('resize', this.handleResize);
  923. Object.values(this.charts).forEach((chart) => chart && chart.dispose());
  924. },
  925. methods: {
  926. init() {
  927. this.getYqpf();
  928. this.getSxyw();
  929. this.getGs();
  930. this.getSmq();
  931. this.getQp();
  932. this.getZzq();
  933. // this.getGwgrq();
  934. this.getDwgrq();
  935. this.getGmj1();
  936. this.getGmj2();
  937. this.getLc();
  938. this.getLt();
  939. this.getCcq();
  940. this.getYcfj();
  941. this.getEcfj();
  942. this.getYfj();
  943. this.getZgs()
  944. },
  945. onFullscreen() {
  946. this.isFullscreen = !this.isFullscreen;
  947. },
  948. updateTime() {
  949. const now = new Date();
  950. const hours = now.getHours().toString().padStart(2, '0');
  951. const minutes = now.getMinutes().toString().padStart(2, '0');
  952. const seconds = now.getSeconds().toString().padStart(2, '0');
  953. this.time = `${hours}:${minutes}:${seconds}`;
  954. const year = now.getFullYear();
  955. const month = (now.getMonth() + 1).toString().padStart(2, '0');
  956. const day = now.getDate().toString().padStart(2, '0');
  957. this.date = `${year}-${month}-${day}`;
  958. },
  959. syncHeaderWidth() {
  960. this.$nextTick(() => {
  961. const threeColumnLayout =
  962. document.querySelector('.two-column-layout');
  963. const headerSection = document.querySelector('.header-section');
  964. if (threeColumnLayout && headerSection) {
  965. const layoutWidth = threeColumnLayout.scrollWidth;
  966. headerSection.style.width = layoutWidth + 'px';
  967. }
  968. });
  969. },
  970. handleResize() {
  971. this.$nextTick(() => {
  972. Object.values(this.charts).forEach(
  973. (chart) => chart && chart.resize()
  974. );
  975. });
  976. },
  977. getYqpf() {
  978. const keys = ['颗粒物', 'NOX', 'O2', '排烟温度', 'SO2'];
  979. getRealData(this.yqpf.deviceId[this.currentId]).then((res) => {
  980. res.forEach((item) => {
  981. keys.forEach((key) => {
  982. if (item.identifier == this.yqpf[key][this.currentId]) {
  983. this.yqpf[key].value = {
  984. value: item.value,
  985. unit: item.unit
  986. };
  987. // console.log(this.yqpf[key]);
  988. // console.log(key);
  989. }
  990. });
  991. });
  992. });
  993. },
  994. getSxyw() {
  995. const keys = ['水位'];
  996. getRealData(this.sxyw.deviceId[this.currentId]).then((res) => {
  997. res.forEach((item) => {
  998. keys.forEach((key) => {
  999. if (item.identifier == this.sxyw[key][this.currentId]) {
  1000. this.sxyw[key].value = {
  1001. value: item.value,
  1002. unit: item.unit
  1003. };
  1004. }
  1005. });
  1006. });
  1007. });
  1008. },
  1009. getGs() {
  1010. const keys = ['给水压力', '出口流量'];
  1011. getRealData(this.gs.deviceId[this.currentId]).then((res) => {
  1012. res.forEach((item) => {
  1013. keys.forEach((key) => {
  1014. if (item.identifier == this.gs[key][this.currentId]) {
  1015. this.gs[key].value = {
  1016. value: item.value,
  1017. unit: item.unit
  1018. };
  1019. }
  1020. });
  1021. });
  1022. });
  1023. },
  1024. getSmq() {
  1025. const keys = ['出口水温'];
  1026. getRealData(this.smq.deviceId[this.currentId]).then((res) => {
  1027. res.forEach((item) => {
  1028. keys.forEach((key) => {
  1029. if (item.identifier == this.smq[key][this.currentId]) {
  1030. this.smq[key].value = {
  1031. value: item.value,
  1032. unit: item.unit
  1033. };
  1034. }
  1035. });
  1036. });
  1037. });
  1038. },
  1039. getQp() {
  1040. const keys = ['汽包进口温度', '汽包液位', '汽包出口温度'];
  1041. getRealData(this.qp.deviceId[this.currentId]).then((res) => {
  1042. res.forEach((item) => {
  1043. keys.forEach((key) => {
  1044. if (item.identifier == this.qp[key][this.currentId]) {
  1045. this.qp[key].value = {
  1046. value: item.value,
  1047. unit: item.unit
  1048. };
  1049. }
  1050. });
  1051. });
  1052. });
  1053. },
  1054. getZzq() {
  1055. const keys = ['主蒸汽压力', '主蒸汽温度'];
  1056. getRealData(this.zzq.deviceId[this.currentId]).then((res) => {
  1057. res.forEach((item) => {
  1058. keys.forEach((key) => {
  1059. if (item.identifier == this.zzq[key][this.currentId]) {
  1060. this.zzq[key].value = {
  1061. value: item.value,
  1062. unit: item.unit
  1063. };
  1064. }
  1065. });
  1066. });
  1067. });
  1068. },
  1069. getDwgrq() {
  1070. const keys = ['低温过热器前烟压', '进口温度'];
  1071. getRealData(this.dwgrq.deviceId[this.currentId]).then((res) => {
  1072. res.forEach((item) => {
  1073. keys.forEach((key) => {
  1074. if (item.identifier == this.dwgrq[key][this.currentId]) {
  1075. this.dwgrq[key].value = {
  1076. value: item.value,
  1077. unit: item.unit
  1078. };
  1079. }
  1080. });
  1081. });
  1082. });
  1083. },
  1084. getGmj1() {
  1085. const keys = ['频率'];
  1086. getRealData(this.gmj1.deviceId[this.currentId]).then((res) => {
  1087. res.forEach((item) => {
  1088. keys.forEach((key) => {
  1089. if (item.identifier == this.gmj1[key][this.currentId]) {
  1090. this.gmj1[key].value = {
  1091. value: item.value,
  1092. unit: item.unit
  1093. };
  1094. }
  1095. });
  1096. });
  1097. });
  1098. },
  1099. getGmj2() {
  1100. const keys = ['频率'];
  1101. getRealData(this.gmj2.deviceId[this.currentId]).then((res) => {
  1102. res.forEach((item) => {
  1103. keys.forEach((key) => {
  1104. if (item.identifier == this.gmj2[key][this.currentId]) {
  1105. this.gmj2[key].value = {
  1106. value: item.value,
  1107. unit: item.unit
  1108. };
  1109. }
  1110. });
  1111. });
  1112. });
  1113. },
  1114. getLc() {
  1115. const keys = ['料层差压左', '料层差压右'];
  1116. getRealData(this.lc.deviceId[this.currentId]).then((res) => {
  1117. res.forEach((item) => {
  1118. keys.forEach((key) => {
  1119. if (item.identifier == this.lc[key][this.currentId]) {
  1120. this.lc[key].value = {
  1121. value: item.value,
  1122. unit: item.unit
  1123. };
  1124. }
  1125. });
  1126. });
  1127. });
  1128. },
  1129. getLt() {
  1130. const keys = [
  1131. '下端温度左',
  1132. '沸中温度左',
  1133. '沸下温度左',
  1134. '下端温度右',
  1135. '沸中温度右',
  1136. '沸下温度右',
  1137. '炉膛温度左',
  1138. '炉膛出口温度右',
  1139. '炉膛出口压力'
  1140. ];
  1141. getRealData(this.lt.deviceId[this.currentId]).then((res) => {
  1142. res.forEach((item) => {
  1143. keys.forEach((key) => {
  1144. if (item.identifier == this.lt[key][this.currentId]) {
  1145. this.lt[key].value = {
  1146. value: item.value,
  1147. unit: item.unit
  1148. };
  1149. }
  1150. });
  1151. });
  1152. });
  1153. },
  1154. getCcq() {
  1155. const keys = ['后烟压', '出口烟温'];
  1156. getRealData(this.ccq.deviceId[this.currentId]).then((res) => {
  1157. res.forEach((item) => {
  1158. keys.forEach((key) => {
  1159. if (item.identifier == this.ccq[key][this.currentId]) {
  1160. this.ccq[key].value = {
  1161. value: item.value,
  1162. unit: item.unit
  1163. };
  1164. }
  1165. });
  1166. });
  1167. });
  1168. },
  1169. getYcfj() {
  1170. const keys = ['频率'];
  1171. getRealData(this.ycfj.deviceId[this.currentId]).then((res) => {
  1172. res.forEach((item) => {
  1173. keys.forEach((key) => {
  1174. if (item.identifier == this.ycfj[key][this.currentId]) {
  1175. this.ycfj[key].value = {
  1176. value: item.value,
  1177. unit: item.unit
  1178. };
  1179. }
  1180. });
  1181. });
  1182. });
  1183. },
  1184. getEcfj() {
  1185. const keys = ['风压'];
  1186. getRealData(this.ecfj.deviceId[this.currentId]).then((res) => {
  1187. res.forEach((item) => {
  1188. keys.forEach((key) => {
  1189. if (item.identifier == this.ecfj[key][this.currentId]) {
  1190. this.ecfj[key].value = {
  1191. value: item.value,
  1192. unit: item.unit
  1193. };
  1194. }
  1195. });
  1196. });
  1197. });
  1198. },
  1199. getYfj() {
  1200. const keys = ['频率'];
  1201. getRealData(this.yfj.deviceId[this.currentId]).then((res) => {
  1202. res.forEach((item) => {
  1203. keys.forEach((key) => {
  1204. if (item.identifier == this.yfj[key][this.currentId]) {
  1205. this.yfj[key].value = {
  1206. value: item.value,
  1207. unit: item.unit
  1208. };
  1209. }
  1210. });
  1211. });
  1212. });
  1213. },
  1214. getZgs() {
  1215. const keys = ['进口流量'];
  1216. getRealData(this.zgs.deviceId[this.currentId]).then((res) => {
  1217. res.forEach((item) => {
  1218. keys.forEach((key) => {
  1219. if (item.identifier == this.zgs[key][this.currentId]) {
  1220. this.zgs[key].value = {
  1221. value: item.value,
  1222. unit: item.unit
  1223. };
  1224. }
  1225. });
  1226. });
  1227. });
  1228. }
  1229. }
  1230. };
  1231. </script>
  1232. <style lang="scss" scoped>
  1233. .box-container {
  1234. width: 100%;
  1235. overflow: hidden;
  1236. font-family: 'Microsoft YaHei', sans-serif;
  1237. display: flex;
  1238. flex-direction: column;
  1239. background: url('~@/assets/pcs/back.png') no-repeat center center;
  1240. background-size: cover;
  1241. .box-header-scroll {
  1242. height: 80px;
  1243. background: url('~@/assets/pcs/header.png') no-repeat center top;
  1244. background-size: 100% 100%;
  1245. display: flex;
  1246. align-items: center;
  1247. justify-content: center;
  1248. padding: 0 20px;
  1249. position: relative;
  1250. z-index: 10;
  1251. .logo {
  1252. padding-top: 10px;
  1253. position: absolute;
  1254. left: 80px;
  1255. ::v-deep .custom-select {
  1256. .el-input__inner {
  1257. background: #0d2960;
  1258. border: 1px solid #1a4a8a;
  1259. color: #fff;
  1260. height: 36px;
  1261. line-height: 36px;
  1262. &::placeholder {
  1263. color: #8ba3c7;
  1264. }
  1265. }
  1266. .el-input__suffix {
  1267. .el-input__icon {
  1268. color: #8ba3c7;
  1269. }
  1270. }
  1271. }
  1272. }
  1273. .title {
  1274. flex: 1;
  1275. text-align: center;
  1276. font-size: 28px;
  1277. font-weight: bold;
  1278. color: #fff;
  1279. text-shadow: 0 0 10px rgba(59, 130, 246, 0.5);
  1280. letter-spacing: 4px;
  1281. }
  1282. .time {
  1283. position: absolute;
  1284. right: 30px;
  1285. width: 280px;
  1286. display: flex;
  1287. align-items: center;
  1288. justify-content: flex-end;
  1289. gap: 15px;
  1290. .time-display {
  1291. display: flex;
  1292. flex-direction: column;
  1293. align-items: flex-end;
  1294. .date-text {
  1295. font-size: 14px;
  1296. color: #8ba3c7;
  1297. }
  1298. .time-text {
  1299. font-size: 20px;
  1300. font-weight: bold;
  1301. color: #fff;
  1302. }
  1303. }
  1304. .fullscreen-toggle {
  1305. cursor: pointer;
  1306. font-size: 20px;
  1307. color: #8ba3c7;
  1308. transition: color 0.3s;
  1309. &:hover {
  1310. color: #3b82f6;
  1311. }
  1312. }
  1313. }
  1314. }
  1315. .header-section {
  1316. width: auto;
  1317. flex-shrink: 0;
  1318. padding-top: 10px;
  1319. min-width: 100%;
  1320. }
  1321. .main-content {
  1322. display: flex;
  1323. flex-direction: column;
  1324. justify-content: space-between;
  1325. height: calc(100% - 100px);
  1326. min-width: 100%;
  1327. margin-top: 20px;
  1328. font-size: 0;
  1329. padding: 0 15px 15px;
  1330. gap: 15px;
  1331. }
  1332. .system-panel {
  1333. flex: 1;
  1334. min-height: 0;
  1335. display: flex;
  1336. flex-direction: column;
  1337. border-radius: 8px;
  1338. overflow: hidden;
  1339. .panel-title {
  1340. font-size: 24px;
  1341. font-family: 'YouSheBiaoTiHei', 'Microsoft YaHei', sans-serif;
  1342. color: #fff;
  1343. margin-bottom: 10px;
  1344. height: 42px;
  1345. padding-left: 40px;
  1346. position: relative;
  1347. display: flex;
  1348. align-items: center;
  1349. background: url('~@/assets/pcs/titleb.png') no-repeat center top;
  1350. background-size: 100% 100%;
  1351. flex-shrink: 0;
  1352. .panel-icon {
  1353. position: absolute;
  1354. left: 15px;
  1355. width: 20px;
  1356. height: 25px;
  1357. background: url('~@/assets/pcs/titleIcon.png') no-repeat center top;
  1358. background-size: 100% 100%;
  1359. }
  1360. }
  1361. .panel-body {
  1362. flex: 1;
  1363. min-height: 0;
  1364. position: relative;
  1365. overflow: hidden;
  1366. padding: 0 50px;
  1367. .bg-image {
  1368. position: absolute;
  1369. top: 0;
  1370. left: 0;
  1371. width: 100%;
  1372. height: 100%;
  1373. background-repeat: no-repeat;
  1374. background-position: center center;
  1375. background-size: 100% 100%;
  1376. z-index: 1;
  1377. &.combustion-bg {
  1378. background-image: url('~@/assets/home1.png');
  1379. left: 80px;
  1380. width: auto;
  1381. right: 100px;
  1382. }
  1383. &.steam-bg {
  1384. background-image: url('~@/assets/home2.png');
  1385. left: 80px;
  1386. // top: 30px;
  1387. right: 10%;
  1388. width: auto;
  1389. }
  1390. }
  1391. .overlay-labels {
  1392. position: absolute;
  1393. top: 0;
  1394. left: 0;
  1395. width: 100%;
  1396. height: 100%;
  1397. z-index: 2;
  1398. .label {
  1399. position: absolute;
  1400. white-space: nowrap;
  1401. z-index: 3;
  1402. &.data-box {
  1403. background: #fff;
  1404. color: #333;
  1405. font-size: 12px;
  1406. font-weight: 500;
  1407. padding: 3px 8px;
  1408. border-radius: 3px;
  1409. border: 1px solid #ddd;
  1410. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  1411. }
  1412. &.device-name {
  1413. color: #fff;
  1414. font-size: 14px;
  1415. font-weight: bold;
  1416. text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
  1417. padding: 2px 4px;
  1418. }
  1419. }
  1420. }
  1421. }
  1422. &.combustion-panel {
  1423. flex: 1.2;
  1424. }
  1425. &.steam-panel {
  1426. flex: 1.5;
  1427. }
  1428. }
  1429. .emission-panel {
  1430. position: absolute;
  1431. right: 1%;
  1432. top: 8%;
  1433. width: 170px;
  1434. display: flex;
  1435. flex-direction: column;
  1436. gap: 20px;
  1437. padding: 10px 8px;
  1438. // background: rgba(10, 25, 60, 0.5);
  1439. // border: 1px solid rgba(43, 111, 216, 0.2);
  1440. border-radius: 4px;
  1441. z-index: 20;
  1442. .emission-item {
  1443. display: flex;
  1444. justify-content: space-between;
  1445. align-items: center;
  1446. padding: 4px 2px;
  1447. .emission-label {
  1448. color: #fff;
  1449. font-size: 16px;
  1450. white-space: nowrap;
  1451. }
  1452. .emission-value {
  1453. color: #333;
  1454. font-size: 13px;
  1455. font-weight: 500;
  1456. background: #fff;
  1457. border: 1px solid #ddd;
  1458. border-radius: 3px;
  1459. padding: 2px 8px;
  1460. min-width: 70px;
  1461. text-align: center;
  1462. white-space: nowrap;
  1463. }
  1464. }
  1465. }
  1466. }
  1467. [v-cloak] {
  1468. display: none;
  1469. }
  1470. </style>