index.vue 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292
  1. <template>
  2. <div class="control">
  3. <div class="bg_header">
  4. <img src="@/assets/controlPanel/icon/bgheader3.png" alt="" />
  5. <div class="header-handle">
  6. <div><weather /></div>
  7. <div>
  8. <a-dropdown
  9. class="dropdown-link"
  10. overlayClassName="site-custom__classname"
  11. >
  12. <a class="ant-dropdown-link" @click.prevent>
  13. <div class="siteinfo1">
  14. <span style="margin-right: 25rem"
  15. ><EnvironmentOutlined />{{ nowAccount.sitename }}</span
  16. >
  17. <span style="margin-right: 10rem">{{ nowAccount.name }}</span>
  18. <DownOutlined />
  19. </div>
  20. </a>
  21. <template #overlay>
  22. <a-menu>
  23. <a-menu-item v-for="item in accountList" :key="item.index">
  24. <a @click="accountItemClick(item, false)">{{
  25. item.sitename + "-" + item.name
  26. }}</a>
  27. </a-menu-item>
  28. <a-menu-divider />
  29. <a-menu-item>
  30. <LogoutOutlined />
  31. <a class="color-red" @click="loginOut">&nbsp;退出登录</a>
  32. </a-menu-item>
  33. </a-menu>
  34. </template>
  35. </a-dropdown>
  36. <a-button
  37. type="primary"
  38. size="small"
  39. @click="router.push('/controlPanel')"
  40. style="position: absolute; right: 20rem; bottom: 0"
  41. >退出</a-button
  42. >
  43. </div>
  44. </div>
  45. </div>
  46. <div class="control_content">
  47. <div class="control_content-left">
  48. <ContentBox>
  49. <div class="header">
  50. <span>告警记录</span>
  51. <a-button
  52. type="primary"
  53. size="small"
  54. @click="goPage('/warningHistory')"
  55. >进入</a-button
  56. >
  57. </div>
  58. <div class="history-statistice">
  59. <div>
  60. <div class="history-item">
  61. <span class="normal-title">今日告警量</span>
  62. <span>{{ data.dataAll.today_total }}</span>
  63. </div>
  64. <div class="history-item">
  65. <span class="normal-title">未处理</span>
  66. <span>{{ data.dataAll.today_undeal }}</span>
  67. </div>
  68. <div class="history-item">
  69. <span class="normal-title">已处理</span>
  70. <span>{{ data.dataAll.today_deal }}</span>
  71. </div>
  72. </div>
  73. </div>
  74. <div class="history-wrapper" v-load-directive="warningLoad">
  75. <div
  76. :class="[{ move: warningMove }, { 'history-list': true }]"
  77. @mouseenter="warningClose"
  78. @mouseleave="warningScrollUp"
  79. v-if="data.warningHistory.length"
  80. >
  81. <div
  82. class="history-item"
  83. v-for="(item, index) in data.warningHistory"
  84. :key="index"
  85. >
  86. <a-tooltip>
  87. <template #title>
  88. <span>{{ item.devicename }}</span>
  89. </template>
  90. <span>{{ item.devicename }}</span>
  91. </a-tooltip>
  92. <a-tooltip>
  93. <template #title>
  94. <span>{{ item.eventname }}</span>
  95. </template>
  96. <span>{{ item.eventname }}</span>
  97. </a-tooltip>
  98. <span
  99. :style="{
  100. color: baseSet.styleObj(
  101. eventlevelList.filter(
  102. (v) => v.value == item.lasteventlevel
  103. )[0]
  104. ? eventlevelList.filter(
  105. (v) => v.value == item.lasteventlevel
  106. )[0].remarks
  107. : ''
  108. ).color,
  109. }"
  110. >{{
  111. eventlevelList.filter(
  112. (v) => v.value == item.lasteventlevel
  113. )[0]
  114. ? eventlevelList.filter(
  115. (v) => v.value == item.lasteventlevel
  116. )[0].remarks
  117. : ""
  118. }}</span
  119. >
  120. <span>{{ item.lasteventtime }}</span>
  121. </div>
  122. </div>
  123. <a-empty :image="simpleImage" v-else>
  124. <template #description>
  125. <span style="color: #ffffff">暂无数据</span>
  126. </template>
  127. </a-empty>
  128. </div>
  129. </ContentBox>
  130. <ContentBox>
  131. <div class="header">
  132. <span>本周告警统计</span>
  133. <a-button
  134. type="primary"
  135. size="small"
  136. @click="goPage('/warningControl', 'valvesystem')"
  137. >进入</a-button
  138. >
  139. </div>
  140. <div class="history-statistice">
  141. <div>
  142. <div class="history-item">
  143. <span class="normal-title">本周告警量</span>
  144. <span>{{ data.dataAll.week_total }}</span>
  145. </div>
  146. <div class="history-item">
  147. <span class="normal-title">紧急</span>
  148. <span>{{ data.dataAll.week_emergent }}</span>
  149. </div>
  150. <div class="history-item">
  151. <span class="normal-title">重要</span>
  152. <span>{{ data.dataAll.week_important }}</span>
  153. </div>
  154. </div>
  155. </div>
  156. <div class="map" ref="map"></div>
  157. </ContentBox>
  158. </div>
  159. <div class="control_content-center">
  160. <ContentBox>
  161. <div class="header">
  162. <span>设备监控</span>
  163. <a-button
  164. type="primary"
  165. size="small"
  166. @click="goPage('/equipmentManage')"
  167. >进入</a-button
  168. >
  169. </div>
  170. <div class="device-statistice">
  171. <div class="device-item">
  172. <div class="left">
  173. <span>设备数</span>
  174. <span>{{ data.dataAll.device_total }}</span>
  175. </div>
  176. <div class="right">
  177. <img src="@/assets/controlPanel/icon/设备数.png" alt="" />
  178. </div>
  179. </div>
  180. <div class="device-item">
  181. <div class="left">
  182. <span>在线数</span>
  183. <span>{{ data.dataAll.device_online }}</span>
  184. </div>
  185. <div class="right">
  186. <img src="@/assets/controlPanel/icon/在线数.png" alt="" />
  187. </div>
  188. </div>
  189. <div class="device-item">
  190. <div class="left">
  191. <span>异常数</span>
  192. <span>{{ data.dataAll.device_abnormal }}</span>
  193. </div>
  194. <div class="right">
  195. <img src="@/assets/controlPanel/icon/异常数.png" alt="" />
  196. </div>
  197. </div>
  198. </div>
  199. <devices systemname='valvesystem' />
  200. </ContentBox>
  201. </div>
  202. <div class="control_content-right">
  203. <ContentBox>
  204. <div class="header">
  205. <span>待接收的命令</span>
  206. </div>
  207. <div class="info-wrapper" v-load-directive="cmdLoad">
  208. <div class="info-list" v-if="data.cmdList.length">
  209. <template v-for="item in data.cmdList">
  210. <div
  211. class="info-item"
  212. v-for="(item2, index) in item.content"
  213. :key="index"
  214. >
  215. <a-tooltip>
  216. <template #title>
  217. <span>{{ item.createdate }}</span>
  218. </template>
  219. <span>{{ item.createdate }}</span>
  220. </a-tooltip>
  221. <a-tooltip>
  222. <template #title>
  223. <span>{{ item.devicename }}</span>
  224. </template>
  225. <span>{{ item.devicename }}</span>
  226. </a-tooltip>
  227. <a-tooltip>
  228. <template #title>
  229. <span>{{ item2.title }}:{{ item2.value }}</span>
  230. </template>
  231. <span>{{ item2.title }}:{{ item2.value }}</span>
  232. </a-tooltip>
  233. </div>
  234. </template>
  235. </div>
  236. <a-empty :image="simpleImage" v-else>
  237. <template #description>
  238. <span style="color: #ffffff">暂无数据</span>
  239. </template>
  240. </a-empty>
  241. </div>
  242. </ContentBox>
  243. <ContentBox>
  244. <div class="header">
  245. <span>操作记录</span>
  246. </div>
  247. <div class="handle-wrapper" v-load-directive="handleLoad">
  248. <div
  249. :class="[{ move: move }, { 'handle-list': true }]"
  250. @mouseenter="close"
  251. @mouseleave="scrollUp"
  252. v-if="data.handleHistory.length"
  253. >
  254. <div
  255. class="info-item"
  256. v-for="(item, index) in data.handleHistory"
  257. :key="index"
  258. >
  259. <a-tooltip>
  260. <template #title>
  261. <span>{{ item.createdate }}</span>
  262. </template>
  263. <span>{{ item.createdate }}</span>
  264. </a-tooltip>
  265. <a-tooltip>
  266. <template #title>
  267. <span>{{ item.devicename }}</span>
  268. </template>
  269. <span>{{ item.devicename }}</span>
  270. </a-tooltip>
  271. <a-tooltip>
  272. <template #title>
  273. <span>{{ item.title }}:{{ item.value }}</span>
  274. </template>
  275. <span>{{ item.title }}:{{ item.value }}</span>
  276. </a-tooltip>
  277. </div>
  278. </div>
  279. <a-empty :image="simpleImage" v-else>
  280. <template #description>
  281. <span style="color: #ffffff">暂无数据</span>
  282. </template>
  283. </a-empty>
  284. </div>
  285. </ContentBox>
  286. </div>
  287. </div>
  288. </div>
  289. </template>
  290. <script setup>
  291. import weather from "@/components/weather/index.vue";
  292. import devices from "../pressureControl/modules/devices.vue"
  293. import { Empty, Modal } from "ant-design-vue";
  294. import {
  295. EnvironmentOutlined,
  296. DownOutlined,
  297. ExclamationCircleOutlined,
  298. } from "@ant-design/icons-vue";
  299. const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
  300. import baseSet from "../warningControl/baseSet.js";
  301. import ContentBox from "../pressureControl/modules/Box.vue";
  302. import { Line } from "@antv/g2plot";
  303. import {
  304. ref,
  305. defineProps,
  306. defineEmits,
  307. onMounted,
  308. onUnmounted,
  309. onBeforeMount,
  310. onDeactivated,
  311. watch,
  312. createVNode,
  313. } from "vue";
  314. import Api from "@/api/api";
  315. import utils from "@/utils/utils";
  316. import { onBeforeRouteUpdate, useRouter } from "vue-router";
  317. import { useRouteTabsStore } from "@/stores/modules/Htabs";
  318. import { useAuthStore } from "@/stores/modules/auth";
  319. import { storeToRefs } from "pinia";
  320. const store = useAuthStore();
  321. let { system, mods, actSystem, openKeys, app, accountList, nowAccount } =
  322. storeToRefs(store);
  323. const rotTabs = useRouteTabsStore();
  324. let { historyRoutes } = storeToRefs(rotTabs);
  325. const emit = defineEmits([]);
  326. const router = useRouter();
  327. let map = ref();
  328. let line = ref();
  329. let eventlevelList = ref([]);
  330. let loading = ref(false);
  331. let timer = ref();
  332. let move = ref(false);
  333. const accountItemClick = (account, bool) => {
  334. store.defaultAccount(account, () => {
  335. store.reloadPage();
  336. setTimeout(() => {
  337. getBaseInfo();
  338. historyDataFun();
  339. isRefresh.value = true;
  340. }, 1500);
  341. // historyRoutes.value = []
  342. });
  343. if (!bool) {
  344. if (router.currentRoute.value.meta.isDetail) {
  345. router.go(-1);
  346. }
  347. } else {
  348. router.go(0);
  349. }
  350. };
  351. const loginOut = () => {
  352. Modal.confirm({
  353. title: "注意",
  354. icon: createVNode(ExclamationCircleOutlined),
  355. content: "确定登出当前账号吗?",
  356. okText: "确认",
  357. cancelText: "取消",
  358. onOk() {
  359. historyRoutes.value = [];
  360. Api.loginout({});
  361. router.push({ path: "/" });
  362. },
  363. });
  364. };
  365. let goPage = (path, name) => {
  366. if (name) {
  367. router.push({ path: path, query: { systemname: name } });
  368. } else {
  369. router.push(path);
  370. }
  371. setTimeout(() => {
  372. console.log(system.value, app.value);
  373. let result;
  374. system.value.forEach((item) => {
  375. item.modules.forEach((item2) => {
  376. if (item2.systemmoduleid == app.value.systemmoduleid) {
  377. result = item;
  378. }
  379. });
  380. });
  381. actSystem.value = result;
  382. store.modulesData(result);
  383. openKeys.value.push(result.modules[0].apps[0].systemmoduleid);
  384. });
  385. };
  386. let calcSizeFun = () => {
  387. let baseSize = 1920;
  388. console.log(document.body.clientWidth);
  389. document.querySelector("html").style.fontSize = `${100 / baseSize}vw`;
  390. };
  391. let scrollUp = () => {
  392. timer.value = setInterval(() => {
  393. let wrapper = document.querySelector(".handle-wrapper").clientHeight;
  394. let list = document.querySelector(".handle-list").clientHeight;
  395. if (list < wrapper) return;
  396. move.value = true;
  397. setTimeout(() => {
  398. data.value.handleHistory.push(data.value.handleHistory.shift());
  399. move.value = false;
  400. }, 500);
  401. }, 2000);
  402. };
  403. let close = () => {
  404. clearInterval(timer.value);
  405. };
  406. let warningMove = ref(false);
  407. let timer2 = ref();
  408. let warningScrollUp = () => {
  409. timer2.value = setInterval(() => {
  410. let wrapper = document.querySelector(".history-wrapper").clientHeight;
  411. let list = document.querySelector(".history-list").clientHeight;
  412. if (list < wrapper) return;
  413. warningMove.value = true;
  414. setTimeout(() => {
  415. data.value.warningHistory.push(data.value.warningHistory.shift());
  416. warningMove.value = false;
  417. }, 500);
  418. }, 2000);
  419. };
  420. let warningClose = () => {
  421. clearInterval(timer2.value);
  422. };
  423. /* 数据变量 */
  424. let data = ref({
  425. dataAll: {},
  426. warningMapData: [],
  427. warningHistory: [],
  428. deviceList: [],
  429. handleHistory: [],
  430. cmdList: [],
  431. });
  432. let warningParam = ref({
  433. id: 20230914133102,
  434. content: {
  435. systemname: "valvesystem",
  436. pageNumber: 1,
  437. pageSize: 30,
  438. },
  439. });
  440. let cmdParam = ref({
  441. id: 20230914133402,
  442. content: {
  443. systemname: "valvesystem",
  444. pageNumber: 1,
  445. pageSize: 10,
  446. },
  447. });
  448. let handleParam = ref({
  449. id: 20230914133502,
  450. content: {
  451. systemname: "valvesystem",
  452. pageNumber: 1,
  453. pageSize: 30,
  454. },
  455. });
  456. let listData = async () => {
  457. let res = await Api.requested({
  458. id: 20230914133002,
  459. content: { systemname: "valvesystem" },
  460. });
  461. data.value.dataAll = res.data;
  462. console.log(data.value.dataAll, "数据统计");
  463. let res3 = await Api.requested({
  464. id: 20230914133202,
  465. content: { systemname: "valvesystem" },
  466. });
  467. data.value.warningMapData = res3.data;
  468. data.value.warningMapData.forEach((item) => (item.次数 = item.count));
  469. line.value.changeData(data.value.warningMapData);
  470. console.log(data.value.warningMapData, "告警统计");
  471. };
  472. let deviceClick = (data) => {
  473. router.push({
  474. path: "/" + (data.dashboardpath || "baseDevice"),
  475. query: {
  476. id: data.w_deviceid,
  477. },
  478. });
  479. };
  480. let warningTotalPage = ref(0);
  481. let warningLoad = () => {
  482. console.log("触发");
  483. if (
  484. warningParam.value.content.pageNumber == warningTotalPage.value ||
  485. loading.value == true
  486. )
  487. return;
  488. warningParam.value.content.pageNumber += 1;
  489. console.log(warningParam.value);
  490. getwarningData();
  491. };
  492. let getwarningData = async () => {
  493. loading.value = true;
  494. let res = await Api.requested(warningParam.value);
  495. data.value.warningHistory =
  496. warningParam.value.content.pageNumber == 1
  497. ? res.data
  498. : data.value.warningHistory.concat(res.data);
  499. data.value.warningHistory.forEach((item) => {
  500. item.lasteventtime = item.lasteventtime.slice(5, item.lasteventtime.length);
  501. });
  502. warningTotalPage.value = res.pageTotal;
  503. setTimeout(() => {
  504. loading.value = false;
  505. }, 1500);
  506. console.log(data.value.warningHistory, "告警记录");
  507. };
  508. let cmdTotalPage = ref(0);
  509. let cmdLoad = () => {
  510. if (
  511. cmdParam.value.content.pageNumber == cmdTotalPage.value ||
  512. loading.value == true
  513. )
  514. return;
  515. cmdParam.value.content.pageNumber += 1;
  516. console.log(cmdParam.value);
  517. getCmdData();
  518. };
  519. let getCmdData = async () => {
  520. loading.value = true;
  521. let res = await Api.requested(cmdParam.value);
  522. data.value.cmdList =
  523. cmdParam.value.content.pageNumber == 1
  524. ? res.data
  525. : data.value.cmdList.concat(res.data);
  526. data.value.cmdList.forEach((item) => {
  527. item.createdate = item.createdate.slice(5, item.createdate.length);
  528. });
  529. cmdTotalPage.value = res.pageTotal;
  530. setTimeout(() => {
  531. loading.value = false;
  532. }, 1500);
  533. console.log(data.value.cmdList, "cmd列表");
  534. };
  535. let handleTotalPage = ref(0);
  536. let handleLoad = () => {
  537. if (
  538. handleParam.value.content.pageNumber == handleTotalPage.value ||
  539. loading.value == true
  540. )
  541. return;
  542. handleParam.value.content.pageNumber += 1;
  543. console.log(handleParam.value);
  544. getHanleData();
  545. };
  546. let getHanleData = async () => {
  547. loading.value = true;
  548. let res = await Api.requested(handleParam.value);
  549. // data.value.handleHistory = handleParam.value.content.pageNumber == 1 ? res.data : data.value.handleHistory.concat(res.data)
  550. res.data.forEach((item) => {
  551. item.content.forEach((item2) => {
  552. data.value.handleHistory.push({
  553. devicename: item.devicename,
  554. createdate: item.createdate.slice(5, item.createdate.length),
  555. title: item2.title,
  556. value: item2.value,
  557. });
  558. });
  559. });
  560. handleTotalPage.value = res.pageTotal;
  561. setTimeout(() => {
  562. loading.value = false;
  563. }, 1000);
  564. console.log(data.value.handleHistory, "操作记录");
  565. };
  566. let initChart = () => {
  567. line.value = new Line(map.value, {
  568. data: data.value.warningMapData,
  569. xField: "date",
  570. yField: "次数",
  571. yAxis: {
  572. label: {
  573. style: {
  574. fill: "#ffffff",
  575. },
  576. },
  577. },
  578. xAxis: {
  579. label: {
  580. style: {
  581. fill: "#ffffff",
  582. },
  583. },
  584. },
  585. color: ["#16FFF6", "rgba(255, 164, 6)"],
  586. legend: {
  587. position: "bottom",
  588. itemName: {
  589. style: {
  590. fill: "#ffffff",
  591. },
  592. },
  593. },
  594. tooltip: {
  595. // formatter:(v) => {
  596. // return {name:v.paramname,value:v.value + chartData.value.find(item => item.paramname == v.paramname).unit}
  597. // }
  598. },
  599. area: {
  600. style: {
  601. fillOpacity: 0.15,
  602. },
  603. },
  604. // @TODO 后续会换一种动画方式
  605. animation: {
  606. appear: {
  607. animation: "path-in",
  608. duration: 3000,
  609. },
  610. },
  611. });
  612. line.value.render();
  613. };
  614. let vLoadDirective = {
  615. mounted(el, binding) {
  616. let tableWarp = el;
  617. function handleFun(e) {
  618. if (
  619. tableWarp.scrollTop + tableWarp.clientHeight >=
  620. tableWarp.scrollHeight
  621. ) {
  622. binding.value();
  623. }
  624. }
  625. tableWarp.addEventListener("scroll", handleFun);
  626. el.tableWarp = tableWarp;
  627. el.handleFun = handleFun;
  628. },
  629. unmounted(el) {
  630. el.tableWarp.removeEventListener("scroll", el.handleFun);
  631. },
  632. };
  633. onMounted(async () => {
  634. calcSizeFun();
  635. initChart();
  636. listData();
  637. getCmdData();
  638. getHanleData();
  639. getwarningData();
  640. scrollUp();
  641. warningScrollUp();
  642. const res = await Api.optionstype("eventlevel");
  643. eventlevelList.value = res.data;
  644. console.log("警告等级", eventlevelList.value);
  645. console.log(router.currentRoute.value.path);
  646. });
  647. router.beforeEach((to, from, next) => {
  648. clearInterval(timer2.value);
  649. clearInterval(timer.value);
  650. next();
  651. });
  652. </script>
  653. <style>
  654. .site-custom__classname .ant-dropdown-menu {
  655. background: rgba(5, 54, 178, 0.7) !important;
  656. color: #ffffff !important;
  657. padding: 0 !important;
  658. }
  659. .site-custom__classname .ant-dropdown-menu-item {
  660. color: #ffffff !important;
  661. }
  662. .site-custom__classname .ant-dropdown-menu-item:hover {
  663. background: rgba(5, 54, 178, 0.1) !important;
  664. }
  665. </style>
  666. <style scoped>
  667. .header-handle {
  668. padding: 0 40rem;
  669. transform: translateY(-20rem);
  670. display: flex;
  671. justify-content: space-between;
  672. }
  673. .weather-panel {
  674. font-size: 14rem;
  675. font-weight: bold;
  676. }
  677. .ant-btn-primary {
  678. background: rgb(20, 49, 125) !important;
  679. border-color: rgb(20, 49, 125) !important;
  680. }
  681. /deep/.weather-panel .white {
  682. display: none;
  683. }
  684. /deep/.weather-panel span:nth-child(2) {
  685. margin-right: 15rem;
  686. }
  687. /deep/.weather-panel span:nth-child(3) {
  688. margin-right: 3rem;
  689. }
  690. /deep/.weather-panel span:nth-child(4) {
  691. }
  692. /deep/.weather-panel span:last-child {
  693. }
  694. .siteinfo1 {
  695. color: #ffffff !important;
  696. font-size: 14rem;
  697. font-weight: bold;
  698. z-index: 999999;
  699. margin-right: 40rem;
  700. }
  701. .normal-title {
  702. font-size: 16rem;
  703. color: #ffffff;
  704. }
  705. .header {
  706. display: flex;
  707. justify-content: space-between;
  708. align-items: center;
  709. font-size: 14rem;
  710. font-weight: bold;
  711. margin-bottom: 20rem;
  712. }
  713. * {
  714. box-sizing: border-box;
  715. }
  716. .control {
  717. width: 100%;
  718. height: 100vh;
  719. background: #02004d;
  720. color: #ffffff;
  721. --color1: #16fff6;
  722. --color2: rgba(255, 164, 6);
  723. overflow: hidden;
  724. }
  725. .control .bg_header {
  726. position: relative;
  727. }
  728. .control .bg_header img {
  729. width: 100%;
  730. }
  731. .control .control_content {
  732. width: 100%;
  733. height: calc(100vh - 110rem);
  734. margin-top: 10rem;
  735. padding: 0 10rem 10rem 10rem;
  736. display: flex;
  737. }
  738. .control .control_content .control_content-left {
  739. flex: 1;
  740. height: 100%;
  741. display: flex;
  742. flex-direction: column;
  743. overflow: hidden;
  744. }
  745. .control .control_content .control_content-left .content_box {
  746. height: 50%;
  747. }
  748. .control .control_content .control_content-left .content_box:first-child {
  749. margin-bottom: 15rem;
  750. }
  751. .control .control_content .control_content-left .history-statistice {
  752. display: flex;
  753. }
  754. .control .control_content .control_content-left .history-statistice > div {
  755. margin: 0 auto;
  756. display: flex;
  757. }
  758. .control
  759. .control_content
  760. .control_content-left
  761. .history-statistice
  762. .history-item {
  763. display: flex;
  764. flex-direction: column;
  765. text-align: center;
  766. margin-right: 20rem;
  767. }
  768. .control
  769. .control_content
  770. .control_content-left
  771. .history-statistice
  772. .history-item
  773. span:last-child {
  774. color: var(--color2);
  775. font-size: 16rem;
  776. font-weight: bold;
  777. }
  778. .control .control_content .control_content-left .history-wrapper {
  779. height: calc(100% - 110rem);
  780. overflow-y: scroll;
  781. margin-top: 15rem;
  782. padding-bottom: 15rem;
  783. }
  784. ::-webkit-scrollbar {
  785. display: none;
  786. }
  787. .control .control_content .control_content-left .history-wrapper .history-item {
  788. display: flex;
  789. justify-content: space-between;
  790. margin-bottom: 10rem;
  791. cursor: pointer;
  792. }
  793. .control
  794. .control_content
  795. .control_content-left
  796. .history-wrapper
  797. .history-item:last-child {
  798. margin: 0;
  799. }
  800. .control
  801. .control_content
  802. .control_content-left
  803. .history-wrapper
  804. .history-item:hover {
  805. background: rgba(255, 255, 255, 0.4);
  806. }
  807. .control
  808. .control_content
  809. .control_content-left
  810. .history-wrapper
  811. .history-item
  812. span {
  813. white-space: nowrap;
  814. overflow: hidden;
  815. text-overflow: ellipsis;
  816. }
  817. .control
  818. .control_content
  819. .control_content-left
  820. .history-wrapper
  821. .history-item
  822. span:nth-child(1) {
  823. flex: 1;
  824. }
  825. .control
  826. .control_content
  827. .control_content-left
  828. .history-wrapper
  829. .history-item
  830. span:nth-child(2) {
  831. flex: 1;
  832. }
  833. .control
  834. .control_content
  835. .control_content-left
  836. .history-wrapper
  837. .history-item
  838. span:nth-child(3) {
  839. flex: 0.5;
  840. }
  841. .control
  842. .control_content
  843. .control_content-left
  844. .history-wrapper
  845. .history-item
  846. span:nth-child(4) {
  847. flex: 1;
  848. }
  849. .control .control_content .control_content-left .map {
  850. height: calc(100% - 120rem);
  851. }
  852. .control .control_content .control_content-center {
  853. flex: 1.5;
  854. height: 100%;
  855. min-width: 565rem;
  856. }
  857. .control .control_content .control_content-center .device-statistice {
  858. display: flex;
  859. justify-content: space-between;
  860. margin: 15rem;
  861. }
  862. .control
  863. .control_content
  864. .control_content-center
  865. .device-statistice
  866. .device-item {
  867. display: flex;
  868. flex: 1;
  869. justify-content: space-between;
  870. border: 1rem solid var(--color1);
  871. margin-right: 20rem;
  872. padding: 10rem 20rem;
  873. color: var(--color1);
  874. }
  875. .siteinfo {
  876. position: absolute;
  877. left: 0;
  878. top: 0;
  879. width: 100%;
  880. }
  881. .siteinfo .siteinfo-wrapper {
  882. display: flex;
  883. align-items: center;
  884. align-self: flex-start;
  885. width: 100%;
  886. background: #40a9ff;
  887. }
  888. .siteinfo span {
  889. margin-left: 10px;
  890. white-space: nowrap;
  891. text-overflow: ellipsis;
  892. overflow: hidden;
  893. font-size: 14rem;
  894. }
  895. .control
  896. .control_content
  897. .control_content-center
  898. .device-statistice
  899. .device-item:last-child {
  900. margin: 0;
  901. }
  902. .control
  903. .control_content
  904. .control_content-center
  905. .device-statistice
  906. .device-item
  907. .left {
  908. display: flex;
  909. justify-content: space-between;
  910. flex-direction: column;
  911. }
  912. .control
  913. .control_content
  914. .control_content-center
  915. .device-statistice
  916. .device-item
  917. .left
  918. span:last-child {
  919. color: var(--color2);
  920. font-size: 16rem;
  921. font-weight: bold;
  922. }
  923. .control
  924. .control_content
  925. .control_content-center
  926. .device-statistice
  927. .device-item
  928. .right {
  929. width: 50rem;
  930. height: 50rem;
  931. display: flex;
  932. align-items: center;
  933. }
  934. .control
  935. .control_content
  936. .control_content-center
  937. .device-statistice
  938. .device-item
  939. .right
  940. img {
  941. width: 100%;
  942. margin-bottom: 0 !important;
  943. }
  944. .control .control_content .control_content-center .device-wrapper {
  945. overflow-y: scroll;
  946. height: calc(100% - 180rem);
  947. margin-top: 40rem;
  948. }
  949. .control .control_content .control_content-center .device-wrapper .device-list {
  950. display: flex;
  951. flex-wrap: wrap;
  952. }
  953. .control
  954. .control_content
  955. .control_content-center
  956. .device-wrapper
  957. .device-list
  958. .used {
  959. display: inline-block;
  960. width: 10rem;
  961. height: 10rem;
  962. border-radius: 10rem;
  963. background: var(--icon);
  964. margin-right: 10rem;
  965. }
  966. .control
  967. .control_content
  968. .control_content-center
  969. .device-wrapper
  970. .device-list
  971. .device-title {
  972. display: flex;
  973. align-items: center;
  974. height: 44rem;
  975. font-size: 14rem;
  976. }
  977. .control
  978. .control_content
  979. .control_content-center
  980. .device-wrapper
  981. .device-list
  982. .device-title,
  983. img,
  984. .status {
  985. margin-bottom: 10rem;
  986. font-size: 14rem;
  987. }
  988. .control
  989. .control_content
  990. .control_content-center
  991. .device-wrapper
  992. .device-list
  993. .device-title
  994. span {
  995. display: inline-block;
  996. width: 140rem;
  997. text-overflow: ellipsis;
  998. overflow: hidden;
  999. display: -webkit-box;
  1000. -webkit-line-clamp: 2;
  1001. -webkit-box-orient: vertical;
  1002. word-break: break-all;
  1003. }
  1004. .control
  1005. .control_content
  1006. .control_content-center
  1007. .device-wrapper
  1008. .device-list
  1009. .content_box {
  1010. display: flex;
  1011. flex-direction: column;
  1012. align-items: center;
  1013. align-content: center;
  1014. padding: 0 25rem;
  1015. margin-bottom: 15rem;
  1016. cursor: pointer;
  1017. }
  1018. .control
  1019. .control_content
  1020. .control_content-center
  1021. .device-wrapper
  1022. .device-list
  1023. .content_box:hover {
  1024. --color: red !important;
  1025. }
  1026. .control
  1027. .control_content
  1028. .control_content-center
  1029. .device-wrapper
  1030. .device-list
  1031. .content_box:hover
  1032. img {
  1033. transition: all 0.2s;
  1034. transform: scale(1.2);
  1035. }
  1036. .control
  1037. .control_content
  1038. .control_content-center
  1039. .device-wrapper
  1040. .device-list
  1041. .i {
  1042. width: 20rem;
  1043. height: 20rem;
  1044. border-radius: 20rem;
  1045. background: red;
  1046. }
  1047. .control
  1048. .control_content
  1049. .control_content-center
  1050. .device-wrapper
  1051. .device-list
  1052. img {
  1053. width: 100%;
  1054. max-height: 70rem;
  1055. }
  1056. .control
  1057. .control_content
  1058. .control_content-center
  1059. .device-wrapper
  1060. .device-list
  1061. .status {
  1062. color: var(--color2);
  1063. }
  1064. .control .control_content .control_content-center .content_box {
  1065. height: 100%;
  1066. margin: 0 18rem;
  1067. width: auto !important;
  1068. flex: 1;
  1069. }
  1070. .control .control_content .control_content-center .device-list .content_box {
  1071. flex: 1 !important;
  1072. max-width: 212rem;
  1073. }
  1074. .control .control_content .control_content-right {
  1075. flex: 1;
  1076. height: 100%;
  1077. display: flex;
  1078. flex-direction: column;
  1079. overflow: hidden;
  1080. }
  1081. .control .control_content .control_content-right .content_box:first-child {
  1082. margin-bottom: 15rem;
  1083. height: 35%;
  1084. }
  1085. .control .control_content .control_content-right .content_box:last-child {
  1086. height: 65%;
  1087. }
  1088. .control .control_content .control_content-right .info-wrapper {
  1089. height: calc(100% - 30rem);
  1090. overflow-y: scroll;
  1091. }
  1092. .control .control_content .control_content-right .info-wrapper .info-list {
  1093. }
  1094. .control
  1095. .control_content
  1096. .control_content-right
  1097. .info-wrapper
  1098. .info-list
  1099. .info-item {
  1100. display: flex;
  1101. justify-content: space-between;
  1102. margin-bottom: 10rem;
  1103. cursor: pointer;
  1104. }
  1105. .control
  1106. .control_content
  1107. .control_content-right
  1108. .info-wrapper
  1109. .info-list
  1110. .info-item:hover {
  1111. background: rgba(255, 255, 255, 0.4);
  1112. }
  1113. .control
  1114. .control_content
  1115. .control_content-right
  1116. .info-wrapper
  1117. .info-list
  1118. .info-item
  1119. span {
  1120. white-space: nowrap;
  1121. overflow: hidden;
  1122. text-overflow: ellipsis;
  1123. }
  1124. .control
  1125. .control_content
  1126. .control_content-right
  1127. .info-wrapper
  1128. .info-list
  1129. .info-item
  1130. span:nth-child(1) {
  1131. flex: 1;
  1132. }
  1133. .control
  1134. .control_content
  1135. .control_content-right
  1136. .info-wrapper
  1137. .info-list
  1138. .info-item
  1139. span:nth-child(2) {
  1140. flex: 1;
  1141. }
  1142. .control
  1143. .control_content
  1144. .control_content-right
  1145. .info-wrapper
  1146. .info-list
  1147. .info-item
  1148. span:nth-child(3) {
  1149. flex: 2;
  1150. }
  1151. .control
  1152. .control_content
  1153. .control_content-right
  1154. .info-wrapper
  1155. .info-list
  1156. .info-item
  1157. span:nth-child(1) {
  1158. color: var(--color1);
  1159. }
  1160. .control
  1161. .control_content
  1162. .control_content-right
  1163. .info-wrapper
  1164. .info-list
  1165. .info-item
  1166. span:nth-child(2) {
  1167. color: var(--color2);
  1168. }
  1169. .control .control_content .control_content-right .handle-wrapper {
  1170. height: calc(100% - 30rem);
  1171. overflow-y: scroll;
  1172. }
  1173. .control .control_content .control_content-right .handle-wrapper .handle-list {
  1174. }
  1175. .control
  1176. .control_content
  1177. .control_content-right
  1178. .handle-wrapper
  1179. .handle-list
  1180. .info-item {
  1181. display: flex;
  1182. justify-content: space-between;
  1183. margin-bottom: 10rem;
  1184. cursor: pointer;
  1185. }
  1186. .control
  1187. .control_content
  1188. .control_content-right
  1189. .handle-wrapper
  1190. .handle-list
  1191. .info-item:hover {
  1192. background: rgba(255, 255, 255, 0.4);
  1193. }
  1194. .control
  1195. .control_content
  1196. .control_content-right
  1197. .handle-wrapper
  1198. .handle-list
  1199. .info-item
  1200. span {
  1201. white-space: nowrap;
  1202. overflow: hidden;
  1203. text-overflow: ellipsis;
  1204. }
  1205. .control
  1206. .control_content
  1207. .control_content-right
  1208. .handle-wrapper
  1209. .handle-list
  1210. .info-item
  1211. span:nth-child(1) {
  1212. flex: 1;
  1213. }
  1214. .control
  1215. .control_content
  1216. .control_content-right
  1217. .handle-wrapper
  1218. .handle-list
  1219. .info-item
  1220. span:nth-child(2) {
  1221. flex: 1;
  1222. }
  1223. .control
  1224. .control_content
  1225. .control_content-right
  1226. .handle-wrapper
  1227. .handle-list
  1228. .info-item
  1229. span:nth-child(3) {
  1230. flex: 2;
  1231. }
  1232. .control
  1233. .control_content
  1234. .control_content-right
  1235. .handle-wrapper
  1236. .handle-list
  1237. .info-item
  1238. span:nth-child(1) {
  1239. color: var(--color1);
  1240. }
  1241. .control
  1242. .control_content
  1243. .control_content-right
  1244. .handle-wrapper
  1245. .handle-list
  1246. .info-item
  1247. span:nth-child(2) {
  1248. color: var(--color2);
  1249. }
  1250. .content_box {
  1251. padding: 10rem 15rem;
  1252. }
  1253. .move {
  1254. margin-top: -30rem;
  1255. transition: all 0.5s ease-in-out;
  1256. }
  1257. </style>