index.vue 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851
  1. <template>
  2. <div class="bodys">
  3. <!-- v-if="Object.keys(monitorInfo).length" -->
  4. <div class="edge" v-if="0">
  5. <div class="info" style="position: relative">
  6. <div class="info-wrapper">
  7. <!-- <div class="ps-info">
  8. <div class="ps-title">厂商名称:</div>
  9. <div class="ps-name">{{ otherInfo?.manufacturer }}</div>
  10. </div> -->
  11. <div class="ps-info" @click="handleXhClick(windInfo)">
  12. <div class="ps-title">设备型号:</div>
  13. <div class="ps-name">
  14. {{ otherInfo?.manufacturer }} ( {{ otherInfo?.model }} )
  15. </div>
  16. </div>
  17. </div>
  18. <div class="info-wrapper">
  19. <div class="info-title" :class="colorList[monitorInfo.status]">
  20. <span class="text">设备名称: {{ windname }}</span>
  21. </div>
  22. <div class="wt-alarm" @click="handleAlarm(wtid)">
  23. <i
  24. class="svg-icon svg-icon-sm"
  25. :class="'svg-icon-' + colorList[monitorInfo.status]"
  26. >
  27. <svgIcon svgid="svg-station-surveillance"></svgIcon>
  28. </i>
  29. <span :class="colorList[monitorInfo.status]">设备报警</span>
  30. </div>
  31. </div>
  32. <div class="info-item">
  33. 日发电量
  34. <div class="info-value">
  35. {{ Number(monitorInfo?.rfdl).toFixed(2) || "0" }}
  36. <div class="unit">kWh</div>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="monitoring">
  41. <div class="monitoring-item">
  42. <div class="point point-left bottom"></div>
  43. <div class="point point-right bottom"></div>
  44. 监测信息
  45. </div>
  46. <div class="wind-info-list">
  47. <div class="wind-info">
  48. 风速
  49. <div class="wind-value">
  50. {{ Number(monitorInfo?.fs).toFixed(2) }}
  51. <div class="unit">m/s</div>
  52. </div>
  53. </div>
  54. <div class="wind-info">
  55. 风向
  56. <div class="wind-value">
  57. {{ Number(monitorInfo?.fx).toFixed(2) }}
  58. <div class="unit">°</div>
  59. </div>
  60. </div>
  61. <div class="wind-info">
  62. 实时功率
  63. <div class="wind-value">
  64. {{ Number(monitorInfo?.ssgl).toFixed(2) }}
  65. <div class="unit">kW</div>
  66. </div>
  67. </div>
  68. <div class="wind-info">
  69. 无功功率
  70. <div class="wind-value">
  71. {{ Number(monitorInfo?.wggl).toFixed(2) }}
  72. <div class="unit">kW</div>
  73. </div>
  74. </div>
  75. <div class="wind-info">
  76. 理论功率
  77. <div class="wind-value">
  78. {{ Number(monitorInfo?.llgl).toFixed(2) }}
  79. <div class="unit">kW</div>
  80. </div>
  81. </div>
  82. <div class="wind-info">
  83. 保证功率
  84. <div class="wind-value">
  85. {{ Number(monitorInfo?.bzgl).toFixed(2) }}
  86. <div class="unit">kW</div>
  87. </div>
  88. </div>
  89. <div class="wind-info">
  90. 叶轮转速
  91. <div class="wind-value">
  92. {{ Number(monitorInfo?.ylzs).toFixed(2) }}
  93. <div class="unit">rpm</div>
  94. </div>
  95. </div>
  96. <div class="wind-info">
  97. 故障损失
  98. <div class="wind-value">
  99. {{ Number(monitorInfo?.gzss).toFixed(2) }}
  100. <div class="unit">kWh</div>
  101. </div>
  102. </div>
  103. <div class="wind-info">
  104. 检修损失
  105. <div class="wind-value">
  106. {{ Number(monitorInfo?.jxss).toFixed(2) }}
  107. <div class="unit">kWh</div>
  108. </div>
  109. </div>
  110. <div class="wind-info">
  111. 限电损失
  112. <div class="wind-value">
  113. {{ Number(monitorInfo?.xdss).toFixed(2) }}
  114. <div class="unit">kWh</div>
  115. </div>
  116. </div>
  117. <div class="wind-info">
  118. 性能损失
  119. <div class="wind-value">
  120. {{ Number(monitorInfo?.xnss).toFixed(2) }}
  121. <div class="unit">kWh</div>
  122. </div>
  123. </div>
  124. <div class="wind-info">
  125. 受累损失
  126. <div class="wind-value">
  127. {{ Number(monitorInfo?.slss).toFixed(2) }}
  128. <div class="unit">kWh</div>
  129. </div>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. <div class="parts">
  135. <div class="part-top">
  136. <div class="part-title">
  137. <div
  138. class="title-item part-left"
  139. :class="{ active: current === 'fdj' }"
  140. @click="handleClick('fdj')"
  141. >
  142. 发电机
  143. </div>
  144. <div
  145. v-if="otherInfo?.model != 'XE100-2000'"
  146. class="title-item"
  147. :class="{ active: current === 'clx' }"
  148. @click="handleClick('clx')"
  149. >
  150. 齿轮箱
  151. </div>
  152. <div
  153. class="title-item"
  154. :class="{ active: current === 'bj' }"
  155. @click="handleClick('bj')"
  156. >
  157. 变桨
  158. </div>
  159. <div
  160. class="title-item"
  161. :class="{ active: current === 'ph' }"
  162. @click="handleClick('ph')"
  163. >
  164. 偏航
  165. </div>
  166. <div
  167. class="title-item"
  168. :class="{ active: current === 'yy' }"
  169. @click="handleClick('yy')"
  170. >
  171. 液压
  172. </div>
  173. <div
  174. class="title-item part-right"
  175. :class="{ active: current === 'jc' }"
  176. @click="handleClick('jc')"
  177. >
  178. 机舱信息
  179. </div>
  180. <!-- <div
  181. class="title-item part-right"
  182. :class="{ active: current === 'qt' }"
  183. @click="handleClick('qt')"
  184. >
  185. 其他
  186. </div> -->
  187. <!-- <div
  188. class="title-item part-right"
  189. :class="{ active: current === 'zz' }"
  190. @click="handleClick('zz')"
  191. >
  192. 主轴
  193. </div> -->
  194. </div>
  195. <div class="part-imgs" v-if="otherInfo?.model == 'XE100-2000'">
  196. <img
  197. class="wind-part"
  198. :style="{ width: flag ? '450px' : '500px' }"
  199. src="@assets/imgs/zqfj.png"
  200. />
  201. </div>
  202. <div class="part-imgs" v-else>
  203. <img
  204. v-if="current === 'fdj'"
  205. class="wind-part"
  206. :style="{ width: flag ? '650px' : '800px' }"
  207. src="@assets/imgs/fdj_b.png"
  208. />
  209. <img
  210. v-if="current === 'clx'"
  211. class="wind-part"
  212. :style="{ width: flag ? '650px' : '800px' }"
  213. src="@assets/imgs/clx_b.png"
  214. />
  215. <img
  216. v-if="current === 'bj'"
  217. class="wind-part"
  218. :style="{ width: flag ? '650px' : '800px' }"
  219. src="@assets/imgs/bj_b.png"
  220. />
  221. <img
  222. v-if="current === 'ph'"
  223. class="wind-part"
  224. :style="{ width: flag ? '650px' : '800px' }"
  225. src="@assets/imgs/ph_b.png"
  226. />
  227. <img
  228. v-if="current === 'yy'"
  229. class="wind-part"
  230. :style="{ width: flag ? '650px' : '800px' }"
  231. src="@assets/imgs/yy_b.png"
  232. />
  233. <img
  234. v-if="current === 'jc'"
  235. class="wind-part"
  236. :style="{ width: flag ? '650px' : '800px' }"
  237. src="@assets/imgs/jc_b.png"
  238. />
  239. <img
  240. v-if="current === 'qt'"
  241. class="wind-part"
  242. :style="{ width: flag ? '650px' : '800px' }"
  243. src="@assets/imgs/qt_b.png"
  244. />
  245. </div>
  246. </div>
  247. <div class="part-info">
  248. <!-- v-if="partDInfos.length > 0" style="max-height: 25vh"-->
  249. <div class="part-body">
  250. <div class="monitoring-item">
  251. <div class="point point-left bottom"></div>
  252. <div class="point point-right bottom"></div>
  253. 遥信值
  254. </div>
  255. <div class="part-item">
  256. <div
  257. class="part"
  258. :class="{ active: index % 2 === 1 }"
  259. v-for="(val, index) in partDInfos"
  260. :key="index"
  261. >
  262. <div class="table-item" v-for="(item, ind) in val" :key="ind">
  263. <div>{{ item.name }}</div>
  264. <div class="table-value-di">
  265. <span :class="item.value == 1 ? 'round-red' : 'round'">{{
  266. item.value == 1 ? "触发" : "未触发"
  267. }}</span>
  268. </div>
  269. </div>
  270. </div>
  271. </div>
  272. </div>
  273. <!-- <div
  274. class="part-body"
  275. style="max-height: 25vh"
  276. v-if="partAInfos.length > 0"
  277. >
  278. <div class="monitoring-item">
  279. <div class="point point-left bottom"></div>
  280. <div class="point point-right bottom"></div>
  281. 遥测值
  282. </div>
  283. <div class="part-item">
  284. <div
  285. class="part"
  286. :class="{ active: index % 2 === 1 }"
  287. v-for="(val, index) in partAInfos"
  288. :key="index"
  289. >
  290. <div class="table-item" v-for="(item, ind) in val" :key="ind">
  291. <div>{{ item.name }}</div>
  292. <div class="table-value">
  293. {{
  294. item.name.includes("状态")
  295. ? item.value
  296. : item.name == "总发电量"
  297. ? (item.value / 10000).toFixed(2)
  298. : Number(item.value).toFixed(2)
  299. }}
  300. <div v-if="item.valueUnit != 'NULL'" class="unit">
  301. {{ item.valueUnit }}
  302. </div>
  303. <div v-else class="unit"></div>
  304. </div>
  305. </div>
  306. </div>
  307. </div>
  308. </div> -->
  309. </div>
  310. </div>
  311. <div class="problemsAI" style="color: #fff">
  312. <div class="part-info-ai">
  313. <!-- v-if="partAInfos.length > 0" -->
  314. <div class="part-body-ai">
  315. <div class="monitoring-item">
  316. <div class="point point-left bottom"></div>
  317. <div class="point point-right bottom"></div>
  318. 遥测值
  319. </div>
  320. <div class="part-item-ai">
  321. <div
  322. class="part-ai"
  323. :class="{ active: index % 2 === 1 }"
  324. v-for="(val, index) in partAInfos"
  325. :key="index"
  326. >
  327. <div class="table-item-ai" v-for="(item, ind) in val" :key="ind">
  328. <div>{{ item.name }}</div>
  329. <div class="table-value-ai">
  330. {{
  331. item.name.includes("状态")
  332. ? item.value
  333. : item.name == "总发电量"
  334. ? (item.value / 10000).toFixed(2)
  335. : Number(item.value).toFixed(2)
  336. }}
  337. <div v-if="item.valueUnit != 'NULL'" class="unit-ai">
  338. {{ item.valueUnit }}
  339. </div>
  340. <div v-else class="unit-ai"></div>
  341. </div>
  342. </div>
  343. </div>
  344. </div>
  345. </div>
  346. </div>
  347. </div>
  348. <!-- <div class="problems" style="color: #fff">
  349. <div class="problemTit">
  350. <div class="point point-left bottom"></div>
  351. <div class="point point-right bottom"></div>
  352. <span style="font-size: 16px;position: relative;top: -5px;">故障分类</span>
  353. </div>
  354. <div class="problemMain">
  355. <div class="problemWarn">
  356. <div class="warn">
  357. <div class="warnCom">
  358. <div class="circle-container">
  359. <svg class="circle-segment segment-1" viewBox="0 0 100 100">
  360. <circle cx="50" cy="50" r="40"></circle>
  361. </svg>
  362. </div>
  363. <div class="warnComImg">
  364. <img src="@/assets/imgs/danger.png" alt="">
  365. </div>
  366. <div class="warnComNum">
  367. <div class="numTop">{{warnTypeData.total}}</div>
  368. <div class="numBot">总故障</div>
  369. </div>
  370. </div>
  371. <div class="warnItems" v-for="(it, index) in warnTypeData.dataColumn1" :key="index" @click="getwarnTableDataFn(it)">
  372. <div class="warnItemLeft">{{it.count}}</div>
  373. <div class="warnItemRight">{{it.name}}</div>
  374. </div>
  375. </div>
  376. <div class="warn" v-for="(it, index) in warnTypeData.dataColumnOther" :key="index">
  377. <div class="warnItems" v-for="(itv, index) in it" :key="index" @click="getwarnTableDataFn(itv)">
  378. <div class="warnItemLeft" :class="isRed(index)">{{itv.count}}</div>
  379. <div class="warnItemRight" :class="isRed(index)">{{itv.name}}</div>
  380. </div>
  381. </div>
  382. </div>
  383. <div class="warnTable">
  384. <el-table
  385. size="mini"
  386. :data="warnTypeData.tableData"
  387. style="width: 100%; height: calc(100% - 310px)"
  388. max-height="580px"
  389. stripe>
  390. <el-table-column
  391. v-for="item in warnTypeData.tableHeader"
  392. :label="item.name"
  393. :prop="item.code"
  394. :key="item.code"
  395. :width="item.width || ''"
  396. show-overflow-tooltip
  397. header-align="center"
  398. align="center"
  399. >
  400. <template #default="scope">
  401. <span v-if="item.code == 'isClose'">
  402. <span :style="scope.row.isClose ? 'color: red' : 'color: green'">{{scope.row.isClose ? "未解除" : "已解除"}}</span>
  403. </span>
  404. <span v-else>
  405. {{
  406. scope.row[item.code] != "NULL" ? scope.row[item.code] : ""
  407. }}
  408. </span>
  409. </template>
  410. </el-table-column>
  411. </el-table>
  412. </div>
  413. </div>
  414. </div> -->
  415. <alarmDialog ref="alarmDialog" />
  416. <powerAndSpeed ref="powerAndSpeed" :tabEvent="-1" />
  417. </div>
  418. </template>
  419. <script>
  420. import { Search } from "@element-plus/icons-vue";
  421. import { GetWtPoints, GetPointsData } from "@/api/points/index.js";
  422. import powerAndSpeed from "@/components/powerAndSpeedSearch/index.vue";
  423. import {
  424. GetWtMonitorInfo,
  425. GetWtTelemeteryInfo,
  426. GetWtOtherInfo,
  427. GetMatrixalarmtype,
  428. GetMatrixalarmtypeTable,
  429. } from "@/api/factoryMonitor/index.js";
  430. import svgIcon from "@/components/coms/icon/svg-icon.vue";
  431. import alarmDialog from "@/components/alarm";
  432. export default {
  433. name: "windDetail",
  434. data() {
  435. return {
  436. inputcv: "",
  437. current: "fdj",
  438. windname: "",
  439. wtid: "",
  440. wpid: "",
  441. windInfo: {},
  442. monitorInfo: {},
  443. otherInfo: {},
  444. partAInfo: [],
  445. partDInfo: [],
  446. partAInfos: [
  447. [
  448. {
  449. name: "AI值1",
  450. value: 10.2,
  451. valueUnit: "%",
  452. },
  453. {
  454. name: "AI值2",
  455. value: 23.4,
  456. valueUnit: "%",
  457. },
  458. {
  459. name: "AI值3",
  460. value: 32.5,
  461. valueUnit: "%",
  462. },
  463. {
  464. name: "AI值4",
  465. value: 54.5,
  466. valueUnit: "%",
  467. },
  468. {
  469. name: "AI值5",
  470. value: 14.5,
  471. valueUnit: "%",
  472. },
  473. {
  474. name: "AI值6",
  475. value: 54.5,
  476. valueUnit: "%",
  477. },
  478. {
  479. name: "AI值7",
  480. value: 14.5,
  481. valueUnit: "%",
  482. },
  483. ],
  484. ],
  485. partDInfos: [
  486. [
  487. {
  488. name: "DI值1",
  489. value: 10.2,
  490. },
  491. {
  492. name: "DI值2",
  493. value: 23.4,
  494. },
  495. {
  496. name: "DI值3",
  497. value: 32.5,
  498. },
  499. {
  500. name: "DI值4",
  501. value: 54.5,
  502. },
  503. {
  504. name: "DI值5",
  505. value: 14.5,
  506. },
  507. {
  508. name: "DI值6",
  509. value: 54.5,
  510. },
  511. {
  512. name: "DI值7",
  513. value: 14.5,
  514. },
  515. ],
  516. ],
  517. uniformcodesA: [],
  518. uniformcodesD: [],
  519. resA: [],
  520. resD: [],
  521. indexe: 0,
  522. videoTit: [],
  523. dialogVisible: false,
  524. reliable: {},
  525. colorList: ["blue", "green", "red", "orange", "pink", "write", "gray"],
  526. path: ["camera.png", "camera2.png"],
  527. count: 0,
  528. colorFlag: false,
  529. timer: "",
  530. times: "",
  531. warnLeft: [
  532. {
  533. name: "防雷保护类",
  534. value: 10,
  535. },
  536. ],
  537. tableData: [
  538. {
  539. code: "1000",
  540. name: "变桨电池充电故障",
  541. message: "error_battery_charger",
  542. status: 1,
  543. },
  544. {
  545. code: "1002",
  546. name: "转子侧变流器电流故障",
  547. message: "error_converter_error_inu_flag",
  548. status: 0,
  549. },
  550. {
  551. code: "1000",
  552. name: "变桨电池充电故障",
  553. message: "error_battery_charger",
  554. status: 1,
  555. },
  556. {
  557. code: "1002",
  558. name: "转子侧变流器电流故障",
  559. message: "error_converter_error_inu_flag",
  560. status: 0,
  561. },
  562. {
  563. code: "1000",
  564. name: "变桨电池充电故障",
  565. message: "error_battery_charger",
  566. status: 1,
  567. },
  568. {
  569. code: "1002",
  570. name: "转子侧变流器电流故障",
  571. message: "error_converter_error_inu_flag",
  572. status: 0,
  573. },
  574. {
  575. code: "1000",
  576. name: "变桨电池充电故障",
  577. message: "error_battery_charger",
  578. status: 1,
  579. },
  580. {
  581. code: "1002",
  582. name: "转子侧变流器电流故障",
  583. message: "error_converter_error_inu_flag",
  584. status: 0,
  585. },
  586. {
  587. code: "1000",
  588. name: "变桨电池充电故障",
  589. message: "error_battery_charger",
  590. status: 1,
  591. },
  592. {
  593. code: "1002",
  594. name: "转子侧变流器电流故障",
  595. message: "error_converter_error_inu_flag",
  596. status: 0,
  597. },
  598. {
  599. code: "1000",
  600. name: "变桨电池充电故障",
  601. message: "error_battery_charger",
  602. status: 1,
  603. },
  604. {
  605. code: "1002",
  606. name: "转子侧变流器电流故障",
  607. message: "error_converter_error_inu_flag",
  608. status: 0,
  609. },
  610. {
  611. code: "1000",
  612. name: "变桨电池充电故障",
  613. message: "error_battery_charger",
  614. status: 1,
  615. },
  616. {
  617. code: "1002",
  618. name: "转子侧变流器电流故障",
  619. message: "error_converter_error_inu_flag",
  620. status: 0,
  621. },
  622. {
  623. code: "1000",
  624. name: "变桨电池充电故障",
  625. message: "error_battery_charger",
  626. status: 1,
  627. },
  628. {
  629. code: "1002",
  630. name: "转子侧变流器电流故障",
  631. message: "error_converter_error_inu_flag",
  632. status: 0,
  633. },
  634. ],
  635. warnTypeData: {
  636. total: "",
  637. typeData: [],
  638. tableData: [],
  639. dataColumn1: [],
  640. dataColumnOther: [],
  641. tableHeader: [
  642. {
  643. code: "alarmId",
  644. name: "报警编号",
  645. },
  646. {
  647. code: "id",
  648. name: "PCL变量名",
  649. },
  650. {
  651. code: "tagid",
  652. name: "报警文字信息",
  653. },
  654. {
  655. code: "isClose",
  656. name: "报警状态",
  657. },
  658. ],
  659. },
  660. windObj: {},
  661. };
  662. },
  663. components: { svgIcon, alarmDialog, powerAndSpeed },
  664. apiUrl: "",
  665. props: {
  666. wind: {
  667. type: Object,
  668. default: () => {},
  669. },
  670. flag: {
  671. type: Boolean,
  672. default: false,
  673. },
  674. },
  675. computed: {
  676. windSpeedRota() {
  677. let count = this.windStatus?.SSPJFS / 25;
  678. let result = Number((310 * count + 50).toFixed(0));
  679. if (result) {
  680. if (result > 310) {
  681. return "rotateZ(310deg)";
  682. } else {
  683. return "rotateZ(" + Number((310 * count + 50).toFixed(0)) + "deg)";
  684. }
  685. } else {
  686. return "rotateZ(50deg)";
  687. }
  688. },
  689. },
  690. mounted() {
  691. this.timer = setInterval(() => {
  692. if (Object.keys(this.windInfo).length) {
  693. this.getWtMonitorInfo(this.windInfo);
  694. this.getPointsData(this.resA, this.resD);
  695. }
  696. }, 5000);
  697. this.times = setInterval(() => {
  698. this.count++;
  699. if (this.count > 1) {
  700. this.count = 0;
  701. }
  702. }, 800);
  703. if (document.getElementById("ifrId")) {
  704. const oIframe = document.getElementById("ifrId");
  705. const deviceWidth = document.getElementById("ifVideo").offsetWidth;
  706. const deviceHeight = document.getElementById("ifVideo").offsetHeight;
  707. oIframe.style.width = deviceWidth + "px";
  708. oIframe.style.height = deviceHeight + "px";
  709. }
  710. },
  711. unmounted() {
  712. clearInterval(this.timer);
  713. this.timer = null;
  714. clearInterval(this.times);
  715. this.times = null;
  716. },
  717. watch: {
  718. wind: {
  719. handler() {
  720. if (Object.keys(this.wind).length) {
  721. this.start(this.wind);
  722. this.getwarnTypeData(this.wind.wtid);
  723. }
  724. },
  725. },
  726. $route: {
  727. handler(val) {
  728. if (
  729. val.path.includes("lightmatrix") ||
  730. val.path.includes("detailmatrix") ||
  731. val.path.includes("draughtFan")
  732. ) {
  733. this.colorFlag = true;
  734. }
  735. },
  736. immediate: true,
  737. },
  738. },
  739. methods: {
  740. getwarnTypeData(id) {
  741. let that = this;
  742. let params = {
  743. // wtid: "NX_FGS_HA_F_WT_0039_EQ"
  744. wtid: id,
  745. };
  746. GetMatrixalarmtype(params).then((res) => {
  747. if (res && res.data && res.data.data.length > 0) {
  748. for (let i = 0; i < res.data.data.length; i++) {
  749. let item = res.data.data[i];
  750. for (let k in res.data.count) {
  751. if (item.nemCode === k) {
  752. item.count = res.data.count[k];
  753. }
  754. }
  755. }
  756. that.warnTypeData.total = res.data.count.zs;
  757. that.warnTypeData.typeData = res.data.data;
  758. that.warnTypeData.dataColumn1 = that.warnTypeData.typeData.slice(
  759. 0,
  760. 5
  761. );
  762. that.warnTypeData.dataColumnOther[0] =
  763. that.warnTypeData.typeData.slice(5, 13);
  764. that.warnTypeData.dataColumnOther[1] =
  765. that.warnTypeData.typeData.slice(13, 21);
  766. console.log("typeData===>>>", that.warnTypeData.typeData);
  767. that.getwarnTableData(that.warnTypeData.typeData[0], id);
  768. }
  769. });
  770. },
  771. getwarnTableDataFn(data) {
  772. this.getwarnTableData(data, this.wind.wtid);
  773. },
  774. getwarnTableData(data, id) {
  775. let that = this;
  776. let params = {
  777. // type: "BJXT",
  778. // wtid: "NX_FGS_HA_F_WT_0039_EQ",
  779. type: data.nemCode,
  780. wtid: id,
  781. };
  782. GetMatrixalarmtypeTable(params).then((res) => {
  783. if (res && res.data) {
  784. res.data.forEach((it) => {
  785. it.isClose = it.closeTime ? true : it.endts ? true : false;
  786. });
  787. that.warnTypeData.tableData = res.data;
  788. }
  789. });
  790. },
  791. handleXhClick(wind) {
  792. // console.log(wind);
  793. this.$refs.powerAndSpeed && this.$refs.powerAndSpeed.init(wind);
  794. },
  795. isRed(val) {
  796. if (val === 2 || val === 6) {
  797. return "redsty";
  798. }
  799. },
  800. cancle() {
  801. this.windInfo = {};
  802. this.windname = "";
  803. this.wtid = "";
  804. this.current = "fdj";
  805. this.monitorInfo = {};
  806. this.partAInfo = [];
  807. this.partDInfo = [];
  808. this.partAInfos = [];
  809. this.partDInfos = [];
  810. this.uniformcodesA = [];
  811. this.uniformcodesD = [];
  812. this.resA = [];
  813. this.resD = [];
  814. },
  815. // 页面初始信息
  816. start(val) {
  817. if (Object.keys(val).length) {
  818. this.windInfo = val;
  819. this.windname = val.wtname;
  820. this.wtid = val.wtid;
  821. this.wpid = val.wpid;
  822. this.current = "fdj";
  823. this.getWtMonitorInfo(val);
  824. this.getWtOtherInfo(val);
  825. this.handleClick("fdj");
  826. } else {
  827. this.cancle();
  828. }
  829. },
  830. // 设备监测信息
  831. getWtMonitorInfo(val) {
  832. if (val.wtType == -1) {
  833. GetWtMonitorInfo({ wtid: val.wtid }).then(({ data }) => {
  834. this.monitorInfo = data.data;
  835. this.monitorInfo.rfdl =
  836. this.monitorInfo.rfdl < 0 ? 0 : this.monitorInfo.rfdl;
  837. // for(var key in this.monitorInfo){
  838. // this.monitorInfo[key]=this.monitorInfo[key] < 0 ? 0 : this.monitorInfo[key];
  839. // }
  840. });
  841. } else {
  842. this.monitorInfo = {};
  843. }
  844. },
  845. // 设备其他信息
  846. getWtOtherInfo(val) {
  847. GetWtOtherInfo({ wtid: val.wtid }).then((res) => {
  848. if (res.code == 200) {
  849. this.otherInfo = res.data;
  850. }
  851. });
  852. },
  853. // 查看各部位编码
  854. handleClick(val) {
  855. this.current = val;
  856. this.partAInfos = [];
  857. this.partDInfos = [];
  858. if (this.wtid) {
  859. this.getPartInfo();
  860. }
  861. },
  862. // 统一编码
  863. getPartInfo() {
  864. if (this.windInfo.wtType == -1) {
  865. if (this.wtid.length && this.current) {
  866. GetWtTelemeteryInfo({
  867. part: this.current,
  868. wtid: this.wtid,
  869. }).then(({ data }) => {
  870. // 拿到初始获取数据
  871. this.partAInfo = data.data.AI;
  872. this.partDInfo = data.data.DI;
  873. // 拿到数据的uniformcode集合
  874. this.uniformcodesD = this.partDInfo.length
  875. ? this.partDInfo.map((item) => item.uniformCode)
  876. : [];
  877. this.uniformcodesA = this.partAInfo.length
  878. ? this.partAInfo.map((item) => item.uniformCode)
  879. : [];
  880. // 获取测点数据
  881. // if (this.uniformcodesA.length>0 && this.uniformcodesD.length>0) {
  882. // this.getPointsIds();
  883. // } else {
  884. if (this.uniformcodesA.length > 0) {
  885. this.getPointsIdOne("AI", this.uniformcodesA);
  886. }
  887. if (this.uniformcodesD.length > 0) {
  888. this.getPointsIdOne("DI", this.uniformcodesD);
  889. }
  890. // }
  891. });
  892. }
  893. }
  894. },
  895. //查询数据AI和DI同时存在
  896. getPointsIds() {
  897. let pointsIdsA = new Promise((resolve, reject) => {
  898. GetWtPoints({
  899. wtid: this.wtid,
  900. uniformcodes: this.uniformcodesA,
  901. })
  902. .then(({ data }) => {
  903. resolve(data);
  904. })
  905. .catch((e) => {
  906. reject("发生错误");
  907. });
  908. });
  909. let pointsIdsD = new Promise((resolve, reject) => {
  910. GetWtPoints({
  911. wtid: this.wtid,
  912. uniformcodes: this.uniformcodesD,
  913. })
  914. .then(({ data }) => {
  915. resolve(data);
  916. })
  917. .catch((e) => {
  918. // 标记失败后给定某个数据
  919. reject("发生错误");
  920. });
  921. });
  922. Promise.all([pointsIdsA, pointsIdsD])
  923. .then((results) => {
  924. this.resA = results[0].data.length
  925. ? results[0].data.map((item) => (item != null ? item.nemCode : ""))
  926. : [];
  927. this.resD = results[1].data.length
  928. ? results[1].data.map((item) => (item != null ? item.nemCode : ""))
  929. : [];
  930. this.getPointsData(this.resA, this.resD);
  931. })
  932. .catch((e) => {
  933. console.log("error", e);
  934. });
  935. },
  936. getPointsData(pointsA, pointsD) {
  937. let pointsDataA = new Promise((resolve, reject) => {
  938. if (pointsA.length > 0) {
  939. GetPointsData({
  940. pointIds: pointsA,
  941. })
  942. .then(({ data }) => {
  943. resolve(data);
  944. })
  945. .catch((e) => {
  946. // 标记失败后给定某个数据
  947. reject("发生错误");
  948. });
  949. }
  950. });
  951. let pointsDataD = new Promise((resolve, reject) => {
  952. if (pointsD.length > 0) {
  953. GetPointsData({
  954. pointIds: pointsD,
  955. })
  956. .then(({ data }) => {
  957. resolve(data);
  958. })
  959. .catch((e) => {
  960. // 标记失败后给定某个数据
  961. reject("发生错误");
  962. });
  963. }
  964. });
  965. Promise.all([pointsDataA, pointsDataD])
  966. .then((results) => {
  967. let pointsInfoA = results[0].data.length ? results[0].data : [];
  968. let pointsInfoD = results[1].data.length ? results[1].data : [];
  969. let partAInfo = [];
  970. let partDInfo = [];
  971. let chunk = 4;
  972. this.partAInfo.forEach((item, index) => {
  973. pointsInfoA.forEach((i, ind) => {
  974. if (index == ind) {
  975. item.value = i.pointValueInDouble;
  976. }
  977. });
  978. });
  979. for (let i = 0, j = this.partAInfo.length; i < j; i += chunk) {
  980. partAInfo.push(this.partAInfo.slice(i, i + chunk));
  981. }
  982. this.partDInfo.forEach((item, index) => {
  983. pointsInfoD.forEach((i, ind) => {
  984. if (index == ind) {
  985. item.value = i.pointValueInDouble;
  986. }
  987. });
  988. });
  989. for (let m = 0, n = this.partDInfo.length; m < n; m += chunk) {
  990. partDInfo.push(this.partDInfo.slice(m, m + chunk));
  991. }
  992. this.partDInfos = partDInfo;
  993. this.partAInfos = partAInfo;
  994. })
  995. .catch((e) => {
  996. // 失败的时候则返回最先被reject失败状态的值
  997. console.log("error", e);
  998. });
  999. },
  1000. //查询数据只有AI点或者只有DI点
  1001. getPointsIdOne(type, uniformcodesXo) {
  1002. GetWtPoints({
  1003. wtid: this.wtid,
  1004. uniformcodes: uniformcodesXo,
  1005. })
  1006. .then(({ data }) => {
  1007. if (type === "AI") {
  1008. this.resA = data.data.length
  1009. ? data.data.map((item) => (item != null ? item.nemCode : ""))
  1010. : [];
  1011. if (this.resA.length > 0) {
  1012. this.getPointsDataOne(type, this.resA);
  1013. }
  1014. } else {
  1015. this.resD = data.data.length
  1016. ? data.data.map((item) => (item != null ? item.nemCode : ""))
  1017. : [];
  1018. if (this.resD.length > 0) {
  1019. this.getPointsDataOne(type, this.resD);
  1020. }
  1021. }
  1022. })
  1023. .catch((e) => {
  1024. console.log("发生错误");
  1025. });
  1026. },
  1027. getPointsDataOne(type, pointsData) {
  1028. GetPointsData({
  1029. pointIds: pointsData,
  1030. })
  1031. .then(({ data }) => {
  1032. let pointsInfo = data.data.length ? data.data : [];
  1033. let partAInfo = [];
  1034. let partDInfo = [];
  1035. let chunk = 4;
  1036. if (type === "AI") {
  1037. this.partAInfo.forEach((item, index) => {
  1038. pointsInfo.forEach((i, ind) => {
  1039. if (index == ind) {
  1040. item.value = i.pointValueInDouble;
  1041. }
  1042. });
  1043. });
  1044. for (let i = 0, j = this.partAInfo.length; i < j; i += chunk) {
  1045. partAInfo.push(this.partAInfo.slice(i, i + chunk));
  1046. }
  1047. this.partAInfos = partAInfo;
  1048. } else {
  1049. this.partDInfo.forEach((item, index) => {
  1050. pointsInfo.forEach((i, ind) => {
  1051. if (index == ind) {
  1052. item.value = i.pointValueInDouble;
  1053. }
  1054. });
  1055. });
  1056. for (let m = 0, n = this.partDInfo.length; m < n; m += chunk) {
  1057. partDInfo.push(this.partDInfo.slice(m, m + chunk));
  1058. }
  1059. this.partDInfos = partDInfo;
  1060. }
  1061. console.log("partAInfos===>>>", this.partAInfos);
  1062. console.log("partDInfos===>>>", this.partDInfos);
  1063. })
  1064. .catch((e) => {
  1065. // 标记失败后给定某个数据
  1066. console.log("发生错误");
  1067. });
  1068. },
  1069. //打开报警页面
  1070. handleAlarm(id) {
  1071. this.$refs.alarmDialog &&
  1072. this.$refs.alarmDialog.openDialog(id, this.wpid, this.windInfo.wtType);
  1073. },
  1074. clickVideo(index) {
  1075. this.indexe = index;
  1076. },
  1077. clivkFun() {
  1078. this.dialogVisible = true;
  1079. },
  1080. },
  1081. };
  1082. </script>
  1083. <style lang="less" scoped>
  1084. .icLi {
  1085. background: rgba(0, 70, 199, 0.1);
  1086. border-radius: 20px;
  1087. color: #b3b3b3;
  1088. }
  1089. .actives {
  1090. background: rgba(0, 70, 199, 0.4);
  1091. border-radius: 20px;
  1092. color: #f5f7fa;
  1093. }
  1094. .bodys {
  1095. display: flex;
  1096. flex-direction: row;
  1097. width: 100%;
  1098. height: 100%;
  1099. .edge {
  1100. width: 400px;
  1101. display: flex;
  1102. height: 100%;
  1103. flex-direction: column;
  1104. //
  1105. .info {
  1106. width: 100%;
  1107. flex: 0 0 auto;
  1108. padding: 10px 15px;
  1109. // background-color: rgba(11, 12, 12, 0.45);
  1110. background-color: rgba(96, 103, 105, 0.2);
  1111. border-radius: 5px;
  1112. display: flex;
  1113. flex-direction: column;
  1114. .info-wrapper {
  1115. display: flex;
  1116. width: 100%;
  1117. align-items: center;
  1118. justify-content: space-between;
  1119. margin-bottom: 10px;
  1120. .ps-info {
  1121. display: flex;
  1122. align-items: center;
  1123. margin-bottom: -5px;
  1124. white-space: nowrap;
  1125. color: #959595;
  1126. font-size: 15px;
  1127. div:nth-child(2) {
  1128. cursor: pointer;
  1129. &:hover,
  1130. &:active {
  1131. font-weight: 700;
  1132. }
  1133. }
  1134. }
  1135. }
  1136. .info-title {
  1137. width: 50%;
  1138. height: 25px;
  1139. font-size: 16px;
  1140. font-family: Microsoft YaHei;
  1141. font-weight: 400;
  1142. display: flex;
  1143. flex-direction: row;
  1144. align-items: center;
  1145. justify-content: center;
  1146. white-space: nowrap;
  1147. &.green {
  1148. background-color: rgba(5, 187, 76, 0.2);
  1149. // border: 1px solid #05bb4c;
  1150. color: #05bb4c;
  1151. }
  1152. &.blue {
  1153. background-color: rgba(0, 70, 199, 0.2);
  1154. // border: 1px solid #3c88f7;
  1155. color: #1c99ff;
  1156. }
  1157. &.pink {
  1158. background-color: rgba(197, 48, 200, 0.2);
  1159. // border: 1px solid #c530c8;
  1160. color: #c530c8;
  1161. }
  1162. &.red {
  1163. background-color: rgba(186, 50, 55, 0.2);
  1164. // border: 1px solid #ba3237;
  1165. color: #ba3237;
  1166. }
  1167. &.orange {
  1168. background-color: rgba(225, 125, 36, 0.2);
  1169. // border: 1px solid #e17d24;
  1170. color: #e17d24;
  1171. }
  1172. &.write {
  1173. background-color: rgba(255, 255, 255, 0.2);
  1174. // border: 1px solid #ffffff;
  1175. color: #ffffff;
  1176. }
  1177. &.gray {
  1178. background-color: rgba(96, 103, 105, 0.2);
  1179. // border: 1px solid #606769;
  1180. color: #606769;
  1181. }
  1182. }
  1183. .wt-alarm {
  1184. font-family: Microsoft YaHei;
  1185. font-weight: 400;
  1186. cursor: pointer;
  1187. span {
  1188. margin-left: 5px;
  1189. &.green {
  1190. color: #05bb4c;
  1191. }
  1192. &.blue {
  1193. color: #1c99ff;
  1194. }
  1195. &.pink {
  1196. color: #c530c8;
  1197. }
  1198. &.red {
  1199. color: #ba3237;
  1200. }
  1201. &.orange {
  1202. color: #e17d24;
  1203. }
  1204. &.write {
  1205. color: #ffffff;
  1206. }
  1207. &.gray {
  1208. color: #606769;
  1209. }
  1210. }
  1211. &:hover,
  1212. &:active {
  1213. span {
  1214. font-weight: 700;
  1215. font-size: 16px;
  1216. }
  1217. }
  1218. }
  1219. .info-item {
  1220. font-size: 24px;
  1221. font-family: Adobe Heiti Std;
  1222. font-weight: normal;
  1223. color: #ffffff;
  1224. display: flex;
  1225. align-items: center;
  1226. justify-content: space-between;
  1227. }
  1228. .info-value {
  1229. display: flex;
  1230. flex-direction: row;
  1231. align-items: baseline;
  1232. font-size: 40px;
  1233. font-family: Arial;
  1234. font-weight: 400;
  1235. color: #05bb4c;
  1236. white-space: nowrap;
  1237. .unit {
  1238. font-size: 24px;
  1239. font-family: Adobe Heiti Std;
  1240. font-weight: normal;
  1241. // margin-right: 20px;
  1242. }
  1243. }
  1244. }
  1245. .monitoring {
  1246. width: 100%;
  1247. flex: 1 0 auto;
  1248. background-color: rgba(96, 103, 105, 0.2);
  1249. // background-color: rgba(11, 12, 12, 0.45);
  1250. border-radius: 5px;
  1251. margin-top: 10px;
  1252. display: flex;
  1253. flex-direction: column;
  1254. align-items: center;
  1255. }
  1256. .wind-info-list {
  1257. height: calc(100% - 42px);
  1258. width: 100%;
  1259. display: flex;
  1260. flex-direction: column;
  1261. }
  1262. .wind-info {
  1263. flex: 1 0 auto;
  1264. display: flex;
  1265. flex-direction: row;
  1266. align-items: center;
  1267. justify-content: space-between;
  1268. width: 100%;
  1269. padding: 0 10%;
  1270. font-size: 14px;
  1271. font-family: Source Han Sans SC;
  1272. font-weight: 400;
  1273. color: #959595;
  1274. .wind-value {
  1275. display: flex;
  1276. flex-direction: row;
  1277. align-items: baseline;
  1278. font-size: 16px;
  1279. font-family: Arial;
  1280. font-weight: 400;
  1281. color: #05bb4c;
  1282. .unit {
  1283. font-size: 12px;
  1284. font-family: Source Han Sans SC;
  1285. font-weight: 400;
  1286. color: #959595;
  1287. width: 40px;
  1288. margin-left: 15px;
  1289. }
  1290. }
  1291. }
  1292. }
  1293. .parts {
  1294. // width: calc(100% - 600px - 20px);
  1295. width: calc(68vw - 20px);
  1296. // width: calc(99vw - 20px);
  1297. margin-right: 20px;
  1298. height: 100%;
  1299. display: flex;
  1300. flex-direction: column;
  1301. align-items: center;
  1302. justify-content: space-between;
  1303. // position: relative;
  1304. .part-top {
  1305. flex: 1;
  1306. width: 100%;
  1307. height: 70vh;
  1308. }
  1309. .part-title {
  1310. width: 100%;
  1311. height: 30px;
  1312. display: flex;
  1313. align-items: flex-start;
  1314. flex-direction: row;
  1315. .title-item {
  1316. width: 140px;
  1317. height: 100%;
  1318. display: flex;
  1319. align-items: center;
  1320. color: #b3bdc0;
  1321. justify-content: center;
  1322. // background: rgba(67, 81, 107, 0.2);
  1323. background: rgba(96, 103, 105, 0.2);
  1324. border-left: 1px solid rgba(0, 70, 199, 0.48);
  1325. border-top: 1px solid rgba(0, 70, 199, 0.48);
  1326. border-bottom: 1px solid rgba(0, 70, 199, 0.48);
  1327. &.part-left {
  1328. border-radius: 15px 0px 0px 15px;
  1329. }
  1330. &.part-right {
  1331. border-right: 1px solid rgba(0, 70, 199, 0.48);
  1332. border-radius: 0px 15px 15px 0px;
  1333. }
  1334. &.active {
  1335. // background-color: rgba(0, 70, 199, 0.4);
  1336. background-color: rgba(0, 70, 199, 0.48);
  1337. color: #ffffff;
  1338. }
  1339. }
  1340. }
  1341. .part-imgs {
  1342. min-height: calc(100% - 30px);
  1343. position: relative;
  1344. }
  1345. .wind-part {
  1346. position: absolute;
  1347. top: 50%;
  1348. left: 50%;
  1349. transform: translate(-50%, -50%);
  1350. }
  1351. .part-info {
  1352. width: 100%;
  1353. // max-height: 50vh;
  1354. height: 30vh;
  1355. bottom: 0px;
  1356. display: flex;
  1357. // flex-direction: column-reverse;
  1358. [v-cloak] {
  1359. display: none;
  1360. }
  1361. .part-body {
  1362. width: 100%;
  1363. padding-bottom: 20px;
  1364. // background: rgba(11, 12, 12, 0.45);
  1365. background: rgba(96, 103, 105, 0.2);
  1366. border-radius: 5px;
  1367. margin-top: 10px;
  1368. display: flex;
  1369. flex-direction: column;
  1370. align-items: center;
  1371. padding: 10px 0;
  1372. .part-item {
  1373. width: 100%;
  1374. height: calc(100% - 42px);
  1375. overflow-y: scroll;
  1376. }
  1377. .part {
  1378. width: 100%;
  1379. display: flex;
  1380. // flex-direction: row;
  1381. flex-wrap: wrap;
  1382. margin-top: 5px;
  1383. font-size: 13px;
  1384. font-family: Source Han Sans SC;
  1385. font-weight: 400;
  1386. color: #959595;
  1387. padding: 0 10px;
  1388. .table-item {
  1389. width: 25%;
  1390. font-size: 12px;
  1391. .table-value {
  1392. display: flex;
  1393. flex-direction: row;
  1394. align-items: baseline;
  1395. .unit {
  1396. font-size: 12px;
  1397. font-family: Source Han Sans SC;
  1398. font-weight: 400;
  1399. color: #817c7c;
  1400. margin-left: 5px;
  1401. width: 40px;
  1402. }
  1403. &.round {
  1404. width: 8px;
  1405. height: 8px;
  1406. border-radius: 50%;
  1407. background-color: rgba(0, 70, 199, 0.48);
  1408. margin-right: 90px;
  1409. }
  1410. &.round-red {
  1411. width: 8px;
  1412. height: 8px;
  1413. border-radius: 50%;
  1414. background-color: red;
  1415. margin-right: 90px;
  1416. }
  1417. }
  1418. }
  1419. &.active {
  1420. background-color: rgba(83, 89, 104, 0.15);
  1421. }
  1422. }
  1423. }
  1424. }
  1425. }
  1426. .problemsAI {
  1427. width: 32vw;
  1428. // background: rgba(96, 103, 105, 0.2);
  1429. border-radius: 5px;
  1430. padding: 10px;
  1431. .part-info-ai {
  1432. width: 100%;
  1433. height: 100%;
  1434. bottom: 0px;
  1435. display: flex;
  1436. flex-direction: column-reverse;
  1437. [v-cloak] {
  1438. display: none;
  1439. }
  1440. .part-body-ai {
  1441. width: 100%;
  1442. height: 100%;
  1443. padding-bottom: 20px;
  1444. // background: rgba(11, 12, 12, 0.45);
  1445. background: rgba(96, 103, 105, 0.2);
  1446. border-radius: 5px;
  1447. margin-top: 10px;
  1448. display: flex;
  1449. flex-direction: column;
  1450. align-items: center;
  1451. padding: 10px 0;
  1452. .part-item-ai {
  1453. width: 100%;
  1454. // height: calc(100% - 42px);
  1455. height: 100%;
  1456. overflow-y: scroll;
  1457. }
  1458. .part-ai {
  1459. width: 100%;
  1460. display: flex;
  1461. // flex-direction: row;
  1462. flex-wrap: wrap;
  1463. margin-top: 5px;
  1464. font-size: 13px;
  1465. font-family: Source Han Sans SC;
  1466. font-weight: 400;
  1467. color: #959595;
  1468. padding: 0 10px;
  1469. .table-item-ai {
  1470. width: 50%;
  1471. font-size: 12px;
  1472. .table-value-ai {
  1473. display: flex;
  1474. flex-direction: row;
  1475. align-items: baseline;
  1476. .unit-ai {
  1477. font-size: 12px;
  1478. font-family: Source Han Sans SC;
  1479. font-weight: 400;
  1480. color: #817c7c;
  1481. margin-left: 5px;
  1482. width: 40px;
  1483. }
  1484. &.round {
  1485. width: 8px;
  1486. height: 8px;
  1487. border-radius: 50%;
  1488. background-color: rgba(0, 70, 199, 0.48);
  1489. margin-right: 90px;
  1490. }
  1491. &.round-red {
  1492. width: 8px;
  1493. height: 8px;
  1494. border-radius: 50%;
  1495. background-color: red;
  1496. margin-right: 90px;
  1497. }
  1498. }
  1499. }
  1500. &.active {
  1501. background-color: rgba(83, 89, 104, 0.15);
  1502. }
  1503. }
  1504. }
  1505. }
  1506. }
  1507. .problems {
  1508. width: 30vw;
  1509. background: rgba(96, 103, 105, 0.2);
  1510. border-radius: 5px;
  1511. padding: 10px;
  1512. .problemTit {
  1513. display: flex;
  1514. justify-content: space-between;
  1515. position: relative;
  1516. width: 98%;
  1517. height: 42px;
  1518. border-bottom: 1px solid #363b46;
  1519. display: flex;
  1520. align-items: center;
  1521. padding-left: 20px;
  1522. font-size: 16px;
  1523. font-family: Microsoft YaHei;
  1524. font-weight: 400;
  1525. color: #ffffff;
  1526. .problemSeach {
  1527. display: flex;
  1528. .el-input {
  1529. width: 150px;
  1530. position: relative;
  1531. top: -4px;
  1532. margin-right: 5px;
  1533. }
  1534. .seachBtn {
  1535. width: 30px;
  1536. height: 30px;
  1537. background: rgba(0, 70, 199, 0.48);
  1538. border-radius: 30px;
  1539. position: relative;
  1540. margin-left: 5px;
  1541. cursor: pointer;
  1542. .el-icon {
  1543. position: absolute;
  1544. top: 6px;
  1545. left: 7px;
  1546. }
  1547. &:hover {
  1548. background-color: rgba(16, 81, 219, 0.5);
  1549. color: #ffffff;
  1550. }
  1551. }
  1552. .buttons {
  1553. background-color: rgba(5, 187, 76, 0.2);
  1554. border: 1px solid #3b6c53;
  1555. color: #b3b3b3;
  1556. font-size: 14px;
  1557. width: 40px;
  1558. height: 30px;
  1559. position: relative;
  1560. padding: 0 25px !important;
  1561. .button {
  1562. position: absolute;
  1563. left: 13px;
  1564. top: 7px;
  1565. }
  1566. &:hover {
  1567. background-color: rgba(5, 187, 76, 0.5);
  1568. color: #ffffff;
  1569. }
  1570. }
  1571. }
  1572. }
  1573. .problemMain {
  1574. .problemWarn {
  1575. margin-top: 10px;
  1576. display: flex;
  1577. justify-content: space-between;
  1578. width: 100%;
  1579. .warn {
  1580. width: 32%;
  1581. }
  1582. .warnCom {
  1583. width: 100%;
  1584. height: 100px;
  1585. // border: 1px solid rgba(255,0,0,0.8);
  1586. margin-bottom: 5px;
  1587. box-shadow: inset 0px 0px 40px 0px red;
  1588. animation: flash 1s infinite alternate; /* 闪烁动画 */
  1589. .warnComImg {
  1590. width: 50px;
  1591. height: 50px;
  1592. text-align: center;
  1593. border-radius: 50px;
  1594. border: 1px solid rgba(255, 0, 0, 0.3);
  1595. position: relative;
  1596. top: -74px;
  1597. left: 22px;
  1598. img {
  1599. position: relative;
  1600. top: 5px;
  1601. }
  1602. }
  1603. .warnComNum {
  1604. position: relative;
  1605. top: -119px;
  1606. left: 88px;
  1607. width: 55px;
  1608. .numTop {
  1609. font-size: 22px;
  1610. font-weight: bold;
  1611. color: red;
  1612. text-align: end;
  1613. }
  1614. .numBot {
  1615. font-size: 14px;
  1616. color: rgb(136, 136, 136);
  1617. position: absolute;
  1618. right: 0;
  1619. top: 21px;
  1620. }
  1621. }
  1622. .circle-container {
  1623. width: 100px;
  1624. height: 100px;
  1625. position: relative;
  1626. }
  1627. .circle-segment {
  1628. position: absolute;
  1629. top: 20%;
  1630. left: 17%;
  1631. width: 60px;
  1632. height: 60px;
  1633. transform-origin: center;
  1634. transform: translate(-50%, -50%);
  1635. stroke-width: 5;
  1636. fill: none;
  1637. stroke-dasharray: 50, 30; /* 圆周长三分之一加间隔 */
  1638. stroke-dashoffset: 0;
  1639. animation: rotate 4s linear infinite;
  1640. }
  1641. .segment-1 {
  1642. stroke: red;
  1643. transform: rotate(0deg);
  1644. }
  1645. @keyframes rotate {
  1646. from {
  1647. transform: rotate(0deg);
  1648. }
  1649. to {
  1650. transform: rotate(360deg);
  1651. }
  1652. }
  1653. }
  1654. @keyframes flash {
  1655. from {
  1656. box-shadow: inset 0 0 10px #e60101; /* 开始时的内阴影 */
  1657. }
  1658. to {
  1659. box-shadow: inset 0 0 40px #f00; /* 结束时的内阴影,颜色更亮或更大 */
  1660. }
  1661. }
  1662. .warnItems {
  1663. width: 100%;
  1664. display: flex;
  1665. color: #817c7c;
  1666. margin-bottom: 3px;
  1667. cursor: pointer;
  1668. .warnItemLeft {
  1669. height: 32px;
  1670. width: 20%;
  1671. border: 1px solid #817c7c;
  1672. margin-right: 1%;
  1673. text-align: center;
  1674. line-height: 28px;
  1675. }
  1676. .warnItemRight {
  1677. height: 32px;
  1678. width: 79%;
  1679. line-height: 28px;
  1680. border: 1px solid #817c7c;
  1681. padding-left: 5px;
  1682. }
  1683. .redsty {
  1684. border: 1px solid red;
  1685. color: red;
  1686. }
  1687. }
  1688. }
  1689. .warnTable {
  1690. margin-top: 10px;
  1691. }
  1692. }
  1693. }
  1694. }
  1695. .monitoring-item {
  1696. position: relative;
  1697. width: 98%;
  1698. height: 42px;
  1699. border-bottom: 1px solid #363b46;
  1700. display: flex;
  1701. align-items: center;
  1702. padding-left: 20px;
  1703. font-size: 16px;
  1704. font-family: Microsoft YaHei;
  1705. font-weight: 400;
  1706. color: #ffffff;
  1707. }
  1708. .point {
  1709. width: 8px;
  1710. height: 1px;
  1711. background-color: #ffffff;
  1712. position: absolute;
  1713. &.point-left {
  1714. left: 0;
  1715. }
  1716. &.point-right {
  1717. right: 0;
  1718. }
  1719. &.top {
  1720. top: -1px;
  1721. }
  1722. &.bottom {
  1723. bottom: -1px;
  1724. }
  1725. }
  1726. .points {
  1727. width: 1px;
  1728. height: 8px;
  1729. background-color: #ffffff;
  1730. position: absolute;
  1731. &.point-left {
  1732. left: 0;
  1733. }
  1734. &.point-right {
  1735. right: 0;
  1736. }
  1737. &.top {
  1738. top: -1px;
  1739. }
  1740. &.bottom {
  1741. bottom: -1px;
  1742. }
  1743. }
  1744. .table-item,
  1745. .table-item-ai {
  1746. display: flex;
  1747. flex-direction: row;
  1748. align-items: center;
  1749. justify-content: space-between;
  1750. width: 100%;
  1751. height: 33px;
  1752. font-size: 12px;
  1753. font-family: Microsoft YaHei;
  1754. font-weight: 400;
  1755. color: #b3b3b3;
  1756. padding: 0 0px;
  1757. .table-value,
  1758. .table-value-ai {
  1759. font-family: Arial;
  1760. font-weight: 400;
  1761. color: rgb(15, 120, 240);
  1762. margin-right: 25px;
  1763. }
  1764. .table-value-di {
  1765. font-family: Arial;
  1766. font-weight: 400;
  1767. color: rgb(15, 120, 240);
  1768. margin-right: 25px;
  1769. .round {
  1770. width: 30px;
  1771. height: 18px;
  1772. // color: rgba(0, 70, 199, 0.88);
  1773. color: rgb(15, 120, 240);
  1774. margin-right: 90px;
  1775. }
  1776. .round-red {
  1777. width: 30px;
  1778. height: 18px;
  1779. color: red;
  1780. margin-right: 90px;
  1781. }
  1782. }
  1783. }
  1784. </style>