index.vue 25 KB

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