index.vue 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. <template>
  2. <div class="bodys">
  3. <div class="edge" v-if="Object.keys(monitorInfo).length">
  4. <div class="info" style="position: relative">
  5. <div class="info-wrapper">
  6. <!-- <div class="ps-info">
  7. <div class="ps-title">厂商名称:</div>
  8. <div class="ps-name">{{ otherInfo?.manufacturer }}</div>
  9. </div> -->
  10. <div class="ps-info" @click="handleXhClick(windInfo)">
  11. <div class="ps-title">设备型号:</div>
  12. <div class="ps-name">{{ otherInfo?.model }}</div>
  13. </div>
  14. </div>
  15. <div class="info-wrapper">
  16. <div class="info-title" :class="colorList[monitorInfo.status]">
  17. <span class="text">设备名称: {{ windname }}</span>
  18. </div>
  19. <div class="wt-alarm" @click="handleAlarm(wtid)">
  20. <i
  21. class="svg-icon svg-icon-sm"
  22. :class="'svg-icon-' + colorList[monitorInfo.status]"
  23. >
  24. <svgIcon svgid="svg-station-surveillance"></svgIcon>
  25. </i>
  26. <span :class="colorList[monitorInfo.status]">设备报警</span>
  27. </div>
  28. </div>
  29. <div class="info-item">
  30. 日发电量
  31. <div class="info-value">
  32. {{ Number(monitorInfo?.rfdl).toFixed(2) || "0" }}
  33. <div class="unit">kWh</div>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="monitoring">
  38. <div class="monitoring-item">
  39. <div class="point point-left bottom"></div>
  40. <div class="point point-right bottom"></div>
  41. 监测信息
  42. </div>
  43. <div class="wind-info-list">
  44. <div class="wind-info">
  45. 风速
  46. <div class="wind-value">
  47. {{ Number(monitorInfo?.fs).toFixed(2) }}
  48. <div class="unit">m/s</div>
  49. </div>
  50. </div>
  51. <div class="wind-info">
  52. 风向
  53. <div class="wind-value">
  54. {{ Number(monitorInfo?.fx).toFixed(2) }}
  55. <div class="unit">°</div>
  56. </div>
  57. </div>
  58. <div class="wind-info">
  59. 实时功率
  60. <div class="wind-value">
  61. {{ Number(monitorInfo?.ssgl).toFixed(2) }}
  62. <div class="unit">kW</div>
  63. </div>
  64. </div>
  65. <div class="wind-info">
  66. 无功功率
  67. <div class="wind-value">
  68. {{ Number(monitorInfo?.wggl).toFixed(2) }}
  69. <div class="unit">kW</div>
  70. </div>
  71. </div>
  72. <div class="wind-info">
  73. 理论功率
  74. <div class="wind-value">
  75. {{ Number(monitorInfo?.llgl).toFixed(2) }}
  76. <div class="unit">kW</div>
  77. </div>
  78. </div>
  79. <div class="wind-info">
  80. 保证功率
  81. <div class="wind-value">
  82. {{ Number(monitorInfo?.bzgl).toFixed(2) }}
  83. <div class="unit">kW</div>
  84. </div>
  85. </div>
  86. <div class="wind-info">
  87. 叶轮转速
  88. <div class="wind-value">
  89. {{ Number(monitorInfo?.ylzs).toFixed(2) }}
  90. <div class="unit">rpm</div>
  91. </div>
  92. </div>
  93. <div class="wind-info">
  94. 故障损失
  95. <div class="wind-value">
  96. {{ Number(monitorInfo?.gzss).toFixed(2) }}
  97. <div class="unit">kWh</div>
  98. </div>
  99. </div>
  100. <div class="wind-info">
  101. 检修损失
  102. <div class="wind-value">
  103. {{ Number(monitorInfo?.jxss).toFixed(2) }}
  104. <div class="unit">kWh</div>
  105. </div>
  106. </div>
  107. <div class="wind-info">
  108. 限电损失
  109. <div class="wind-value">
  110. {{ Number(monitorInfo?.xdss).toFixed(2) }}
  111. <div class="unit">kWh</div>
  112. </div>
  113. </div>
  114. <div class="wind-info">
  115. 性能损失
  116. <div class="wind-value">
  117. {{ Number(monitorInfo?.xnss).toFixed(2) }}
  118. <div class="unit">kWh</div>
  119. </div>
  120. </div>
  121. <div class="wind-info">
  122. 受累损失
  123. <div class="wind-value">
  124. {{ Number(monitorInfo?.slss).toFixed(2) }}
  125. <div class="unit">kWh</div>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. </div>
  131. <div class="parts">
  132. <div class="part-top">
  133. <div class="part-title">
  134. <div
  135. class="title-item part-left"
  136. :class="{ active: current === 'fdj' }"
  137. @click="handleClick('fdj')"
  138. >
  139. 发电机
  140. </div>
  141. <div
  142. v-if="otherInfo?.model != 'XE100-2000'"
  143. class="title-item"
  144. :class="{ active: current === 'clx' }"
  145. @click="handleClick('clx')"
  146. >
  147. 齿轮箱
  148. </div>
  149. <div
  150. class="title-item"
  151. :class="{ active: current === 'bj' }"
  152. @click="handleClick('bj')"
  153. >
  154. 变桨
  155. </div>
  156. <div
  157. class="title-item"
  158. :class="{ active: current === 'ph' }"
  159. @click="handleClick('ph')"
  160. >
  161. 偏航
  162. </div>
  163. <div
  164. class="title-item"
  165. :class="{ active: current === 'yy' }"
  166. @click="handleClick('yy')"
  167. >
  168. 液压
  169. </div>
  170. <div
  171. class="title-item"
  172. :class="{ active: current === 'jc' }"
  173. @click="handleClick('jc')"
  174. >
  175. 机舱信息
  176. </div>
  177. <div
  178. class="title-item part-right"
  179. :class="{ active: current === 'qt' }"
  180. @click="handleClick('qt')"
  181. >
  182. 其他
  183. </div>
  184. </div>
  185. <div class="part-imgs" v-if="otherInfo?.model == 'XE100-2000'">
  186. <img
  187. class="wind-part"
  188. :style="{ width: flag ? '450px' : '500px' }"
  189. src="@assets/imgs/zqfj.png"
  190. />
  191. </div>
  192. <div class="part-imgs" v-else>
  193. <img
  194. v-if="current === 'fdj'"
  195. class="wind-part"
  196. :style="{ width: flag ? '650px' : '800px' }"
  197. src="@assets/imgs/fdj.png"
  198. />
  199. <img
  200. v-if="current === 'clx'"
  201. class="wind-part"
  202. :style="{ width: flag ? '650px' : '800px' }"
  203. src="@assets/imgs/clx.png"
  204. />
  205. <img
  206. v-if="current === 'bj'"
  207. class="wind-part"
  208. :style="{ width: flag ? '650px' : '800px' }"
  209. src="@assets/imgs/bj.png"
  210. />
  211. <img
  212. v-if="current === 'ph'"
  213. class="wind-part"
  214. :style="{ width: flag ? '650px' : '800px' }"
  215. src="@assets/imgs/ph.png"
  216. />
  217. <img
  218. v-if="current === 'yy'"
  219. class="wind-part"
  220. :style="{ width: flag ? '650px' : '800px' }"
  221. src="@assets/imgs/yy.png"
  222. />
  223. <img
  224. v-if="current === 'jc'"
  225. class="wind-part"
  226. :style="{ width: flag ? '650px' : '800px' }"
  227. src="@assets/imgs/jc.png"
  228. />
  229. <img
  230. v-if="current === 'qt'"
  231. class="wind-part"
  232. :style="{ width: flag ? '650px' : '800px' }"
  233. src="@assets/imgs/qt.png"
  234. />
  235. </div>
  236. </div>
  237. <div class="part-info">
  238. <div
  239. class="part-body"
  240. style="max-height: 220px"
  241. v-if="partDInfos.length"
  242. >
  243. <div class="monitoring-item">
  244. <div class="point point-left bottom"></div>
  245. <div class="point point-right bottom"></div>
  246. 遥信值
  247. </div>
  248. <div class="part-item">
  249. <div
  250. class="part"
  251. :class="{ active: index % 2 === 1 }"
  252. v-for="(val, index) in partDInfos"
  253. :key="index"
  254. >
  255. <div class="table-item" v-for="(item, ind) in val" :key="ind">
  256. <div>{{ item.name }}</div>
  257. <div
  258. class="table-value"
  259. :class="item.value == 1 ? 'round-red' : 'round'"
  260. ></div>
  261. </div>
  262. </div>
  263. </div>
  264. </div>
  265. <div
  266. class="part-body"
  267. style="max-height: 220px"
  268. v-if="partAInfos.length"
  269. >
  270. <div class="monitoring-item">
  271. <div class="point point-left bottom"></div>
  272. <div class="point point-right bottom"></div>
  273. 遥测值
  274. </div>
  275. <div class="part-item">
  276. <div
  277. class="part"
  278. :class="{ active: index % 2 === 1 }"
  279. v-for="(val, index) in partAInfos"
  280. :key="index"
  281. >
  282. <div class="table-item" v-for="(item, ind) in val" :key="ind">
  283. <div>{{ item.name }}</div>
  284. <div class="table-value">
  285. {{ Number(item.value).toFixed(2) }}
  286. <div v-if="item.valueUnit != 'NULL'" class="unit">
  287. {{ item.valueUnit }}
  288. </div>
  289. </div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. </div>
  295. </div>
  296. <alarmDialog ref="alarmDialog" />
  297. <powerAndSpeed ref="powerAndSpeed" :tabEvent="-1" />
  298. </div>
  299. </template>
  300. <script>
  301. import { GetWtPoints, GetPointsData } from "@/api/points/index.js";
  302. import powerAndSpeed from "@/components/powerAndSpeedSearch/index.vue";
  303. import {
  304. GetWtMonitorInfo,
  305. GetWtTelemeteryInfo,
  306. GetWtOtherInfo,
  307. } from "@/api/factoryMonitor/index.js";
  308. import svgIcon from "@/components/coms/icon/svg-icon.vue";
  309. import alarmDialog from "@/components/alarm";
  310. export default {
  311. name: "windDetail",
  312. data() {
  313. return {
  314. current: "fdj",
  315. windname: "",
  316. wtid: "",
  317. wpid: "",
  318. windInfo: {},
  319. monitorInfo: {},
  320. otherInfo: {},
  321. partAInfo: [],
  322. partDInfo: [],
  323. partAInfos: [],
  324. partDInfos: [],
  325. uniformcodesA: [],
  326. uniformcodesD: [],
  327. resA: [],
  328. resD: [],
  329. indexe: 0,
  330. videoTit: [],
  331. dialogVisible: false,
  332. reliable: {},
  333. colorList: ["blue", "green", "red", "orange", "pink", "write", "gray"],
  334. path: ["camera.png", "camera2.png"],
  335. count: 0,
  336. colorFlag: false,
  337. timer: "",
  338. times: "",
  339. };
  340. },
  341. components: { svgIcon, alarmDialog, powerAndSpeed },
  342. apiUrl: "",
  343. props: {
  344. wind: {
  345. type: Object,
  346. default: () => {},
  347. },
  348. flag: {
  349. type: Boolean,
  350. default: false,
  351. },
  352. },
  353. computed: {
  354. windSpeedRota() {
  355. let count = this.windStatus?.SSPJFS / 25;
  356. let result = Number((310 * count + 50).toFixed(0));
  357. if (result) {
  358. if (result > 310) {
  359. return "rotateZ(310deg)";
  360. } else {
  361. return "rotateZ(" + Number((310 * count + 50).toFixed(0)) + "deg)";
  362. }
  363. } else {
  364. return "rotateZ(50deg)";
  365. }
  366. },
  367. },
  368. mounted() {
  369. this.timer = setInterval(() => {
  370. if (Object.keys(this.windInfo).length) {
  371. this.getWtMonitorInfo(this.windInfo);
  372. this.getPointsData(this.resA, this.resD);
  373. }
  374. }, 5000);
  375. this.times = setInterval(() => {
  376. this.count++;
  377. if (this.count > 1) {
  378. this.count = 0;
  379. }
  380. }, 800);
  381. if (document.getElementById("ifrId")) {
  382. const oIframe = document.getElementById("ifrId");
  383. const deviceWidth = document.getElementById("ifVideo").offsetWidth;
  384. const deviceHeight = document.getElementById("ifVideo").offsetHeight;
  385. oIframe.style.width = deviceWidth + "px";
  386. oIframe.style.height = deviceHeight + "px";
  387. }
  388. },
  389. unmounted() {
  390. clearInterval(this.timer);
  391. this.timer = null;
  392. clearInterval(this.times);
  393. this.times = null;
  394. },
  395. watch: {
  396. wind: {
  397. handler() {
  398. if (Object.keys(this.wind).length) {
  399. this.start(this.wind);
  400. }
  401. },
  402. },
  403. $route: {
  404. handler(val) {
  405. if (
  406. val.path.includes("lightmatrix") ||
  407. val.path.includes("detailmatrix") ||
  408. val.path.includes("draughtFan")
  409. ) {
  410. this.colorFlag = true;
  411. }
  412. },
  413. immediate: true,
  414. },
  415. },
  416. methods: {
  417. handleXhClick(wind) {
  418. // console.log(wind);
  419. this.$refs.powerAndSpeed && this.$refs.powerAndSpeed.init(wind);
  420. },
  421. cancle() {
  422. this.windInfo = {};
  423. this.windname = "";
  424. this.wtid = "";
  425. this.current = "fdj";
  426. this.monitorInfo = {};
  427. this.partAInfo = [];
  428. this.partDInfo = [];
  429. this.partAInfos = [];
  430. this.partDInfos = [];
  431. this.uniformcodesA = [];
  432. this.uniformcodesD = [];
  433. this.resA = [];
  434. this.resD = [];
  435. },
  436. // 页面初始信息
  437. start(val) {
  438. if (Object.keys(val).length) {
  439. this.windInfo = val;
  440. this.windname = val.wtname;
  441. this.wtid = val.wtid;
  442. this.wpid = val.wpid;
  443. this.current = "fdj";
  444. this.getWtMonitorInfo(val);
  445. this.getWtOtherInfo(val);
  446. this.handleClick("fdj");
  447. } else {
  448. this.cancle();
  449. }
  450. },
  451. // 设备监测信息
  452. getWtMonitorInfo(val) {
  453. if (val.wtType == -1) {
  454. GetWtMonitorInfo({ wtid: val.wtid }).then(({ data }) => {
  455. this.monitorInfo = data.data;
  456. this.monitorInfo.rfdl =
  457. this.monitorInfo.rfdl < 0 ? 0 : this.monitorInfo.rfdl;
  458. // for(var key in this.monitorInfo){
  459. // this.monitorInfo[key]=this.monitorInfo[key] < 0 ? 0 : this.monitorInfo[key];
  460. // }
  461. });
  462. } else {
  463. this.monitorInfo = {};
  464. }
  465. },
  466. // 设备其他信息
  467. getWtOtherInfo(val) {
  468. GetWtOtherInfo({ wtid: val.wtid }).then((res) => {
  469. if (res.code == 200) {
  470. this.otherInfo = res.data;
  471. }
  472. });
  473. },
  474. // 查看各部位编码
  475. handleClick(val) {
  476. this.current = val;
  477. if (this.wtid) {
  478. this.getPartInfo();
  479. }
  480. },
  481. // 统一编码
  482. getPartInfo() {
  483. if (this.windInfo.wtType == -1) {
  484. if (this.wtid.length && this.current) {
  485. GetWtTelemeteryInfo({
  486. part: this.current,
  487. wtid: this.wtid,
  488. }).then(({ data }) => {
  489. // 拿到初始获取数据
  490. this.partAInfo = data.data.AI;
  491. this.partDInfo = data.data.DI;
  492. // 拿到数据的uniformcode集合
  493. this.uniformcodesD = this.partDInfo.length
  494. ? this.partDInfo.map((item) => item.uniformCode)
  495. : [];
  496. this.uniformcodesA = this.partAInfo.length
  497. ? this.partAInfo.map((item) => item.uniformCode)
  498. : [];
  499. // 获取测点数据
  500. this.getPointsIds();
  501. });
  502. }
  503. }
  504. },
  505. getPointsIds() {
  506. let pointsIdsA = new Promise((resolve, reject) => {
  507. GetWtPoints({
  508. wtid: this.wtid,
  509. uniformcodes: this.uniformcodesA,
  510. })
  511. .then(({ data }) => {
  512. resolve(data);
  513. })
  514. .catch((e) => {
  515. reject("发生错误");
  516. });
  517. });
  518. let pointsIdsD = new Promise((resolve, reject) => {
  519. GetWtPoints({
  520. wtid: this.wtid,
  521. uniformcodes: this.uniformcodesD,
  522. })
  523. .then(({ data }) => {
  524. resolve(data);
  525. })
  526. .catch((e) => {
  527. // 标记失败后给定某个数据
  528. reject("发生错误");
  529. });
  530. });
  531. Promise.all([pointsIdsA, pointsIdsD])
  532. .then((results) => {
  533. this.resA = results[0].data.length
  534. ? results[0].data.map((item) => (item != null ? item.nemCode : ""))
  535. : [];
  536. this.resD = results[1].data.length
  537. ? results[1].data.map((item) => (item != null ? item.nemCode : ""))
  538. : [];
  539. this.getPointsData(this.resA, this.resD);
  540. })
  541. .catch((e) => {
  542. console.log("error", e);
  543. });
  544. },
  545. getPointsData(pointsA, pointsD) {
  546. let pointsDataA = new Promise((resolve, reject) => {
  547. GetPointsData({
  548. pointIds: pointsA,
  549. })
  550. .then(({ data }) => {
  551. resolve(data);
  552. })
  553. .catch((e) => {
  554. // 标记失败后给定某个数据
  555. reject("发生错误");
  556. });
  557. });
  558. let pointsDataD = new Promise((resolve, reject) => {
  559. GetPointsData({
  560. pointIds: pointsD,
  561. })
  562. .then(({ data }) => {
  563. resolve(data);
  564. })
  565. .catch((e) => {
  566. // 标记失败后给定某个数据
  567. reject("发生错误");
  568. });
  569. });
  570. Promise.all([pointsDataA, pointsDataD])
  571. .then((results) => {
  572. let pointsInfoA = results[0].data.length ? results[0].data : [];
  573. let pointsInfoD = results[1].data.length ? results[1].data : [];
  574. let partAInfo = [];
  575. let partDInfo = [];
  576. let chunk = 4;
  577. this.partAInfo.forEach((item, index) => {
  578. pointsInfoA.forEach((i, ind) => {
  579. if (index == ind) {
  580. item.value = i.pointValueInDouble;
  581. }
  582. });
  583. });
  584. for (let i = 0, j = this.partAInfo.length; i < j; i += chunk) {
  585. partAInfo.push(this.partAInfo.slice(i, i + chunk));
  586. }
  587. this.partDInfo.forEach((item, index) => {
  588. pointsInfoD.forEach((i, ind) => {
  589. if (index == ind) {
  590. item.value = i.pointValueInDouble;
  591. }
  592. });
  593. });
  594. for (let m = 0, n = this.partDInfo.length; m < n; m += chunk) {
  595. partDInfo.push(this.partDInfo.slice(m, m + chunk));
  596. }
  597. this.partDInfos = partDInfo;
  598. this.partAInfos = partAInfo;
  599. console.log(this.partAInfos);
  600. })
  601. .catch((e) => {
  602. // 失败的时候则返回最先被reject失败状态的值
  603. console.log("error", e);
  604. });
  605. },
  606. //打开报警页面
  607. handleAlarm(id) {
  608. this.$refs.alarmDialog &&
  609. this.$refs.alarmDialog.openDialog(id, this.wpid, this.windInfo.wtType);
  610. },
  611. clickVideo(index) {
  612. this.indexe = index;
  613. },
  614. clivkFun() {
  615. this.dialogVisible = true;
  616. },
  617. },
  618. };
  619. </script>
  620. <style lang="less" scoped>
  621. .icLi {
  622. background: rgba(0, 70, 199, 0.1);
  623. border-radius: 20px;
  624. color: #b3b3b3;
  625. }
  626. .actives {
  627. background: rgba(0, 70, 199, 0.4);
  628. border-radius: 20px;
  629. color: #f5f7fa;
  630. }
  631. .bodys {
  632. display: flex;
  633. flex-direction: row;
  634. width: 100%;
  635. height: 100%;
  636. .edge {
  637. width: 400px;
  638. display: flex;
  639. height: 100%;
  640. flex-direction: column;
  641. //
  642. .info {
  643. width: 100%;
  644. flex: 0 0 auto;
  645. padding: 10px 15px;
  646. // background-color: rgba(11, 12, 12, 0.45);
  647. background-color: rgba(96, 103, 105, 0.2);
  648. border-radius: 5px;
  649. display: flex;
  650. flex-direction: column;
  651. .info-wrapper {
  652. display: flex;
  653. width: 100%;
  654. align-items: center;
  655. justify-content: space-between;
  656. margin-bottom: 10px;
  657. .ps-info {
  658. display: flex;
  659. align-items: center;
  660. margin-bottom: -5px;
  661. white-space: nowrap;
  662. color: #959595;
  663. font-size: 15px;
  664. &:nth-child(2) {
  665. cursor: pointer;
  666. &:hover,
  667. &:active {
  668. font-weight: 700;
  669. }
  670. }
  671. }
  672. }
  673. .info-title {
  674. width: 50%;
  675. height: 25px;
  676. font-size: 16px;
  677. font-family: Microsoft YaHei;
  678. font-weight: 400;
  679. display: flex;
  680. flex-direction: row;
  681. align-items: center;
  682. justify-content: center;
  683. white-space: nowrap;
  684. &.green {
  685. background-color: rgba(5, 187, 76, 0.2);
  686. // border: 1px solid #05bb4c;
  687. color: #05bb4c;
  688. }
  689. &.blue {
  690. background-color: rgba(0, 70, 199, 0.2);
  691. // border: 1px solid #3c88f7;
  692. color: #1c99ff;
  693. }
  694. &.pink {
  695. background-color: rgba(197, 48, 200, 0.2);
  696. // border: 1px solid #c530c8;
  697. color: #c530c8;
  698. }
  699. &.red {
  700. background-color: rgba(186, 50, 55, 0.2);
  701. // border: 1px solid #ba3237;
  702. color: #ba3237;
  703. }
  704. &.orange {
  705. background-color: rgba(225, 125, 36, 0.2);
  706. // border: 1px solid #e17d24;
  707. color: #e17d24;
  708. }
  709. &.write {
  710. background-color: rgba(255, 255, 255, 0.2);
  711. // border: 1px solid #ffffff;
  712. color: #ffffff;
  713. }
  714. &.gray {
  715. background-color: rgba(96, 103, 105, 0.2);
  716. // border: 1px solid #606769;
  717. color: #606769;
  718. }
  719. }
  720. .wt-alarm {
  721. font-family: Microsoft YaHei;
  722. font-weight: 400;
  723. span {
  724. margin-left: 5px;
  725. &.green {
  726. color: #05bb4c;
  727. }
  728. &.blue {
  729. color: #1c99ff;
  730. }
  731. &.pink {
  732. color: #c530c8;
  733. }
  734. &.red {
  735. color: #ba3237;
  736. }
  737. &.orange {
  738. color: #e17d24;
  739. }
  740. &.write {
  741. color: #ffffff;
  742. }
  743. &.gray {
  744. color: #606769;
  745. }
  746. }
  747. }
  748. .info-item {
  749. font-size: 24px;
  750. font-family: Adobe Heiti Std;
  751. font-weight: normal;
  752. color: #ffffff;
  753. display: flex;
  754. align-items: center;
  755. justify-content: space-between;
  756. }
  757. .info-value {
  758. display: flex;
  759. flex-direction: row;
  760. align-items: baseline;
  761. font-size: 40px;
  762. font-family: Arial;
  763. font-weight: 400;
  764. color: #05bb4c;
  765. white-space: nowrap;
  766. .unit {
  767. font-size: 24px;
  768. font-family: Adobe Heiti Std;
  769. font-weight: normal;
  770. // margin-right: 20px;
  771. }
  772. }
  773. }
  774. .monitoring {
  775. width: 100%;
  776. flex: 1 0 auto;
  777. background-color: rgba(96, 103, 105, 0.2);
  778. // background-color: rgba(11, 12, 12, 0.45);
  779. border-radius: 5px;
  780. margin-top: 10px;
  781. display: flex;
  782. flex-direction: column;
  783. align-items: center;
  784. }
  785. .wind-info-list {
  786. height: calc(100% - 42px);
  787. width: 100%;
  788. display: flex;
  789. flex-direction: column;
  790. }
  791. .wind-info {
  792. flex: 1 0 auto;
  793. display: flex;
  794. flex-direction: row;
  795. align-items: center;
  796. justify-content: space-between;
  797. width: 100%;
  798. padding: 0 10%;
  799. font-size: 14px;
  800. font-family: Source Han Sans SC;
  801. font-weight: 400;
  802. color: #959595;
  803. .wind-value {
  804. display: flex;
  805. flex-direction: row;
  806. align-items: baseline;
  807. font-size: 16px;
  808. font-family: Arial;
  809. font-weight: 400;
  810. color: #05bb4c;
  811. .unit {
  812. font-size: 12px;
  813. font-family: Source Han Sans SC;
  814. font-weight: 400;
  815. color: #959595;
  816. width: 40px;
  817. margin-left: 15px;
  818. }
  819. }
  820. }
  821. }
  822. .parts {
  823. width: calc(100% - 400px - 20px);
  824. margin-left: 20px;
  825. height: 100%;
  826. display: flex;
  827. flex-direction: column;
  828. align-items: center;
  829. justify-content: space-between;
  830. // position: relative;
  831. .part-top {
  832. flex: 1;
  833. width: 100%;
  834. text-align: center;
  835. }
  836. .part-title {
  837. width: 100%;
  838. height: 30px;
  839. display: flex;
  840. align-items: center;
  841. flex-direction: row;
  842. justify-content: center;
  843. .title-item {
  844. width: 140px;
  845. height: 100%;
  846. display: flex;
  847. align-items: center;
  848. color: #b3bdc0;
  849. justify-content: center;
  850. // background: rgba(67, 81, 107, 0.2);
  851. background: rgba(96, 103, 105, 0.2);
  852. border-left: 1px solid #3b6c53;
  853. border-top: 1px solid #3b6c53;
  854. border-bottom: 1px solid #3b6c53;
  855. &.part-left {
  856. border-radius: 15px 0px 0px 15px;
  857. }
  858. &.part-right {
  859. border-right: 1px solid #3b6c53;
  860. border-radius: 0px 15px 15px 0px;
  861. }
  862. &.active {
  863. // background-color: rgba(0, 70, 199, 0.4);
  864. background-color: rgba(0, 199, 19, 0.4);
  865. color: #ffffff;
  866. }
  867. }
  868. }
  869. .part-imgs {
  870. min-height: calc(100% - 30px);
  871. position: relative;
  872. }
  873. .wind-part {
  874. position: absolute;
  875. top: 50%;
  876. left: 50%;
  877. transform: translate(-50%, -50%);
  878. }
  879. .part-info {
  880. width: 100%;
  881. max-height: 440px;
  882. bottom: 0px;
  883. display: flex;
  884. flex-direction: column-reverse;
  885. [v-cloak] {
  886. display: none;
  887. }
  888. .part-body {
  889. width: 100%;
  890. padding-bottom: 20px;
  891. // background: rgba(11, 12, 12, 0.45);
  892. background: rgba(96, 103, 105, 0.2);
  893. border-radius: 5px;
  894. margin-top: 10px;
  895. display: flex;
  896. flex-direction: column;
  897. align-items: center;
  898. padding: 10px 0;
  899. .part-item {
  900. width: 100%;
  901. height: calc(100% - 42px);
  902. overflow-y: scroll;
  903. }
  904. .part {
  905. width: 100%;
  906. display: flex;
  907. flex-direction: row;
  908. margin-top: 5px;
  909. font-size: 13px;
  910. font-family: Source Han Sans SC;
  911. font-weight: 400;
  912. color: #959595;
  913. padding: 0 10px;
  914. .table-item {
  915. width: 25%;
  916. font-size: 12px;
  917. .table-value {
  918. display: flex;
  919. flex-direction: row;
  920. align-items: baseline;
  921. .unit {
  922. font-size: 12px;
  923. font-family: Source Han Sans SC;
  924. font-weight: 400;
  925. color: #606769;
  926. margin-left: 5px;
  927. // width: 40px;
  928. }
  929. &.round {
  930. width: 8px;
  931. height: 8px;
  932. border-radius: 50%;
  933. background-color: #05bb4c;
  934. margin-right: 90px;
  935. }
  936. &.round-red {
  937. width: 8px;
  938. height: 8px;
  939. border-radius: 50%;
  940. background-color: red;
  941. margin-right: 90px;
  942. }
  943. }
  944. }
  945. &.active {
  946. background-color: rgba(83, 89, 104, 0.15);
  947. }
  948. }
  949. }
  950. }
  951. }
  952. }
  953. .monitoring-item {
  954. position: relative;
  955. width: 98%;
  956. height: 42px;
  957. border-bottom: 1px solid #363b46;
  958. display: flex;
  959. align-items: center;
  960. padding-left: 20px;
  961. font-size: 16px;
  962. font-family: Microsoft YaHei;
  963. font-weight: 400;
  964. color: #ffffff;
  965. }
  966. .point {
  967. width: 8px;
  968. height: 1px;
  969. background-color: #ffffff;
  970. position: absolute;
  971. &.point-left {
  972. left: 0;
  973. }
  974. &.point-right {
  975. right: 0;
  976. }
  977. &.top {
  978. top: -1px;
  979. }
  980. &.bottom {
  981. bottom: -1px;
  982. }
  983. }
  984. .points {
  985. width: 1px;
  986. height: 8px;
  987. background-color: #ffffff;
  988. position: absolute;
  989. &.point-left {
  990. left: 0;
  991. }
  992. &.point-right {
  993. right: 0;
  994. }
  995. &.top {
  996. top: -1px;
  997. }
  998. &.bottom {
  999. bottom: -1px;
  1000. }
  1001. }
  1002. .table-item {
  1003. display: flex;
  1004. flex-direction: row;
  1005. align-items: center;
  1006. justify-content: space-between;
  1007. width: 100%;
  1008. height: 33px;
  1009. font-size: 12px;
  1010. font-family: Microsoft YaHei;
  1011. font-weight: 400;
  1012. color: #b3b3b3;
  1013. padding: 0 0px;
  1014. .table-value {
  1015. font-family: Arial;
  1016. font-weight: 400;
  1017. color: #05bb4c;
  1018. margin-right: 25px;
  1019. }
  1020. }
  1021. </style>