OverviewView.vue 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118
  1. <template>
  2. <div class="overview-container">
  3. <!-- 左侧数据卡片 -->
  4. <div class="left-sidebar">
  5. <!-- 乌拉海水库简介卡片 -->
  6. <div class="data-card">
  7. <div class="card-header" @click="toggleWeatherForecast">
  8. <h3 class="card-title">乌拉海水库</h3>
  9. <div class="header-actions">
  10. <span class="more-header" @click.stop="showReservoirModal = true">更多</span>
  11. <span class="toggle-btn">{{ weatherForecastExpanded ? '▼' : '▶' }}</span>
  12. </div>
  13. </div>
  14. <div v-if="weatherForecastExpanded" class="card-body">
  15. <div class="reservoir-image">
  16. <img src="/src/assets/images/乌拉海沟水库.png" alt="乌拉海沟水库" />
  17. </div>
  18. <div class="reservoir-info">
  19. <p><span class="info-label">基本情况:</span>属于平原区水库(中型)</p>
  20. <p><span class="info-label">工程等别:</span>Ⅰ等</p>
  21. <p><span class="info-label">水利主管部门:</span>第四师水利局</p>
  22. <p><span class="info-label">管理部门:</span>第四师水利管理处</p>
  23. <p><span class="info-label">所在地:</span>第四师乌拉海沟 经度:87°25′00″ 纬度:44°09′00″</p>
  24. <p><span class="info-label">主要功能:</span>防洪、灌溉、供水、生态、旅游、养殖</p>
  25. </div>
  26. </div>
  27. </div>
  28. <!-- 水库特征卡片 -->
  29. <div class="data-card mt-20">
  30. <div class="card-header" @click="toggleDistrictRainfall">
  31. <h3 class="card-title">水库特征</h3>
  32. <div class="header-actions">
  33. <span class="toggle-btn">{{ districtRainfallExpanded ? '▼' : '▶' }}</span>
  34. </div>
  35. </div>
  36. <div v-if="districtRainfallExpanded" class="card-body">
  37. <div class="feature-grid">
  38. <div class="feature-item">
  39. <div class="feature-icon-small">
  40. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  41. </div>
  42. <div class="feature-info">
  43. <div class="feature-name">总库容</div>
  44. <div class="feature-data">
  45. <span class="feature-value">6500</span>
  46. <span class="feature-unit">万m³</span>
  47. </div>
  48. </div>
  49. </div>
  50. <div class="feature-item">
  51. <div class="feature-icon-small">
  52. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  53. </div>
  54. <div class="feature-info">
  55. <div class="feature-name">死库容</div>
  56. <div class="feature-data">
  57. <span class="feature-value">860</span>
  58. <span class="feature-unit">万m³</span>
  59. </div>
  60. </div>
  61. </div>
  62. <div class="feature-item">
  63. <div class="feature-icon-small">
  64. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  65. </div>
  66. <div class="feature-info">
  67. <div class="feature-name">死水位</div>
  68. <div class="feature-data">
  69. <span class="feature-value">108.5</span>
  70. <span class="feature-unit">m</span>
  71. </div>
  72. </div>
  73. </div>
  74. <div class="feature-item">
  75. <div class="feature-icon-small">
  76. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  77. </div>
  78. <div class="feature-info">
  79. <div class="feature-name">设计洪水位</div>
  80. <div class="feature-data">
  81. <span class="feature-value">118.2</span>
  82. <span class="feature-unit">m</span>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="feature-item">
  87. <div class="feature-icon-small">
  88. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  89. </div>
  90. <div class="feature-info">
  91. <div class="feature-name">防洪高水位</div>
  92. <div class="feature-data">
  93. <span class="feature-value">116.8</span>
  94. <span class="feature-unit">m</span>
  95. </div>
  96. </div>
  97. </div>
  98. <div class="feature-item">
  99. <div class="feature-icon-small">
  100. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  101. </div>
  102. <div class="feature-info">
  103. <div class="feature-name">调节库容</div>
  104. <div class="feature-data">
  105. <span class="feature-value">4200</span>
  106. <span class="feature-unit">万m³</span>
  107. </div>
  108. </div>
  109. </div>
  110. <div class="feature-item">
  111. <div class="feature-icon-small">
  112. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  113. </div>
  114. <div class="feature-info">
  115. <div class="feature-name">正常蓄水位</div>
  116. <div class="feature-data">
  117. <span class="feature-value">114.0</span>
  118. <span class="feature-unit">m</span>
  119. </div>
  120. </div>
  121. </div>
  122. <div class="feature-item">
  123. <div class="feature-icon-small">
  124. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  125. </div>
  126. <div class="feature-info">
  127. <div class="feature-name">校核洪水位</div>
  128. <div class="feature-data">
  129. <span class="feature-value">119.5</span>
  130. <span class="feature-unit">m</span>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <div style="margin-top: 16px;">
  136. <div class="chart-sub-header">
  137. <span class="chart-sub-title">主坝特征</span>
  138. </div>
  139. <div class="dam-feature-grid">
  140. <div class="feature-item">
  141. <div class="feature-icon-small">
  142. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  143. </div>
  144. <div class="feature-info">
  145. <div class="feature-name">坝基防渗形式</div>
  146. <div class="feature-data">
  147. <span class="feature-value">混凝土防渗墙</span>
  148. </div>
  149. </div>
  150. </div>
  151. <div class="feature-item">
  152. <div class="feature-icon-small">
  153. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  154. </div>
  155. <div class="feature-info">
  156. <div class="feature-name">坝型</div>
  157. <div class="feature-data">
  158. <span class="feature-value">均值混凝土</span>
  159. </div>
  160. </div>
  161. </div>
  162. <div class="feature-item">
  163. <div class="feature-icon-small">
  164. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  165. </div>
  166. <div class="feature-info">
  167. <div class="feature-name">坝顶总长度(m)</div>
  168. <div class="feature-data">
  169. <span class="feature-value">5400</span>
  170. </div>
  171. </div>
  172. </div>
  173. <div class="feature-item">
  174. <div class="feature-icon-small">
  175. <img src="/src/assets/images/水电站大坝工程.png" alt="icon" />
  176. </div>
  177. <div class="feature-info">
  178. <div class="feature-name">坝顶高程(m)</div>
  179. <div class="feature-data">
  180. <span class="feature-value">487.37</span>
  181. </div>
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. <div style="margin-top: 12px;">
  187. <div class="chart-sub-header">
  188. <span class="chart-sub-title">特征图</span>
  189. </div>
  190. <ReservoirChart />
  191. </div>
  192. </div>
  193. </div>
  194. </div>
  195. <!-- 右侧数据 -->
  196. <div class="right-sidebar">
  197. <!-- 今日值班卡片 -->
  198. <div class="data-card mt-20">
  199. <div class="card-header">
  200. <h3 class="card-title">今日值班</h3>
  201. </div>
  202. <div class="card-body">
  203. <div class="duty-section">
  204. <div class="duty-section-title">四师水利局</div>
  205. <div class="duty-row">
  206. <span class="duty-tag today">今</span>
  207. <span class="duty-segment">值班:</span>
  208. <span class="duty-person">张 三</span>
  209. <span class="duty-segment">带班:</span>
  210. <span class="duty-person">李 明</span>
  211. </div>
  212. <div class="duty-row">
  213. <span class="duty-tag tomorrow">明</span>
  214. <span class="duty-segment">值班:</span>
  215. <span class="duty-person">张文超</span>
  216. <span class="duty-segment">带班:</span>
  217. <span class="duty-person">李小红</span>
  218. </div>
  219. </div>
  220. <div class="duty-section">
  221. <div class="duty-section-title">四师水利管理处</div>
  222. <div class="duty-row">
  223. <span class="duty-tag today">今</span>
  224. <span class="duty-segment">值班:</span>
  225. <span class="duty-person">张 三</span>
  226. <span class="duty-segment">带班:</span>
  227. <span class="duty-person">李 明</span>
  228. </div>
  229. <div class="duty-row">
  230. <span class="duty-tag tomorrow">明</span>
  231. <span class="duty-segment">值班:</span>
  232. <span class="duty-person">张文超</span>
  233. <span class="duty-segment">带班:</span>
  234. <span class="duty-person">李小红</span>
  235. </div>
  236. </div>
  237. </div>
  238. </div>
  239. <!-- 最新调度卡片 -->
  240. <div class="data-card mt-20">
  241. <div class="card-header">
  242. <h3 class="card-title">最新调度</h3>
  243. </div>
  244. <div class="card-body">
  245. <div class="dispatch-notice">
  246. <div class="dispatch-notice-icon">
  247. <img src="/src/assets/images/铃铛.png" alt="铃铛" />
  248. </div>
  249. <div class="dispatch-notice-text">
  250. <div class="dispatch-notice-scroll">
  251. 乌拉海水库调[2023]84号,出库流量按60m³/s控制
  252. </div>
  253. </div>
  254. </div>
  255. <div class="dispatch-cards">
  256. <div class="dispatch-card">
  257. <div class="dispatch-card-label">控制出库流量</div>
  258. <div class="dispatch-card-value">60<span class="dispatch-card-unit">m³/s</span></div>
  259. </div>
  260. <div class="dispatch-card">
  261. <div class="dispatch-card-label">实时出库流量</div>
  262. <div class="dispatch-card-value dispatch-card-value-warning">52.412<span class="dispatch-card-unit">m³/s</span></div>
  263. </div>
  264. <div class="dispatch-card">
  265. <div class="dispatch-card-label">日均出库流量</div>
  266. <div class="dispatch-card-value">60.32<span class="dispatch-card-unit">m³/s</span></div>
  267. </div>
  268. </div>
  269. <div class="dispatch-time">
  270. <span class="dispatch-time-label">最新调整时间</span>
  271. <span class="dispatch-time-value">2026年5月29日10:42:40</span>
  272. </div>
  273. <div class="dispatch-level-cards">
  274. <div class="dispatch-level-card">
  275. <div class="dispatch-level-icon">
  276. <img src="/src/assets/images/小图标库水位.png" alt="库水位" />
  277. </div>
  278. <div class="dispatch-level-info">
  279. <div class="dispatch-level-label">库水位(m)</div>
  280. <div class="dispatch-level-value">112.5</div>
  281. </div>
  282. </div>
  283. <div class="dispatch-level-card">
  284. <div class="dispatch-level-icon">
  285. <img src="/src/assets/images/小图标库水位.png" alt="下游水位" />
  286. </div>
  287. <div class="dispatch-level-info">
  288. <div class="dispatch-level-label">下游水位(m)</div>
  289. <div class="dispatch-level-value">12.5</div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. </div>
  295. <!-- 水库监测卡片 -->
  296. <div class="data-card mt-20">
  297. <div class="card-header">
  298. <h3 class="card-title">水库监测</h3>
  299. </div>
  300. <div class="card-body">
  301. <!-- 趋势监控图表 -->
  302. <div class="reservoir-monitor-section">
  303. <div class="monitor-time-range">
  304. <span class="time-range-label">时间范围:</span>
  305. <span class="time-range-value">2026-05-29 18:30 至 2026-05-30 15:30</span>
  306. </div>
  307. <!-- 降雨与水位组合图 -->
  308. <div class="monitor-chart-box">
  309. <div class="monitor-chart-label">降雨与水位监测</div>
  310. <div id="waterLevelTrendChart" style="width:100%;height:200px;"></div>
  311. <div class="monitor-chart-desc">库水位在监测时段内稳定维持在约 113.0m,无明显波动</div>
  312. </div>
  313. </div>
  314. <!-- 水量统计卡片 -->
  315. <div class="water-stats-row">
  316. <div class="water-stat-card">
  317. <div class="water-stat-label">当日供水(万m³)</div>
  318. <div class="water-stat-value">502</div>
  319. </div>
  320. <div class="water-stat-card">
  321. <div class="water-stat-label">当日排水(万m³)</div>
  322. <div class="water-stat-value">0</div>
  323. </div>
  324. </div>
  325. </div>
  326. </div>
  327. </div>
  328. <!-- 水库详情弹窗 -->
  329. <div v-if="showReservoirModal" class="modal-overlay" @click.self="showReservoirModal = false">
  330. <div class="modal-content">
  331. <div class="modal-header">
  332. <h3>乌拉海沟水库</h3>
  333. <span class="modal-close" @click="showReservoirModal = false">✕</span>
  334. </div>
  335. <div class="modal-body">
  336. <div class="modal-image">
  337. <img src="/src/assets/images/乌拉海沟水库.png" alt="乌拉海沟水库" />
  338. </div>
  339. <div class="modal-text">
  340. <p><span class="info-label">基本情况:</span>属于平原区水库(中型)</p>
  341. <p><span class="info-label">工程等别:</span>Ⅰ等</p>
  342. <p><span class="info-label">水利主管部门:</span>第四师水利局</p>
  343. <p><span class="info-label">管理部门:</span>第四师水利管理处</p>
  344. <p><span class="info-label">所在地:</span>第四师乌拉海沟 经度:87°25′00″ 纬度:44°09′00″</p>
  345. <div class="info-section-title">建设时间:</div>
  346. <p style="padding-left:12px;">主体工程开工:1952年06月01日</p>
  347. <p style="padding-left:12px;">下闸蓄水:1956年05月01日</p>
  348. <p style="padding-left:12px;">竣工验收:1956年09月01日</p>
  349. <div class="info-section-title">加固时间:</div>
  350. <p style="padding-left:12px;">主体工程开工:2004年04月01日</p>
  351. <p style="padding-left:12px;">下闸蓄水:2005年06月02日</p>
  352. <p style="padding-left:12px;">竣工验收:2005年09月02日</p>
  353. <p><span class="info-label">主要功能:</span>防洪、灌溉、供水、生态、旅游、养殖</p>
  354. </div>
  355. </div>
  356. </div>
  357. </div>
  358. </div>
  359. </template>
  360. <script>
  361. import DataCard from '../components/DataCard.vue'
  362. import ReservoirChart from '../components/ReservoirChart.vue'
  363. import * as echarts from 'echarts'
  364. export default {
  365. name: 'OverviewView',
  366. components: {
  367. DataCard,
  368. ReservoirChart
  369. },
  370. data() {
  371. return {
  372. showReservoirModal: false,
  373. weatherForecastExpanded: true,
  374. districtRainfallExpanded: true,
  375. heilinHydrologyExpanded: true,
  376. warningDiff: -2.0,
  377. waterLevel24hChart: null,
  378. rainfall24hChart: null,
  379. flowChart: null,
  380. capacityChart: null,
  381. waterLevelTrendChart: null,
  382. }
  383. },
  384. mounted() {
  385. // 延迟初始化图表,确保DOM已经渲染
  386. setTimeout(() => {
  387. this.initCharts()
  388. }, 100)
  389. },
  390. beforeUnmount() {
  391. this.destroyCharts()
  392. },
  393. methods: {
  394. toggleWeatherForecast() {
  395. this.weatherForecastExpanded = !this.weatherForecastExpanded
  396. },
  397. toggleDistrictRainfall() {
  398. this.districtRainfallExpanded = !this.districtRainfallExpanded
  399. },
  400. goToHydrologyForecast() {
  401. // 跳转到水文四预页面
  402. this.$emit('selectTab', '水文四预')
  403. },
  404. initCharts() {
  405. // 初始化24h水位变化趋势图(核心监测卡片中)
  406. if (document.getElementById('waterLevel24hChart')) {
  407. this.waterLevel24hChart = echarts.init(document.getElementById('waterLevel24hChart'))
  408. const waterLevel24hOption = {
  409. animation: false,
  410. tooltip: {
  411. trigger: 'axis',
  412. axisPointer: {
  413. type: 'cross',
  414. label: {
  415. backgroundColor: '#6a7985'
  416. }
  417. }
  418. },
  419. legend: {
  420. data: ['实时水位', '保证水位', '警戒水位'],
  421. textStyle: {
  422. color: '#7bbef6'
  423. },
  424. bottom: '0%'
  425. },
  426. grid: {
  427. left: '3%',
  428. right: '4%',
  429. bottom: '15%',
  430. top: '2%',
  431. containLabel: true
  432. },
  433. xAxis: [
  434. {
  435. type: 'category',
  436. boundaryGap: false,
  437. data: ['00:00', '03:00', '06:00', '09:00', '12:00', '15:00', '18:00', '21:00', '24:00'],
  438. axisLine: {
  439. lineStyle: {
  440. color: '#7bbef6'
  441. }
  442. },
  443. axisLabel: {
  444. color: '#7bbef6'
  445. }
  446. }
  447. ],
  448. yAxis: [
  449. {
  450. type: 'value',
  451. name: '水位(m)',
  452. nameTextStyle: {
  453. color: '#7bbef6'
  454. },
  455. min: 0,
  456. max: 7,
  457. axisLine: {
  458. lineStyle: {
  459. color: '#7bbef6'
  460. }
  461. },
  462. axisLabel: {
  463. color: '#7bbef6'
  464. },
  465. splitLine: {
  466. lineStyle: {
  467. color: 'rgba(123, 190, 246, 0.2)'
  468. }
  469. }
  470. }
  471. ],
  472. series: [
  473. {
  474. name: '实时水位',
  475. type: 'line',
  476. data: [2.5, 2.8, 3.0, 3.2, 3.5, 3.8, 4.0, 4.1, 4.2],
  477. lineStyle: {
  478. color: '#00d4ff',
  479. width: 2
  480. },
  481. itemStyle: {
  482. color: '#00d4ff'
  483. }
  484. },
  485. {
  486. name: '保证水位',
  487. type: 'line',
  488. data: [3.7, 3.7, 3.7, 3.7, 3.7, 3.7, 3.7, 3.7, 3.7],
  489. symbol: 'none',
  490. lineStyle: {
  491. color: '#ffd93d',
  492. width: 2,
  493. type: 'dashed'
  494. },
  495. itemStyle: {
  496. color: '#ffd93d'
  497. }
  498. },
  499. {
  500. name: '警戒水位',
  501. type: 'line',
  502. data: [4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5],
  503. symbol: 'none',
  504. lineStyle: {
  505. color: '#ff6b6b',
  506. width: 2,
  507. type: 'dashed'
  508. },
  509. itemStyle: {
  510. color: '#ff6b6b'
  511. }
  512. }
  513. ]
  514. }
  515. this.waterLevel24hChart.setOption(waterLevel24hOption)
  516. }
  517. // 初始化24h雨量柱状图
  518. if (document.getElementById('rainfall24hChart')) {
  519. this.rainfall24hChart = echarts.init(document.getElementById('rainfall24hChart'))
  520. const rainfall24hOption = {
  521. animation: false,
  522. tooltip: {
  523. trigger: 'axis',
  524. axisPointer: {
  525. type: 'shadow'
  526. }
  527. },
  528. grid: {
  529. left: '3%',
  530. right: '4%',
  531. bottom: '15%',
  532. top: '2%',
  533. containLabel: true
  534. },
  535. xAxis: [
  536. {
  537. type: 'category',
  538. data: ['00:00', '03:00', '06:00', '09:00', '12:00', '15:00', '18:00', '21:00', '24:00'],
  539. axisLine: {
  540. lineStyle: {
  541. color: '#7bbef6'
  542. }
  543. },
  544. axisLabel: {
  545. color: '#7bbef6'
  546. }
  547. }
  548. ],
  549. yAxis: [
  550. {
  551. type: 'value',
  552. name: '雨量(mm)',
  553. nameTextStyle: {
  554. color: '#7bbef6'
  555. },
  556. min: 0,
  557. axisLine: {
  558. lineStyle: {
  559. color: '#7bbef6'
  560. }
  561. },
  562. axisLabel: {
  563. color: '#7bbef6'
  564. },
  565. splitLine: {
  566. lineStyle: {
  567. color: 'rgba(123, 190, 246, 0.2)'
  568. }
  569. }
  570. }
  571. ],
  572. series: [
  573. {
  574. name: '24h雨量',
  575. type: 'bar',
  576. data: [1.2, 0.8, 2.5, 3.1, 2.8, 1.5, 0.9, 1.8, 0.7],
  577. itemStyle: {
  578. color: '#62f6fb'
  579. }
  580. }
  581. ]
  582. }
  583. this.rainfall24hChart.setOption(rainfall24hOption)
  584. }
  585. // 初始化入库/出库流量对比图
  586. if (document.getElementById('flowChart')) {
  587. this.flowChart = echarts.init(document.getElementById('flowChart'))
  588. const flowOption = {
  589. animation: false,
  590. tooltip: {
  591. trigger: 'axis',
  592. axisPointer: {
  593. type: 'shadow'
  594. }
  595. },
  596. legend: {
  597. data: ['入库流量', '出库流量'],
  598. textStyle: {
  599. color: '#7bbef6'
  600. }
  601. },
  602. grid: {
  603. left: '3%',
  604. right: '4%',
  605. bottom: '3%',
  606. containLabel: true
  607. },
  608. xAxis: {
  609. type: 'category',
  610. data: ['00:00', '06:00', '12:00', '18:00'],
  611. axisLine: {
  612. lineStyle: {
  613. color: '#7bbef6'
  614. }
  615. },
  616. axisLabel: {
  617. color: '#7bbef6'
  618. }
  619. },
  620. yAxis: {
  621. type: 'value',
  622. axisLine: {
  623. lineStyle: {
  624. color: '#7bbef6'
  625. }
  626. },
  627. axisLabel: {
  628. color: '#7bbef6'
  629. },
  630. splitLine: {
  631. lineStyle: {
  632. color: 'rgba(123, 190, 246, 0.2)'
  633. }
  634. }
  635. },
  636. series: [
  637. {
  638. name: '入库流量',
  639. type: 'bar',
  640. data: [30.2, 32.5, 35.2, 33.8],
  641. itemStyle: {
  642. color: '#62f6fb'
  643. }
  644. },
  645. {
  646. name: '出库流量',
  647. type: 'bar',
  648. data: [20.0, 22.5, 25.0, 24.5],
  649. itemStyle: {
  650. color: '#7bbef6'
  651. }
  652. }
  653. ]
  654. }
  655. this.flowChart.setOption(flowOption)
  656. }
  657. // 初始化库容占比环形图
  658. if (document.getElementById('capacityChart')) {
  659. this.capacityChart = echarts.init(document.getElementById('capacityChart'))
  660. const capacityOption = {
  661. animation: false,
  662. tooltip: {
  663. trigger: 'item',
  664. formatter: '{b}: {c}万m³ ({d}%)'
  665. },
  666. legend: {
  667. orient: 'vertical',
  668. left: 'left',
  669. textStyle: {
  670. color: '#7bbef6'
  671. }
  672. },
  673. series: [
  674. {
  675. name: '库容占比',
  676. type: 'pie',
  677. radius: ['40%', '70%'],
  678. avoidLabelOverlap: false,
  679. itemStyle: {
  680. borderRadius: 10,
  681. borderColor: 'rgba(0, 30, 60, 0.6)',
  682. borderWidth: 2
  683. },
  684. label: {
  685. show: false,
  686. position: 'center'
  687. },
  688. emphasis: {
  689. label: {
  690. show: true,
  691. fontSize: 14,
  692. fontWeight: 'bold',
  693. color: '#e0fcff'
  694. }
  695. },
  696. labelLine: {
  697. show: false
  698. },
  699. data: [
  700. {
  701. value: 78,
  702. name: '已使用',
  703. itemStyle: {
  704. color: '#62f6fb'
  705. }
  706. },
  707. {
  708. value: 22,
  709. name: '剩余',
  710. itemStyle: {
  711. color: 'rgba(123, 190, 246, 0.3)'
  712. }
  713. }
  714. ]
  715. }
  716. ]
  717. }
  718. this.capacityChart.setOption(capacityOption)
  719. }
  720. // 水库监测-降雨与水位组合图(双轴)
  721. if (document.getElementById('waterLevelTrendChart')) {
  722. this.waterLevelTrendChart = echarts.init(document.getElementById('waterLevelTrendChart'))
  723. const waterLevelTrendOption = {
  724. animation: false,
  725. tooltip: {
  726. trigger: 'axis',
  727. axisPointer: { type: 'cross' }
  728. },
  729. legend: {
  730. data: ['降雨量', '融雪水量', '库水位'],
  731. textStyle: { color: '#7bbef6' },
  732. bottom: '0%',
  733. itemWidth: 12,
  734. itemHeight: 8
  735. },
  736. grid: {
  737. left: '5%',
  738. right: '6%',
  739. bottom: '14%',
  740. top: '3%',
  741. containLabel: true
  742. },
  743. xAxis: {
  744. type: 'category',
  745. data: ['05-29 18:30', '05-29 21:30', '05-30 00:30', '05-30 03:30', '05-30 06:30', '05-30 09:30', '05-30 12:30', '05-30 15:30'],
  746. axisLine: { lineStyle: { color: '#7bbef6' } },
  747. axisLabel: { color: '#7bbef6', fontSize: 10 }
  748. },
  749. yAxis: [
  750. {
  751. type: 'value',
  752. name: '水量(mm)',
  753. nameTextStyle: { color: '#62f6fb' },
  754. min: -4,
  755. max: 0,
  756. axisLine: { lineStyle: { color: '#62f6fb' } },
  757. axisLabel: {
  758. color: '#62f6fb',
  759. formatter: (v) => Math.abs(v)
  760. },
  761. splitLine: { show: false }
  762. },
  763. {
  764. type: 'value',
  765. name: '水位(m)',
  766. nameTextStyle: { color: '#00d4ff' },
  767. min: 112.0,
  768. max: 114.0,
  769. axisLine: { lineStyle: { color: '#00d4ff' } },
  770. axisLabel: { color: '#00d4ff' },
  771. splitLine: { lineStyle: { color: 'rgba(123, 190, 246, 0.15)' } }
  772. }
  773. ],
  774. series: [
  775. {
  776. name: '融雪水量',
  777. type: 'bar',
  778. yAxisIndex: 0,
  779. barWidth: 6,
  780. data: [-0.3, -0.2, -0.2, -0.5, -1.2, -2.0, -1.8, -0.8],
  781. itemStyle: {
  782. color: '#ffffff',
  783. borderRadius: [0, 0, 2, 2]
  784. }
  785. },
  786. {
  787. name: '降雨量',
  788. type: 'bar',
  789. yAxisIndex: 0,
  790. barWidth: 6,
  791. data: [0, 0, 0, -0.3, -1.2, -0.8, -0.2, 0],
  792. itemStyle: {
  793. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  794. { offset: 0, color: 'rgba(98, 246, 251, 0.3)' },
  795. { offset: 1, color: 'rgba(98, 246, 251, 0.9)' }
  796. ]),
  797. borderRadius: [0, 0, 2, 2]
  798. }
  799. },
  800. {
  801. name: '库水位',
  802. type: 'line',
  803. yAxisIndex: 1,
  804. data: [112.98, 112.99, 113.00, 113.01, 113.00, 112.99, 113.00, 113.01],
  805. smooth: true,
  806. symbol: 'circle',
  807. symbolSize: 4,
  808. lineStyle: { color: '#00d4ff', width: 2 },
  809. itemStyle: { color: '#00d4ff' },
  810. areaStyle: {
  811. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  812. { offset: 0, color: 'rgba(0, 212, 255, 0.35)' },
  813. { offset: 1, color: 'rgba(0, 212, 255, 0.05)' }
  814. ])
  815. }
  816. }
  817. ]
  818. }
  819. this.waterLevelTrendChart.setOption(waterLevelTrendOption)
  820. }
  821. },
  822. destroyCharts() {
  823. if (this.waterLevel24hChart) {
  824. this.waterLevel24hChart.dispose()
  825. }
  826. if (this.rainfall24hChart) {
  827. this.rainfall24hChart.dispose()
  828. }
  829. if (this.flowChart) {
  830. this.flowChart.dispose()
  831. }
  832. if (this.capacityChart) {
  833. this.capacityChart.dispose()
  834. }
  835. if (this.waterLevelTrendChart) {
  836. this.waterLevelTrendChart.dispose()
  837. }
  838. }
  839. }
  840. }
  841. </script>
  842. <style scoped>
  843. .overview-container {
  844. width: 100%;
  845. height: 100%;
  846. position: relative;
  847. }
  848. .left-sidebar {
  849. position: absolute;
  850. left: 20px;
  851. top: 120px;
  852. width: 350px;
  853. z-index: 5;
  854. }
  855. .right-sidebar {
  856. position: absolute;
  857. right: 20px;
  858. top: 120px;
  859. width: 350px;
  860. z-index: 5;
  861. }
  862. .mt-20 {
  863. margin-top: 10px;
  864. }
  865. /* 核心监测数据卡片样式 */
  866. .data-card {
  867. width: 100%;
  868. background: rgba(0, 20, 40, 0.7);
  869. border-radius: 4px;
  870. overflow: hidden;
  871. box-shadow: 0 0 10px rgba(0, 212, 255, 0.2);
  872. }
  873. .card-header {
  874. height: 42px;
  875. background-image: url('/src/assets/images/数据小标题.png');
  876. background-size: 100% 100%;
  877. background-position: center;
  878. background-repeat: no-repeat;
  879. display: flex;
  880. align-items: flex-start;
  881. justify-content: space-between;
  882. padding: 4px 16px 0;
  883. cursor: pointer;
  884. }
  885. .card-title {
  886. font-size: var(--fs-card-title);
  887. font-weight: bold;
  888. color: #e0fcff;
  889. margin: 0;
  890. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  891. padding-left: 20px;
  892. }
  893. .card-subtitle {
  894. font-size: 12px;
  895. font-weight: normal;
  896. color: #62f6fb;
  897. margin-left: 8px;
  898. text-shadow: none;
  899. }
  900. .header-actions {
  901. display: flex;
  902. align-items: center;
  903. gap: 15px;
  904. margin-top: 5px;
  905. }
  906. .update-time {
  907. color: #62f6fb;
  908. font-size: 14px;
  909. font-family: monospace;
  910. }
  911. .toggle-btn {
  912. color: #e0fcff;
  913. font-size: 14px;
  914. cursor: pointer;
  915. }
  916. .card-body {
  917. font-size: var(--fs-body);
  918. line-height: 1.6;
  919. margin-top: -10px;
  920. }
  921. .forecast-card .card-body {
  922. display: flex;
  923. flex-direction: column;
  924. gap: 25px;
  925. }
  926. /* 小节样式 */
  927. .section {
  928. margin-bottom: 25px;
  929. padding-bottom: 20px;
  930. border-bottom: 1px solid rgba(0, 212, 255, 0.2);
  931. }
  932. .section:last-child {
  933. margin-bottom: 0;
  934. padding-bottom: 0;
  935. border-bottom: none;
  936. }
  937. .chart-section {
  938. background: rgba(0, 20, 40, 0.5);
  939. border-radius: 4px;
  940. border: 1px solid rgba(0, 212, 255, 0.2);
  941. padding: 15px;
  942. margin-bottom: 25px;
  943. min-height: 180px;
  944. }
  945. .chart-section .section-title {
  946. margin-bottom: 15px;
  947. }
  948. .section-title {
  949. font-size: 18px;
  950. font-weight: bold;
  951. color: #62f6fb;
  952. margin: 0 0 15px 0;
  953. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  954. }
  955. .section-content {
  956. display: flex;
  957. flex-direction: column;
  958. gap: 12px;
  959. }
  960. .main-indicators {
  961. display: flex;
  962. flex-wrap: wrap;
  963. gap: 15px;
  964. }
  965. .aux-indicators {
  966. display: flex;
  967. flex-wrap: wrap;
  968. gap: 15px;
  969. margin-top: 8px;
  970. }
  971. .indicator {
  972. color: #e0fcff;
  973. font-size: 16px;
  974. font-weight: bold;
  975. text-shadow: 0 0 3px rgba(0, 212, 255, 0.5);
  976. }
  977. .indicator-flood-limit {
  978. color: #ff6b6b;
  979. font-size: 14px;
  980. font-weight: bold;
  981. text-shadow: 0 0 3px rgba(255, 107, 107, 0.5);
  982. }
  983. /* 汇总数据卡片样式 */
  984. .summary-cards {
  985. display: grid;
  986. grid-template-columns: repeat(2, 1fr);
  987. gap: 10px;
  988. margin-bottom: 20px;
  989. }
  990. .summary-card {
  991. background: rgba(0, 30, 60, 0.6);
  992. border: 1px solid rgba(0, 213, 255, 0.3);
  993. border-radius: 8px;
  994. padding: 10px;
  995. text-align: center;
  996. }
  997. .summary-title {
  998. color: #7bbef6;
  999. font-size: 12px;
  1000. margin-bottom: 8px;
  1001. }
  1002. .summary-value {
  1003. color: #e0fcff;
  1004. font-size: 16px;
  1005. font-weight: bold;
  1006. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  1007. }
  1008. /* 图表容器样式 */
  1009. .chart-container {
  1010. margin: 15px 0;
  1011. background: rgba(0, 20, 40, 0.5);
  1012. border-radius: 4px;
  1013. padding: 10px;
  1014. border: 1px solid rgba(0, 212, 255, 0.2);
  1015. }
  1016. .chart-container.small {
  1017. margin: 10px 0;
  1018. padding: 8px;
  1019. }
  1020. .chart-container.small-chart {
  1021. width: 150px;
  1022. float: right;
  1023. margin-left: 15px;
  1024. }
  1025. .chart-container.small-chart.small {
  1026. width: 130px;
  1027. margin-left: 10px;
  1028. }
  1029. .chart-container.with-title {
  1030. padding: 10px;
  1031. background: rgba(0, 20, 40, 0.5);
  1032. border-radius: 4px;
  1033. border: 1px solid rgba(0, 212, 255, 0.2);
  1034. }
  1035. .chart-container.with-title .section-title {
  1036. margin-bottom: 10px;
  1037. margin-top: 0;
  1038. }
  1039. /* 图表并排显示样式 */
  1040. .charts-row {
  1041. display: flex;
  1042. gap: 10px;
  1043. flex-wrap: wrap;
  1044. }
  1045. .chart-item {
  1046. flex: 1;
  1047. min-width: 280px;
  1048. }
  1049. /* 上下游断面样式 */
  1050. .extreme-values {
  1051. display: flex;
  1052. flex-direction: column;
  1053. gap: 8px;
  1054. }
  1055. .extreme {
  1056. color: #e0fcff;
  1057. font-size: 16px;
  1058. font-weight: bold;
  1059. text-shadow: 0 0 3px rgba(0, 212, 255, 0.5);
  1060. }
  1061. .cross-section-list {
  1062. display: flex;
  1063. flex-direction: column;
  1064. gap: 10px;
  1065. margin-top: 10px;
  1066. margin-bottom: 20px;
  1067. }
  1068. .cross-section-item {
  1069. display: flex;
  1070. justify-content: space-between;
  1071. align-items: center;
  1072. padding: 8px 12px;
  1073. background: rgba(0, 20, 40, 0.5);
  1074. border-radius: 4px;
  1075. border: 1px solid rgba(0, 212, 255, 0.2);
  1076. }
  1077. .section-name {
  1078. color: #e0fcff;
  1079. font-size: 14px;
  1080. font-weight: bold;
  1081. }
  1082. .section-water-level {
  1083. font-size: 14px;
  1084. font-weight: bold;
  1085. text-shadow: 0 0 3px rgba(0, 212, 255, 0.5);
  1086. }
  1087. .section-water-level.normal {
  1088. color: #62f6fb;
  1089. }
  1090. .section-water-level.warning {
  1091. color: #ffd93d;
  1092. }
  1093. .section-water-level.danger {
  1094. color: #ff6b6b;
  1095. }
  1096. /* 水位联动对比表样式 */
  1097. .water-level-comparison {
  1098. background: rgba(0, 20, 40, 0.5);
  1099. border-radius: 4px;
  1100. border: 1px solid rgba(0, 212, 255, 0.2);
  1101. overflow: hidden;
  1102. }
  1103. .comparison-header {
  1104. display: flex;
  1105. justify-content: space-between;
  1106. padding: 10px 15px;
  1107. background: rgba(0, 212, 255, 0.2);
  1108. font-weight: bold;
  1109. color: #e0fcff;
  1110. font-size: 14px;
  1111. border-bottom: 1px solid rgba(0, 212, 255, 0.3);
  1112. }
  1113. .comparison-item {
  1114. display: flex;
  1115. justify-content: space-between;
  1116. padding: 8px 15px;
  1117. border-bottom: 1px solid rgba(0, 212, 255, 0.1);
  1118. font-size: 14px;
  1119. color: #7bbef6;
  1120. }
  1121. .comparison-item:last-child {
  1122. border-bottom: none;
  1123. }
  1124. .comparison-item.highest {
  1125. background: rgba(0, 212, 255, 0.1);
  1126. color: #e0fcff;
  1127. font-weight: bold;
  1128. }
  1129. .comparison-item.lowest {
  1130. background: rgba(117, 117, 117, 0.1);
  1131. color: #7bbef6;
  1132. font-weight: bold;
  1133. }
  1134. /* 预报卡片样式 */
  1135. .forecast-card {
  1136. width: 100%;
  1137. }
  1138. .time-range-toggle {
  1139. display: flex;
  1140. gap: 8px;
  1141. justify-content: flex-end;
  1142. margin-bottom: 20px;
  1143. }
  1144. .time-btn {
  1145. padding: 5px 15px;
  1146. background: rgba(0, 20, 40, 0.7);
  1147. border: 1px solid rgba(0, 212, 255, 0.5);
  1148. border-radius: 3px;
  1149. color: #7bbef6;
  1150. font-size: 14px;
  1151. cursor: pointer;
  1152. transition: all 0.3s ease;
  1153. }
  1154. .time-btn.active {
  1155. background: rgba(0, 212, 255, 0.3);
  1156. color: #e0fcff;
  1157. border-color: #00d5ff;
  1158. }
  1159. /* 预报内容样式 */
  1160. .forecast-main {
  1161. flex: 2;
  1162. margin-bottom: 25px;
  1163. }
  1164. .forecast-secondary {
  1165. flex: 1;
  1166. }
  1167. .main-forecast {
  1168. display: flex;
  1169. flex-wrap: wrap;
  1170. gap: 20px;
  1171. margin-bottom: 15px;
  1172. }
  1173. .aux-forecast {
  1174. margin-bottom: 15px;
  1175. }
  1176. .forecast-item {
  1177. color: #e0fcff;
  1178. font-size: 16px;
  1179. font-weight: bold;
  1180. text-shadow: 0 0 3px rgba(0, 212, 255, 0.5);
  1181. }
  1182. .forecast-note {
  1183. display: flex;
  1184. flex-wrap: wrap;
  1185. gap: 20px;
  1186. margin-top: 15px;
  1187. }
  1188. .note-item {
  1189. color: #7bbef6;
  1190. font-size: 14px;
  1191. }
  1192. /* 预警提示样式 */
  1193. .warning-alert {
  1194. background: rgba(255, 107, 107, 0.2);
  1195. border: 1px solid rgba(255, 107, 107, 0.5);
  1196. border-radius: 3px;
  1197. padding: 12px;
  1198. margin: 15px 0;
  1199. }
  1200. .warning-text {
  1201. color: #ff6b6b;
  1202. font-size: 14px;
  1203. font-weight: bold;
  1204. text-shadow: 0 0 3px rgba(255, 107, 107, 0.5);
  1205. }
  1206. /* 快捷链接样式 */
  1207. .quick-link {
  1208. margin-top: 20px;
  1209. }
  1210. .link-btn {
  1211. display: inline-block;
  1212. padding: 10px 20px;
  1213. background: rgba(0, 212, 255, 0.2);
  1214. border: 1px solid rgba(0, 212, 255, 0.5);
  1215. border-radius: 3px;
  1216. color: #62f6fb;
  1217. font-size: 14px;
  1218. font-weight: bold;
  1219. text-decoration: none;
  1220. transition: all 0.3s ease;
  1221. cursor: pointer;
  1222. }
  1223. .link-btn:hover {
  1224. background: rgba(0, 212, 255, 0.4);
  1225. color: #e0fcff;
  1226. }
  1227. /* 乌拉海水库简介样式 */
  1228. .reservoir-image {
  1229. width: 100%;
  1230. height: 130px;
  1231. margin-bottom: 4px;
  1232. border-radius: 4px;
  1233. overflow: hidden;
  1234. border: 1px solid rgba(0, 212, 255, 0.3);
  1235. }
  1236. .reservoir-image img {
  1237. width: 100%;
  1238. height: 100%;
  1239. object-fit: cover;
  1240. }
  1241. .reservoir-info {
  1242. display: flex;
  1243. flex-direction: column;
  1244. gap: 0;
  1245. }
  1246. .reservoir-info p {
  1247. margin: 0;
  1248. color: #e0fcff;
  1249. font-size: 12px;
  1250. line-height: 1.8;
  1251. }
  1252. .info-label {
  1253. color: #62f6fb;
  1254. font-weight: bold;
  1255. }
  1256. .info-section-title {
  1257. color: #00d5ff;
  1258. font-size: 12px;
  1259. font-weight: bold;
  1260. margin: 2px 0 0 0;
  1261. text-shadow: 0 0 5px rgba(0, 212, 255, 0.3);
  1262. }
  1263. .chart-sub-header {
  1264. height: 30px;
  1265. background-image: url('/src/assets/images/小标题.png');
  1266. background-size: 100% 100%;
  1267. background-position: center;
  1268. background-repeat: no-repeat;
  1269. display: inline-flex;
  1270. align-items: center;
  1271. padding-left: 16px;
  1272. padding-right: 30px;
  1273. margin-bottom: 8px;
  1274. }
  1275. .chart-sub-title {
  1276. color: #e0fcff;
  1277. font-size: 14px;
  1278. font-weight: bold;
  1279. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  1280. }
  1281. .more-link,
  1282. .more-header {
  1283. color: #00d5ff;
  1284. font-size: 12px;
  1285. cursor: pointer;
  1286. text-decoration: underline;
  1287. }
  1288. .dam-feature-grid {
  1289. display: grid;
  1290. grid-template-columns: 1fr 1fr;
  1291. gap: 6px;
  1292. }
  1293. .dam-feature-grid .feature-name {
  1294. font-size: var(--fs-label); font-weight: var(--fw-label);
  1295. }
  1296. .dam-feature-grid .feature-value {
  1297. font-size: 13px;
  1298. }
  1299. .more-header {
  1300. margin-right: 8px;
  1301. }
  1302. .more-link:hover,
  1303. .more-header:hover {
  1304. color: #62f6fb;
  1305. }
  1306. .feature-data {
  1307. display: flex;
  1308. align-items: baseline;
  1309. gap: 6px;
  1310. line-height: 1.4;
  1311. }
  1312. /* 水库详情弹窗 */
  1313. .modal-overlay {
  1314. position: fixed;
  1315. top: 0;
  1316. left: 0;
  1317. width: 100%;
  1318. height: 100%;
  1319. background: rgba(0, 0, 0, 0.6);
  1320. display: flex;
  1321. align-items: center;
  1322. justify-content: center;
  1323. z-index: 1000;
  1324. }
  1325. .modal-content {
  1326. background: linear-gradient(135deg, rgba(0, 26, 51, 0.97) 0%, rgba(0, 51, 102, 0.97) 100%);
  1327. border: 2px solid rgba(0, 213, 255, 0.5);
  1328. border-radius: 8px;
  1329. width: 700px;
  1330. max-height: 85vh;
  1331. overflow-y: auto;
  1332. }
  1333. .modal-header {
  1334. display: flex;
  1335. justify-content: space-between;
  1336. align-items: center;
  1337. padding: 16px 20px;
  1338. border-bottom: 1px solid rgba(0, 213, 255, 0.3);
  1339. }
  1340. .modal-header h3 {
  1341. margin: 0;
  1342. font-size: var(--fs-value-lg); font-weight: var(--fw-value);
  1343. color: #e0fcff;
  1344. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  1345. }
  1346. .modal-close {
  1347. color: #62f6fb;
  1348. font-size: 20px;
  1349. cursor: pointer;
  1350. padding: 4px;
  1351. line-height: 1;
  1352. }
  1353. .modal-close:hover {
  1354. color: #00d5ff;
  1355. }
  1356. .modal-body {
  1357. padding: 20px;
  1358. }
  1359. .modal-image {
  1360. width: 100%;
  1361. height: 200px;
  1362. border-radius: 6px;
  1363. overflow: hidden;
  1364. margin-bottom: 16px;
  1365. border: 1px solid rgba(0, 213, 255, 0.3);
  1366. }
  1367. .modal-image img {
  1368. width: 100%;
  1369. height: 100%;
  1370. object-fit: cover;
  1371. }
  1372. .modal-body p {
  1373. margin: 0;
  1374. color: #e0fcff;
  1375. font-size: 14px;
  1376. line-height: 1.6;
  1377. }
  1378. /* 主管部门样式 */
  1379. .dept-info p {
  1380. margin: 0;
  1381. color: #e0fcff;
  1382. font-size: 12px;
  1383. line-height: 1.4;
  1384. text-indent: 2em;
  1385. }
  1386. /* 水库特征样式 */
  1387. .feature-grid {
  1388. display: grid;
  1389. grid-template-columns: 1fr 1fr;
  1390. gap: 6px;
  1391. }
  1392. .feature-item {
  1393. display: flex;
  1394. align-items: center;
  1395. gap: 6px;
  1396. padding: 4px 8px;
  1397. background-image: url('/src/assets/images/卡片背景.png');
  1398. background-size: 100% 100%;
  1399. background-position: center;
  1400. background-repeat: no-repeat;
  1401. }
  1402. .feature-icon-small {
  1403. width: 28px;
  1404. height: 28px;
  1405. border-radius: 4px;
  1406. overflow: hidden;
  1407. flex-shrink: 0;
  1408. }
  1409. .feature-icon-small img {
  1410. width: 100%;
  1411. height: 100%;
  1412. object-fit: cover;
  1413. }
  1414. .feature-info {
  1415. flex: 1;
  1416. display: flex;
  1417. flex-direction: column;
  1418. min-width: 0;
  1419. }
  1420. .feature-name {
  1421. color: #62f6fb;
  1422. font-size: var(--fs-label); font-weight: var(--fw-label);
  1423. font-weight: bold;
  1424. line-height: 1.3;
  1425. }
  1426. .feature-data {
  1427. display: flex;
  1428. align-items: baseline;
  1429. gap: 4px;
  1430. line-height: 1.4;
  1431. }
  1432. .feature-value {
  1433. color: #ffffff;
  1434. font-size: 13px;
  1435. font-weight: bold;
  1436. }
  1437. .feature-unit {
  1438. color: #62f6fb;
  1439. font-size: var(--fs-unit); font-weight: var(--fw-normal);
  1440. }
  1441. /* 水文站实时水情样式 */
  1442. .hydrology-card-body {
  1443. padding: 6px;
  1444. background: rgba(0, 20, 40, 0.5);
  1445. border-radius: 4px;
  1446. border: 1px solid rgba(0, 212, 255, 0.2);
  1447. }
  1448. .hydrology-stats {
  1449. display: flex;
  1450. gap: 4px;
  1451. margin-bottom: 8px;
  1452. margin-top: -4px;
  1453. }
  1454. .stat-item {
  1455. flex: 1;
  1456. background: rgba(0, 20, 40, 0.6);
  1457. border-radius: 2px;
  1458. border: 1px solid rgba(0, 212, 255, 0.2);
  1459. padding: 6px 2px;
  1460. text-align: center;
  1461. }
  1462. .stat-label {
  1463. color: #7bbef6;
  1464. font-size: 11px;
  1465. }
  1466. .stat-unit {
  1467. color: #7bbef6;
  1468. font-size: 10px;
  1469. margin-bottom: 2px;
  1470. }
  1471. .stat-value {
  1472. font-size: var(--fs-value-lg); font-weight: var(--fw-value);
  1473. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  1474. }
  1475. .stat-value.current {
  1476. color: #62f6fb;
  1477. }
  1478. .stat-value.yesterday {
  1479. color: #f472b6;
  1480. }
  1481. .stat-value.average {
  1482. color: #ffd93d;
  1483. }
  1484. .stat-value.warning-negative {
  1485. color: #22c55e;
  1486. }
  1487. .stat-value.warning-positive {
  1488. color: #ff6b6b;
  1489. }
  1490. .charts-container {
  1491. display: flex;
  1492. flex-direction: column;
  1493. gap: 10px;
  1494. }
  1495. .chart-box {
  1496. background: rgba(0, 20, 40, 0.5);
  1497. border-radius: 4px;
  1498. border: 1px solid rgba(0, 212, 255, 0.2);
  1499. padding: 8px;
  1500. }
  1501. .chart-title {
  1502. color: #7bbef6;
  1503. font-size: 13px;
  1504. font-weight: bold;
  1505. margin-bottom: 6px;
  1506. text-align: left;
  1507. }
  1508. /* 今日值班样式 */
  1509. .duty-section {
  1510. margin-bottom: 10px;
  1511. }
  1512. .duty-section:last-child {
  1513. margin-bottom: 0;
  1514. }
  1515. .duty-section-title {
  1516. display: flex;
  1517. align-items: center;
  1518. justify-content: center;
  1519. height: 32px;
  1520. padding: 0 20px;
  1521. background-image: url('/src/assets/images/小标题背景2.png');
  1522. background-size: 100% 100%;
  1523. background-position: center;
  1524. background-repeat: no-repeat;
  1525. color: #e0fcff;
  1526. font-size: 16px;
  1527. font-weight: bold;
  1528. margin-bottom: 6px;
  1529. text-shadow: 0 0 5px rgba(0, 212, 255, 0.3);
  1530. }
  1531. .duty-row {
  1532. display: flex;
  1533. align-items: center;
  1534. justify-content: center;
  1535. gap: 0;
  1536. padding: 1px 0;
  1537. }
  1538. .duty-segment {
  1539. color: #62f6fb;
  1540. font-size: 15px;
  1541. font-weight: normal;
  1542. white-space: nowrap;
  1543. letter-spacing: 2px;
  1544. }
  1545. .duty-segment:first-of-type {
  1546. width: 48px;
  1547. text-align: center;
  1548. }
  1549. .duty-segment:last-of-type {
  1550. width: 48px;
  1551. text-align: center;
  1552. }
  1553. .duty-person {
  1554. color: #ffffff;
  1555. font-size: 15px;
  1556. font-weight: normal;
  1557. white-space: nowrap;
  1558. min-width: 56px;
  1559. text-align: center;
  1560. }
  1561. .duty-tag.today,
  1562. .duty-tag.tomorrow {
  1563. display: inline-flex;
  1564. align-items: center;
  1565. justify-content: center;
  1566. width: 22px;
  1567. height: 22px;
  1568. border-radius: 3px;
  1569. color: #ffffff;
  1570. font-size: 15px;
  1571. font-weight: bold;
  1572. line-height: 1;
  1573. flex-shrink: 0;
  1574. margin-right: 4px;
  1575. }
  1576. .duty-tag.today {
  1577. background: #0066cc;
  1578. }
  1579. .duty-tag.tomorrow {
  1580. background: #f97316;
  1581. }
  1582. /* 最新调度样式 */
  1583. .dispatch-notice {
  1584. display: flex;
  1585. align-items: center;
  1586. gap: 6px;
  1587. padding: 2px 8px;
  1588. background: rgba(255, 193, 7, 0.15);
  1589. border-radius: 4px;
  1590. margin-bottom: 8px;
  1591. height: 20px;
  1592. overflow: hidden;
  1593. }
  1594. .dispatch-notice-icon {
  1595. width: 16px;
  1596. height: 16px;
  1597. flex-shrink: 0;
  1598. }
  1599. .dispatch-notice-icon img {
  1600. width: 100%;
  1601. height: 100%;
  1602. }
  1603. .dispatch-notice-text {
  1604. flex: 1;
  1605. overflow: hidden;
  1606. height: 20px;
  1607. line-height: 20px;
  1608. }
  1609. .dispatch-notice-scroll {
  1610. display: inline-block;
  1611. white-space: nowrap;
  1612. animation: scrollNotice 10s linear infinite;
  1613. color: #ffc107;
  1614. font-size: 13px;
  1615. font-weight: normal;
  1616. }
  1617. @keyframes scrollNotice {
  1618. 0% { transform: translateX(100%); }
  1619. 10% { transform: translateX(0); }
  1620. 85% { transform: translateX(0); }
  1621. 100% { transform: translateX(-100%); }
  1622. }
  1623. .dispatch-cards {
  1624. display: flex;
  1625. gap: 6px;
  1626. }
  1627. .dispatch-card {
  1628. flex: 1;
  1629. display: flex;
  1630. flex-direction: column;
  1631. align-items: center;
  1632. padding: 4px 2px;
  1633. background-image: url('/src/assets/images/卡片背景2.png');
  1634. background-size: 100% 100%;
  1635. background-position: center;
  1636. background-repeat: no-repeat;
  1637. }
  1638. .dispatch-card-label {
  1639. color: #62f6fb;
  1640. font-size: var(--fs-label); font-weight: var(--fw-label);
  1641. font-weight: normal;
  1642. text-align: center;
  1643. white-space: nowrap;
  1644. }
  1645. .dispatch-card-value {
  1646. color: #ffffff;
  1647. font-size: 18px;
  1648. font-weight: bold;
  1649. }
  1650. .dispatch-card-value-warning {
  1651. color: #ffc107;
  1652. }
  1653. .dispatch-card-unit {
  1654. color: #62f6fb;
  1655. font-size: var(--fs-unit); font-weight: var(--fw-normal);
  1656. font-weight: normal;
  1657. margin-left: 2px;
  1658. }
  1659. .dispatch-time {
  1660. display: flex;
  1661. align-items: center;
  1662. justify-content: center;
  1663. gap: 8px;
  1664. height: 30px;
  1665. margin: 8px 0;
  1666. border: 1px solid rgba(0, 213, 255, 0.3);
  1667. border-radius: 4px;
  1668. }
  1669. .dispatch-time-label {
  1670. color: #62f6fb;
  1671. font-size: 13px;
  1672. font-weight: normal;
  1673. }
  1674. .dispatch-time-value {
  1675. color: #ffffff;
  1676. font-size: 13px;
  1677. font-weight: normal;
  1678. }
  1679. .dispatch-level-cards {
  1680. display: flex;
  1681. gap: 6px;
  1682. }
  1683. .dispatch-level-card {
  1684. flex: 1;
  1685. display: flex;
  1686. align-items: center;
  1687. gap: 4px;
  1688. padding: 3px 6px;
  1689. background-image: url('/src/assets/images/卡片背景2.png');
  1690. background-size: 100% 100%;
  1691. background-position: center;
  1692. background-repeat: no-repeat;
  1693. }
  1694. .dispatch-level-icon {
  1695. width: 40px;
  1696. height: 40px;
  1697. flex-shrink: 0;
  1698. display: flex;
  1699. align-items: center;
  1700. justify-content: center;
  1701. }
  1702. .dispatch-level-icon img {
  1703. max-width: 100%;
  1704. max-height: 100%;
  1705. object-fit: contain;
  1706. }
  1707. .dispatch-level-info {
  1708. display: flex;
  1709. align-items: center;
  1710. gap: 6px;
  1711. min-width: 0;
  1712. }
  1713. .dispatch-level-label {
  1714. color: #62f6fb;
  1715. font-size: 11px;
  1716. font-weight: normal;
  1717. white-space: nowrap;
  1718. }
  1719. .dispatch-level-value {
  1720. color: #ffffff;
  1721. font-size: 18px;
  1722. font-weight: bold;
  1723. white-space: nowrap;
  1724. }
  1725. /* 水库监测卡片样式 */
  1726. .water-stats-row {
  1727. display: flex;
  1728. gap: 8px;
  1729. }
  1730. .water-stat-card {
  1731. flex: 1;
  1732. display: flex;
  1733. flex-direction: row;
  1734. align-items: center;
  1735. justify-content: space-between;
  1736. padding: 4px 16px;
  1737. background-image: url('/src/assets/images/卡片背景2.png');
  1738. background-size: 100% 100%;
  1739. background-position: center;
  1740. background-repeat: no-repeat;
  1741. height: 50px;
  1742. }
  1743. .water-stat-label {
  1744. color: #62f6fb;
  1745. font-size: var(--fs-label); font-weight: var(--fw-label);
  1746. margin-bottom: 0;
  1747. text-align: left;
  1748. line-height: 1.2;
  1749. white-space: nowrap;
  1750. }
  1751. .water-stat-value {
  1752. color: #ffffff;
  1753. font-size: var(--fs-value-xl); font-weight: var(--fw-value);
  1754. font-weight: bold;
  1755. text-shadow: 0 0 6px rgba(0, 212, 255, 0.5);
  1756. line-height: 1.2;
  1757. }
  1758. .reservoir-monitor-section {
  1759. margin-bottom: 12px;
  1760. padding-bottom: 12px;
  1761. border-bottom: 1px solid rgba(0, 212, 255, 0.15);
  1762. }
  1763. .reservoir-monitor-section:last-child {
  1764. margin-bottom: 0;
  1765. padding-bottom: 0;
  1766. border-bottom: none;
  1767. }
  1768. .monitor-time-range {
  1769. display: flex;
  1770. align-items: center;
  1771. gap: 4px;
  1772. margin: 6px 0 8px;
  1773. padding: 4px 8px;
  1774. background: rgba(0, 20, 40, 0.5);
  1775. border-radius: 3px;
  1776. border: 1px solid rgba(0, 212, 255, 0.15);
  1777. }
  1778. .time-range-label {
  1779. color: #62f6fb;
  1780. font-size: 11px;
  1781. white-space: nowrap;
  1782. }
  1783. .time-range-value {
  1784. color: #e0fcff;
  1785. font-size: 11px;
  1786. font-family: monospace;
  1787. }
  1788. .monitor-chart-box {
  1789. background: rgba(0, 20, 40, 0.4);
  1790. border-radius: 4px;
  1791. border: 1px solid rgba(0, 212, 255, 0.15);
  1792. padding: 6px;
  1793. margin-bottom: 8px;
  1794. }
  1795. .monitor-chart-box:last-child {
  1796. margin-bottom: 0;
  1797. }
  1798. .monitor-chart-label {
  1799. color: #7bbef6;
  1800. font-size: var(--fs-label); font-weight: var(--fw-label);
  1801. font-weight: bold;
  1802. margin-bottom: 2px;
  1803. }
  1804. .monitor-chart-desc {
  1805. color: #62f6fb;
  1806. font-size: 11px;
  1807. line-height: 1.5;
  1808. margin-top: 4px;
  1809. text-align: center;
  1810. }
  1811. .real-time-data {
  1812. display: flex;
  1813. flex-direction: column;
  1814. gap: 8px;
  1815. }
  1816. .real-time-item {
  1817. background: rgba(0, 20, 40, 0.4);
  1818. border-radius: 4px;
  1819. border: 1px solid rgba(0, 212, 255, 0.15);
  1820. padding: 8px 10px;
  1821. }
  1822. .real-time-label {
  1823. color: #7bbef6;
  1824. font-size: var(--fs-label); font-weight: var(--fw-label);
  1825. margin-bottom: 4px;
  1826. }
  1827. .real-time-value-row {
  1828. display: flex;
  1829. align-items: baseline;
  1830. gap: 6px;
  1831. margin-bottom: 4px;
  1832. }
  1833. .real-time-value {
  1834. color: #ffffff;
  1835. font-size: var(--fs-value-xl); font-weight: var(--fw-value);
  1836. font-weight: bold;
  1837. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  1838. }
  1839. .real-time-unit {
  1840. color: #62f6fb;
  1841. font-size: 13px;
  1842. }
  1843. .real-time-value-text {
  1844. color: #e0fcff;
  1845. font-size: 14px;
  1846. font-weight: bold;
  1847. }
  1848. .real-time-status {
  1849. display: inline-flex;
  1850. align-items: center;
  1851. padding: 2px 10px;
  1852. border-radius: 3px;
  1853. font-size: 12px;
  1854. font-weight: bold;
  1855. margin-left: auto;
  1856. }
  1857. .real-time-status.status-normal {
  1858. background: rgba(34, 197, 94, 0.2);
  1859. color: #22c55e;
  1860. border: 1px solid rgba(34, 197, 94, 0.4);
  1861. }
  1862. .real-time-desc {
  1863. color: #62f6fb;
  1864. font-size: 11px;
  1865. }
  1866. .real-time-divider {
  1867. height: 1px;
  1868. background: rgba(0, 212, 255, 0.15);
  1869. margin: 0;
  1870. }
  1871. .water-volume-cards {
  1872. display: flex;
  1873. flex-direction: column;
  1874. gap: 6px;
  1875. }
  1876. .volume-card {
  1877. display: flex;
  1878. align-items: center;
  1879. gap: 8px;
  1880. padding: 6px 8px;
  1881. background-image: url('/src/assets/images/卡片背景2.png');
  1882. background-size: 100% 100%;
  1883. background-position: center;
  1884. background-repeat: no-repeat;
  1885. }
  1886. .volume-card-icon {
  1887. width: 36px;
  1888. height: 36px;
  1889. flex-shrink: 0;
  1890. display: flex;
  1891. align-items: center;
  1892. justify-content: center;
  1893. }
  1894. .volume-card-icon img {
  1895. max-width: 100%;
  1896. max-height: 100%;
  1897. object-fit: contain;
  1898. }
  1899. .volume-card-info {
  1900. flex: 1;
  1901. min-width: 0;
  1902. }
  1903. .volume-card-label {
  1904. color: #62f6fb;
  1905. font-size: var(--fs-label); font-weight: var(--fw-label);
  1906. margin-bottom: 2px;
  1907. }
  1908. .volume-card-value {
  1909. color: #ffffff;
  1910. font-size: var(--fs-value-lg); font-weight: var(--fw-value);
  1911. text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
  1912. }
  1913. .volume-card-unit {
  1914. color: #62f6fb;
  1915. font-size: var(--fs-unit); font-weight: var(--fw-normal);
  1916. margin-left: 2px;
  1917. }
  1918. .volume-card-desc {
  1919. color: #7bbef6;
  1920. font-size: 11px;
  1921. margin-top: 2px;
  1922. }
  1923. </style>