anomaly-dashboard.scss 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. .anomaly-dashboard-page {
  2. height: 100%;
  3. min-height: 0;
  4. position: relative;
  5. display: flex;
  6. flex-direction: column;
  7. padding: 10px;
  8. box-sizing: border-box;
  9. font-family: "Microsoft YaHei", system-ui, sans-serif;
  10. overflow-x: hidden;
  11. *,
  12. *::before,
  13. *::after {
  14. box-sizing: border-box;
  15. }
  16. .anomaly-page__body {
  17. flex: 1;
  18. min-height: 0;
  19. overflow-y: auto;
  20. }
  21. .anomaly-top-grid {
  22. display: grid;
  23. grid-template-columns: 1fr;
  24. gap: 12px;
  25. min-height: 520px;
  26. }
  27. @media (min-width: 1024px) {
  28. .anomaly-top-grid {
  29. grid-template-columns: repeat(3, minmax(0, 1fr));
  30. }
  31. }
  32. .anomaly-overview-card {
  33. padding: 16px;
  34. height: 100%;
  35. display: flex;
  36. flex-direction: column;
  37. }
  38. .anomaly-overview-stats {
  39. display: grid;
  40. grid-template-columns: 1fr 1px 1fr;
  41. align-items: stretch;
  42. gap: 16px;
  43. margin-top: 8px;
  44. }
  45. .anomaly-overview-ring-wrap {
  46. display: flex;
  47. flex-direction: column;
  48. align-items: center;
  49. justify-content: center;
  50. padding: 12px 0;
  51. }
  52. .anomaly-overview-ring {
  53. width: 80px;
  54. height: 80px;
  55. border-radius: 50%;
  56. display: flex;
  57. align-items: center;
  58. justify-content: center;
  59. .anomaly-num {
  60. font-size: 32px;
  61. line-height: 1;
  62. }
  63. }
  64. .anomaly-overview-ring-label {
  65. margin-top: 16px;
  66. font-size: 13px;
  67. font-weight: 500;
  68. }
  69. .anomaly-overview-side {
  70. display: flex;
  71. flex-direction: column;
  72. justify-content: center;
  73. gap: 12px;
  74. padding: 4px 0;
  75. }
  76. .anomaly-stat-card {
  77. display: flex;
  78. align-items: center;
  79. gap: 12px;
  80. padding: 12px;
  81. border-radius: 12px;
  82. }
  83. .anomaly-stat-icon {
  84. width: 48px;
  85. height: 48px;
  86. border-radius: 12px;
  87. display: flex;
  88. align-items: center;
  89. justify-content: center;
  90. flex-shrink: 0;
  91. font-size: 20px;
  92. font-weight: 700;
  93. }
  94. .anomaly-stat-label {
  95. font-size: 12px;
  96. font-weight: 500;
  97. line-height: 1.3;
  98. }
  99. .anomaly-stat-ratio {
  100. font-size: 10px;
  101. margin-top: 4px;
  102. }
  103. .anomaly-radar-wrap {
  104. margin-top: 14px;
  105. padding-top: 14px;
  106. display: grid;
  107. grid-template-columns: 1fr 1fr;
  108. gap: 8px;
  109. }
  110. .anomaly-radar-panel {
  111. min-width: 0;
  112. border-radius: 10px;
  113. padding: 10px 8px 4px;
  114. overflow: hidden;
  115. }
  116. .anomaly-radar-panel-head {
  117. display: flex;
  118. justify-content: space-between;
  119. align-items: center;
  120. gap: 2px;
  121. padding: 0 6px 4px;
  122. }
  123. .anomaly-radar-panel-title {
  124. font-size: 14px;
  125. font-weight: 600;
  126. display: flex;
  127. align-items: center;
  128. gap: 4px;
  129. }
  130. .anomaly-radar-panel-unit {
  131. font-size: 10px;
  132. white-space: nowrap;
  133. }
  134. .anomaly-radar-chart {
  135. width: 100%;
  136. height: 220px;
  137. }
  138. .anomaly-heatmap-card {
  139. padding: 12px;
  140. height: 100%;
  141. display: flex;
  142. flex-direction: column;
  143. min-height: 520px;
  144. }
  145. .anomaly-heatmap-chart {
  146. flex: 1;
  147. min-height: 0;
  148. width: 100%;
  149. }
  150. .anomaly-carousel-card {
  151. padding: 12px;
  152. margin-top: 12px;
  153. }
  154. .anomaly-carousel-head {
  155. display: flex;
  156. align-items: center;
  157. justify-content: space-between;
  158. margin-bottom: 12px;
  159. }
  160. .anomaly-carousel-controls {
  161. display: flex;
  162. align-items: center;
  163. gap: 8px;
  164. position: relative;
  165. z-index: 5;
  166. flex-shrink: 0;
  167. }
  168. .anomaly-carousel-btn {
  169. width: 28px;
  170. height: 28px;
  171. border-radius: 50%;
  172. display: inline-flex;
  173. align-items: center;
  174. justify-content: center;
  175. cursor: pointer;
  176. transition: background 0.2s ease;
  177. padding: 0;
  178. }
  179. .anomaly-carousel-dots {
  180. display: flex;
  181. align-items: center;
  182. gap: 10px;
  183. padding: 6px 10px;
  184. margin: 0 4px;
  185. }
  186. .anomaly-carousel-dot {
  187. width: 10px;
  188. height: 10px;
  189. border-radius: 50%;
  190. cursor: pointer;
  191. flex-shrink: 0;
  192. position: relative;
  193. z-index: 6;
  194. transition: all 0.2s ease;
  195. }
  196. .anomaly-carousel-chart {
  197. height: 340px;
  198. width: 100%;
  199. position: relative;
  200. z-index: 1;
  201. }
  202. .anomaly-wind-list-title {
  203. margin: 12px 0 8px;
  204. font-size: 14px;
  205. font-weight: 600;
  206. }
  207. .anomaly-wind-grid {
  208. display: grid;
  209. grid-template-columns: repeat(1, minmax(0, 1fr));
  210. gap: 12px;
  211. padding-bottom: 12px;
  212. }
  213. @media (min-width: 768px) {
  214. .anomaly-wind-grid {
  215. grid-template-columns: repeat(2, minmax(0, 1fr));
  216. }
  217. }
  218. @media (min-width: 1280px) {
  219. .anomaly-wind-grid {
  220. grid-template-columns: repeat(4, minmax(0, 1fr));
  221. }
  222. }
  223. .anomaly-wind-empty-card {
  224. grid-column: 1 / -1;
  225. min-height: 160px;
  226. display: flex;
  227. align-items: center;
  228. justify-content: center;
  229. padding: 24px 12px;
  230. }
  231. .anomaly-wind-empty-card__text {
  232. font-size: 14px;
  233. letter-spacing: 0.5px;
  234. }
  235. .anomaly-wind-card {
  236. position: relative;
  237. min-height: 200px;
  238. padding: 12px;
  239. }
  240. .anomaly-wind-card__header {
  241. display: flex;
  242. align-items: center;
  243. justify-content: space-between;
  244. gap: 8px;
  245. margin-bottom: 10px;
  246. }
  247. .anomaly-wind-card__modules {
  248. display: flex;
  249. flex-direction: column;
  250. gap: 10px;
  251. }
  252. .anomaly-wind-module {
  253. padding: 8px;
  254. border-radius: 6px;
  255. background: rgba(0, 36, 64, 0.22);
  256. border: 1px solid rgba(126, 172, 199, 0.18);
  257. }
  258. .anomaly-wind-module__title {
  259. margin-bottom: 8px;
  260. font-size: 11px;
  261. font-weight: 600;
  262. line-height: 1.2;
  263. color: var(--anomaly-title, #b7dff5);
  264. }
  265. .anomaly-wind-module--sensor {
  266. .anomaly-wind-sensors {
  267. font-size: 11px;
  268. line-height: 1.5;
  269. word-break: break-all;
  270. }
  271. }
  272. .anomaly-wind-turbine {
  273. grid-column: 3;
  274. grid-row: 1;
  275. display: flex;
  276. align-items: center;
  277. justify-content: center;
  278. min-height: 0;
  279. opacity: 0.9;
  280. }
  281. .anomaly-wind-turbine__icon {
  282. width: 100%;
  283. max-width: 96px;
  284. height: auto;
  285. max-height: 92px;
  286. display: block;
  287. object-fit: contain;
  288. }
  289. .anomaly-wind-id {
  290. flex-shrink: 0;
  291. font-size: 12px;
  292. font-weight: 700;
  293. line-height: 1;
  294. padding: 4px 8px;
  295. border-radius: 10px;
  296. }
  297. .anomaly-wind-metrics {
  298. display: grid;
  299. grid-template-columns: repeat(3, minmax(0, 1fr));
  300. grid-template-rows: auto auto;
  301. gap: 12px 8px;
  302. align-items: center;
  303. }
  304. .anomaly-wind-metric {
  305. display: flex;
  306. flex-direction: column;
  307. align-items: center;
  308. justify-content: center;
  309. text-align: center;
  310. min-width: 0;
  311. .anomaly-num {
  312. display: block;
  313. font-size: 18px;
  314. line-height: 1.4;
  315. }
  316. }
  317. .anomaly-wind-metric--wind {
  318. grid-column: 1;
  319. grid-row: 1;
  320. }
  321. .anomaly-wind-metric--yaw {
  322. grid-column: 2;
  323. grid-row: 1;
  324. }
  325. .anomaly-wind-metric--pitch {
  326. grid-column: 1;
  327. grid-row: 2;
  328. }
  329. .anomaly-wind-metric--run {
  330. grid-column: 2;
  331. grid-row: 2;
  332. }
  333. .anomaly-wind-metric--aero {
  334. grid-column: 3;
  335. grid-row: 2;
  336. }
  337. .anomaly-wind-label {
  338. display: block;
  339. margin-top: 4px;
  340. font-size: 11px;
  341. line-height: 1.35;
  342. min-height: 2.8em;
  343. word-break: break-all;
  344. }
  345. .anomaly-wind-sensors {
  346. min-width: 0;
  347. font-size: 11px;
  348. line-height: 1.5;
  349. }
  350. .anomaly-wind-detail__btn {
  351. flex-shrink: 0;
  352. display: inline-flex;
  353. align-items: center;
  354. gap: 4px;
  355. padding: 4px 12px;
  356. border-radius: 4px;
  357. font-size: 11px;
  358. line-height: 1.4;
  359. cursor: pointer;
  360. transition: all 0.25s ease;
  361. background: rgba(34, 211, 238, 0.08);
  362. border: 1px solid rgba(103, 232, 249, 0.45);
  363. color: #67e8f9;
  364. &:hover {
  365. background: rgba(34, 211, 238, 0.18);
  366. border-color: rgba(103, 232, 249, 0.75);
  367. color: #a5f3fc;
  368. }
  369. }
  370. .anomaly-wind-detail__icon {
  371. font-size: 12px;
  372. }
  373. /* —— 非科技蓝:浅色业务主题 —— */
  374. html:not([data-theme="tech-blue"]) & {
  375. background-color: var(--anomaly-page-bg, var(--content-bg, #f5f7fa));
  376. color: var(--anomaly-page-text, #303133);
  377. .el-loading-mask {
  378. background-color: var(--anomaly-loading-bg, rgba(255, 255, 255, 0.72)) !important;
  379. }
  380. .anomaly-card {
  381. background: var(--anomaly-card-bg, #ffffff);
  382. border: 1px solid var(--anomaly-card-border, #ebeef5);
  383. border-radius: 8px;
  384. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
  385. }
  386. .anomaly-title {
  387. color: var(--anomaly-title, #303133);
  388. font-size: 14px;
  389. font-weight: 600;
  390. margin-bottom: 10px;
  391. display: flex;
  392. align-items: center;
  393. gap: 6px;
  394. }
  395. .anomaly-num {
  396. color: var(--anomaly-num, var(--primary-color, #82780c));
  397. font-weight: 700;
  398. }
  399. .anomaly-overview-ring {
  400. border: 1px solid var(--anomaly-ring-border, #dcdfe6);
  401. background: var(--anomaly-ring-bg, #f5f7fa);
  402. box-shadow: none;
  403. .anomaly-num {
  404. color: var(--anomaly-ring-num, var(--primary-color, #82780c));
  405. }
  406. }
  407. .anomaly-overview-ring-label {
  408. color: var(--anomaly-ring-label, #606266);
  409. }
  410. .anomaly-overview-divider {
  411. background: var(--anomaly-divider, #ebeef5);
  412. }
  413. .anomaly-stat-card.sensor {
  414. background: var(--anomaly-stat-sensor-bg, rgba(64, 158, 255, 0.08));
  415. border: 1px solid var(--anomaly-stat-sensor-border, rgba(64, 158, 255, 0.2));
  416. }
  417. .anomaly-stat-card.detect {
  418. background: var(--anomaly-stat-detect-bg, rgba(103, 194, 58, 0.08));
  419. border: 1px solid var(--anomaly-stat-detect-border, rgba(103, 194, 58, 0.2));
  420. }
  421. .anomaly-stat-card.sensor .anomaly-stat-icon {
  422. background: rgba(64, 158, 255, 0.15);
  423. color: var(--anomaly-stat-sensor-icon, #409eff);
  424. box-shadow: none;
  425. }
  426. .anomaly-stat-card.detect .anomaly-stat-icon {
  427. background: rgba(103, 194, 58, 0.15);
  428. color: var(--anomaly-stat-detect-icon, #67c23a);
  429. box-shadow: none;
  430. }
  431. .anomaly-stat-label {
  432. color: var(--anomaly-stat-label, #606266);
  433. }
  434. .anomaly-stat-ratio {
  435. color: var(--anomaly-stat-ratio, #909399);
  436. }
  437. .anomaly-radar-wrap {
  438. border-top: 1px solid var(--anomaly-divider, #ebeef5);
  439. }
  440. .anomaly-radar-panel {
  441. background: var(--anomaly-radar-panel-bg, #f5f7fa);
  442. border: 1px solid var(--anomaly-radar-panel-border, #ebeef5);
  443. box-shadow: none;
  444. }
  445. .anomaly-radar-panel-title {
  446. color: var(--anomaly-radar-title, #303133);
  447. }
  448. .anomaly-radar-panel-unit {
  449. color: var(--anomaly-radar-unit, #909399);
  450. }
  451. .anomaly-carousel-btn {
  452. border: 1px solid var(--anomaly-carousel-btn-border, #dcdfe6);
  453. background: var(--anomaly-carousel-btn-bg, #ffffff);
  454. color: var(--anomaly-carousel-btn-text, #606266);
  455. &:hover {
  456. background: var(--anomaly-carousel-btn-hover, #f5f7fa);
  457. }
  458. }
  459. .anomaly-carousel-dot {
  460. background: var(--anomaly-carousel-dot, #dcdfe6);
  461. &.active {
  462. background: var(--anomaly-carousel-dot-active, var(--primary-color, #82780c));
  463. }
  464. }
  465. .anomaly-wind-list-title {
  466. color: var(--anomaly-title, #303133);
  467. }
  468. .anomaly-wind-empty-card__text {
  469. color: var(--anomaly-muted, #909399);
  470. }
  471. .anomaly-wind-turbine__icon {
  472. opacity: 0.72;
  473. }
  474. .anomaly-wind-id {
  475. color: var(--anomaly-wind-id-text, #303133);
  476. border: 1px solid var(--anomaly-wind-id-border, #dcdfe6);
  477. background: var(--anomaly-wind-id-bg, #f5f7fa);
  478. }
  479. .anomaly-wind-label {
  480. color: var(--anomaly-wind-label, #909399);
  481. }
  482. .anomaly-wind-module {
  483. background: var(--anomaly-module-bg, #f8fafc);
  484. border-color: var(--anomaly-divider, #ebeef5);
  485. }
  486. .anomaly-wind-module__title {
  487. color: var(--anomaly-title, #303133);
  488. }
  489. .anomaly-wind-sensors {
  490. color: var(--anomaly-muted, #909399);
  491. }
  492. .anomaly-wind-detail__btn {
  493. background: var(--anomaly-detail-btn-bg, rgba(0, 128, 128, 0.06));
  494. border-color: var(--anomaly-detail-btn-border, var(--primary-color, #82780c));
  495. color: var(--anomaly-detail-btn-text, var(--primary-color, #82780c));
  496. &:hover {
  497. background: var(
  498. --anomaly-detail-btn-hover-bg,
  499. var(--bgopacity-color, rgba(0, 128, 128, 0.12))
  500. );
  501. border-color: var(--primary-color, #82780c);
  502. color: var(--primary-color, #82780c);
  503. }
  504. }
  505. .anomaly-heatmap-ratio {
  506. color: var(--anomaly-heatmap-ratio, #909399);
  507. font-size: 10px;
  508. }
  509. }
  510. /* —— 科技蓝大屏(保持不变) —— */
  511. html[data-theme="tech-blue"] & {
  512. background-color: #090a10;
  513. color: #d8efff;
  514. .anomaly-card {
  515. background: #101628;
  516. border: 1px solid rgba(73, 183, 228, 0.28);
  517. border-radius: 8px;
  518. box-shadow: inset 0 0 14px rgba(65, 176, 225, 0.06);
  519. }
  520. .anomaly-title {
  521. color: #b7dff5;
  522. font-size: 14px;
  523. font-weight: 600;
  524. margin-bottom: 10px;
  525. display: flex;
  526. align-items: center;
  527. gap: 6px;
  528. }
  529. .anomaly-num {
  530. color: #4facca;
  531. font-weight: 700;
  532. }
  533. .anomaly-overview-ring {
  534. border: 1px solid rgba(95, 189, 227, 0.45);
  535. background: linear-gradient(
  536. 145deg,
  537. rgba(29, 145, 211, 0.35),
  538. rgba(22, 30, 56, 0.35)
  539. );
  540. box-shadow: 0 0 18px rgba(52, 182, 242, 0.22);
  541. .anomaly-num {
  542. color: #d8efff;
  543. }
  544. }
  545. .anomaly-overview-ring-label {
  546. color: #d6eefc;
  547. }
  548. .anomaly-overview-divider {
  549. background: linear-gradient(
  550. to bottom,
  551. transparent,
  552. rgba(95, 189, 227, 0.35),
  553. transparent
  554. );
  555. }
  556. .anomaly-stat-card.sensor {
  557. background: rgba(77, 141, 255, 0.12);
  558. border: 1px solid rgba(77, 141, 255, 0.22);
  559. }
  560. .anomaly-stat-card.detect {
  561. background: rgba(77, 230, 152, 0.1);
  562. border: 1px solid rgba(77, 230, 152, 0.22);
  563. }
  564. .anomaly-stat-card.sensor .anomaly-stat-icon {
  565. background: linear-gradient(
  566. 145deg,
  567. rgba(77, 141, 255, 0.55),
  568. rgba(77, 141, 255, 0.15)
  569. );
  570. color: #6ba3ff;
  571. box-shadow: 0 4px 12px rgba(77, 141, 255, 0.2);
  572. }
  573. .anomaly-stat-card.detect .anomaly-stat-icon {
  574. background: linear-gradient(
  575. 145deg,
  576. rgba(77, 230, 152, 0.5),
  577. rgba(77, 230, 152, 0.15)
  578. );
  579. color: #6effb0;
  580. box-shadow: 0 4px 12px rgba(77, 230, 152, 0.18);
  581. }
  582. .anomaly-stat-label {
  583. color: #d8efff;
  584. }
  585. .anomaly-stat-ratio {
  586. color: #8db6d1;
  587. }
  588. .anomaly-radar-wrap {
  589. border-top: 1px solid rgba(95, 189, 227, 0.22);
  590. }
  591. .anomaly-radar-panel {
  592. background: #111627;
  593. border: 1px solid rgba(95, 189, 227, 0.18);
  594. box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
  595. }
  596. .anomaly-radar-panel-title {
  597. color: #b7dff5;
  598. }
  599. .anomaly-radar-panel-unit {
  600. color: #6a9bb5;
  601. }
  602. .anomaly-carousel-btn {
  603. border: 1px solid rgba(95, 189, 227, 0.35);
  604. background: rgba(22, 30, 56, 0.88);
  605. color: #b7dff5;
  606. &:hover {
  607. background: rgba(29, 145, 211, 0.35);
  608. }
  609. }
  610. .anomaly-carousel-dot {
  611. background: rgba(95, 189, 227, 0.35);
  612. &.active {
  613. background: #5ecdee;
  614. }
  615. }
  616. .anomaly-wind-list-title {
  617. color: #9cc7df;
  618. }
  619. .anomaly-wind-empty-card__text {
  620. color: #8db6d1;
  621. }
  622. .anomaly-wind-turbine__icon {
  623. filter: drop-shadow(0 0 8px rgba(83, 217, 255, 0.35));
  624. }
  625. .anomaly-wind-id {
  626. color: #d8efff;
  627. border: 1px solid rgba(95, 189, 227, 0.45);
  628. background: rgba(22, 30, 56, 0.88);
  629. }
  630. .anomaly-wind-label {
  631. color: #b8d3e6;
  632. }
  633. .anomaly-wind-module {
  634. background: rgba(17, 22, 39, 0.72);
  635. border-color: rgba(95, 189, 227, 0.22);
  636. }
  637. .anomaly-wind-module__title {
  638. color: #9cc7df;
  639. }
  640. .anomaly-wind-sensors {
  641. color: #9abed3;
  642. }
  643. .anomaly-wind-detail__btn {
  644. background: rgba(34, 211, 238, 0.08);
  645. border-color: rgba(103, 232, 249, 0.45);
  646. color: #67e8f9;
  647. &:hover {
  648. background: rgba(34, 211, 238, 0.18);
  649. border-color: rgba(103, 232, 249, 0.75);
  650. color: #a5f3fc;
  651. }
  652. }
  653. .anomaly-heatmap-ratio {
  654. color: #6a9bb5;
  655. font-size: 10px;
  656. }
  657. }
  658. }