index.vue 27 KB

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