index.vue 25 KB

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