index.vue 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  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 class="unit">{{ item.valueUnit }}</div> -->
  287. </div>
  288. </div>
  289. </div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. <alarmDialog ref="alarmDialog" />
  295. <powerAndSpeed ref="powerAndSpeed" :tabEvent="-1" />
  296. </div>
  297. </template>
  298. <script>
  299. import { GetWtPoints, GetPointsData } from "@/api/points/index.js";
  300. import powerAndSpeed from "@/components/powerAndSpeedSearch/index.vue";
  301. import {
  302. GetWtMonitorInfo,
  303. GetWtTelemeteryInfo,
  304. GetWtOtherInfo,
  305. } from "@/api/factoryMonitor/index.js";
  306. import svgIcon from "@/components/coms/icon/svg-icon.vue";
  307. import alarmDialog from "@/components/alarm";
  308. export default {
  309. name: "windDetail",
  310. data() {
  311. return {
  312. current: "fdj",
  313. windname: "",
  314. wtid: "",
  315. wpid: "",
  316. windInfo: {},
  317. monitorInfo: {},
  318. otherInfo: {},
  319. partAInfo: [],
  320. partDInfo: [],
  321. partAInfos: [],
  322. partDInfos: [],
  323. uniformcodesA: [],
  324. uniformcodesD: [],
  325. resA: [],
  326. resD: [],
  327. indexe: 0,
  328. videoTit: [],
  329. dialogVisible: false,
  330. reliable: {},
  331. colorList: ["blue", "green", "red", "orange", "pink", "write", "gray"],
  332. path: ["camera.png", "camera2.png"],
  333. count: 0,
  334. colorFlag: false,
  335. timer: "",
  336. times: "",
  337. };
  338. },
  339. components: { svgIcon, alarmDialog, powerAndSpeed },
  340. apiUrl: "",
  341. props: {
  342. wind: {
  343. type: Object,
  344. default: () => {},
  345. },
  346. flag: {
  347. type: Boolean,
  348. default: false,
  349. },
  350. },
  351. computed: {
  352. windSpeedRota() {
  353. let count = this.windStatus?.SSPJFS / 25;
  354. let result = Number((310 * count + 50).toFixed(0));
  355. if (result) {
  356. if (result > 310) {
  357. return "rotateZ(310deg)";
  358. } else {
  359. return "rotateZ(" + Number((310 * count + 50).toFixed(0)) + "deg)";
  360. }
  361. } else {
  362. return "rotateZ(50deg)";
  363. }
  364. },
  365. },
  366. mounted() {
  367. this.timer = setInterval(() => {
  368. if (Object.keys(this.windInfo).length) {
  369. this.getWtMonitorInfo(this.windInfo);
  370. this.getPointsData(this.resA, this.resD);
  371. }
  372. }, 5000);
  373. this.times = setInterval(() => {
  374. this.count++;
  375. if (this.count > 1) {
  376. this.count = 0;
  377. }
  378. }, 800);
  379. if (document.getElementById("ifrId")) {
  380. const oIframe = document.getElementById("ifrId");
  381. const deviceWidth = document.getElementById("ifVideo").offsetWidth;
  382. const deviceHeight = document.getElementById("ifVideo").offsetHeight;
  383. oIframe.style.width = deviceWidth + "px";
  384. oIframe.style.height = deviceHeight + "px";
  385. }
  386. },
  387. unmounted() {
  388. clearInterval(this.timer);
  389. this.timer = null;
  390. clearInterval(this.times);
  391. this.times = null;
  392. },
  393. watch: {
  394. wind: {
  395. handler() {
  396. if (Object.keys(this.wind).length) {
  397. this.start(this.wind);
  398. }
  399. },
  400. },
  401. $route: {
  402. handler(val) {
  403. if (
  404. val.path.includes("lightmatrix") ||
  405. val.path.includes("detailmatrix") ||
  406. val.path.includes("draughtFan")
  407. ) {
  408. this.colorFlag = true;
  409. }
  410. },
  411. immediate: true,
  412. },
  413. },
  414. methods: {
  415. handleXhClick(wind) {
  416. // console.log(wind);
  417. this.$refs.powerAndSpeed && this.$refs.powerAndSpeed.init(wind);
  418. },
  419. cancle() {
  420. this.windInfo = {};
  421. this.windname = "";
  422. this.wtid = "";
  423. this.current = "fdj";
  424. this.monitorInfo = {};
  425. this.partAInfo = [];
  426. this.partDInfo = [];
  427. this.partAInfos = [];
  428. this.partDInfos = [];
  429. this.uniformcodesA = [];
  430. this.uniformcodesD = [];
  431. this.resA = [];
  432. this.resD = [];
  433. },
  434. // 页面初始信息
  435. start(val) {
  436. if (Object.keys(val).length) {
  437. this.windInfo = val;
  438. this.windname = val.wtname;
  439. this.wtid = val.wtid;
  440. this.wpid = val.wpid;
  441. this.current = "fdj";
  442. this.getWtMonitorInfo(val);
  443. this.getWtOtherInfo(val);
  444. this.handleClick("fdj");
  445. } else {
  446. this.cancle();
  447. }
  448. },
  449. // 设备监测信息
  450. getWtMonitorInfo(val) {
  451. if (val.wtType == -1) {
  452. GetWtMonitorInfo({ wtid: val.wtid }).then(({ data }) => {
  453. this.monitorInfo = data.data;
  454. this.monitorInfo.rfdl =
  455. this.monitorInfo.rfdl < 0 ? 0 : this.monitorInfo.rfdl;
  456. // for(var key in this.monitorInfo){
  457. // this.monitorInfo[key]=this.monitorInfo[key] < 0 ? 0 : this.monitorInfo[key];
  458. // }
  459. });
  460. } else {
  461. this.monitorInfo = {};
  462. }
  463. },
  464. // 设备其他信息
  465. getWtOtherInfo(val) {
  466. GetWtOtherInfo({ wtid: val.wtid }).then((res) => {
  467. if (res.code == 200) {
  468. this.otherInfo = res.data;
  469. }
  470. });
  471. },
  472. // 查看各部位编码
  473. handleClick(val) {
  474. this.current = val;
  475. if (this.wtid) {
  476. this.getPartInfo();
  477. }
  478. },
  479. // 统一编码
  480. getPartInfo() {
  481. if (this.windInfo.wtType == -1) {
  482. if (this.wtid.length && this.current) {
  483. GetWtTelemeteryInfo({
  484. part: this.current,
  485. wtid: this.wtid,
  486. }).then(({ data }) => {
  487. // 拿到初始获取数据
  488. this.partAInfo = data.data.AI;
  489. this.partDInfo = data.data.DI;
  490. // 拿到数据的uniformcode集合
  491. this.uniformcodesD = this.partDInfo.length
  492. ? this.partDInfo.map((item) => item.uniformCode)
  493. : [];
  494. this.uniformcodesA = this.partAInfo.length
  495. ? this.partAInfo.map((item) => item.uniformCode)
  496. : [];
  497. // 获取测点数据
  498. this.getPointsIds();
  499. });
  500. }
  501. }
  502. },
  503. getPointsIds() {
  504. let pointsIdsA = new Promise((resolve, reject) => {
  505. GetWtPoints({
  506. wtid: this.wtid,
  507. uniformcodes: this.uniformcodesA,
  508. })
  509. .then(({ data }) => {
  510. resolve(data);
  511. })
  512. .catch((e) => {
  513. reject("发生错误");
  514. });
  515. });
  516. let pointsIdsD = new Promise((resolve, reject) => {
  517. GetWtPoints({
  518. wtid: this.wtid,
  519. uniformcodes: this.uniformcodesD,
  520. })
  521. .then(({ data }) => {
  522. resolve(data);
  523. })
  524. .catch((e) => {
  525. // 标记失败后给定某个数据
  526. reject("发生错误");
  527. });
  528. });
  529. Promise.all([pointsIdsA, pointsIdsD])
  530. .then((results) => {
  531. this.resA = results[0].data.length
  532. ? results[0].data.map((item) => (item != null ? item.nemCode : ""))
  533. : [];
  534. this.resD = results[1].data.length
  535. ? results[1].data.map((item) => (item != null ? item.nemCode : ""))
  536. : [];
  537. this.getPointsData(this.resA, this.resD);
  538. })
  539. .catch((e) => {
  540. console.log("error", e);
  541. });
  542. },
  543. getPointsData(pointsA, pointsD) {
  544. let pointsDataA = new Promise((resolve, reject) => {
  545. GetPointsData({
  546. pointIds: pointsA,
  547. })
  548. .then(({ data }) => {
  549. resolve(data);
  550. })
  551. .catch((e) => {
  552. // 标记失败后给定某个数据
  553. reject("发生错误");
  554. });
  555. });
  556. let pointsDataD = new Promise((resolve, reject) => {
  557. GetPointsData({
  558. pointIds: pointsD,
  559. })
  560. .then(({ data }) => {
  561. resolve(data);
  562. })
  563. .catch((e) => {
  564. // 标记失败后给定某个数据
  565. reject("发生错误");
  566. });
  567. });
  568. Promise.all([pointsDataA, pointsDataD])
  569. .then((results) => {
  570. let pointsInfoA = results[0].data.length ? results[0].data : [];
  571. let pointsInfoD = results[1].data.length ? results[1].data : [];
  572. let partAInfo = [];
  573. let partDInfo = [];
  574. let chunk = 4;
  575. this.partAInfo.forEach((item, index) => {
  576. pointsInfoA.forEach((i, ind) => {
  577. if (index == ind) {
  578. item.value = i.pointValueInDouble;
  579. }
  580. });
  581. });
  582. for (let i = 0, j = this.partAInfo.length; i < j; i += chunk) {
  583. partAInfo.push(this.partAInfo.slice(i, i + chunk));
  584. }
  585. this.partDInfo.forEach((item, index) => {
  586. pointsInfoD.forEach((i, ind) => {
  587. if (index == ind) {
  588. item.value = i.pointValueInDouble;
  589. }
  590. });
  591. });
  592. for (let m = 0, n = this.partDInfo.length; m < n; m += chunk) {
  593. partDInfo.push(this.partDInfo.slice(m, m + chunk));
  594. }
  595. this.partDInfos = partDInfo;
  596. this.partAInfos = partAInfo;
  597. console.log(this.partAInfos);
  598. })
  599. .catch((e) => {
  600. // 失败的时候则返回最先被reject失败状态的值
  601. console.log("error", e);
  602. });
  603. },
  604. //打开报警页面
  605. handleAlarm(id) {
  606. this.$refs.alarmDialog &&
  607. this.$refs.alarmDialog.openDialog(id, this.wpid, this.windInfo.wtType);
  608. },
  609. clickVideo(index) {
  610. this.indexe = index;
  611. },
  612. clivkFun() {
  613. this.dialogVisible = true;
  614. },
  615. },
  616. };
  617. </script>
  618. <style lang="less" scoped>
  619. .icLi {
  620. background: rgba(0, 70, 199, 0.1);
  621. border-radius: 20px;
  622. color: #b3b3b3;
  623. }
  624. .actives {
  625. background: rgba(0, 70, 199, 0.4);
  626. border-radius: 20px;
  627. color: #f5f7fa;
  628. }
  629. .bodys {
  630. display: flex;
  631. flex-direction: row;
  632. width: 100%;
  633. height: 100%;
  634. .edge {
  635. width: 400px;
  636. display: flex;
  637. height: 100%;
  638. flex-direction: column;
  639. //
  640. .info {
  641. width: 100%;
  642. flex: 0 0 auto;
  643. padding: 10px 15px;
  644. // background-color: rgba(11, 12, 12, 0.45);
  645. background-color: rgba(96, 103, 105, 0.2);
  646. border-radius: 5px;
  647. display: flex;
  648. flex-direction: column;
  649. .info-wrapper {
  650. display: flex;
  651. width: 100%;
  652. align-items: center;
  653. justify-content: space-between;
  654. margin-bottom: 10px;
  655. .ps-info {
  656. display: flex;
  657. align-items: center;
  658. margin-bottom: -5px;
  659. white-space: nowrap;
  660. color: #959595;
  661. font-size: 15px;
  662. &:nth-child(2) {
  663. cursor: pointer;
  664. &:hover,
  665. &:active {
  666. font-weight: 700;
  667. }
  668. }
  669. }
  670. }
  671. .info-title {
  672. width: 50%;
  673. height: 25px;
  674. font-size: 16px;
  675. font-family: Microsoft YaHei;
  676. font-weight: 400;
  677. display: flex;
  678. flex-direction: row;
  679. align-items: center;
  680. justify-content: center;
  681. white-space: nowrap;
  682. &.green {
  683. background-color: rgba(5, 187, 76, 0.2);
  684. // border: 1px solid #05bb4c;
  685. color: #05bb4c;
  686. }
  687. &.blue {
  688. background-color: rgba(0, 70, 199, 0.2);
  689. // border: 1px solid #3c88f7;
  690. color: #1c99ff;
  691. }
  692. &.pink {
  693. background-color: rgba(197, 48, 200, 0.2);
  694. // border: 1px solid #c530c8;
  695. color: #c530c8;
  696. }
  697. &.red {
  698. background-color: rgba(186, 50, 55, 0.2);
  699. // border: 1px solid #ba3237;
  700. color: #ba3237;
  701. }
  702. &.orange {
  703. background-color: rgba(225, 125, 36, 0.2);
  704. // border: 1px solid #e17d24;
  705. color: #e17d24;
  706. }
  707. &.write {
  708. background-color: rgba(255, 255, 255, 0.2);
  709. // border: 1px solid #ffffff;
  710. color: #ffffff;
  711. }
  712. &.gray {
  713. background-color: rgba(96, 103, 105, 0.2);
  714. // border: 1px solid #606769;
  715. color: #606769;
  716. }
  717. }
  718. .wt-alarm {
  719. font-family: Microsoft YaHei;
  720. font-weight: 400;
  721. span {
  722. margin-left: 5px;
  723. &.green {
  724. color: #05bb4c;
  725. }
  726. &.blue {
  727. color: #1c99ff;
  728. }
  729. &.pink {
  730. color: #c530c8;
  731. }
  732. &.red {
  733. color: #ba3237;
  734. }
  735. &.orange {
  736. color: #e17d24;
  737. }
  738. &.write {
  739. color: #ffffff;
  740. }
  741. &.gray {
  742. color: #606769;
  743. }
  744. }
  745. }
  746. .info-item {
  747. font-size: 24px;
  748. font-family: Adobe Heiti Std;
  749. font-weight: normal;
  750. color: #ffffff;
  751. display: flex;
  752. align-items: center;
  753. justify-content: space-between;
  754. }
  755. .info-value {
  756. display: flex;
  757. flex-direction: row;
  758. align-items: baseline;
  759. font-size: 40px;
  760. font-family: Arial;
  761. font-weight: 400;
  762. color: #05bb4c;
  763. white-space: nowrap;
  764. .unit {
  765. font-size: 24px;
  766. font-family: Adobe Heiti Std;
  767. font-weight: normal;
  768. // margin-right: 20px;
  769. }
  770. }
  771. }
  772. .monitoring {
  773. width: 100%;
  774. flex: 1 0 auto;
  775. background-color: rgba(96, 103, 105, 0.2);
  776. // background-color: rgba(11, 12, 12, 0.45);
  777. border-radius: 5px;
  778. margin-top: 10px;
  779. display: flex;
  780. flex-direction: column;
  781. align-items: center;
  782. }
  783. .wind-info-list {
  784. height: calc(100% - 42px);
  785. width: 100%;
  786. display: flex;
  787. flex-direction: column;
  788. }
  789. .wind-info {
  790. flex: 1 0 auto;
  791. display: flex;
  792. flex-direction: row;
  793. align-items: center;
  794. justify-content: space-between;
  795. width: 100%;
  796. padding: 0 10%;
  797. font-size: 14px;
  798. font-family: Source Han Sans SC;
  799. font-weight: 400;
  800. color: #959595;
  801. .wind-value {
  802. display: flex;
  803. flex-direction: row;
  804. align-items: baseline;
  805. font-size: 16px;
  806. font-family: Arial;
  807. font-weight: 400;
  808. color: #05bb4c;
  809. .unit {
  810. font-size: 12px;
  811. font-family: Source Han Sans SC;
  812. font-weight: 400;
  813. color: #959595;
  814. width: 40px;
  815. margin-left: 15px;
  816. }
  817. }
  818. }
  819. }
  820. .parts {
  821. width: calc(100% - 400px - 20px);
  822. margin-left: 20px;
  823. height: 100%;
  824. display: flex;
  825. flex-direction: column;
  826. align-items: center;
  827. justify-content: space-between;
  828. // position: relative;
  829. .part-top {
  830. flex: 1;
  831. width: 100%;
  832. text-align: center;
  833. }
  834. .part-title {
  835. width: 100%;
  836. height: 30px;
  837. display: flex;
  838. align-items: center;
  839. flex-direction: row;
  840. justify-content: center;
  841. .title-item {
  842. width: 140px;
  843. height: 100%;
  844. display: flex;
  845. align-items: center;
  846. color: #b3bdc0;
  847. justify-content: center;
  848. // background: rgba(67, 81, 107, 0.2);
  849. background: rgba(96, 103, 105, 0.2);
  850. border-left: 1px solid #3b6c53;
  851. border-top: 1px solid #3b6c53;
  852. border-bottom: 1px solid #3b6c53;
  853. &.part-left {
  854. border-radius: 15px 0px 0px 15px;
  855. }
  856. &.part-right {
  857. border-right: 1px solid #3b6c53;
  858. border-radius: 0px 15px 15px 0px;
  859. }
  860. &.active {
  861. // background-color: rgba(0, 70, 199, 0.4);
  862. background-color: rgba(0, 199, 19, 0.4);
  863. color: #ffffff;
  864. }
  865. }
  866. }
  867. .part-imgs {
  868. min-height: calc(100% - 30px);
  869. position: relative;
  870. }
  871. .wind-part {
  872. position: absolute;
  873. top: 50%;
  874. left: 50%;
  875. transform: translate(-50%, -50%);
  876. }
  877. .part-info {
  878. width: 100%;
  879. max-height: 440px;
  880. bottom: 0px;
  881. display: flex;
  882. flex-direction: column-reverse;
  883. [v-cloak] {
  884. display: none;
  885. }
  886. .part-body {
  887. width: 100%;
  888. padding-bottom: 20px;
  889. // background: rgba(11, 12, 12, 0.45);
  890. background: rgba(96, 103, 105, 0.2);
  891. border-radius: 5px;
  892. margin-top: 10px;
  893. display: flex;
  894. flex-direction: column;
  895. align-items: center;
  896. padding: 10px 0;
  897. .part-item {
  898. width: 100%;
  899. height: calc(100% - 42px);
  900. overflow-y: scroll;
  901. }
  902. .part {
  903. width: 100%;
  904. display: flex;
  905. flex-direction: row;
  906. margin-top: 5px;
  907. font-size: 13px;
  908. font-family: Source Han Sans SC;
  909. font-weight: 400;
  910. color: #959595;
  911. padding: 0 10px;
  912. .table-item {
  913. width: 25%;
  914. font-size: 12px;
  915. .table-value {
  916. display: flex;
  917. flex-direction: row;
  918. align-items: baseline;
  919. .unit {
  920. font-size: 12px;
  921. font-family: Source Han Sans SC;
  922. font-weight: 400;
  923. color: #606769;
  924. margin-left: 5px;
  925. width: 40px;
  926. }
  927. &.round {
  928. width: 8px;
  929. height: 8px;
  930. border-radius: 50%;
  931. background-color: #05bb4c;
  932. margin-right: 90px;
  933. }
  934. &.round-red {
  935. width: 8px;
  936. height: 8px;
  937. border-radius: 50%;
  938. background-color: red;
  939. margin-right: 90px;
  940. }
  941. }
  942. }
  943. &.active {
  944. background-color: rgba(83, 89, 104, 0.15);
  945. }
  946. }
  947. }
  948. }
  949. }
  950. }
  951. .monitoring-item {
  952. position: relative;
  953. width: 98%;
  954. height: 42px;
  955. border-bottom: 1px solid #363b46;
  956. display: flex;
  957. align-items: center;
  958. padding-left: 20px;
  959. font-size: 16px;
  960. font-family: Microsoft YaHei;
  961. font-weight: 400;
  962. color: #ffffff;
  963. }
  964. .point {
  965. width: 8px;
  966. height: 1px;
  967. background-color: #ffffff;
  968. position: absolute;
  969. &.point-left {
  970. left: 0;
  971. }
  972. &.point-right {
  973. right: 0;
  974. }
  975. &.top {
  976. top: -1px;
  977. }
  978. &.bottom {
  979. bottom: -1px;
  980. }
  981. }
  982. .points {
  983. width: 1px;
  984. height: 8px;
  985. background-color: #ffffff;
  986. position: absolute;
  987. &.point-left {
  988. left: 0;
  989. }
  990. &.point-right {
  991. right: 0;
  992. }
  993. &.top {
  994. top: -1px;
  995. }
  996. &.bottom {
  997. bottom: -1px;
  998. }
  999. }
  1000. .table-item {
  1001. display: flex;
  1002. flex-direction: row;
  1003. align-items: center;
  1004. justify-content: space-between;
  1005. width: 100%;
  1006. height: 33px;
  1007. font-size: 12px;
  1008. font-family: Microsoft YaHei;
  1009. font-weight: 400;
  1010. color: #b3b3b3;
  1011. padding: 0 0px;
  1012. .table-value {
  1013. font-family: Arial;
  1014. font-weight: 400;
  1015. color: #05bb4c;
  1016. margin-right: 25px;
  1017. }
  1018. }
  1019. </style>