Browse Source

1.新增设备定时开关功能

2.新增空调风柜系统页面
dev
selia-zx 3 weeks ago
parent
commit
631f29cb9a
  1. 4
      .env.development
  2. 10
      src/api/aircAndWindc/index.js
  3. 35
      src/api/bigScreen.js
  4. 10
      src/api/temSys/temHistory.js
  5. 10
      src/api/temSys/temMonitor.js
  6. BIN
      src/assets/flowimg/badhotpum.png
  7. BIN
      src/assets/flowimg/badpum.png
  8. BIN
      src/assets/flowimg/badweb.png
  9. BIN
      src/assets/flowimg/circulate-move.gif
  10. BIN
      src/assets/flowimg/circulate-nomove.png
  11. BIN
      src/assets/flowimg/closehotpum.png
  12. BIN
      src/assets/flowimg/closepum.png
  13. BIN
      src/assets/flowimg/flow.png
  14. BIN
      src/assets/flowimg/move.gif
  15. BIN
      src/assets/flowimg/nomove.png
  16. BIN
      src/assets/flowimg/notusebath.png
  17. BIN
      src/assets/flowimg/onlineweb.png
  18. BIN
      src/assets/flowimg/replenish-move.gif
  19. BIN
      src/assets/flowimg/replenish-nomove.png
  20. BIN
      src/assets/flowimg/starthotpum.png
  21. BIN
      src/assets/flowimg/startpum.png
  22. BIN
      src/assets/flowimg/supply-move.gif
  23. BIN
      src/assets/flowimg/supply-nomove.png
  24. BIN
      src/assets/flowimg/thermometer.png
  25. BIN
      src/assets/flowimg/usebath.png
  26. BIN
      src/assets/flowimg/waterBox.png
  27. 1
      src/assets/icons/svg/143.svg
  28. 1
      src/assets/icons/svg/aircAndWindc.svg
  29. 1
      src/assets/icons/svg/bigScreen.svg
  30. 1
      src/assets/icons/svg/percentage-icon.svg
  31. 1
      src/assets/icons/svg/temHistory.svg
  32. 1
      src/assets/icons/svg/temSys.svg
  33. 1
      src/assets/icons/svg/tem_icon.svg
  34. 1
      src/assets/icons/svg/timeSwitch.svg
  35. BIN
      src/assets/images/blue-arrow.png
  36. BIN
      src/assets/images/energy-icon1.png
  37. BIN
      src/assets/images/energy-icon2.png
  38. BIN
      src/assets/images/energy-icon3.png
  39. BIN
      src/assets/images/energy-icon4.png
  40. BIN
      src/assets/images/fenggui.png
  41. BIN
      src/assets/images/fengshan.png
  42. BIN
      src/assets/images/haiwang2.png
  43. BIN
      src/assets/images/message-img2.png
  44. BIN
      src/assets/images/message-img6.png
  45. BIN
      src/assets/images/message-img8.png
  46. BIN
      src/assets/images/message-img9.png
  47. BIN
      src/assets/images/orange-arrow.png
  48. BIN
      src/assets/images/组 3.png
  49. BIN
      src/assets/images/路径 1112.png
  50. 14
      src/assets/styles/element-ui.scss
  51. 183
      src/router/index.js
  52. 2
      src/utils/evenBus.js
  53. 758
      src/views/aircAndWindc/awSysMonitor/index.vue
  54. 584
      src/views/bigScreen/bigScreen.vue
  55. 429
      src/views/bigScreen/components/allEnergy.vue
  56. 598
      src/views/bigScreen/components/coldSysEnergy.vue
  57. 52
      src/views/bigScreen/components/timeData.vue
  58. 265
      src/views/bigScreen/components/useElect.vue
  59. 599
      src/views/bigScreen/components/waterSysEnergy.vue
  60. 20
      src/views/bigScreen/index.vue
  61. 43
      src/views/centerairC/delaySwitch/index.vue
  62. 43
      src/views/centerairC/deviceStrategy/index.vue
  63. 420
      src/views/centerairC/sysControl/index.vue
  64. 167
      src/views/centerairC/sysMonitor/index.vue
  65. 1504
      src/views/centerairC/sysMonitor/index2.vue
  66. 458
      src/views/centerairC/timeSwitch/index.vue
  67. 102
      src/views/components/waterTank.vue
  68. 105
      src/views/hotWater/waterControl/index.vue
  69. 756
      src/views/hotWater/waterMonitor/index.vue
  70. 13
      src/views/temSys/temHistory/index.vue
  71. 13
      src/views/temSys/temMonitor/index.vue

4
.env.development

@ -7,9 +7,9 @@ ENV = 'development'
# 开发环境
# VUE_APP_BASE_API = '/dev-api'
# 后台
# VUE_APP_BASE_API = 'http://192.168.1.222:8080'
VUE_APP_BASE_API = 'http://192.168.1.222:8080'
# 云端
VUE_APP_BASE_API = 'http://106.55.173.225:8090'
# VUE_APP_BASE_API = 'http://106.55.173.225:8090'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

10
src/api/aircAndWindc/index.js

@ -0,0 +1,10 @@
import request from "@/utils/request";
//根据房间号查询对应的风柜系统操作
export function windList(query) {
return request({
url: "/device/ahu/monitor/list",
method: "get",
params: query,
});
}

35
src/api/bigScreen.js

@ -0,0 +1,35 @@
import request from "@/utils/request";
// 能耗总览和基本信息、冷源系统和生活热水系统能耗
export function overView(data) {
return request({
url: "/bigScreen/overview",
method: "post",
data: data,
});
}
// 用电趋势
export function systemTrend(data) {
return request({
url: "/bigScreen/systemTrend",
method: "post",
data: data,
});
}
// 天气数据
export function getWeatherData() {
return request({
url: "/device/cs/getWeatherData",
method: "get",
});
}
// 运行时间
export function getRunTime() {
return request({
url: "/device/cs/runTime",
method: "get",
});
}

10
src/api/temSys/temHistory.js

@ -0,0 +1,10 @@
import request from "@/utils/request";
// 历史数据
export function temHistory(query) {
return request({
url: "/device/indoor/tempHis",
method: "get",
params: query,
});
}

10
src/api/temSys/temMonitor.js

@ -0,0 +1,10 @@
import request from "@/utils/request";
// 设备监视
export function temList(query) {
return request({
url: "/device/indoor/tempList",
method: "get",
params: query,
});
}

BIN
src/assets/flowimg/badhotpum.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/assets/flowimg/badpum.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
src/assets/flowimg/badweb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/flowimg/circulate-move.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
src/assets/flowimg/circulate-nomove.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/assets/flowimg/closehotpum.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
src/assets/flowimg/closepum.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
src/assets/flowimg/flow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
src/assets/flowimg/move.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
src/assets/flowimg/nomove.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

BIN
src/assets/flowimg/notusebath.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
src/assets/flowimg/onlineweb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/assets/flowimg/replenish-move.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/assets/flowimg/replenish-nomove.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
src/assets/flowimg/starthotpum.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/assets/flowimg/startpum.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
src/assets/flowimg/supply-move.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

BIN
src/assets/flowimg/supply-nomove.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

BIN
src/assets/flowimg/thermometer.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
src/assets/flowimg/usebath.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
src/assets/flowimg/waterBox.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

1
src/assets/icons/svg/143.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744269624472" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1891" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M500.06518 407.417083c-15.230889 6.368034-22.38994 23.673166-16.126282 38.904055 6.305613 15.172561 23.715121 22.311145 38.841633 16.105816 15.19405-6.321986 22.38994-23.731494 16.109909-38.920428C532.584827 408.374898 515.217275 401.153426 500.06518 407.417083zM585.498968 441.122743c0.170892-2.049682 0.280386-4.115738 0.282433-6.209422l-0.036839 0c0-19.511379-7.523347-37.262672-19.816325-50.531883 14.241352-2.867304 27.126824-12.905938 35.858696-27.600615l55.722092-69.448722c15.027252-25.197892 6.692423-57.833173-18.524912-72.822562l-13.381775-7.892761c-25.238824-15.005762-57.837266-6.625908-72.764234 18.608823l-34.264385 82.09781c-10.598382 17.871019-12.231579 37.855166-3.322675 53.317323-1.277086-0.065492-2.563382-0.099261-3.856841-0.099261-19.257599 0-36.809347 7.337105-50.016137 19.367093 0.870834-18.241456-10.194176-35.44221-28.357861-46.27186l-69.470211-55.716976c-25.113981-15.009855-57.774845-6.713912-72.764234 18.524912l-7.9296 13.402241c-14.968923 25.214265-6.630001 57.853639 18.608823 72.802096l82.134649 34.284851c18.560728 11.029194 39.464827 12.322653 55.17974 2.105964-1.113357 5.116531-1.716084 10.423397-1.716084 15.873526 0 22.020526 9.55461 41.782615 24.727171 55.396681-16.293081 1.208525-31.330566 11.833513-41.136909 28.326139l-55.700603 69.448722c-14.989389 25.176402-6.730285 57.8168 18.504446 72.843028l13.444197 7.850805c25.176402 15.009855 57.8168 6.65149 72.764234-18.566868l34.243919-82.134649c12.038174-20.252253 12.530384-43.223431-0.849344-59.251475 2.737344 0.305969 5.514597 0.476861 8.333806 0.476861 18.781762 0 35.919071-6.969739 49.006134-18.450211 2.416026 14.856359 12.626575 28.381397 27.844162 37.445844l69.470211 55.721069c25.134447 15.068184 57.774845 6.730285 72.802096-18.508539l7.850805-13.419637c15.031345-25.176402 6.693446-57.837266-18.546402-72.7847l-82.138742-34.248012C620.244306 434.682054 600.796372 432.888198 585.498968 441.122743zM572.72913 434.913321c-0.010233 8.178263-1.626034 15.974833-4.52813 23.107277-0.048095 0.080841-0.100284 0.155543-0.148379 0.236384l-1.549286 2.523473c-1.461281 2.468215-2.662643 4.955872-3.63069 7.448646-10.9197 16.850783-29.862121 28.004821-51.479465 28.015054-33.860179-0.016373-61.273529-27.450189-61.315484-61.331857 0.041956-33.902134 27.454282-61.273529 61.315484-61.33595 7.236821 0.013303 14.171768 1.279133 20.611433 3.576455l2.266623 1.408069c3.25309 1.925862 6.537903 3.405563 9.824763 4.482081 17.200754 10.856255 28.619828 29.996175 28.670993 51.868321L572.72913 434.911274zM552.125883 136.172379l-40.732703-2.603291-40.674375 2.603291c-147.190317 19.932981-260.748652 145.790434-260.748652 298.457486 0 166.573783 134.911666 301.644061 301.423027 301.644061 166.473499 0 301.505915-135.070278 301.505915-301.644061C812.900118 281.963837 699.279361 156.105361 552.125883 136.172379zM511.393179 700.015118c-146.257062 0-265.243013-119.048373-265.243013-265.384229 0-146.240689 118.985952-265.267573 265.243013-265.267573 146.320507 0 265.263479 119.026884 265.263479 265.267573C776.657682 580.966745 657.713686 700.015118 511.393179 700.015118zM886.475833 9.519818 136.456858 9.640568c-38.741349 0-70.082148 31.278377-70.082148 70.061682l0 864.390839c0 38.658462 31.340799 70.078055 70.082148 70.118987l750.018975-0.041956c38.678928 0 70.015633-31.419594 70.015633-70.078055L956.491467 79.701227C956.491467 40.917922 925.071873 9.640568 886.475833 9.519818zM914.172639 944.092066c-0.041956 15.168468-12.486382 27.65485-27.695782 27.65485l-750.018975 0.104377c-15.313777-0.104377-27.658943-12.428054-27.800159-27.758204L108.657722 835.984882l805.51594 0L914.173662 944.092066zM914.172639 811.374368l-805.51594 0L108.656699 79.701227c0.141216-15.272845 12.444427-27.759227 27.800159-27.759227l750.018975 0c15.210423 0.100284 27.65485 12.486382 27.695782 27.759227L914.171616 811.374368zM511.352247 931.605683c13.486152 0 24.405853-10.903328 24.405853-24.405853 0-13.522991-10.920724-24.464181-24.405853-24.464181-13.522991 0-24.485671 10.94119-24.485671 24.464181C486.866576 920.702356 497.828232 931.605683 511.352247 931.605683zM413.514965 931.605683c13.502525 0 24.443715-10.903328 24.443715-24.405853 0-13.522991-10.94119-24.464181-24.443715-24.464181-13.502525 0-24.464181 10.94119-24.464181 24.464181C389.050784 920.702356 400.01244 931.605683 413.514965 931.605683zM603.071182 931.605683c13.46057 0 24.40176-10.903328 24.40176-24.405853 0-13.522991-10.94119-24.464181-24.40176-24.464181-13.544481 0-24.465205 10.94119-24.465205 24.464181C578.605977 920.702356 589.526701 931.605683 603.071182 931.605683z" fill="" p-id="1892"></path></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

1
src/assets/icons/svg/aircAndWindc.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744269448510" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="26640" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M192 0h640c44.184 0 80 35.816 80 80v864c0 44.184-35.816 80-80 80H192c-44.184 0-80-35.816-80-80V80C112 35.816 147.816 0 192 0z m0 64a16 16 0 0 0-16 16v864a16 16 0 0 0 16 16h640a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16H192z m320 544c-139.176 0-252-112.824-252-252s112.824-252 252-252 252 112.824 252 252-112.824 252-252 252z m0-64c103.828 0 188-84.172 188-188s-84.172-188-188-188-188 84.172-188 188 84.172 188 188 188z m-64.688-63.88c-11.88 6.4-37.236 11.576-66.588-42.168-29.356-53.748-0.944-87.72 15.56-96.608 12.692-6.84 43.744-5.008 63.268-2.32a56.104 56.104 0 0 1 19.1-25.56c-1.304-8.12-5.348-24.74-17.424-36.188-16.52-15.656-27.028-29.824-27.028-43.248 0-13.42 7.508-38.028 69.068-38.028 61.56 0 78.08 41 78.08 59.648 0 15.776-19.888 45.964-31.464 60.752a55.724 55.724 0 0 1 18.128 32.632c8.932 1.464 21.88 2.072 33.844-3.012 20.992-8.92 38.24-12.94 50.668-7.66 12.42 5.28 32.24 21.82 8.02 78.032-24.224 56.212-68.676 55.16-85.932 47.82-14.736-6.26-35.076-36.776-44.088-53.064a56.56 56.56 0 0 1-18.056 2.956c-7.88 0.004-15.676-1.64-22.872-4.824-6.372 6.1-13.776 15.2-16.896 26.62-5.984 21.888-13.512 37.82-25.388 44.22z m122.036-105.464A55.828 55.828 0 0 1 556 396.384c7.236 10.956 16.216 23.064 23.76 28.64 15.48 11.448 41.016 16.624 55.492-16.964 14.472-33.592 8.064-39.56-10.468-34.46-16.748 4.608-43.16 3.784-55.436 1.056z m-56.2 7.304c13.892 0 25.152-11.184 25.152-24.98 0-13.796-11.26-24.98-25.152-24.98-13.888 0-25.148 11.184-25.148 24.98 0 13.796 11.26 24.98 25.148 24.98zM506.088 224c-36.784 0-39.788 8.2-27.776 23.116 12.012 14.912 22.52 43.248 23.276 53.688a6.48 6.48 0 0 1-0.032 1.128 56.772 56.772 0 0 1 23.536 1.068c7.68-11.308 16.2-25.352 18.536-35.008 4.504-18.64-0.752-43.992-37.54-43.992z m-78.28 141.712c-18.64 4.956-38.572 21.632-21.032 53.748 17.54 32.12 26.232 30.828 33.704 13.232 6-14.152 20.148-31.58 30.08-40.8a55.44 55.44 0 0 1-11.48-27.392c-11.504-0.776-23.564-0.84-31.268 1.212zM260 648h504v64H260v-64z m0 104h504v64H260v-64z m0 104h504v64H260v-64z" fill="" p-id="26641"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
src/assets/icons/svg/bigScreen.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744187269534" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2952" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M905.792 768H118.144C55.168 768 0 719.04 0 663.168V104.704C0 48.832 55.168 0 118.144 0h787.648C968.768 0 1024 48.832 1024 104.704v558.528c0 55.872-55.168 104.704-118.144 104.704zM404.544 635.712c15.68 0 39.36-15.808 39.36-39.424V360.064c0-23.68-15.744-39.36-39.36-39.36-23.68 0-39.424 15.744-39.424 39.36v236.288c0 23.68 15.744 39.424 39.424 39.424z m173.248 0c23.68 0 39.36-15.808 39.36-39.424V478.208c0-23.68-15.68-39.36-39.36-39.36s-39.36 15.68-39.36 39.36v118.144c0 23.68 15.68 39.424 39.36 39.424z m173.248 0c23.68 0 39.424-15.808 39.424-39.424v-39.424c0-23.616-15.744-39.36-39.424-39.36-23.616 0-39.36 15.744-39.36 39.36v39.424c0 23.616 15.744 39.36 39.36 39.36z m-519.808 0c15.744 0 39.36-15.808 39.36-39.424V241.92c0-23.68-15.68-39.424-39.36-39.424s-39.36 15.808-39.36 39.424v354.432c0 23.68 15.68 39.424 39.36 39.424zM256 841.088h512a73.152 73.152 0 0 1 0 146.24H256a73.152 73.152 0 0 1 0-146.24z" p-id="2953"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/svg/percentage-icon.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744356433813" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="48748" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 820c-205.6 0-372-166.4-372-372S306.4 140 512 140s372 166.4 372 372-166.4 372-372 372zM282.4 404.8c0-34.4 9.6-61.6 28-81.6 19.2-20.8 44.8-30.4 76.8-30.4 31.2 0 54.4 9.6 72 28 16.8 18.4 25.6 44 25.6 76.8 0 33.6-9.6 60.8-28.8 80.8-19.2 20-44 30.4-76 30.4-29.6 0-53.6-9.6-71.2-28.8-17.6-19.2-26.4-44-26.4-75.2z m58.4-3.2c0 38.4 14.4 57.6 42.4 57.6 28.8 0 43.2-20 43.2-60 0-39.2-13.6-58.4-41.6-58.4-28.8 0-44 20.8-44 60.8z m340-104L410.4 714.4h-67.2l270.4-416.8h67.2zM540 616c0-34.4 9.6-61.6 28.8-82.4 19.2-20 44.8-30.4 76.8-30.4 31.2 0 54.4 8.8 72 27.2 16.8 18.4 25.6 44 25.6 76.8 0 34.4-9.6 61.6-28.8 81.6-19.2 20-44.8 30.4-76 30.4-29.6 0-53.6-9.6-71.2-28.8s-27.2-43.2-27.2-74.4z m59.2-3.2c0 38.4 14.4 58.4 42.4 58.4 28.8 0 43.2-20 43.2-60 0-19.2-4-33.6-11.2-43.2-8-10.4-17.6-15.2-30.4-15.2-29.6-0.8-44 20-44 60z" fill="#ffffff" p-id="48749"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/svg/temHistory.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744269424219" class="icon" viewBox="0 0 1169 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="25041" xmlns:xlink="http://www.w3.org/1999/xlink" width="228.3203125" height="200"><path d="M800.342 286.784A366.289 366.289 0 1 0 1164.312 653a365.42 365.42 0 0 0-363.97-366.216z m0 663.799A297.583 297.583 0 1 1 1095.968 653a297.148 297.148 0 0 1-295.626 297.583zM49.935 820.128a45.08 45.08 0 0 0-31.961 13.335 45.732 45.732 0 0 0-13.19 31.962 45.224 45.224 0 0 0 45.006 45.441h347.88a474.35 474.35 0 0 1-44.5-90.593z m0-724.388h961.31a45.08 45.08 0 0 0 45.006-45.297 45.66 45.66 0 0 0-13.045-32.107 44.79 44.79 0 0 0-31.962-13.335H50.008a45.37 45.37 0 0 0 0 90.666z m0 543.562h273.666a496.382 496.382 0 0 1 11.016-90.593H50.007a45.297 45.297 0 1 0 0 90.593zM504.79 276.927H50.008a45.442 45.442 0 0 0 0 90.811h367.81a484.35 484.35 0 0 1 86.97-91.246z m0 0" fill="" p-id="25042"></path><path d="M811.14 647.782v-95.087a40.803 40.803 0 0 0-81.534 0v135.818a40.659 40.659 0 0 0 40.731 40.731h135.819a40.803 40.803 0 1 0 0-81.534z m0 0" fill="" p-id="25043"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/svg/temSys.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744269239099" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13084" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M491.456 107.84c7.072 18.976 10.752 38.528 10.72 58.816-0.064 135.616 0 271.2-0.192 406.784 0 6.56 2.464 10.656 6.88 15.04 46.688 45.984 74.56 101.344 79.296 166.976 5.28 73.152-19.36 136.704-68.96 189.696-43.456 46.4-98.432 71.36-161.76 77.632-2.016 0.192-4 0.8-6.016 1.216h-26.336c-1.568-0.384-3.136-0.896-4.736-1.184-13.12-2.176-26.496-3.488-39.392-6.592a252.032 252.032 0 0 1-190.272-208.384c-1.568-10.656-2.528-21.376-3.776-32.096v-6.272l2.4-23.552c0.448-3.936 0.96-7.84 1.568-11.712 9.024-57.12 33.088-106.432 76.64-145.344a19.392 19.392 0 0 0 7.328-16c-0.224-135.2-0.32-270.4-0.128-405.568C174.88 85.568 231.776 11.008 324.704 0.864c70.4-7.712 140.864 37.824 166.72 107.008zM304.64 71.776c-39.328 13.088-63.552 49.952-63.552 92.8v427.552c0 2.528 0.16 5.056-0.096 7.52-0.96 8.704-3.52 16.736-10.304 22.848-7.744 6.944-15.776 13.664-23.2 20.992-47.52 47.04-61.568 104.48-49.504 168.576 16.288 86.304 106.88 169.088 227.616 139.616 82.08-20.064 159.552-106.368 131.648-226.048-9.6-41.184-34.24-72.96-66.368-99.168-11.232-9.152-15.36-20.192-15.36-33.76v-218.176c0-71.488 0.064-142.944-0.064-214.4 0-6.624-0.576-13.44-2.08-19.84-11.776-49.824-64.32-89.984-128.736-68.512z m34.688 220.032c11.712 0.64 21.248 9.76 23.168 22.528 0.48 3.264 0.48 6.656 0.48 9.984 0 110.304 0.128 220.64-0.128 330.944 0 10.176 3.488 13.824 12.032 16.672 50.048 16.768 74.592 57.632 74.752 100.608 0.16 46.592-25.024 90.816-79.872 107.328-56.16 16.896-128-15.776-141.024-90.016-8.96-51.328 22.816-102.336 73.088-118.08 10.688-3.328 11.968-5.12 11.968-16.416V489.216l0.032-165.44c0-3.936 0.288-8 1.184-11.776 3.072-12.768 12.96-20.8 24.32-20.224z m0.864 417.984c-32.608-0.992-64 35.136-64.8 61.056-1.056 33.664 30.976 68.256 62.88 64.256 33.12 4 62.656-31.232 63.232-61.376 0.576-31.04-34.464-63.136-61.312-63.936z m386.624-257.408c3.104 0 6.208 0.512 9.28 1.152 18.784 3.776 26.624 15.04 26.752 33.184 0.128 18.08-12.512 30.72-30.56 31.744-15.168 0.864-30.464 0.192-45.696 0.192v0.384c-13.376 0-26.72 0.192-40.096-0.064-20.96-0.32-31.808-8.896-35.84-27.776-3.04-14.272 4.8-29.92 18.368-35.136 5.344-2.08 11.296-3.488 16.992-3.552 26.912-0.384 53.856-0.224 80.8-0.128z m3.52-174.24c26.752 0 53.44-0.064 80.192 0.032 4.16 0.032 8.352 0.352 12.416 1.216 17.312 3.648 25.92 12.384 26.976 32.448 0.928 16.992-11.36 29.984-28.576 32.416-4.512 0.64-9.152 0.96-13.696 0.96-51.36 0.064-102.72 0.064-154.08 0-4.576 0-9.184-0.224-13.696-0.896-12.16-1.792-22.08-6.72-27.008-19.2-5.216-13.184-3.168-25.344 5.312-35.84 7.296-8.992 18.432-11.04 29.536-11.104 27.52-0.16 55.072-0.032 82.656-0.032z m168.64-173.92c4.928 0.064 9.984 0.8 14.752 2.112 14.56 3.968 23.168 15.712 23.328 31.04 0.128 15.104-8.512 27.296-22.944 31.328-5.12 1.44-10.656 2.176-16 2.208l-62.368 0.096H773.44c-41.376 0-82.72 0-124.096-0.064-3.744 0-7.52-0.288-11.2-0.928-12.352-2.112-21.536-8.096-25.92-20.608a33.696 33.696 0 0 1 6.368-34.624c7.456-8.832 18.624-10.624 29.728-10.624 65.376-0.064 130.752-0.032 196.16-0.032 18.144 0 36.32-0.16 54.496 0.096z" p-id="13085"></path></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

1
src/assets/icons/svg/tem_icon.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744356001810" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="45068" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M571.392 544.768l-14.336-8.192V227.328c0-43.008-34.816-77.824-77.824-77.824-43.008 0-77.824 34.816-77.824 77.824v311.296l-14.336 6.144c-53.248 32.768-86.016 90.112-86.016 151.552 0 98.304 79.872 178.176 178.176 178.176s178.176-79.872 178.176-178.176c0-61.44-32.768-120.832-86.016-151.552z m-92.16 301.056c-79.872 0-145.408-65.536-145.408-145.408 0-65.536 45.056-122.88 104.448-139.264V221.184c0-22.528 18.432-38.912 38.912-38.912s38.912 18.432 38.912 38.912v339.968c59.392 16.384 104.448 73.728 104.448 139.264 2.048 79.872-61.44 145.408-141.312 145.408z" fill="#ffffff" fill-opacity=".75" p-id="45069"></path><path d="M512 30.72C245.76 30.72 30.72 245.76 30.72 512S245.76 993.28 512 993.28 993.28 778.24 993.28 512 778.24 30.72 512 30.72z m-32.768 884.736c-120.832 0-219.136-98.304-219.136-219.136 0-73.728 38.912-143.36 100.352-184.32V225.28c0-65.536 53.248-118.784 118.784-118.784s118.784 53.248 118.784 118.784v286.72c61.44 40.96 100.352 108.544 100.352 184.32 0 120.832-98.304 219.136-219.136 219.136z m260.096-538.624h-96.256c-10.24 0-18.432-8.192-18.432-18.432s8.192-18.432 18.432-18.432h96.256c10.24 0 18.432 8.192 18.432 18.432s-8.192 18.432-18.432 18.432z m0-61.44h-96.256c-10.24 0-18.432-8.192-18.432-18.432s8.192-18.432 18.432-18.432h96.256c10.24 0 18.432 8.192 18.432 18.432s-8.192 18.432-18.432 18.432z m0-61.44h-96.256c-10.24 0-18.432-8.192-18.432-18.432s8.192-18.432 18.432-18.432h96.256c10.24 0 18.432 8.192 18.432 18.432s-8.192 18.432-18.432 18.432z" fill="#ffffff" fill-opacity=".75" p-id="45070"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/assets/icons/svg/timeSwitch.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744073345788" class="icon" viewBox="0 0 1168 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4440" xmlns:xlink="http://www.w3.org/1999/xlink" width="228.125" height="200"><path d="M836.384 363.64c180.744 0 327.272 146.52 327.272 327.272 0 180.744-146.528 327.272-327.28 327.272-180.744 0-327.264-146.528-327.264-327.28 0-180.744 146.52-327.264 327.272-327.264zM363.656 872.72a72.72 72.72 0 0 1 0 145.456H72.744a72.72 72.72 0 0 1 0-145.456h290.912z m472.72-363.64a36.36 36.36 0 0 0-35.776 29.824l-0.584 6.544v145.456a36.36 36.36 0 0 0 29.824 35.776l6.544 0.584h145.456a36.36 36.36 0 0 0 6.544-72.144l-6.544-0.584h-109.096V545.456a36.36 36.36 0 0 0-36.36-36.368z m-472.72 72.728a72.72 72.72 0 0 1 0 145.456H72.744a72.72 72.72 0 0 1 0-145.456h290.912z m0-290.904a72.72 72.72 0 1 1 0 145.448H72.744a72.72 72.72 0 1 1 0-145.448h290.912zM1090.928 0a72.72 72.72 0 0 1 0 145.456H72.744A72.72 72.72 0 1 1 72.744 0h1018.184z" fill="" p-id="4441"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/images/blue-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
src/assets/images/energy-icon1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
src/assets/images/energy-icon2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
src/assets/images/energy-icon3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
src/assets/images/energy-icon4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
src/assets/images/fenggui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

BIN
src/assets/images/fengshan.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
src/assets/images/haiwang2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

BIN
src/assets/images/message-img2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/assets/images/message-img6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/assets/images/message-img8.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/assets/images/message-img9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/assets/images/orange-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
src/assets/images/组 3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

BIN
src/assets/images/路径 1112.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 783 B

14
src/assets/styles/element-ui.scss

@ -1362,3 +1362,17 @@
border: 1px solid #ff4949;
background: #ff4949;
}
.el-table__body tr.current-row > td.el-table__cell, .el-table__body tr.selection-row > td.el-table__cell{
background-color: rgba(0, 71, 125, 0.4) !important;
}
.el-loading-mask{
min-height: 800px;
}
.el-loading-spinner{
min-height: 800px;
display: flex;
top: 0 !important;
flex-direction: column;
align-items: center;
justify-content: center;
}

183
src/router/index.js

@ -1,10 +1,10 @@
import Vue from 'vue'
import Router from 'vue-router'
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router)
Vue.use(Router);
/* Layout */
import Layout from '@/layout'
import Layout from "@/layout";
/**
* Note: 路由配置项
@ -31,153 +31,160 @@ import Layout from '@/layout'
// 公共路由
export const constantRoutes = [
{
path: '/redirect',
path: "/redirect",
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect')
}
]
path: "/redirect/:path(.*)",
component: () => import("@/views/redirect"),
},
],
},
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
path: "/login",
component: () => import("@/views/login"),
hidden: true,
},
{
path: '/register',
component: () => import('@/views/register'),
hidden: true
path: "/register",
component: () => import("@/views/register"),
hidden: true,
},
{
path: '/404',
component: () => import('@/views/error/404'),
hidden: true
path: "/404",
component: () => import("@/views/error/404"),
hidden: true,
},
{
path: '/401',
component: () => import('@/views/error/401'),
hidden: true
path: "/401",
component: () => import("@/views/error/401"),
hidden: true,
},
{
path: '',
path: "",
component: Layout,
redirect: 'index',
redirect: "index",
children: [
{
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
}
]
path: "index",
component: () => import("@/views/index"),
name: "Index",
meta: { title: "首页", icon: "dashboard", affix: true },
},
],
},
{
path: '/user',
path: "/user",
component: Layout,
hidden: true,
redirect: 'noredirect',
redirect: "noredirect",
children: [
{
path: 'profile',
component: () => import('@/views/system/user/profile/index'),
name: 'Profile',
meta: { title: '个人中心', icon: 'user' }
}
]
}
]
path: "profile",
component: () => import("@/views/system/user/profile/index"),
name: "Profile",
meta: { title: "个人中心", icon: "user" },
},
],
},
// 综合大屏
{
path: "/bigScreen",
hidden: true,
component: () => import("@/views/bigScreen/bigScreen"),
meta: { title: "大屏总览", icon: "screen" },
},
];
// 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [
{
path: '/system/user-auth',
path: "/system/user-auth",
component: Layout,
hidden: true,
permissions: ['system:user:edit'],
permissions: ["system:user:edit"],
children: [
{
path: 'role/:userId(\\d+)',
component: () => import('@/views/system/user/authRole'),
name: 'AuthRole',
meta: { title: '分配角色', activeMenu: '/system/user' }
}
]
path: "role/:userId(\\d+)",
component: () => import("@/views/system/user/authRole"),
name: "AuthRole",
meta: { title: "分配角色", activeMenu: "/system/user" },
},
],
},
{
path: '/system/role-auth',
path: "/system/role-auth",
component: Layout,
hidden: true,
permissions: ['system:role:edit'],
permissions: ["system:role:edit"],
children: [
{
path: 'user/:roleId(\\d+)',
component: () => import('@/views/system/role/authUser'),
name: 'AuthUser',
meta: { title: '分配用户', activeMenu: '/system/role' }
}
]
path: "user/:roleId(\\d+)",
component: () => import("@/views/system/role/authUser"),
name: "AuthUser",
meta: { title: "分配用户", activeMenu: "/system/role" },
},
],
},
{
path: '/system/dict-data',
path: "/system/dict-data",
component: Layout,
hidden: true,
permissions: ['system:dict:list'],
permissions: ["system:dict:list"],
children: [
{
path: 'index/:dictId(\\d+)',
component: () => import('@/views/system/dict/data'),
name: 'Data',
meta: { title: '字典数据', activeMenu: '/system/dict' }
}
]
path: "index/:dictId(\\d+)",
component: () => import("@/views/system/dict/data"),
name: "Data",
meta: { title: "字典数据", activeMenu: "/system/dict" },
},
],
},
{
path: '/monitor/job-log',
path: "/monitor/job-log",
component: Layout,
hidden: true,
permissions: ['monitor:job:list'],
permissions: ["monitor:job:list"],
children: [
{
path: 'index/:jobId(\\d+)',
component: () => import('@/views/monitor/job/log'),
name: 'JobLog',
meta: { title: '调度日志', activeMenu: '/monitor/job' }
}
]
path: "index/:jobId(\\d+)",
component: () => import("@/views/monitor/job/log"),
name: "JobLog",
meta: { title: "调度日志", activeMenu: "/monitor/job" },
},
],
},
{
path: '/tool/gen-edit',
path: "/tool/gen-edit",
component: Layout,
hidden: true,
permissions: ['tool:gen:edit'],
permissions: ["tool:gen:edit"],
children: [
{
path: 'index/:tableId(\\d+)',
component: () => import('@/views/tool/gen/editTable'),
name: 'GenEdit',
meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
}
]
}
]
path: "index/:tableId(\\d+)",
component: () => import("@/views/tool/gen/editTable"),
name: "GenEdit",
meta: { title: "修改生成配置", activeMenu: "/tool/gen" },
},
],
},
];
// 防止连续点击多次路由报错
let routerPush = Router.prototype.push;
let routerReplace = Router.prototype.replace;
// push
Router.prototype.push = function push(location) {
return routerPush.call(this, location).catch(err => err)
}
return routerPush.call(this, location).catch((err) => err);
};
// replace
Router.prototype.replace = function push(location) {
return routerReplace.call(this, location).catch(err => err)
}
return routerReplace.call(this, location).catch((err) => err);
};
export default new Router({
mode: 'history', // 去掉url中的#
mode: "history", // 去掉url中的#
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})
routes: constantRoutes,
});

2
src/utils/evenBus.js

@ -0,0 +1,2 @@
import Vue from "vue";
export const eventBus = new Vue();

758
src/views/aircAndWindc/awSysMonitor/index.vue

@ -0,0 +1,758 @@
<template>
<div class="app-container">
<div class="left-tree">
<!-- el-tree 设置一个固定的高度和滚动条 -->
<div style="height: 7rem; overflow-y: auto">
<el-tree
ref="tree"
:data="treeData"
node-key="id"
:default-expand-all="false"
:default-expanded-keys="expandedKeys"
:auto-expand-parent="true"
icon-class="none"
@node-expand="handleNodeExpand"
@node-collapse="handleNodeCollapse"
:highlight-current="true"
@node-click="handleNodeClick"
>
<template #default="{ node }">
<span class="custom-tree-node">
<!-- 根据节点状态动态设置图标类名 -->
<div class="tree-left">
<i :class="getIconClass(node)" class="custom-tree-icon"></i>
<span class="tree-label">{{ node.label }}</span>
</div>
</span>
</template>
</el-tree>
</div>
</div>
<div class="right-monitor">
<div class="buildingDiv">
<img
class="title-bg"
src="../../../assets/images/title-bg.png"
alt=""
/>
<div class="title-word">位置{{ currentName }}</div>
</div>
<div class="mostDiv">
<div class="windC">
<!-- 空调风柜定位 -->
<img
class="wind-img"
src="../../../assets/images/fenggui.png"
alt=""
/>
<!-- 风扇定位 -->
<img
class="wind-move tunCircle"
src="../../../assets/images/fengshan.png"
alt=""
/>
<!-- 箭头定位 -->
<div class="arrow-flex">
<img
class="wind-arrow"
src="../../../assets/images/orange-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/orange-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/orange-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/orange-arrow.png"
alt=""
/>
</div>
<div class="arrow-flex2">
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
</div>
<div class="arrow-flex3">
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
<img
class="wind-arrow"
src="../../../assets/images/blue-arrow.png"
alt=""
/>
</div>
<div class="wind-tem">
<div class="wind-text">回风温度</div>
<el-input v-model="temValue" size="mini">
<svg-icon slot="prefix" icon-class="tem_icon" class="tem-icon" />
</el-input>
</div>
<div class="wind-valve">
<div class="wind-text">电动阀比例调节控制</div>
<el-input v-model="valvePercent" size="mini">
<svg-icon
slot="prefix"
icon-class="percentage-icon"
class="percentage-icon"
/>
</el-input>
</div>
<div class="fan-run">
<div class="wind-text">风机运行状态</div>
<el-switch
style="display: block"
v-model="runStatus"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="运行"
inactive-text="停止"
>
</el-switch>
</div>
<div class="fan-auto">
<div class="wind-text">风机手自动状态</div>
<el-switch
style="display: block"
v-model="autoStatus"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="手动"
inactive-text="自动"
>
</el-switch>
</div>
<div class="fan-start">
<div class="wind-text">风机启停控制</div>
<el-switch
style="display: block"
v-model="startStatus"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="关闭"
inactive-text="打开"
>
</el-switch>
</div>
<div class="fan-frequency">
<div class="wind-text">风机变频控制</div>
<el-input v-model="frequency" size="mini">
<svg-icon
slot="prefix"
icon-class="percentage-icon"
class="percentage-icon"
/>
</el-input>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { spaceTree } from "@/api/region";
import { windList } from "@/api/aircAndWindc/index";
export default {
data() {
return {
loading: false,
treeData: [],
defaultProps: {
children: "children",
label: "label",
},
deviceList: [],
expandedKeys: [],
currentId: "", //id
currentName: "", //
currentLevel: "", //
currentParentId: "", //id
tableData: [], //
temValue: "℃", //
valvePercent: "%", //
runStatus: false, //
autoStatus: false, //
startStatus: false, //
frequency: "v",
};
},
watch: {
temValue(newVal) {
let valueWithoutTem = newVal.replace(/℃/g, "");
if (valueWithoutTem === "") {
this.temValue = "℃";
} else {
this.temValue = valueWithoutTem + "℃";
}
},
valvePercent(newVal) {
// %
let valueWithoutPercent = newVal.replace(/%/g, "");
// %
if (valueWithoutPercent === "") {
this.temValue = "%";
} else {
// %
this.temValue = valueWithoutPercent + "%";
}
},
frequency(newVal) {
let valueWithoutFrequency = newVal.replace(/v/g, "");
if (valueWithoutFrequency === "") {
this.temValue = "v";
} else {
this.temValue = valueWithoutFrequency + "v";
}
},
},
mounted() {
this.getSysBuild();
},
methods: {
getSysBuild() {
spaceTree().then((res) => {
if (res.code == 200) {
//
console.log("楼栋返回值", res);
let newRes = { ...res };
if (newRes.data && newRes.data[0] && newRes.data[0].children) {
newRes.data[0].children = newRes.data[0].children.filter((item) => {
// label ""
return item.label && item.label.includes("空调风柜");
});
}
// 1 4
const targetLevel = 7;
// data[0] 1
if (newRes.data[0]) {
this.removeChildrenAfterLevel(newRes.data[0], 1, targetLevel);
}
console.log("筛选后的新结果", newRes);
this.treeData = newRes.data;
this.$nextTick(() => {
//
this.getExpandedKeys(this.treeData, 1);
if (this.treeData.length > 0) {
//
const lastLevelFirstChild = this.findLastLevelFirstChild(
this.treeData[0]
);
// this.$refs.tree.setCurrentKey(
// this.treeData[0].children[0].children[0].children[0].id
// );
// ,
this.$refs.tree.setCurrentKey(lastLevelFirstChild.id);
//
this.currentId = lastLevelFirstChild.id;
this.currentLevel = lastLevelFirstChild.level;
this.currentName = lastLevelFirstChild.label;
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
this.getWindList();
}
});
}
});
},
// children
removeChildrenAfterLevel(obj, currentLevel, targetLevel) {
if (currentLevel >= targetLevel) {
// children
obj.children = [];
return;
}
if (obj.children && obj.children.length > 0) {
// children
for (let i = 0; i < obj.children.length; i++) {
this.removeChildrenAfterLevel(
obj.children[i],
currentLevel + 1,
targetLevel
);
}
}
},
//
findLastLevelFirstChild(node, level = 1) {
if (!node.children || node.children.length === 0) {
return {
id: node.id,
level,
label: node.label,
};
}
return this.findLastLevelFirstChild(node.children[0], level + 1);
},
//
getExpandedKeys(nodes, level) {
nodes.forEach((node) => {
if (level <= this.currentId + 4) {
this.expandedKeys.push(node.id);
}
if (node.children) {
this.getExpandedKeys(node.children, level + 1);
}
});
},
//
getIconClass(node) {
// console.log("", node);
if (node.level === 5) {
// 4
if (node.expanded) {
return "el-icon-document-opened"; //
}
return "el-icon-document"; //
}
if (node.expanded) {
return "el-icon-folder-opened"; //
}
return "el-icon-folder-add"; //
},
handleNodeExpand(node) {
//
},
handleNodeCollapse(node) {
//
},
//
handleNodeClick(node, data) {
console.log("点击的当前节点", node, data);
if (data.level !== 5) {
console.log("不是第5层000");
// ,
this.$refs.tree.setCurrentKey(this.currentId);
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
} else {
console.log("第5层111");
this.currentId = node.id;
this.currentLevel = data.level;
this.currentName = node.label;
// ,
this.$refs.tree.setCurrentKey(this.currentId);
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
this.getWindList();
}
},
//
getWindList() {
let data = {
systemType: "2",
houseId: this.currentId,
};
windList(data).then((res) => {
console.log("风柜系统查询返回", res);
});
},
},
};
</script>
<style lang="scss" scoped>
.buildingDiv {
padding-left: 54px;
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 20px;
position: relative;
.title-bg {
width: 208px;
height: 38px;
position: absolute;
left: 0;
z-index: 0;
}
.title-word {
z-index: 10;
font-family: YouSheBiaoTiHei;
font-size: 24px;
color: #ffffff;
white-space: nowrap;
}
}
.mostDiv {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.windC {
width: 13rem;
height: 5.38rem;
position: relative;
.wind-img {
width: 13rem;
height: 5.38rem;
position: absolute;
top: 0;
left: 0;
z-index: 1;
}
.wind-tem {
z-index: 10;
width: 1.3rem;
position: absolute;
top: 0.3rem;
left: 7.3rem;
display: flex;
flex-direction: column;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-bottom: 0.15rem;
}
}
.wind-valve {
z-index: 10;
position: absolute;
top: 4.6rem;
left: 3rem;
width: 3rem;
display: flex;
flex-direction: row;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-right: 0.1rem;
white-space: nowrap;
}
}
.fan-run {
z-index: 10;
position: absolute;
top: 1.8rem;
left: 7rem;
width: 3rem;
display: flex;
flex-direction: column;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-bottom: 0.15rem;
white-space: nowrap;
}
}
.fan-auto {
z-index: 10;
position: absolute;
top: 1.8rem;
left: 9rem;
width: 3rem;
display: flex;
flex-direction: column;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-bottom: 0.15rem;
white-space: nowrap;
}
}
.fan-start {
z-index: 10;
position: absolute;
top: 4.6rem;
left: 7rem;
width: 3rem;
display: flex;
flex-direction: column;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-bottom: 0.15rem;
white-space: nowrap;
}
}
.fan-frequency {
z-index: 10;
position: absolute;
top: 4.55rem;
right: 0.5rem;
width: 2.5rem;
display: flex;
flex-direction: row;
align-items: center;
.wind-text {
color: #00d2ff;
font-size: 0.18rem;
margin-right: 0.1rem;
white-space: nowrap;
}
}
.wind-move {
width: 0.72rem;
height: 0.73rem;
position: absolute;
top: 3.23rem;
right: 3.81rem;
z-index: 10;
}
.tunCircle {
/* 应用动画 */
animation: rotate 2s linear infinite;
} /* 定义旋转动画 */
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.arrow-flex {
display: flex;
flex-direction: row;
align-items: center;
z-index: 10;
position: absolute;
top: 3.2rem;
left: -0.1rem;
}
.arrow-flex2 {
display: flex;
flex-direction: row;
align-items: center;
z-index: 10;
position: absolute;
top: 3.2rem;
right: 0.6rem;
}
.arrow-flex3 {
display: flex;
flex-direction: row;
align-items: center;
z-index: 10;
position: absolute;
top: 0.6rem;
right: 6rem;
transform: rotateY(180deg);
}
.wind-arrow {
width: 0.4rem;
height: 0.6rem;
margin-right: 0.15rem;
animation: moveArrow 2s linear infinite;
}
/* 定义每个箭头的透明度 */
.wind-arrow:nth-child(1) {
opacity: 1;
}
.wind-arrow:nth-child(2) {
opacity: 0.6;
}
.wind-arrow:nth-child(3) {
opacity: 0.4;
}
.wind-arrow:nth-child(4) {
opacity: 0.2;
}
/* 定义箭头移动的动画 */
@keyframes moveArrow {
0% {
transform: translateX(0);
}
100% {
transform: translateX(0.2rem);
/* 箭头向右移动的距离 */
}
}
}
.app-container {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: stretch;
height: 100%;
.left-tree {
width: 256px;
padding: 15px 10px 10px 10px;
border: 1px solid #004b8c;
.status {
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
margin-top: 20px;
.status-li {
width: 50%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-bottom: 15px;
}
.status1,
.status2,
.status3,
.status4 {
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 5px;
}
.status1::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #00d2ff;
margin-right: 5px;
}
.status2::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #ff2f2f;
margin-right: 5px;
}
.status3::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #ff9908;
margin-right: 5px;
}
.status4::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #7398c7;
margin-right: 5px;
}
}
}
.right-monitor {
width: calc(100% - 280px);
display: flex;
flex-direction: column;
justify-content: flex-start;
}
}
.tree-container {
height: 300px; /* 设置固定高度 */
overflow-y: auto; /* 启用垂直滚动条 */
}
//
:-webkit-scrollbar {
width: 10px; /* 滚动条宽度 */
}
::-webkit-scrollbar-track {
background: transparent !important; /* 滚动条轨道背景色 */
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
.tree-left {
.custom-tree-icon {
margin-right: 5px;
}
}
}
@media (min-width: 1360px) and (max-width: 1680px) {
.windC {
transform: scale(0.9);
}
}
@media (min-width: 1160px) and (max-width: 1360px) {
.windC {
transform: scale(0.8);
}
}
@media (min-width: 990px) and (max-width: 1160px) {
.windC {
transform: scale(0.7);
}
}
</style>
<style scoped>
/* 自定义高亮颜色 */
.left-tree
>>> .el-tree--highlight-current
.el-tree-node.is-current
> .el-tree-node__content {
background-color: #285b9e !important;
/* color: #f56c6c; */
color: #25f1f8;
}
.windC >>> .el-input__inner {
background-color: #04193a;
border: 1px solid #1262db;
color: #3ef0fd;
font-weight: 700;
text-align: center;
padding: 0 0.1rem !important;
}
.windC >>> .el-input__prefix {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
}
.windC >>> .svg-icon {
width: 0.2rem !important;
height: 0.2rem !important;
fill: #ffffff !important;
}
</style>

584
src/views/bigScreen/bigScreen.vue

@ -0,0 +1,584 @@
<template>
<div class="loginD">
<img
src="../../assets/images/index_img_top.png"
class="loginD_img_top"
alt=""
/>
<img
src="../../assets/images/index_img_down.png"
class="loginD_img_down"
alt=""
/>
<div class="sys-title">楼宇智慧管理系统平台</div>
<!-- <div class="day">已监测100天</div> -->
<div class="set">
<img src="../../assets/images/icon_time.png" class="icon_time" alt="" />
<div>{{ nowTime }}</div>
<img
src="../../assets/images/icon_home.png"
class="icon_home"
alt=""
title="进入系统"
@click="goSys"
/>
<img
src="../../assets/images/icon_dianyuan.png"
class="icon_dianyuan"
alt=""
title="退出系统"
@click="logout"
/>
</div>
<div class="screen-page">
<div class="screen-left" :class="{ collapsed: !isLeftPanelOpen }">
<div class="showLeftConent">
<div class="special-div">
<div class="special-top">
<div class="special-title">
<div class="title-left">
<div>能耗总览</div>
<time-data
v-model="sharedIndex"
:currentIndex="sharedIndex"
@update-message="handleUpdateMessage"
></time-data>
</div>
</div>
</div>
<all-energy :viewMes="viewMes"></all-energy>
</div>
<div class="special-div">
<div class="special-top">
<div class="special-title">
<div class="title-left">
<div>冷源系统能耗</div>
<time-data
v-model="sharedIndex"
:currentIndex="sharedIndex"
@update-message="handleUpdateMessage"
></time-data>
</div>
</div>
</div>
<cold-sys-energy :viewMes="viewMes"></cold-sys-energy>
</div>
<div class="special-div">
<div class="special-top">
<div class="special-title">
<div class="title-left">
<div>生活热水系统</div>
<time-data
v-model="sharedIndex"
:currentIndex="sharedIndex"
@update-message="handleUpdateMessage"
></time-data>
</div>
</div>
</div>
<water-sys-energy :viewMes="viewMes"></water-sys-energy>
</div>
</div>
<img
:src="leftIndicatorSrc"
class="left-Indicator"
@click="togglePanel('left')"
alt=""
/>
</div>
<div class="screen-right" :class="{ collapsed: !isRightPanelOpen }">
<div class="showRightConent">
<div class="special-div">
<div class="special-top">
<div class="special-title">
<div class="title-left">
<div>基本信息</div>
<time-data
v-model="sharedIndex"
:currentIndex="sharedIndex"
@update-message="handleUpdateMessage"
></time-data>
</div>
</div>
</div>
<div class="message">
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img1.png"
alt=""
/>
<div class="message-data">{{ viewMes.buildingArea }}</div>
<div>建筑面积</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img3.png"
alt=""
/>
<div class="message-data">{{ viewMes.totalEle }}kwh</div>
<div>总电耗</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img4.png"
alt=""
/>
<div class="message-data">{{ viewMes.totalWater }}t</div>
<div>总水耗</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img2.png"
alt=""
/>
<div class="message-data">{{ viewMes.totalCold }}kw</div>
<div>总产冷量</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img6.png"
alt=""
/>
<div class="message-data">{{ viewMes.totalGas }}t</div>
<div>总蒸汽量</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img5.png"
alt=""
/>
<div class="message-data">{{ viewMes.eleUnitArea }}wkh/</div>
<div>面积电耗</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img7.png"
alt=""
/>
<div class="message-data">{{ viewMes.waterUnitArea }}kwh</div>
<div>面积水耗</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img8.png"
alt=""
/>
<div class="message-data">{{ viewMes.coldUnitArea }}kw/lm³</div>
<div>面积冷耗</div>
</div>
<div class="message-li">
<img
class="message-img"
src="../../assets/images/message-img9.png"
alt=""
/>
<div class="message-data">{{ viewMes.gasUnitArea }}kw/lm³</div>
<div>面积汽耗</div>
</div>
</div>
</div>
<div class="special-div">
<div class="special-top">
<div class="special-title">
<div class="title-left">
<div>用电趋势</div>
<time-data
v-model="sharedIndex"
:currentIndex="sharedIndex"
@update-message="handleUpdateMessage"
></time-data>
</div>
</div>
</div>
<use-elect></use-elect>
</div>
</div>
<img
:src="rightIndicatorSrc"
class="right-Indicator"
@click="togglePanel('right')"
alt=""
/>
</div>
</div>
<div></div>
</div>
</template>
<script>
import AllEnergy from "./components/allEnergy.vue";
import ColdSysEnergy from "./components/coldSysEnergy.vue";
import waterSysEnergy from "./components/waterSysEnergy.vue";
import useElect from "./components/useElect.vue";
import timeData from "./components/timeData.vue";
import { overView, getWeatherData, getRunTime } from "@/api/bigScreen";
import { getDay, getMonth, getYear } from "@/utils/datetime";
export default {
name: "screen",
components: { timeData, AllEnergy, ColdSysEnergy, waterSysEnergy, useElect },
data() {
return {
nowTime: "",
sharedIndex: "0", //0
queryType: "day", //day
isLeftPanelOpen: true, //
isRightPanelOpen: true, //
leftIndicatorSrc: require("@/assets/images/left-arrow.png"),
rightIndicatorSrc: require("@/assets/images/right-arrow.png"),
viewMes: {},
dataTime: getDay(0), //
};
},
created() {
this.nowTimes();
},
mounted() {
this.getMessage();
// this.getWeather();
// this.getRunData();
},
methods: {
//
timeFormate(timeStamp) {
let hh =
new Date(timeStamp).getHours() < 10
? "0" + new Date(timeStamp).getHours()
: new Date(timeStamp).getHours();
let mm =
new Date(timeStamp).getMinutes() < 10
? "0" + new Date(timeStamp).getMinutes()
: new Date(timeStamp).getMinutes();
let ss =
new Date(timeStamp).getSeconds() < 10
? "0" + new Date(timeStamp).getSeconds()
: new Date(timeStamp).getSeconds();
this.nowTime = hh + ":" + mm + ":" + ss;
},
nowTimes() {
this.timeFormate(new Date());
setInterval(this.nowTimes, 1000);
this.clear();
},
clear() {
clearInterval(this.nowTimes);
this.nowTimes = null;
},
//
goSys() {
this.$router.push("/");
},
// 退
logout() {
//
this.$store.dispatch("LogOut").then(() => {
location.href = "/index";
});
},
//
handleUpdateMessage(message) {
console.log("父组件接收的值", message);
this.sharedIndex = message;
if (this.sharedIndex === 0) {
this.queryType = "day";
this.dataTime = getDay(0);
} else if (this.sharedIndex === 1) {
this.queryType = "month";
this.dataTime = getMonth(0);
} else if (this.sharedIndex === 2) {
this.queryType = "year";
this.dataTime = getYear(0);
}
this.getMessage();
},
togglePanel(val) {
if (val === "left") {
console.log("左边伸缩");
this.isLeftPanelOpen = !this.isLeftPanelOpen;
//
if (this.isLeftPanelOpen) {
this.leftIndicatorSrc = require("@/assets/images/left-arrow.png"); //
} else {
this.leftIndicatorSrc = require("@/assets/images/right-arrow.png"); //
}
} else if (val === "right") {
console.log("右边伸缩");
this.indicatorSrc = require("@/assets/images/right-arrow.png");
this.isRightPanelOpen = !this.isRightPanelOpen;
//
if (this.isRightPanelOpen) {
this.rightIndicatorSrc = require("@/assets/images/right-arrow.png"); //
} else {
this.rightIndicatorSrc = require("@/assets/images/left-arrow.png"); //
}
}
},
//
getMessage() {
let data = {
timeType: this.queryType,
startTime: this.dataTime,
endTime: this.dataTime,
};
overView(data).then((res) => {
console.log("基本信返回", res);
if (res.code == 200) {
let viewData = res.rows[0];
if (viewData.buildingArea > 10000) {
let result = (viewData.buildingArea / 10000).toFixed(4);
//
result = parseFloat(result).toString();
viewData.buildingArea = result + "万";
}
this.viewMes = viewData;
}
});
},
//
getWeather() {
getWeatherData().then((res) => {
console.log("天气返回", res);
});
},
//
getRunData() {
getRunTime().then((res) => {
console.log("运行时间返回", res);
});
},
},
};
</script>
<style rel="stylesheet/scss" lang="scss">
/* 定义呼吸灯动画 */
@keyframes blink {
0% {
opacity: 0.2;
}
50% {
opacity: 1;
}
100% {
opacity: 0.2;
}
}
.loginD {
background-color: #062140;
background-image: url("../../assets/images/bigscreen.png");
background-size: 100% 100%;
background-repeat: no-repeat;
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
padding-bottom: 20px;
.sys-title {
position: absolute;
top: 0.13rem;
font-family: YouSheBiaoTiHei;
font-size: 0.4rem;
letter-spacing: 0.03rem;
text-shadow: 0px 2px 1px rgba(255, 255, 255, 0.3);
background-image: linear-gradient(to bottom, #ffffff, #b0dbff);
background-clip: text;
-webkit-background-clip: text;
color: transparent;
}
.day{
position: absolute;
top: 0.43rem;
left: 5rem;
color: #ffffff;
font-size: 0.18rem;
}
.set {
display: flex;
flex-direction: row;
align-items: center;
font-family: SourceHanSansCN-Regular;
font-size: 0.24rem;
font-weight: normal;
font-stretch: normal;
letter-spacing: 0.03rem;
color: #ffffff;
position: absolute;
top: 0.44rem;
right: 0.7rem;
.icon_time {
width: 0.22rem;
height: 0.22rem;
margin-right: 0.08rem;
}
.icon_home {
width: 0.3rem;
height: 0.27rem;
margin: 0 0.25rem 0 0.27rem;
cursor: pointer;
}
.icon_dianyuan {
width: 0.24rem;
height: 0.26rem;
cursor: pointer;
}
}
.loginD_img_top {
position: absolute;
top: 0;
width: 18.27rem;
height: 1.13rem;
}
.loginD_img_down {
position: absolute;
bottom: 0;
width: 18.66rem;
}
.title-left {
width: calc(100% - 30px);
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.special-div {
margin-bottom: 17px;
}
.screen-page {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: stretch;
width: calc(100% - 122px);
margin-top: 86px;
.screen-left {
display: flex;
flex-direction: column;
width: 433px;
position: relative;
.left-Indicator {
position: absolute;
right: -90px;
width: 60px;
height: 40px;
cursor: pointer;
top: 50%; /* 垂直居中对齐 */
transform: translateY(-50%); /* 调整垂直对齐 */
transition: transform 1s ease;
}
.left-Indicator:hover {
animation: blink 1s infinite;
}
}
.screen-right {
display: flex;
flex-direction: column;
width: 433px;
position: relative;
.message {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
margin-top: 29px;
font-family: SourceHanSansCN-Regular;
font-size: 16px;
font-weight: normal;
font-stretch: normal;
letter-spacing: 0px;
color: #ffffff;
.message-li {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: calc(33.33% - 32px);
margin: 0 16px;
// margin-bottom: 22px;
.message-data {
font-family: DIN-Bold;
font-size: 20px;
letter-spacing: 0px;
color: #ffffff;
margin-bottom: 3px;
}
.message-img {
width: 100px;
height: 99px;
}
}
}
.right-Indicator {
position: absolute;
left: -90px;
width: 60px;
height: 40px;
cursor: pointer;
top: 50%; /* 垂直居中对齐 */
transform: translateY(-50%); /* 调整垂直对齐 */
transition: transform 1s ease;
}
.right-Indicator:hover {
animation: blink 1s infinite;
}
}
}
}
.screen-left {
transition: width 0.3s ease;
}
.screen-left.collapsed .showLeftConent {
// width: 0 !important;
// overflow: hidden;
display: none;
}
.screen-right.collapsed .showRightConent {
// width: 0 !important;
// overflow: hidden;
display: none;
}
.screen-left.collapsed .left-Indicator {
right: auto !important;
left: 0px !important;
}
.screen-right.collapsed .right-Indicator {
left: auto !important;
right: 0px !important;
}
@media (max-width: 1170px) {
.screen-page {
width: calc(100% - 60px) !important;
.screen-left {
transform: scale(0.9);
transform-origin: top left;
}
.screen-right {
transform: scale(0.9);
transform-origin: top right;
}
}
}
@media (max-width: 1060px) {
.screen-page {
width: calc(100% - 40px) !important;
.screen-left {
transform: scale(0.8);
transform-origin: top left;
}
.screen-right {
transform: scale(0.8);
transform-origin: top right;
}
}
}
</style>

429
src/views/bigScreen/components/allEnergy.vue

@ -0,0 +1,429 @@
<template>
<div>
<div class="charts" ref="chart_ref"></div>
</div>
</template>
<script>
import * as echarts from "echarts";
export default {
props: {
viewMes: {
type: Object,
default: () => ({}),
},
},
data() {
return {
chartInstance: null,
option: {},
energyMes:{}
};
},
watch: {
viewMes: {
immediate: true, //
handler(newVal) {
if (Object.keys(newVal).length > 0) {
console.log("newval", newVal);
this.energyMes = newVal;
this.$nextTick(() => {
this.echartsData();
})
}
},
},
},
mounted() {
this.initChart();
window.addEventListener("resize", this.screenAdapter);
this.screenAdapter();
},
destroyed() {
//
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
echartsData() {
console.log("父组件传过来的值", this.energyMes);
if (this.energyMes) {
const titleFontSize = (this.$refs.chart_ref.offsetWidth / 100) * 2;
const colorList = ["#ffe21e", "#08c8ff", "#0882ff", "#2df499"]; //
const adapterOption = {
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
itemWidth: titleFontSize,
itemHeight: titleFontSize,
itemGap: titleFontSize * 2,
formatter: function (name) {
var arr = [];
let data = adapterOption.series[0].data;
var index = 0;
var total = 0;
//
for (var i = 0; i < data.length; i++) {
total += data[i].value;
if (data[i].name == name) {
index = i;
}
}
// 0
var percentage =
data[index].value === 0
? "0.00"
: ((data[index].value / total) * 100).toFixed(2);
arr.push(
"{name|" + name + "}",
"{text|" + " " + ":" + " " + "}",
"{value|" + data[index].value + " " + "}",
"{percentage|" + " " + percentage + "%}"
);
return arr.join("");
},
textStyle: {
color: function (name) {
const dataSeries = adapterOption.series[1].data; // data
const index = dataSeries.findIndex(
(item) => item.name === name
);
const colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; //
return colorList[index];
},
rich: {
name: {
align: "left",
fontSize: titleFontSize * 1.6,
},
text: {
align: "left",
fontSize: titleFontSize * 1.6,
},
value: {
align: "left",
fontSize: titleFontSize * 1.6,
// color: function (params) {
// let data = adapterOption.series[1].data;
// return data.itemStyle.color({ dataIndex: params.dataIndex });
// },
},
percentage: {
align: "left",
fontSize: titleFontSize * 1.6,
// color: function (params) {
// let data = adapterOption.series[1].data;
// return data.itemStyle.color({ dataIndex: params.dataIndex });
// },
},
},
},
},
series: [
{
name: "数据详情:",
data: [
{ value: this.energyMes.totalEle, name: "耗电量标准煤" },
{ value: this.energyMes.totalEle, name: "用水量标准煤" },
{ value: this.energyMes.totalEle, name: "产冷量标准煤" },
{ value: this.energyMes.totalEle, name: "蒸汽量标准煤" },
],
itemStyle: {
color: function (params) {
var colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"];
return colorList[params.dataIndex];
},
// borderWidth: 5,
borderColor: "#002a56",
},
},
{
data: [
{ value: this.energyMes.totalEle, name: "耗电量标准煤" },
{ value: this.energyMes.totalEle, name: "用水量标准煤" },
{ value: this.energyMes.totalEle, name: "产冷量标准煤" },
{ value: this.energyMes.totalEle, name: "蒸汽量标准煤" },
],
},
],
};
this.chartInstance.setOption(adapterOption);
this.chartInstance.resize();
} else {
const titleFontSize = (this.$refs.chart_ref.offsetWidth / 100) * 2;
const adapterOption = {
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
itemWidth: titleFontSize,
itemHeight: titleFontSize,
itemGap: titleFontSize * 2,
formatter: function (name) {
var arr = [];
let data = adapterOption.series[0].data;
var index = 0;
var total = 0;
//
for (var i = 0; i < data.length; i++) {
total += data[i].value;
if (data[i].name == name) {
index = i;
}
}
// 0
var percentage =
data[index].value === 0
? "0.00"
: ((data[index].value / total) * 100).toFixed(2);
arr.push(
"{name|" + name + "}",
"{text|" + " " + ":" + " " + "}",
"{value|" + data[index].value + " " + "}",
"{percentage|" + " " + percentage + "%}"
);
return arr.join("");
},
textStyle: {
color: function (name) {
const dataSeries = adapterOption.series[1].data; // data
const index = dataSeries.findIndex(
(item) => item.name === name
);
const colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; //
return colorList[index];
},
rich: {
name: {
align: "left",
fontSize: titleFontSize * 1.6,
},
text: {
align: "left",
fontSize: titleFontSize * 1.6,
},
value: {
align: "left",
fontSize: titleFontSize * 1.6,
// color: function (params) {
// let data = adapterOption.series[1].data;
// return data.itemStyle.color({ dataIndex: params.dataIndex });
// },
},
percentage: {
align: "left",
fontSize: titleFontSize * 1.6,
// color: function (params) {
// let data = adapterOption.series[1].data;
// return data.itemStyle.color({ dataIndex: params.dataIndex });
// },
},
},
},
},
series: [
{
name: "数据详情:",
data: [
{ value: 0, name: "耗电量标准煤" },
{ value: 0, name: "用水量标准煤" },
{ value: 0, name: "产冷量标准煤" },
{ value: 0, name: "蒸汽量标准煤" },
],
itemStyle: {
color: function (params) {
var colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"];
return colorList[params.dataIndex];
},
// borderWidth: 5,
borderColor: "#002a56",
},
},
{
data: [
{ value: 0, name: "耗电量标准煤" },
{ value: 0, name: "用水量标准煤" },
{ value: 0, name: "产冷量标准煤" },
{ value: 0, name: "蒸汽量标准煤" },
],
},
],
};
this.chartInstance.setOption(adapterOption);
this.chartInstance.resize();
}
},
// 线+ + 线
screenAdapter() {
//,2.6 mes_ref
const titleFontSize = this.$refs.chart_ref.offsetWidth / 40;
//optionoption
const adapterOption = {
title: {
subtextStyle: {
fontSize: titleFontSize * 1.2,
},
},
};
//.chartInstanceoptiondataoption
this.chartInstance.setOption(adapterOption);
//resize
this.chartInstance.resize();
},
//chartInstance
initChart() {
this.chartInstance = echarts.init(this.$refs.chart_ref);
this.option = {
//
title: {
subtext: "总标准煤",
textStyle: {
color: "#ffffff",
},
subtextStyle: {
color: "#ffffff",
},
textAlign: "center",
x: "27%",
y: "36%", //
},
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
//
legend: {
orient: "vertical", //
right: "4%", // 10%
top: "middle", //
//
textStyle: {
color: "#ffffff",
// fontSize: 18,
},
},
series: [
//
{
name: "数据详情:",
type: "pie",
radius: ["60%", "72%"],
center: ["28%", "44%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
labelLine: {
show: false,
},
itemStyle: {
color: function (params) {
var colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"];
return colorList[params.dataIndex];
},
borderWidth: 5,
borderColor: "#002a56",
},
z: 10, //,
},
//
{
type: "pie",
radius: ["50%", "62%"],
center: ["28%", "44%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
silent: true,
labelLine: {
show: false,
},
//
itemStyle: {
color: function (colors) {
var colorList = ["#024e7d", "#09596b", "#385f5c", "#02427f"];
return colorList[colors.dataIndex];
},
},
z: 15,
},
//
{
//
color: ["#305376"],
type: "pie",
silent: true, //
// hoverAnimation: false, //
// 使emphasis.scale true
// silent: true,
// center
radius: ["38%", "39%"],
center: ["28%", "44%"],
label: {
show: false,
},
data: [
{
value: 0,
name: "",
itemStyle: {},
},
],
},
//
{
//
type: "pie",
silent: true, //
// hoverAnimation: false, //
// 使emphasis.scale true
// silent: true,
// center
radius: ["0%", "38%"],
center: ["28%", "44%"],
label: {
show: false,
},
data: [
{
value: 0,
name: "",
itemStyle: {},
},
],
itemStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 1,
y2: 1,
colorStops: [
{ offset: 0, color: "#002a55" }, // 0%
{ offset: 1, color: "#0a457a" }, // 100%
],
global: false, // false
},
},
},
],
};
//
this.chartInstance.setOption(this.option, true);
},
},
};
</script>
<style lang="scss" scoped>
.charts {
margin-top: 30px;
width: 100%;
height: 200px;
margin-top: 20px;
}
</style>

598
src/views/bigScreen/components/coldSysEnergy.vue

@ -0,0 +1,598 @@
<template>
<div class="energy_content">
<div class="sys_charts" ref="sys_charts"></div>
<div class="eer">
<div>用电量:{{energyMes.totalEle}}kw/h</div>
<div>产冷量:{{energyMes.totalCold}}kwh</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { eventBus } from "@/utils/evenBus";
import { overView } from "@/api/bigScreen";
import { getDay, getMonth, getYear } from "@/utils/datetime";
export default {
data() {
return {
chartInstance: null,
option: {},
isShowModule: false,
energyCostText: "eer数据",
dateUse: "",
useForm: {
useData: 5,
maxData: 10, //
},
queryType: "day", //day
dataTime: "",
energyMes: {},
};
},
created() {
eventBus.$on("data-sent-queryType", (data) => {
this.queryType = data;
console.log("得到的queryType为", this.queryType);
this.getChartsData();
});
},
mounted() {
this.initChart();
this.screenAdapter();
window.addEventListener("resize", this.screenAdapter);
this.getChartsData();
},
destroyed() {
//mounted
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
//
getAxisLineColor(useData, maxData) {
//
// 0.75使
const threshold = maxData * 0.75;
//
if (useData > threshold) {
return [
[
useData / maxData,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "rgba(0,127,208,1)" },
{ offset: 0.6, color: "rgba(0,127,208,1)" },
{ offset: 1, color: "rgba(69, 235, 167,0.5)" },
]),
],
[1, "rgba(28,128,245,.0)"],
];
} else {
return [
[
useData / maxData,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "rgba(0,127,208,1)" },
{ offset: 0.5, color: "rgba(0,127,208,1)" },
{ offset: 1, color: "rgba(0,127,208,1)" },
]),
],
[1, "rgba(28,128,245,.0)"],
];
}
},
//chartInstance2 线
initChart() {
// 使
const axisLineColor = this.getAxisLineColor(
this.useForm.useData,
this.useForm.maxData
);
this.chartInstance = echarts.init(this.$refs.sys_charts);
// var dataArr = 80;
this.option = {
backgroundColor: "transparent",
tooltip: {
formatter: "{a} <br/>{b} : {c}",
},
series: [
{
name: "内部动态阴影",
type: "gauge",
center: ["50%", "100%"],
startAngle: 180,
endAngle: -0,
radius: "155%",
z: 1,
splitNumber: 10,
axisLine: {
lineStyle: {
color: axisLineColor,
//
// width: 80,
},
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
textStyle: {
formatter: function (value) {
if (value !== 0) {
return parseInt(value);
} else {
return 0;
}
},
offsetCenter: [0, 5],
detail: {
padding: [0, 0, 0, 0],
// fontSize: titleFontSize * 1.2,
color: "#EDFFFD",
},
},
title: {
//
show: false,
},
pointer: {
show: false,
},
},
{
//
name: "蓝色背景",
type: "gauge",
center: ["50%", "100%"],
//
startAngle: 200,
//
endAngle: -20,
radius: "155%",
z: 0, //
splitNumber: 10,
axisLine: {
lineStyle: {
color: [
[1, "#01366d"], //
],
},
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
textStyle: {
show: false,
},
title: {
show: false,
},
pointer: {
show: false,
},
},
{
name: "内部大边框",
type: "gauge",
z: 2,
min: 0,
max: this.useForm.maxData,
splitNumber: 10,
radius: "180%",
center: ["50%", "100%"],
startAngle: 180,
endAngle: -0,
axisLine: {
lineStyle: {
color: [[1, "#023B80"]],
width: 3,
//
shadowColor: "rgba(14,31,73)",
shadowBlur: 6,
shadowOffsetX: 0,
},
},
tooltip: {
show: false,
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
detail: {
show: false,
},
title: {
//
show: false,
},
pointer: {
show: false,
},
},
{
name: "指针上的圆",
//
type: "pie",
tooltip: {
show: false,
},
emphasis: {
scale: false, //
},
legendHoverLink: false,
radius: ["0%", "70%"],
center: ["50%", "100%"],
startAngle: 120,
endAngle: -0,
labelLine: {
show: false,
},
axisLine: {
lineStyle: {
color: [[1, "#F2BF59"]],
width: 3,
//
shadowColor: "rgba(14,31,73)",
shadowBlur: 60,
shadowOffsetX: 0,
},
},
label: {
show: false,
},
data: [
{
value: 120,
itemStyle: {
color: "#00223a",
},
},
],
z: 4,
},
{
name: "指针上的渐变圆",
//-
type: "pie",
tooltip: {
show: false,
},
emphasis: {
scale: false, //
},
legendHoverLink: false,
radius: ["0%", "70%"],
center: ["50%", "100%"],
startAngle: 120,
endAngle: 0,
labelLine: {
show: false,
},
axisLine: {
lineStyle: {
color: [[1, "#F2BF59"]],
width: 3,
//
shadowColor: "rgba(14,31,73)",
shadowBlur: 60,
shadowOffsetX: 0,
},
},
z: 5,
},
{
//
name: this.energyCostText,
type: "gauge",
radius: "175%",
center: ["50%", "100%"],
min: 0, //
max: this.useForm.maxData, //
splitNumber: 0, //
startAngle: 180,
endAngle: -0,
axisLine: {
show: false,
}, //线
axisLabel: {
show: true,
color: "rgba(4,112,212,1)",
// distance: 16,
// fontSize: 12,
formatter: (value) => {
// 0
if (value === 0 || value == this.useForm.maxData) {
// 100
return value;
}
return "";
},
}, //-
axisTick: {
show: true,
// splitNumber: 5,
lineStyle: {
color: "rgba(4,112,212,1)", //
// width: 3,
},
// length: 6,
}, //
splitLine: {
show: true,
// length: 6,
lineStyle: {
color: "rgba(106, 104, 228, 0.5)", //
},
}, //线
itemStyle: {
show: false,
},
detail: {
show: false,
},
title: {
//
show: false,
},
data: [
{
name: this.dateUse,
value: this.useForm.useData,
},
],
itemStyle: {
color: "#EDF85B",
},
pointer: {
show: true,
length: "60%",
radius: "30%",
shape: "triangle", // 使
// width: 15, //
itemStyle: {
color: "rgb(3, 105, 206,0.5)", //
// shadowColor: "rgb(104, 194, 247, 1)", //
shadowBlur: 20, //
},
},
animationDuration: 4000,
z: 2,
},
],
};
//
this.chartInstance.setOption(this.option, true);
},
screenAdapter() {
const titleFontSize = this.$refs.sys_charts.offsetWidth / 18;
const adapterOption = {
series: [
{
name: "内部动态阴影",
type: "gauge",
axisLine: {
lineStyle: {
width: titleFontSize * 1,
},
},
},
{
name: "蓝色背景",
type: "gauge",
axisLine: {
lineStyle: {
width: titleFontSize * 1,
},
},
},
{
//
name: this.energyCostText,
axisLabel: {
distance: titleFontSize,
fontSize: titleFontSize / 4,
},
axisTick: {
distance: -(titleFontSize / 70),
lineStyle: {
width: titleFontSize / 20,
},
length: titleFontSize / 5,
}, //
splitLine: {
distance: -(titleFontSize / 70),
lineStyle: {
width: titleFontSize / 20,
},
length: titleFontSize / 3.6,
}, //线
pointer: {
width: titleFontSize / 2, //
},
},
],
};
this.chartInstance.setOption(adapterOption);
this.chartInstance.resize();
},
//
getChartsData() {
if (this.queryType === "day") {
this.dataTime = getDay(0);
} else if (this.queryType === "month") {
this.dataTime = getMonth(0);
} else if (this.queryType === "year") {
this.dataTime = getYear(0);
}
let data = {
timeType: this.queryType,
startTime: this.dataTime,
endTime: this.dataTime,
systemType: "0",
};
overView(data).then((res) => {
console.log("两个系统参数返回", res);
if (res.code == 200) {
this.energyMes = res.rows[0];
this.useForm.maxData = 10;
this.useForm.useData = res.rows[0].eer;
let that = this;
// 使
const axisLineColor = this.getAxisLineColor(
this.useForm.useData,
this.useForm.maxData
);
const adapterOption = {
series: [
{
name: "内部动态阴影",
axisLine: {
lineStyle: {
color: axisLineColor,
//
// width: 80,
},
},
},
{
name: "内部大边框",
min: 0,
max: this.useForm.maxData,
},
{
name: "指针上的圆",
data: [
{
value: 5,
},
],
},
{
name: "指针上的渐变圆",
label: {
show: true,
position: "center", //
offset: [0, -5], // 10
formatter: function () {
// HTML 使 rich
return `{line|${that.useForm.useData}}`;
},
rich: {
line: {
color: "#fff", //
fontSize: 20, //
lineHeight: 0, //
},
},
},
data: [
{
value: 0,
itemStyle: {
//
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgb(4,112,212)", //
},
{
offset: 0.3,
color: "rgba(0, 46, 93)", //
},
],
global: false, // false
},
},
},
],
},
{
//
name: this.energyCostText,
max: this.useForm.maxData, //
axisLabel: {
formatter: (value) => {
// 0
if (value === 0 || value == this.useForm.maxData) {
// 100
return value;
}
return "";
},
},
data: [
{
name: this.dateUse,
value: this.useForm.useData,
},
],
},
],
};
this.chartInstance.setOption(adapterOption);
//resize
this.chartInstance.resize();
}
});
},
},
};
</script>
<style lang="scss" scoped>
.energy_content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100% !important;
height: 100%;
.sys_charts {
width: 100%;
height: 1.6rem;
}
.eer {
width: 80%;
color: #fff;
font-size: 18px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin: 10px 0;
}
}
</style>

52
src/views/bigScreen/components/timeData.vue

@ -0,0 +1,52 @@
<template>
<div>
<div class="choice">
<div
class="mr20"
v-for="(item, index) in timeData2"
:key="index"
@click="handleEnter(index, $event)"
:class="{ timeStyle: currentIndex == index }"
>
{{ item.title }}
</div>
</div>
</div>
</template>
<script>
import { eventBus } from "@/utils/evenBus";
export default {
props: ["currentIndex"],
data() {
return {
timeData2: [{ title: "日" }, { title: "月" }, { title: "年" }],
timeIndex2: 0,
};
},
// watch: {
// selectedIndex(newValue) {
// this.timeIndex2 = newValue;
// },
// },
methods: {
handleEnter(index, event) {
// event.stopPropagation(); //
// this.$emit("update:selectedIndex", index);
this.timeIndex2 = index;
let queryType = "";
if (index === 0) {
queryType = "day";
} else if (index === 1) {
queryType = "month";
} else if (index === 2) {
queryType = "year";
}
console.log("传值给父组件", index);
this.$emit("update-message", index);
//
eventBus.$emit("data-sent-queryType", queryType);
},
},
};
</script>
<style lang="scss" scoped></style>

265
src/views/bigScreen/components/useElect.vue

@ -0,0 +1,265 @@
<template>
<div class="energy_content">
<div class="sys_charts" ref="sys_charts"></div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { getDay, getMonth, getYear } from "@/utils/datetime";
import { systemTrend } from "@/api/bigScreen";
import { eventBus } from "@/utils/evenBus";
export default {
data() {
return {
chartInstance: null,
option: {},
queryType: "day", //day
dataTime: "",
energyMes: {},
};
},
created() {
eventBus.$on("data-sent-queryType", (data) => {
this.queryType = data;
console.log("得到的queryType为", this.queryType);
this.getChartsData();
});
},
mounted() {
this.initChart();
this.screenAdapter();
window.addEventListener("resize", this.screenAdapter);
this.getChartsData();
},
destroyed() {
//mounted
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
// 线+ + 线
screenAdapter() {
//,2.6 mes_ref
const titleFontSize = this.$refs.sys_charts.offsetWidth / 130;
//optionoption
const adapterOption = {};
//.chartInstanceoptiondataoption
this.chartInstance.setOption(adapterOption);
//resize
this.chartInstance.resize();
},
//chartInstance
initChart() {
this.chartInstance = echarts.init(this.$refs.sys_charts);
this.option = {
tooltip: {
trigger: "item",
},
legend: {
show: false,
},
grid: {
top: "10%",
left: "4%",
right: "6%",
bottom: "3%",
containLabel: true,
},
xAxis: {
type: "category",
//true
boundaryGap: true,
// x
axisLabel: {
// interval: 0, //x
// rotate: 30, //x30
color: "rgba(255, 255, 255, 1)",
},
axisTick: {
show: false, // 线
},
// x
axisLine: {
show: true,
lineStyle: {
color: "#365576",
},
},
splitLine: {
lineStyle: {
color: "#e2e6f0",
},
}, //x线
},
yAxis: {
min: 0,
// max:20,
// // // min:'dataMin',
// // // max:'dataMax',
// name: "kwh", // y
// name
nameTextStyle: {
color: "rgba(255, 255, 255, 1)",
fontSize: 12,
},
miniInterval: 5,
type: "value",
// y
axisLabel: {
color: "rgba(255, 255, 255, 1)",
},
// y
axisLine: {
show: true,
lineStyle: {
color: "#365576", // y 线
},
},
//y线
// splitNumber: 10,
// y线
splitLine: {
lineStyle: {
color: "#1a3d62", // 线
type: "dashed", // 线线
},
},
},
series: [
{
type: "line",
//
symbolSize: 8,
//线
itemStyle: {
color: "#00CED1", //线
},
lineStyle: {
color: "#00CED1", //线
},
areaStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgba(0, 206, 209, 0.5)", //
},
{
offset: 1,
color: "rgba(0, 206, 209, 0)", //
},
],
global: false, // false
},
},
},
],
};
//
this.chartInstance.setOption(this.option, true);
},
//
getChartsData() {
if (this.queryType === "day") {
this.dataTime = getDay(0);
} else if (this.queryType === "month") {
this.dataTime = getMonth(0);
} else if (this.queryType === "year") {
this.dataTime = getYear(0);
}
let data = {
timeType: this.queryType,
startTime: this.dataTime,
endTime: this.dataTime,
};
systemTrend(data).then((res) => {
console.log("用电趋势返回", res);
if (res.code == 200) {
let adapterOption = {};
// 线
adapterOption = {
tooltip: {
trigger: "axis",
// tooltip
formatter: function (params) {
var res = params[0].name + "<br/>";
for (var i = 0, l = params.length; i < l; i++) {
var seriesName = params[i].seriesName;
var value = params[i].value;
var marker =
'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:' +
params[i].color +
'"></span>';
// seriesName
res +=
marker +
seriesName +
":" +
'<span style="color: #000000; font-weight: bold;margin-left:5px">' +
value +
"</span><br>";
}
return res;
},
},
xAxis: {
data: res.rows[0].timeStr,
},
series: [
{
data: res.rows[0].data,
},
],
};
//.chartInstanceoptiondataoption
this.chartInstance.setOption(adapterOption);
//resize
this.chartInstance.resize();
} else {
let adapterOption = {};
// 线
adapterOption = {
xAxis: {
data: [],
},
series: [
{
data: [],
},
],
};
//.chartInstanceoptiondataoption
this.chartInstance.setOption(adapterOption);
//resize
this.chartInstance.resize();
}
});
},
},
};
</script>
<style lang="scss" scoped>
.energy_content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100% !important;
height: 100%;
.sys_charts {
width: 100%;
height: 2rem;
}
.eer {
font-size: 18px;
margin-top: 25px;
}
}
</style>

599
src/views/bigScreen/components/waterSysEnergy.vue

@ -0,0 +1,599 @@
<template>
<div class="energy_content">
<div class="sys_charts" ref="sys_charts"></div>
<div class="eer">
<div>用电量:{{energyMes.totalEle}}kw/h</div>
<div>用水量:{{energyMes.totalWater}}</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { eventBus } from "@/utils/evenBus";
import { overView } from "@/api/bigScreen";
import { getDay, getMonth, getYear } from "@/utils/datetime";
export default {
data() {
return {
chartInstance: null,
option: {},
isShowModule: false,
energyCostText: "eer数据",
dateUse: "",
useForm: {
useData: 5,
maxData: 10, //
},
queryType: "day", //day
dataTime: "",
energyMes: {},
};
},
created() {
eventBus.$on("data-sent-queryType", (data) => {
this.queryType = data;
console.log("得到的queryType为", this.queryType);
this.getChartsData();
});
},
mounted() {
this.initChart();
this.screenAdapter();
window.addEventListener("resize", this.screenAdapter);
this.getChartsData();
},
destroyed() {
//mounted
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
//
getAxisLineColor(useData, maxData) {
//
// 0.75使
const threshold = maxData * 0.75;
//
if (useData > threshold) {
return [
[
useData / maxData,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "rgba(0,127,208,1)" },
{ offset: 0.6, color: "rgba(0,127,208,1)" },
{ offset: 1, color: "rgba(69, 235, 167,0.5)" },
]),
],
[1, "rgba(28,128,245,.0)"],
];
} else {
return [
[
useData / maxData,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "rgba(0,127,208,1)" },
{ offset: 0.5, color: "rgba(0,127,208,1)" },
{ offset: 1, color: "rgba(0,127,208,1)" },
]),
],
[1, "rgba(28,128,245,.0)"],
];
}
},
//chartInstance2 线
initChart() {
// 使
const axisLineColor = this.getAxisLineColor(
this.useForm.useData,
this.useForm.maxData
);
this.chartInstance = echarts.init(this.$refs.sys_charts);
// var dataArr = 80;
this.option = {
backgroundColor: "transparent",
tooltip: {
formatter: "{a} <br/>{b} : {c}",
},
series: [
{
name: "内部动态阴影",
type: "gauge",
center: ["50%", "100%"],
startAngle: 180,
endAngle: -0,
radius: "155%",
z: 1,
splitNumber: 10,
axisLine: {
lineStyle: {
color: axisLineColor,
//
// width: 80,
},
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
textStyle: {
formatter: function (value) {
if (value !== 0) {
return parseInt(value);
} else {
return 0;
}
},
offsetCenter: [0, 5],
detail: {
padding: [0, 0, 0, 0],
// fontSize: titleFontSize * 1.2,
color: "#EDFFFD",
},
},
title: {
//
show: false,
},
pointer: {
show: false,
},
},
{
//
name: "蓝色背景",
type: "gauge",
center: ["50%", "100%"],
//
startAngle: 200,
//
endAngle: -20,
radius: "155%",
z: 0, //
splitNumber: 10,
axisLine: {
lineStyle: {
color: [
[1, "#01366d"], //
],
},
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
textStyle: {
show: false,
},
title: {
show: false,
},
pointer: {
show: false,
},
},
{
name: "内部大边框",
type: "gauge",
z: 2,
min: 0,
max: this.useForm.maxData,
splitNumber: 10,
radius: "180%",
center: ["50%", "100%"],
startAngle: 180,
endAngle: -0,
axisLine: {
lineStyle: {
color: [[1, "#023B80"]],
width: 3,
//
shadowColor: "rgba(14,31,73)",
shadowBlur: 6,
shadowOffsetX: 0,
},
},
tooltip: {
show: false,
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
detail: {
show: false,
},
title: {
//
show: false,
},
pointer: {
show: false,
},
},
{
name: "指针上的圆",
//
type: "pie",
tooltip: {
show: false,
},
emphasis: {
scale: false, //
},
legendHoverLink: false,
radius: ["0%", "70%"],
center: ["50%", "100%"],
startAngle: 120,
endAngle: -0,
labelLine: {
show: false,
},
axisLine: {
lineStyle: {
color: [[1, "#F2BF59"]],
width: 3,
//
shadowColor: "rgba(14,31,73)",
shadowBlur: 60,
shadowOffsetX: 0,
},
},
label: {
show: false,
},
data: [
{
value: 120,
itemStyle: {
color: "#00223a",
},
},
],
z: 4,
},
{
name: "指针上的渐变圆",
//-
type: "pie",
tooltip: {
show: false,
},
emphasis: {
scale: false, //
},
legendHoverLink: false,
radius: ["0%", "70%"],
center: ["50%", "100%"],
startAngle: 120,
endAngle: 0,
labelLine: {
show: false,
},
axisLine: {
lineStyle: {
color: [[1, "#F2BF59"]],
width: 3,
//
shadowColor: "rgba(14,31,73)",
shadowBlur: 60,
shadowOffsetX: 0,
},
},
z: 5,
},
{
//
name: this.energyCostText,
type: "gauge",
radius: "175%",
center: ["50%", "100%"],
min: 0, //
max: this.useForm.maxData, //
splitNumber: 0, //
startAngle: 180,
endAngle: -0,
axisLine: {
show: false,
}, //线
axisLabel: {
show: true,
color: "rgba(4,112,212,1)",
// distance: 16,
// fontSize: 12,
formatter: (value) => {
// 0
if (value === 0 || value == this.useForm.maxData) {
// 100
return value;
}
return "";
},
}, //-
axisTick: {
show: true,
// splitNumber: 5,
lineStyle: {
color: "rgba(4,112,212,1)", //
// width: 3,
},
// length: 6,
}, //
splitLine: {
show: true,
// length: 6,
lineStyle: {
color: "rgba(106, 104, 228, 0.5)", //
},
}, //线
itemStyle: {
show: false,
},
detail: {
show: false,
},
title: {
//
show: false,
},
data: [
{
name: this.dateUse,
value: this.useForm.useData,
},
],
itemStyle: {
color: "#EDF85B",
},
pointer: {
show: true,
length: "60%",
radius: "30%",
shape: "triangle", // 使
// width: 15, //
itemStyle: {
color: "rgb(3, 105, 206,0.5)", //
// shadowColor: "rgb(104, 194, 247, 1)", //
shadowBlur: 20, //
},
},
animationDuration: 4000,
z: 2,
},
],
};
//
this.chartInstance.setOption(this.option, true);
},
screenAdapter() {
const titleFontSize = this.$refs.sys_charts.offsetWidth / 18;
const adapterOption = {
series: [
{
name: "内部动态阴影",
type: "gauge",
axisLine: {
lineStyle: {
width: titleFontSize * 1,
},
},
},
{
name: "蓝色背景",
type: "gauge",
axisLine: {
lineStyle: {
width: titleFontSize * 1,
},
},
},
{
//
name: this.energyCostText,
axisLabel: {
distance: titleFontSize,
fontSize: titleFontSize / 4,
},
axisTick: {
distance: -(titleFontSize / 70),
lineStyle: {
width: titleFontSize / 20,
},
length: titleFontSize / 5,
}, //
splitLine: {
distance: -(titleFontSize / 70),
lineStyle: {
width: titleFontSize / 20,
},
length: titleFontSize / 3.6,
}, //线
pointer: {
width: titleFontSize / 2, //
},
},
],
};
this.chartInstance.setOption(adapterOption);
this.chartInstance.resize();
},
//
getChartsData() {
if (this.queryType === "day") {
this.dataTime = getDay(0);
} else if (this.queryType === "month") {
this.dataTime = getMonth(0);
} else if (this.queryType === "year") {
this.dataTime = getYear(0);
}
let data = {
timeType: this.queryType,
startTime: this.dataTime,
endTime: this.dataTime,
systemType: "1",
};
overView(data).then((res) => {
console.log("两个系统参数返回", res);
if (res.code == 200) {
this.energyMes = res.rows[0];
this.useForm.maxData = 10;
this.useForm.useData = res.rows[0].eer;
let that = this;
// 使
const axisLineColor = this.getAxisLineColor(
this.useForm.useData,
this.useForm.maxData
);
const adapterOption = {
series: [
{
name: "内部动态阴影",
axisLine: {
lineStyle: {
color: axisLineColor,
//
// width: 80,
},
},
},
{
name: "内部大边框",
min: 0,
max: this.useForm.maxData,
},
{
name: "指针上的圆",
data: [
{
value: 5,
},
],
},
{
name: "指针上的渐变圆",
label: {
show: true,
position: "center", //
offset: [0, -5], // 10
formatter: function () {
// HTML 使 rich
return `{line|${that.useForm.useData}}`;
},
rich: {
line: {
color: "#fff", //
fontSize: 20, //
lineHeight: 0, //
},
},
},
data: [
{
value: 0,
itemStyle: {
//
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgb(4,112,212)", //
},
{
offset: 0.3,
color: "rgba(0, 46, 93)", //
},
],
global: false, // false
},
},
},
],
},
{
//
name: this.energyCostText,
max: this.useForm.maxData, //
axisLabel: {
formatter: (value) => {
// 0
if (value === 0 || value == this.useForm.maxData) {
// 100
return value;
}
return "";
},
},
data: [
{
name: this.dateUse,
value: this.useForm.useData,
},
],
},
],
};
this.chartInstance.setOption(adapterOption);
//resize
this.chartInstance.resize();
}
});
},
},
};
</script>
<style lang="scss" scoped>
.energy_content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100% !important;
height: 100%;
.sys_charts {
width: 100%;
height: 1.6rem;
}
.eer {
width: 80%;
color: #fff;
font-size: 18px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin: 10px 0;
}
}
</style>

20
src/views/bigScreen/index.vue

@ -0,0 +1,20 @@
<template>
<div></div>
</template>
<script>
export default {
created() {
this.toPage();
},
methods: {
toPage() {
console.log("需要跳转的")
//
this.$router.push("/bigScreen")
},
},
};
</script>
<style></style>

43
src/views/centerairC/delaySwitch/index.vue

@ -1,5 +1,5 @@
<template>
<div class="app-container">
<div class="app-container" v-loading="loading">
<img
class="right-line"
src="../../../assets/images/right_line.png"
@ -98,6 +98,7 @@ export default {
components: { dynamicArrow },
data() {
return {
loading: false,
delayList: [],
currentFocusIndex: -1, //
};
@ -108,15 +109,26 @@ export default {
methods: {
//
getPolicyList() {
let data = {
systemType: "0",
funPolicyType: "2",
};
policyListData(data).then((res) => {
console.log("设备延时开关返回res", res);
if (res.code == 200) {
this.delayList = res.rows;
}
return new Promise((resolve, reject) => {
let data = {
systemType: "0",
funPolicyType: "2",
};
policyListData(data)
.then((res) => {
console.log("设备延时开关返回res", res);
if (res.code === 200) {
this.delayList = res.rows;
} else {
this.delayList = [];
}
// Promise
resolve(res);
})
.catch((error) => {
// Promise
reject(error);
});
});
},
handleFocus(index, subIndex) {
@ -173,14 +185,22 @@ export default {
let data = {
id: id,
param: param,
type: 1,
};
console.log("操作参数", data);
operationConrol([data])
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("操作成功");
// loading
this.loading = true;
// ;
this.getPolicyList();
setTimeout(() => {
this.getPolicyList().finally(() => {
// loading
this.loading = false;
});
}, 6000);
} else {
// this.$modal.msgError("");
console.log("应该更新状态的");
@ -230,7 +250,6 @@ export default {
border: 2px solid;
border-image: linear-gradient(45deg, #026bbb, transparent) 1;
/* 主流光动画 */
&::before {
content: "";

43
src/views/centerairC/deviceStrategy/index.vue

@ -1,5 +1,5 @@
<template>
<div class="app-container policy-flex">
<div class="app-container policy-flex" v-loading="loading">
<div
class="policy"
:class="{ 'radio-style': hasRadioInput(item.values) }"
@ -63,6 +63,7 @@ export default {
name: "deviceStrategy",
data() {
return {
loading: false,
policyList: [],
policyDetails: [],
value: "",
@ -78,16 +79,27 @@ export default {
},
//
getPolicyList() {
let data = {
systemType: "0",
funPolicyType: "1",
};
policyListData(data).then((res) => {
console.log("策略返回res", res);
if (res.code == 200) {
this.policyList = res.rows;
this.initRadioSelection();
}
return new Promise((resolve, reject) => {
let data = {
systemType: "0",
funPolicyType: "1",
};
policyListData(data)
.then((res) => {
console.log("策略返回res", res);
if (res.code == 200) {
this.policyList = res.rows;
this.initRadioSelection();
} else {
this.policyList = [];
}
// Promise
resolve(res);
})
.catch((error) => {
// Promise
reject(error);
});
});
},
// radio
@ -178,8 +190,15 @@ export default {
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("操作成功");
// loading
this.loading = true;
// ;
this.getPolicyList();
setTimeout(() => {
this.getPolicyList().finally(() => {
// loading
this.loading = false;
});
}, 6000);
} else {
// this.$modal.msgError("");
console.log("应该更新状态的");

420
src/views/centerairC/sysControl/index.vue

@ -1,5 +1,5 @@
<template>
<div class="app-container">
<div class="app-container" v-loading="loading">
<!-- 状态统计 -->
<div class="status-statistics">
<div class="status-card">
@ -102,15 +102,26 @@
<div class="device-container second">
<div class="device-li">
<div class="device-name">设备名称</div>
<div class="device-name">手动控制</div>
<div class="device-name">手自动切换</div>
<div class="device-name">本地远程状态</div>
<div class="device-name">手动阀关控制</div>
<div class="device-name">阀关反馈</div>
<div class="device-name">手动阀开控制</div>
<div class="device-name">阀开反馈</div>
</div>
<div class="device-li" v-for="(item, index) in valveList" :key="index">
<div class="device-name">{{ item.name }}</div>
<div class="device-name">
<el-switch
style="display: block"
v-model="item.controlText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="停止"
@change="handleControlText(item)"
>
</el-switch>
</div>
<div class="device-name">
<el-switch
style="display: block"
@ -119,7 +130,7 @@
inactive-color="#ff4949"
active-text="自动"
inactive-text="手动"
@change="handleValveControlText(item)"
@change="handleAutomaticText(item)"
>
</el-switch>
</div>
@ -131,18 +142,6 @@
>{{ item.localRemote }}</span
>
</div>
<div class="device-name">
<el-switch
style="display: block"
v-model="item.openText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="停止"
@change="handleValveOpen(item)"
>
</el-switch>
</div>
<div class="device-name">
<div
:class="item.openStauts === '关闭' ? 'bad-status' : 'good-status'"
@ -150,18 +149,6 @@
{{ item.openStauts }}
</div>
</div>
<div class="device-name">
<el-switch
style="display: block"
v-model="item.closeText"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="停止"
@change="handleValveClose(item)"
>
</el-switch>
</div>
<div class="device-name">
<div
:class="item.closeStatus === '关闭' ? 'bad-status' : 'good-status'"
@ -180,6 +167,7 @@ export default {
name: "sysMonitor",
data() {
return {
loading: false,
deviceList: [
{
name: "",
@ -232,129 +220,174 @@ export default {
methods: {
//
getOperationList() {
operationList({ systemType: 0 }).then((res) => {
console.log("列表返回res", res);
if (res.code == 200) {
let handleList = res.rows;
this.deviceList = [];
this.valveList = [];
handleList.forEach((element) => {
if (element.children && element.children.length > 0) {
//
let deviceItem = {
name: element.name,
};
//
let valveItem = {
name: element.name,
};
return new Promise((resolve, reject) => {
operationList({ systemType: 0 })
.then((res) => {
console.log("列表返回res", res);
if (res.code === 200) {
let handleList = res.rows;
this.deviceList = [];
this.valveList = [];
handleList.forEach((element) => {
if (element.children && element.children.length > 0) {
//
let deviceItem = {
name: element.name,
};
//
let valveItem = {
name: element.name,
};
const limitedChildren = element.children;
let valveClosed = false;
let valveOpened = false;
limitedChildren.forEach((child) => {
if (child.name) {
//
if (
child.paramType === "1" &&
!child.name.includes("阀")
) {
deviceItem.runStatus =
Number(child.value) == 0 ? "不运行" : "运行";
}
//
else if (
child.paramType === "2" &&
!child.name.includes("阀")
) {
deviceItem.controlText =
Number(child.value) == 0 ? false : true;
deviceItem.controlId = child.id;
}
// 01
else if (
child.paramType === "6" &&
!child.name.includes("阀")
) {
deviceItem.automaticText =
Number(child.value) == 0 ? true : false;
deviceItem.automaticId = child.id;
}
//
else if (
child.paramType === "5" &&
!child.name.includes("阀")
) {
deviceItem.warnText =
Number(child.value) == 0 ? "未故障" : "故障";
//
} else if (
child.paramType === "22" &&
!child.name.includes("阀")
) {
deviceItem.localRemote =
Number(child.value) == 0 ? "本地" : "远程";
}
//
else if (
child.paramType === "3" &&
!child.name.includes("阀")
) {
deviceItem.frequencySet =
Number(child.value) == 0 ? "0" : child.value;
deviceItem.frequencyId = child.id;
}
//
else if (child.paramType === "4") {
deviceItem.frequency = child.value;
}
// -
else if (
child.paramType === "22" &&
child.name.includes("阀")
) {
valveItem.localRemote =
Number(child.value) == 0 ? "本地" : "远程";
}
// -
else if (
child.paramType === "6" &&
child.name.includes("阀")
) {
valveItem.automaticText =
Number(child.value) == 0 ? true : false;
valveItem.automaticId = child.id;
}
// -
else if (
child.paramType === "2" &&
child.name.includes("阀")
) {
valveItem.controlText =
Number(child.value) == 0 ? false : true;
valveItem.controlId = child.id;
}
const limitedChildren = element.children;
limitedChildren.forEach((child) => {
if (child.name) {
//
if (child.paramType === "1" && !child.name.includes("阀")) {
deviceItem.runStatus =
Number(child.value) == 0 ? "不运行" : "运行";
//
} else if (
child.paramType === "2" &&
!child.name.includes("阀")
) {
deviceItem.controlText =
Number(child.value) == 0 ? false : true;
deviceItem.controlId = child.id;
// 0
} else if (
child.paramType === "6" &&
!child.name.includes("阀")
) {
deviceItem.automaticText =
Number(child.value) == 0 ? false : true;
deviceItem.automaticId = child.id;
//
} else if (
child.paramType === "5" &&
!child.name.includes("阀")
) {
deviceItem.warnText =
Number(child.value) == 0 ? "未故障" : "故障";
//
} else if (
child.paramType === "22" &&
!child.name.includes("阀")
) {
deviceItem.localRemote =
Number(child.value) == 0 ? "本地" : "远程";
} else if (
child.paramType === "3" &&
!child.name.includes("阀")
) {
deviceItem.frequencySet =
Number(child.value) == 0 ? "0" : child.value;
deviceItem.frequencyId = child.id;
//
} else if (child.paramType === "4") {
deviceItem.frequency = child.value;
//
} else if (child.name.includes("阀开反馈")) {
valveItem.openStauts =
Number(child.value) == 0 ? "关闭" : "开启";
//
} else if (
child.name.includes("阀开") &&
!child.name.includes("反馈")
) {
valveItem.openText =
Number(child.value) == 0 ? false : true;
valveItem.openId = child.id;
//
} else if (
child.name.includes("阀关") &&
!child.name.includes("反馈")
) {
valveItem.colseText =
(child.value === Number(child.value)) == 0 ? false : true;
valveItem.closeId = child.id;
//
} else if (child.name.includes("阀关反馈")) {
valveItem.closeStatus =
(child.value === Number(child.value)) == 0
? "关闭"
: "开启";
// -
} else if (
child.paramType === "22" &&
child.name.includes("阀")
) {
valveItem.localRemote =
Number(child.value) == 0 ? "本地" : "远程";
// -
} else if (
child.paramType === "6" &&
child.name.includes("阀")
) {
valveItem.automaticText =
Number(child.value) == 0 ? false : true;
valveItem.automaticId = child.id;
//
if (
child.name.includes("阀关到位") &&
Number(child.value) == 0
) {
valveClosed = false;
} else if (
child.name.includes("阀关到位") &&
Number(child.value) == 1
) {
valveClosed = true;
}
//
if (
child.name.includes("阀开到位") &&
Number(child.value) == 0
) {
valveOpened = false;
} else if (
child.name.includes("阀开到位") &&
Number(child.value) == 1
) {
valveOpened = true;
}
}
});
//
if (valveClosed && !valveOpened) {
valveItem.closeStatus = "开启";
valveItem.openStauts = "关闭";
} else if (!valveClosed && valveOpened) {
valveItem.closeStatus = "关闭";
valveItem.openStauts = "开启";
}
// deviceList
if (Object.keys(deviceItem).length > 1) {
this.deviceList.push(deviceItem);
}
// valveList
if (Object.keys(valveItem).length > 1) {
this.valveList.push(valveItem);
}
}
});
// console.log("", deviceItem);
// deviceList
if (Object.keys(deviceItem).length > 1) {
this.deviceList.push(deviceItem);
}
// valveList
if (Object.keys(valveItem).length > 1) {
this.valveList.push(valveItem);
}
console.log("处理过的this.deviceList", this.deviceList);
console.log("处理过的this.valveList", this.valveList);
this.total = this.deviceList.length + this.valveList.length;
} else {
this.deviceList = [];
this.valveList = [];
this.total = 0;
}
// Promise
resolve(res);
})
.catch((error) => {
// Promise
reject(error);
});
console.log("处理过的this.deviceList", this.deviceList);
console.log("处理过的this.valveList", this.valveList);
this.total = this.deviceList.length + this.valveList.length;
}
});
},
//
@ -430,95 +463,9 @@ export default {
console.log("请求后台", item.automaticText);
let param = null;
if (item.automaticText) {
param = 1;
} else {
param = 0;
}
this.hadleOperationConrol(item.automaticId, param);
})
.catch(() => {
//
item.automaticText = !item.automaticText;
console.log("不请求后台");
});
},
//
handleValveClose(item) {
this.$confirm(
`确定要切换设备"${item.name}"的状态为:${
item.closeText ? "开启" : "停止 吗?"
}`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
let param = null;
if (item.closeText) {
param = 1;
} else {
param = 0;
}
this.hadleOperationConrol(item.closeId, param);
})
.catch(() => {
//
item.closeText = !item.closeText;
console.log("不请求后台");
});
},
//
handleValveOpen(item) {
this.$confirm(
`确定要切换设备"${item.name}"的状态为:${
item.openText ? "开启" : "停止 吗?"
}`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
let param = null;
if (item.openText) {
param = 1;
} else {
param = 0;
}
this.hadleOperationConrol(item.openId, param);
})
.catch(() => {
//
item.openText = !item.openText;
console.log("不请求后台");
});
},
// -
handleValveControlText(item) {
this.$confirm(
`确定要切换设备"${item.name}"的状态为:${
item.automaticText ? "自动" : "手动 吗?"
}`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
//
console.log("请求后台", item.automaticText);
let param = null;
if (item.automaticText) {
param = 1;
} else {
param = 0;
}
this.hadleOperationConrol(item.automaticId, param);
})
@ -538,8 +485,15 @@ export default {
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("操作成功");
// loading
this.loading = true;
// ;
this.getOperationList();
setTimeout(() => {
this.getOperationList().finally(() => {
// loading
this.loading = false;
});
}, 6000);
} else {
// this.$modal.msgError("");
console.log("应该更新状态的");
@ -578,7 +532,7 @@ export default {
.device-name {
flex: 1;
white-space: nowrap;
.el-switch{
.el-switch {
width: 120px !important;
}
.run {

167
src/views/centerairC/sysMonitor/index.vue

@ -1,5 +1,5 @@
<template>
<div class="monitor">
<div class="monitor" v-loading="loading">
<div class="monitor-content">
<!-- 天气数据 -->
<div class="weather">
@ -72,7 +72,7 @@
</div>
<!-- 一键启停 -->
<div class="offClass" @click="handleOneKeyButton">
<div v-if="isShowOn" class="off-bg">ON</div>
<div v-if="isShowOn" class="off-bg on-animation">ON</div>
<div v-else class="off-bg">OFF</div>
</div>
<!-- 整体图 -->
@ -93,6 +93,7 @@
class="host-img1"
src="../../../assets/images/host-img.png"
alt=""
v-if="hostListRunClass(0)"
:class="{ moveClass: hostListRunClass(0) }"
/>
<div class="water-flow1">
@ -133,6 +134,7 @@
class="host-img2"
src="../../../assets/images/host-img.png"
alt=""
v-if="hostListRunClass(1)"
:class="{ moveClass: hostListRunClass(1) }"
/>
<div class="water-flow2">
@ -176,6 +178,7 @@
class="host-img3"
src="../../../assets/images/host-img2.png"
alt=""
v-if="hostListRunClass(2)"
:class="{ moveClass: hostListRunClass(2) }"
/>
<!-- 主机冷却冷冻水流信息 -->
@ -215,18 +218,21 @@
class="cooling-img1"
src="../../../assets/images/pump-fan.png"
alt=""
v-if="coolingPumpRunClass(0)"
:class="{ moveClass2: coolingPumpRunClass(0) }"
/>
<img
class="cooling-img2"
src="../../../assets/images/pump-fan.png"
alt=""
v-if="coolingPumpRunClass(1)"
:class="{ moveClass2: coolingPumpRunClass(1) }"
/>
<img
class="cooling-img3"
src="../../../assets/images/pump-fan.png"
alt=""
v-if="coolingPumpRunClass(2)"
:class="{ moveClass2: coolingPumpRunClass(2) }"
/>
<!-- 冷冻泵数据定位 -->
@ -237,18 +243,21 @@
class="freezing-img1"
src="../../../assets/images/pump-fan.png"
alt=""
v-if="freezingPumpRunClass(0)"
:class="{ moveClass2: freezingPumpRunClass(0) }"
/>
<img
class="freezing-img2"
src="../../../assets/images/pump-fan.png"
alt=""
v-if="freezingPumpRunClass(1)"
:class="{ moveClass2: freezingPumpRunClass(1) }"
/>
<img
class="freezing-img3"
src="../../../assets/images/pump-fan.png"
alt=""
v-if="freezingPumpRunClass(2)"
:class="{ moveClass2: freezingPumpRunClass(2) }"
/>
<!-- 冷却塔数据定位 五个风机 三个出水阀 -->
@ -258,34 +267,39 @@
<!-- 3号冷却塔风机1 -->
<img
class="fan-img1"
v-if="coolingTowerRunClass(2, 1)"
:class="{ moveClass2: coolingTowerRunClass(2, 1) }"
src="../../../assets/images/fan-img.png"
alt=""
/>
<!-- 2号冷却塔风机1 -->
<img
class="fan-img2"
class="fan-img3"
v-if="coolingTowerRunClass(1, 1)"
:class="{ moveClass2: coolingTowerRunClass(1, 1) }"
src="../../../assets/images/fan-img.png"
alt=""
/>
<!-- 2号冷却塔风机2 -->
<img
class="fan-img3"
class="fan-img2"
v-if="coolingTowerRunClass(1, 2)"
:class="{ moveClass2: coolingTowerRunClass(1, 2) }"
src="../../../assets/images/fan-img.png"
alt=""
/>
<!-- 1号冷却塔风机1 -->
<!-- 1 号冷却塔风机1 -->
<img
class="fan-img4"
class="fan-img5"
v-if="coolingTowerRunClass(0, 1)"
:class="{ moveClass2: coolingTowerRunClass(0, 1) }"
src="../../../assets/images/fan-img.png"
alt=""
/>
<!-- 1 号冷却塔风机2 -->
<!-- 1号冷却塔风机2 -->
<img
class="fan-img5"
class="fan-img4"
v-if="coolingTowerRunClass(0, 2)"
:class="{ moveClass2: coolingTowerRunClass(0, 2) }"
src="../../../assets/images/fan-img.png"
alt=""
@ -353,6 +367,7 @@ export default {
components: { LineChildren },
data() {
return {
loading: false,
weatherObj: {},
performanceObj: {},
hostList: [], //
@ -392,20 +407,32 @@ export default {
},
//
getOneKeyButton() {
let data = {
systemType: 0,
paramType: "23",
};
oneKeyButton(data).then((res) => {
if (res.code == 200) {
console.log("一键启停返回信息", res);
this.oneKeyButtonId = res.data.id;
if (Number(res.data.curValue) == 0) {
this.isShowOn = false;
} else {
this.isShowOn = true;
}
}
return new Promise((resolve, reject) => {
let data = {
systemType: 0,
paramType: "23",
};
oneKeyButton(data)
.then((res) => {
console.log("一键启停返回信息", res);
if (res.code === 200) {
this.oneKeyButtonId = res.data.id;
if (Number(res.data.curValue) == 0) {
this.isShowOn = false;
} else {
this.isShowOn = true;
}
} else {
this.oneKeyButtonId = "";
this.isShowOn = false;
}
// Promise
resolve(res);
})
.catch((error) => {
// Promise
reject(error);
});
});
},
//
@ -434,8 +461,15 @@ export default {
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("操作成功");
// loading
this.loading = true;
// ;
this.getOneKeyButton();
setTimeout(() => {
this.getOneKeyButton().finally(() => {
// loading
this.loading = false;
});
}, 6000);
} else {
this.getOneKeyButton();
}
@ -654,7 +688,7 @@ export default {
//
return false;
},
//
// ,index,01;itemx
coolingTowerRunClass(index, item) {
// coolingTower
if (this.coolingTower.length <= index) {
@ -671,23 +705,37 @@ export default {
// paramType === 1
const filteredProperties = [];
let filterItem = {};
for (let i = 0; i < properties.length; i++) {
// console.log('properties[i].paramType',properties[i].paramType)
if (properties[i].paramType === "1") {
filteredProperties.push(properties[i]);
// filterItem = properties[i]
}
}
// // deviceList
// if (Object.keys(filterItem).length > 1) {
// filteredProperties.push(filterItem);
// }
console.log("paramType为1的对象", filteredProperties);
console.log("index, item", index, item);
// index item
const towerNumber = index + 1;
const targetPropertyName = `${towerNumber}号冷却塔风机${item}运行状态`;
const targetPropertyName = `${towerNumber}号冷却塔风机${item}运行`;
// console.log("targetPropertyName",targetPropertyName)
// collectValue "0.00"
for (let i = 0; i < filteredProperties.length; i++) {
if (
filteredProperties[i].name === targetPropertyName &&
filteredProperties[i].collectName === targetPropertyName &&
Number(filteredProperties[i].collectValue) !== 0
) {
if (index === 0 && item === 1) {
console.log(
"返回的true",
filteredProperties[i].collectName === targetPropertyName &&
Number(filteredProperties[i].collectValue) !== 0
);
}
return true;
}
}
@ -710,29 +758,30 @@ export default {
let valveOpenFeedbackFound = false;
let valveCloseFeedbackFound = false;
// properties
for (let i = 0; i < properties.length; i++) {
const item = properties[i];
if (item.paramType === "7") {
//
// console.log("item.collectName", item.collectName);
// console.log("item.collectValue", item.collectValue);
//
if (
item.collectName.includes("阀开反馈") &&
Number(item.collectValue) !== 0
item.collectName.includes("阀开到位") &&
Number(item.collectValue) == 1
) {
valveOpenFeedbackFound = true;
}
//
//
if (
item.collectName.includes("阀关反馈") &&
Number(item.collectValue) === 0
item.collectName.includes("阀关到位") &&
Number(item.collectValue) == 0
) {
valveCloseFeedbackFound = true;
}
}
}
// true ,,
// true ,,
return valveOpenFeedbackFound && valveCloseFeedbackFound;
},
//
@ -755,16 +804,16 @@ export default {
for (let i = 0; i < properties.length; i++) {
const item = properties[i];
if (item.paramType === "7") {
//
//
if (
item.collectName.includes("阀开反馈") &&
item.collectName.includes("阀开到位") &&
Number(item.collectValue) !== 0
) {
valveOpenFeedbackFound = true;
}
//
//
if (
item.collectName.includes("阀关反馈") &&
item.collectName.includes("阀关到位") &&
Number(item.collectValue) === 0
) {
valveCloseFeedbackFound = true;
@ -772,7 +821,7 @@ export default {
}
}
// true ,,
// true ,,
return valveOpenFeedbackFound && valveCloseFeedbackFound;
},
//
@ -795,25 +844,25 @@ export default {
for (let i = 0; i < properties.length; i++) {
const item = properties[i];
if (item.paramType === "7") {
//
//
if (
item.collectName.includes("阀开反馈") &&
item.collectName.includes("阀开到位") &&
Number(item.collectValue) !== 0
) {
valveOpenFeedbackFound = true;
}
//
//
if (
item.collectName.includes("阀关反馈") &&
item.collectName.includes("阀关到位") &&
Number(item.collectValue) === 0
) {
valveCloseFeedbackFound = true;
// console.log("true");
// console.log("true");
}
}
}
// true ,,
// true ,,
return valveOpenFeedbackFound && valveCloseFeedbackFound;
},
},
@ -899,8 +948,8 @@ export default {
.towerValve1 {
z-index: 10;
position: absolute;
top: 1.87rem;
left: 4.2rem;
top: 1.08rem;
left: 4.23rem;
width: 0.15rem;
height: 0.15rem;
background-color: #ebebeb;
@ -909,8 +958,8 @@ export default {
.towerValve2 {
z-index: 10;
position: absolute;
top: 1.72rem;
left: 5rem;
top: 0.98rem;
left: 4.99rem;
width: 0.15rem;
height: 0.15rem;
background-color: #ebebeb;
@ -919,8 +968,8 @@ export default {
.towerValve3 {
z-index: 10;
position: absolute;
top: 1.54rem;
left: 5.86rem;
top: 0.84rem;
left: 5.87rem;
width: 0.15rem;
height: 0.15rem;
background-color: #ebebeb;
@ -1012,7 +1061,7 @@ export default {
z-index: 10;
position: absolute;
top: 4.62rem;
left: 2.68rem;
left: 2.8rem;
width: 0.3rem;
height: 0.3rem;
transform-style: preserve-3d;
@ -1022,7 +1071,7 @@ export default {
z-index: 10;
position: absolute;
top: 4.1rem;
left: 4.3rem;
left: 4.36rem;
width: 0.3rem;
height: 0.3rem;
transform-style: preserve-3d;
@ -1032,7 +1081,7 @@ export default {
z-index: 10;
position: absolute;
top: 3.64rem;
left: 6rem;
left: 5.98rem;
width: 0.3rem;
height: 0.3rem;
transform-style: preserve-3d;
@ -1354,7 +1403,7 @@ export default {
color: #20ebfa;
font-weight: bold;
font-family: DIN;
font-size: 0.20rem;
font-size: 0.2rem;
}
}
@ -1428,6 +1477,8 @@ export default {
font-size: 0.24rem;
color: #20ebfa;
font-weight: bold;
}
.on-animation {
animation: rotateZ 5s linear infinite;
transition: 0.6s; /* 设置过渡时间,控制翻转速度 */
transform-style: preserve-3d; /* 保持子元素的 3D 效果 */
@ -1446,8 +1497,8 @@ export default {
}
}
/* 鼠标悬停时移除动画 */
.offClass:hover .off-bg {
.offClass:hover .on-animation {
animation: none;
}
}
}
</style>

1504
src/views/centerairC/sysMonitor/index2.vue

File diff suppressed because it is too large Load Diff

458
src/views/centerairC/timeSwitch/index.vue

@ -0,0 +1,458 @@
<template>
<div class="app-container" v-loading="loading">
<img
class="right-line"
src="../../../assets/images/right_line.png"
alt=""
/>
<div class="delay-title">定时开关机功能</div>
<div class="device-container">
<div class="device-li">
<div class="device-name">定时名称</div>
<div class="device-name">定时开机</div>
<div class="device-name">定时关机</div>
<div class="device-name">启动状态</div>
</div>
<div class="device-li" v-for="(item, index) in delayList" :key="index">
<div class="device-name">{{ item.name }}</div>
<div class="device-name">
<el-input
size="mini"
v-model="item.delayOpenHour"
@keyup.enter.native="handleEnter(item, 'openHour')"
@input="handleInput(item, 'delayOpenHour', 'hour')"
></el-input>
<div class="slip">:</div>
<el-input
size="mini"
v-model="item.delayOpenMinute"
@keyup.enter.native="handleEnter(item, 'openMinute')"
@input="handleInput(item, 'delayOpenMinute', 'minute')"
></el-input>
</div>
<div class="device-name">
<el-input
size="mini"
v-model="item.delayCloseHour"
@keyup.enter.native="handleEnter(item, 'closeHour')"
@input="handleInput(item, 'delayCloseHour', 'hour')"
></el-input>
<div class="slip">:</div>
<el-input
size="mini"
v-model="item.delayCloseMinute"
@keyup.enter.native="handleEnter(item, 'closeMinute')"
@input="handleInput(item, 'delayCloseMinute', 'minute')"
></el-input>
</div>
<div class="device-name">
<el-switch
style="display: block"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="开启"
inactive-text="禁用"
v-model="item.delayStatus"
@change="handleStatus(item)"
>
</el-switch>
</div>
</div>
</div>
<img class="left-line" src="../../../assets/images/left_line.png" alt="" />
</div>
</template>
<script>
import { policyListData } from "@/api/centerairC/strategy";
import { operationConrol } from "@/api/centerairC/sysMonitor";
export default {
data() {
return {
loading: false,
delayList: [],
};
},
mounted() {
this.getPolicyList();
},
methods: {
//
getPolicyList() {
return new Promise((resolve, reject) => {
let data = {
systemType: "0",
funPolicyType: "3",
};
policyListData(data)
.then((res) => {
console.log("设备定时开关返回res", res);
if (res.code === 200) {
let handleList = res.rows;
this.delayList = [];
handleList.forEach((element, index) => {
if (element.values && element.values.length > 0) {
//
let delayItem = {
name: element.name,
};
const limitedChildren = element.values;
limitedChildren.forEach((child) => {
// console.log("${index}_", `${index}_`);
// console.log("child.pointName", child.pointName);
if (child.pointName) {
// -
if (child.pointName == `定时${index + 1}开_时`) {
// console.log("-·························");
delayItem.delayOpenHour = child.curValue;
delayItem.delayOpenHourId = child.cpmId;
}
// -
else if (
child.pointName.includes(`定时${index + 1}开_分`)
) {
delayItem.delayOpenMinute = child.curValue;
delayItem.delayOpenMinuteId = child.cpmId;
}
// -
else if (
child.pointName.includes(`定时${index + 1}关_时`)
) {
delayItem.delayCloseHour = child.curValue;
delayItem.delayCloseHourId = child.cpmId;
}
// -
else if (
child.pointName.includes(`定时${index + 1}关_分`)
) {
delayItem.delayCloseMinute = child.curValue;
delayItem.delayCloseMinuteId = child.cpmId;
}
//
else if (child.pointName.includes(`启动标志`)) {
delayItem.delayStatus =
Number(child.curValue) == 0 ? false : true;
delayItem.delayStatusId = child.cpmId;
}
}
});
// delayList
if (Object.keys(delayItem).length > 1) {
this.delayList.push(delayItem);
}
}
});
console.log("处理后的数组", this.delayList);
// this.delayList = res.rows;
} else {
this.delayList = [];
}
// Promise
resolve(res);
})
.catch((error) => {
// Promise
reject(error);
});
});
},
//
handleInput(item, propertyName, name) {
console.log("校验", item[propertyName]);
//
if (item[propertyName] === "") {
return;
}
let isValid = true;
//
let inputValue = String(item[propertyName]).replace(/[^\d]/g, "");
if (name === "hour") {
isValid =
!isNaN(inputValue) &&
parseInt(inputValue) >= 0 &&
parseInt(inputValue) <= 23;
if (!isValid) {
this.$message.error("输入值在0-23区间,请重新输入");
item[propertyName] = "";
return;
}
} else if (name === "minute") {
isValid =
!isNaN(inputValue) &&
parseInt(inputValue) >= 0 &&
parseInt(inputValue) <= 59;
if (!isValid) {
this.$message.error("输入值在0-59区间,请重新输入");
item[propertyName] = "";
return;
}
}
item[propertyName] = inputValue;
},
handleEnter(item, name) {
let id = "";
let value = "";
let title = "";
let unit = "";
if (name === "openHour") {
id = item.delayOpenHourId;
value = item.delayOpenHour;
title = "定时开机-小时";
unit = "时";
} else if (name === "openMinute") {
id = item.delayOpenMinuteId;
value = item.delayOpenMinute;
title = "定时开机-分钟";
unit = "分";
} else if (name === "closeHour") {
id = item.delayCloseHourId;
value = item.delayCloseHour;
title = "定时关机-小时";
unit = "时";
} else if (name === "closeMinute") {
id = item.delayCloseMinuteId;
value = item.delayCloseMinute;
title = "定时关机-分钟";
unit = "分";
}
if (value === "") {
this.$message.warning("请输入当前设置值!");
return;
}
console.log("请求后端", item);
this.$confirm(
`确定要把"${item.name}"的${title}设置为:${value} ${unit}吗?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
this.hadleOperationConrol(id, value);
})
.catch(() => {
//
this.getPolicyList();
});
},
hadleOperationConrol(id, param) {
let data = {
id: id,
param: param,
};
console.log("操作参数", data);
operationConrol([data])
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("操作成功");
// loading
this.loading = true;
// ;
setTimeout(() => {
this.getPolicyList().finally(() => {
// loading
this.loading = false;
});
}, 6000);
} else {
// this.$modal.msgError("");
console.log("应该更新状态的");
// ;
this.getPolicyList();
}
})
.catch((error) => {
console.log("请求发生错误,更新设备状态", error);
// ;
this.getPolicyList();
});
},
//
handleStatus(item) {
this.$confirm(
`确定要切换"${item.name}"的状态为:${
item.delayStatus ? "开启" : "禁用 吗?"
}`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
//
console.log("请求后台", item.delayStatus);
let param = null;
if (item.delayStatus) {
param = 1;
} else {
param = 0;
}
this.hadleOperationConrol(item.delayStatusId, param);
})
.catch(() => {
//
item.delayStatus = !item.delayStatus;
console.log("不请求后台");
});
},
},
};
</script>
<style lang="scss" scoped>
.app-container {
position: relative;
padding: 0.2rem;
.delay-title {
/* 基础样式 */
display: inline-block;
padding: 0.1rem;
font-family: "Arial Rounded MT Bold", sans-serif;
font-size: 0.18rem;
font-weight: 700;
color: #e6f3ff;
text-shadow: 0 2px 4px rgba(0, 60, 120, 0.4);
letter-spacing: 2px;
position: relative;
overflow: hidden;
cursor: default;
/* 双背景叠加 */
background: linear-gradient(
65deg,
rgba(1, 11, 24, 0.8) 0%,
rgba(36, 91, 146, 0.6) 50%,
rgba(18, 53, 95, 0.5) 100%
),
linear-gradient(-25deg, #0b274b 20%, #2b4d6b 80%);
background-blend-mode: overlay;
/* 动态边框 */
border: 2px solid;
border-image: linear-gradient(45deg, #026bbb, transparent) 1;
/* 主流光动画 */
&::before {
content: "";
position: absolute;
top: -50%;
left: -100%;
width: 250%;
height: 200%;
background: linear-gradient(
60deg,
transparent 20%,
rgba(255, 255, 255, 0.3) 50%,
transparent 80%
);
animation: shine 2.5s infinite linear;
}
/* 副流光动画 */
&::after {
content: "";
position: absolute;
top: -30%;
left: -50%;
width: 200%;
height: 160%;
background: linear-gradient(
-30deg,
transparent 30%,
rgba(255, 255, 255, 0.2) 50%,
transparent 70%
);
animation: shineReverse 3s infinite linear;
animation-delay: 0.8s;
}
}
/* 主流光动画 */
@keyframes shine {
0% {
transform: translateX(-20%) rotate(60deg);
}
100% {
transform: translateX(120%) rotate(60deg);
}
}
/* 反向副流光 */
@keyframes shineReverse {
0% {
transform: translateX(20%) rotate(-30deg);
}
100% {
transform: translateX(-120%) rotate(-30deg);
}
}
.right-line {
position: absolute;
top: 0;
left: 0;
width: 1.7rem;
height: 0.4rem;
}
.left-line {
position: absolute;
right: 0;
bottom: 0;
width: 0.5rem;
height: 2.2rem;
}
}
.device-container {
display: flex;
flex-direction: column;
width: 100%;
min-height: 700px;
background-color: #142c4e;
padding: 10px 10px 30px 10px;
border-radius: 10px;
.device-li {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
padding: 12px 0;
color: #abcdfc;
border-bottom: 1px dashed #0349ac;
.device-name {
flex: 1;
white-space: nowrap;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
flex-wrap: nowrap;
.slip {
margin: 0 5px;
color: #1282d8;
font-weight: bold;
}
}
}
.device-li:nth-child(1) {
color: #9ca3af;
}
}
</style>
<style scoped>
.device-name >>> .el-input {
width: 80px !important;
}
.device-name >>> .el-input__inner {
background-color: #04193a;
border: 1px solid #1262db;
color: #3ef0fd;
font-weight: 700;
text-align: center;
padding: 0 0.1rem !important;
}
</style>

102
src/views/components/waterTank.vue

@ -3,12 +3,7 @@
<!-- 水箱图片 -->
<img class="monitor-img3" src="../../assets/images/waterBox.png" />
<!-- 表示水的 div -->
<div class="waves" :style="{ height: waterHeight + '%' }">
<div class="wave wave1"></div>
<div class="wave wave2"></div>
<div class="wave wave3"></div>
<div class="wave wave4"></div>
</div>
<div class="water" :style="{ height: waterHeight + '%' }"></div>
</div>
</template>
@ -38,89 +33,80 @@ export default {
.monitor-container {
position: relative;
display: inline-block;
width: 1.2rem;
height: 1.2rem;
}
.monitor-img3 {
width: 1.2rem;
height: 1.3rem;
position: absolute;
top: -10px;
left: 0;
}
.waves {
.water {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
/* 修改颜色表示,添加透明度 */
background-color: rgba(23, 106, 201, 0.1);
background-color: rgba(23, 106, 201);
overflow: hidden;
.wave {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: url(../../assets/images/wave.png);
background-size: 200% 100%;
}
.wave1 {
opacity: 1;
top: 0;
z-index: 1000;
animation: animate 4s linear infinite;
}
.wave2 {
opacity: 0.5;
top: 0.2rem;
z-index: 999;
animation: animate2 4s linear infinite;
}
.wave3 {
opacity: 0.2;
top: 0.3rem;
z-index: 999;
animation: animate 2s linear infinite;
}
.wave4 {
opacity: 0.7;
top: 0.4rem;
z-index: 999;
animation: animate2 2s linear infinite;
}
}
@keyframes animate{
0%{
background-position-x: 110px;
}
100%{
background-position-x: 0px;
}
}
@keyframes animate2{
0%{
background-position-x: 0px;
}
100%{
background-position-x: 110px;
}
}
@media (min-width: 1400px) and (max-width: 1620px) {
.monitor-container {
width: 110px !important;
height: 110px !important;
}
.monitor-img3 {
width: 110px !important;
height: 120px !important;
}
.water {
width: 110px !important;
}
}
@media (min-width: 1240px) and (max-width: 1400px) {
.monitor-container {
width: 90px !important;
height: 90px !important;
}
.monitor-img3 {
width: 90px !important;
height: 100px !important;
}
.water {
width: 90px !important;
}
}
@media (max-width: 1240px) {
@media (min-width: 720px) and (max-width: 1240px){
.monitor-container {
width: 100px !important;
height: 100px !important;
}
.monitor-img3 {
width: 100px !important;
height: 110px !important;
}
.water {
width: 100px !important;
}
}
@media (max-width: 720px) {
.monitor-container {
width: 80px !important;
height: 80px !important;
}
.monitor-img3 {
width: 80px !important;
height: 90px !important;
}
.water {
width: 80px !important;
}
}
</style>

105
src/views/hotWater/waterControl/index.vue

@ -1,5 +1,5 @@
<template>
<div class="app-container">
<div class="app-container" v-loading="loading">
<div class="left-tree">
<!-- el-tree 设置一个固定的高度和滚动条 -->
<div style="height: 750px; overflow-y: auto">
@ -151,7 +151,7 @@
</div>
<!-- 水箱 -->
<div class="monitor-flex-left" v-if="activeName.includes('水箱')">
<water-tank :waterLevel="50"></water-tank>
<water-tank :waterLevel="item.waterLevel"></water-tank>
<div class="monitor-words">
<div class="words-li">
<div class="ash">实际液位:</div>
@ -359,7 +359,7 @@ export default {
tempSet: item.tempSet,
frequency: item.frequency,
frequencySet: item.frequencySet,
waterLevel: item.waterLevel,
waterLevel: Number(item.waterLevel),
waterLevelSet: item.waterLevelSet,
curTime: item.curTime,
alarmStatus: Number(item.alarmStatus) == 0 ? "无故障" : "故障",
@ -374,45 +374,59 @@ export default {
},
//
getWaterList() {
let data = {
systemType: "1",
floorId: this.currentId,
};
waterOperateList(data).then((res) => {
if (res.code == 200 && res.rows.length > 0) {
this.tabsList = res.rows;
this.activeName = res.rows[0].name;
// tab name tabsList item,devicesList
const currentItem = this.tabsList.find(
(item) => item.name === this.activeName
);
console.log("currentItem--=----", currentItem);
if (currentItem.children.length > 0) {
this.devicesList = [];
currentItem.children.forEach((item) => {
if (item.name) {
// deviceItem
let deviceItem = {
id: item.id,
name: item.name,
temp: item.temp,
tempSet: item.tempSet,
frequency: item.frequency,
frequencySet: item.frequencySet,
waterLevel: item.waterLevel,
waterLevelSet: item.waterLevelSet,
curTime: item.curTime,
alarmStatus:
Number(item.alarmStatus) == 0 ? "无故障" : "故障",
switchStatus: Number(item.switchStatus) == 0 ? false : true,
};
// devicesList
this.devicesList.push(deviceItem);
return new Promise((resolve, reject) => {
let data = {
systemType: "1",
floorId: this.currentId,
};
waterOperateList(data)
.then((res) => {
if (res.code == 200 && res.rows.length > 0) {
this.tabsList = res.rows;
this.activeName = res.rows[0].name;
// tab name tabsList item,devicesList
const currentItem = this.tabsList.find(
(item) => item.name === this.activeName
);
console.log("currentItem--=----", currentItem);
if (currentItem.children.length > 0) {
this.devicesList = [];
currentItem.children.forEach((item) => {
if (item.name) {
// deviceItem
let deviceItem = {
id: item.id,
name: item.name,
temp: item.temp,
tempSet: item.tempSet,
frequency: item.frequency,
frequencySet: item.frequencySet,
waterLevel: item.waterLevel,
waterLevelSet: item.waterLevelSet,
curTime: item.curTime,
alarmStatus:
Number(item.alarmStatus) == 0 ? "无故障" : "故障",
switchStatus:
Number(item.switchStatus) == 0 ? false : true,
};
// devicesList
this.devicesList.push(deviceItem);
}
});
console.log("当前楼层water列表", this.devicesList);
}
});
console.log("当前楼层water列表", this.devicesList);
}
}
} else {
this.tabsList = [];
this.devicesList = [];
this.activeName = "";
}
// Promise
resolve(res);
})
.catch((error) => {
// Promise
reject(error);
});
});
},
//
@ -545,8 +559,15 @@ export default {
.then((res) => {
if (res.code == 200) {
this.$modal.msgSuccess("操作成功");
// loading
this.loading = true;
// ;
this.getWaterList();
setTimeout(() => {
this.getWaterList().finally(() => {
// loading
this.loading = false;
});
}, 6000);
} else {
// this.$modal.msgError("");
console.log("应该更新状态的");

756
src/views/hotWater/waterMonitor/index.vue

@ -2,7 +2,7 @@
<div class="app-container">
<div class="left-tree">
<!-- el-tree 设置一个固定的高度和滚动条 -->
<div style="height: 750px; overflow-y: auto">
<div style="height: 5.08rem; overflow-y: auto">
<el-tree
ref="tree"
:data="treeData"
@ -27,6 +27,15 @@
</template>
</el-tree>
</div>
<div class="base-mes">
<div class="base-title">公共信息</div>
<div class="base-height">
<div class="base-li" v-for="(item, index) in baseTable" :key="index">
{{ item.name }}:<span class="deepColor">{{ item.value }}</span
>{{ item.unit }}
</div>
</div>
</div>
</div>
<div class="right-monitor">
<div class="buildingDiv">
@ -37,13 +46,253 @@
/>
<div class="title-word">楼层{{ currentName }}</div>
</div>
<div class="details-header">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="热泵" name="first"> </el-tab-pane>
<el-tab-pane label="高区水泵" name="second"> </el-tab-pane>
<el-tab-pane label="低区水泵" name="three"> </el-tab-pane>
<el-tab-pane label="水箱" name="four"> </el-tab-pane>
</el-tabs>
<div class="folw">
<!-- 动态流程图 -->
<div class="changeimage">
<!-- <img class="img-rad" src="" alt="" /> -->
<div class="flowimg">
<!-- <img v-if="this.useWater == '运行'" src="../../../assets/images/flowimg/move.gif" class="bigMove" alt="" />
<img v-else src="../../../assets/images/flowimg/nomove.png" class="bigMove" alt="" /> -->
<!-- 文字定位 -->
<div class="flow-text text1">冷水泵</div>
<div class="flow-text text2">回水管</div>
<div class="flow-text text3">无线网关</div>
<div class="flow-text text4">回水阀</div>
<div class="flow-text text5">浴室</div>
<div class="flow-text text6">热水供水泵</div>
<div class="flow-text text7">循环加热泵</div>
<!-- 补水定位 -->
<img
class="replenish"
v-if="this.coolpumstate === '运行'"
src="../../../assets/flowimg/replenish-move.gif"
alt=""
/>
<img
class="replenish"
v-else
src="../../../assets/flowimg/replenish-nomove.png"
alt=""
/>
<!-- 供水定位 -->
<img
class="supply"
v-if="this.waterpumstate === '运行'"
src="../../../assets/flowimg/supply-move.gif"
alt=""
/>
<img
class="supply"
v-else
src="../../../assets/flowimg/supply-nomove.png"
alt=""
/>
<!-- 加热定位 -->
<img
class="circulate"
v-if="this.hotpumstate === '运行' && this.isBad"
src="../../../assets/flowimg/circulate-move.gif"
alt=""
/>
<img
class="circulate"
v-else
src="../../../assets/flowimg/circulate-nomove.png"
alt=""
/>
<!-- 冷水泵定位 -->
<img
class="coolpum"
v-if="this.coolpumstate === ''"
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<img
class="coolpum"
v-else-if="this.coolpumstate === '不运行'"
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<img
class="coolpum"
v-else-if="this.coolpumstate === '运行'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="coolpum"
v-else-if="this.coolpumstate === '补水'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="coolpum"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 热水供水泵定位 -->
<img
class="waterpum"
v-if="this.waterpumstate === '运行'"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="waterpum"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 循环加热泵定位-->
<img
class="cirpum"
v-if="this.hotpumstate === '运行' && this.isBad"
src="../../../assets/flowimg/startpum.png"
alt=""
/>
<img
class="cirpum"
v-else
src="../../../assets/flowimg/closepum.png"
alt=""
/>
<!-- 热泵定位 -->
<img
class="hotpum"
v-if="this.hotpumstate === '运行' && this.isBad"
src="../../../assets/flowimg/starthotpum.png"
alt=""
/>
<img
class="hotpum"
v-else-if="this.isBad === '故障'"
src="../../../assets/flowimg/badhotpum.png"
alt=""
/>
<img
class="hotpum"
v-else
src="../../../assets/flowimg/closehotpum.png"
alt=""
/>
<!-- 无线网关定位 无状态-->
<img
class="web"
:src="
webstate == 0
? require('../../../assets/flowimg/badweb.png')
: require('../../../assets/flowimg/onlineweb.png')
"
alt=""
/>
<!-- 保温水箱定位 -->
<img
class="waterBox"
src="../../../assets/flowimg/waterBox.png"
alt=""
/>
<!-- 热泵名称定位 -->
<div class="pumname">{{ this.pumname }}</div>
<!-- 温度定位 -->
<img
class="tem"
src="../../../assets/flowimg/thermometer.png"
alt=""
/>
<div class="temContainer">
<div class="temprogress" :style="{ height: temdata + '%' }"></div>
</div>
<b class="temdiv">{{ temdata }}</b>
<!-- 水位定位 -->
<div class="progressContainer1" v-if="progress > 50">
<div class="progress" :style="{ height: progress + '%' }">
<!-- <b class="propo">{{ progress }}%</b> -->
</div>
<!-- 水位定位 -->
<b class="propo">{{ progress }}%</b>
</div>
<div class="progressContainer2" v-else>
<div class="progress" :style="{ height: progress + '%' }"></div>
<b class="propo">{{ progress }}%</b>
</div>
</div>
</div>
<div class="changecontent">
<div class="tablemaeta">系统状态显示</div>
<el-table
height="2.5rem"
class="maintable"
ref="maintable"
:data="tableData"
highlight-current-row
@row-click="handlerow"
:cell-style="tableRowStyle"
:show-overflow-tooltip="true"
:header-cell-style="{ 'text-align': 'center' }"
>
<el-table-column label="序号" min-width="50">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="curDate" label="状态时间" min-width="130">
</el-table-column>
<el-table-column prop="pumpName" label="热泵名称">
</el-table-column>
<el-table-column prop="tempSet" label="设置温度(℃)" min-width="100">
<template slot-scope="{ row }">
<span>{{ row.tempSet }} </span>
</template>
</el-table-column>
<el-table-column
prop="waterTemp"
label="实际温度(℃)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.waterTemp }} </span>
</template>
</el-table-column>
<el-table-column
prop="levelSet"
label="设置水位(%)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.levelSet }}</span>
</template>
</el-table-column>
<el-table-column
prop="waterLevel"
label="实际水位(%)"
min-width="100"
>
<template slot-scope="{ row }">
<span>{{ row.waterLevel }} </span>
</template>
</el-table-column>
<el-table-column prop="runState" label="热泵状态">
<template slot-scope="{ row }">
<span v-if="row.runState === '0'">不运行 </span>
<span v-if="row.runState === '1'">运行 </span>
</template>
</el-table-column>
<el-table-column prop="upWaterState" label="供水状态">
<template slot-scope="{ row }">
<span v-if="row.rupWaterState === '0'">不运行 </span>
<span v-if="row.upWaterState === '1'">运行 </span>
</template>
</el-table-column>
<el-table-column prop="isFault" label="是否故障">
<template slot-scope="{ row }">
<span v-if="row.risFault === '0'">无故障</span>
<span v-if="row.isFault === '1'">有故障</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</div>
@ -51,7 +300,7 @@
<script>
import { spaceTree } from "@/api/region";
import { waterOperateList, operationConrol } from "@/api/hotWater/waterControl";
import { waterPublic, waterMonitorList } from "@/api/hotWater/waterMonitor";
export default {
data() {
return {
@ -68,7 +317,26 @@ export default {
currentLevel: "", //
currentParentId: "", //id
activeName: "first", //
baseTable: [], //
tableData: [], //
// 0 1
coolpumstate: "",
// 0 1
waterpumstate: "",
//
hotpumstate: "关机模式",
isBad: "无故障",
// 使 0使 1使
bathstate: 0,
// 线 0线 1线
webstate: 1,
//
progress: 0,
//
temdata: 0,
//
pumname: "",
};
},
mounted() {
@ -116,6 +384,8 @@ export default {
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
this.baseMessgae();
this.sysStatus();
}
});
}
@ -202,18 +472,115 @@ export default {
console.log("当前选中节点ID", this.currentId);
console.log("当前选中节点层级", this.currentLevel);
console.log("当前选中节点名称", this.currentName);
return;
this.baseMessgae();
this.sysStatus();
}
},
handleClick(tab, event) {
console.log(tab, event);
console.log("activeName", this.activeName);
},
//
handlerow(row, event, column) {
//
this.progress = row.waterLevel;
this.temdata = row.waterTemp;
this.pumname = row.pumpName;
//
this.hotpumstate = row.runState;
this.isBad = row.isFault;
},
/* 加入小手状态 */
tableRowStyle({ row, column, rowIndex, columnIndex }) {
if (row) {
return "cursor:pointer;text-align:center";
}
},
//
baseMessgae() {
let data = {
systemType: "1",
floorId: this.currentId,
};
waterPublic(data).then((res) => {
console.log("公共信息返回", res);
if (res.code == 200 && res.rows.length > 0) {
this.baseTable = [];
res.rows.forEach((item) => {
//
let baseltem = {
name: item.name,
};
if (item.name.includes("温度")) {
baseltem.unit = "℃";
}
if (item.name.includes("压力")) {
baseltem.unit = "Mpa";
}
if (item.value.includes("采集失败")) {
baseltem.value = "0";
} else {
baseltem.value = item.value;
}
// deviceList
if (Object.keys(baseltem).length > 1) {
this.baseTable.push(baseltem);
}
});
console.log("处理后的公共信息返回", this.baseTable);
}
});
},
//
sysStatus() {
let data = {
systemType: "1",
floorId: this.currentId,
};
waterMonitorList(data).then((res) => {
console.log("系统状态返回", res);
if (res.code == 200 && res.rows.length > 0) {
this.tableData = res.rows;
if (this.tableData.length > 0) {
//
const firstRow = this.tableData[0];
//
this.handlerow(firstRow);
//
this.$refs.maintable.setCurrentRow(firstRow);
}
} else {
this.tableData = [];
}
});
},
},
};
</script>
<style lang="scss" scoped>
.buildingDiv {
padding-left: 54px;
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 20px;
position: relative;
.title-bg {
width: 208px;
height: 38px;
position: absolute;
left: 0;
z-index: 0;
}
.title-word {
z-index: 10;
font-family: YouSheBiaoTiHei;
font-size: 24px;
color: #ffffff;
white-space: nowrap;
}
}
.app-container {
display: flex;
flex-direction: row;
@ -221,10 +588,9 @@ export default {
align-items: stretch;
height: 100%;
.left-tree {
width: 216px;
padding: 15px 10px;
width: 256px;
padding: 15px 10px 10px 10px;
border: 1px solid #004b8c;
min-height: 800px;
.status {
display: flex;
flex-direction: row;
@ -281,45 +647,330 @@ export default {
margin-right: 5px;
}
}
.base-mes {
background-color: #142c4e;
padding: 20px 10px;
font-size: 16px;
border-radius: 6px;
color: #129bd1;
.base-title {
font-family: SourceHanSansCN-Medium;
font-size: 18px;
font-style: italic;
color: #d1d6df;
margin-bottom: 20px;
}
.base-height{
height: 2.02rem;
overflow-y: auto;
.base-li {
margin-bottom: 20px;
.deepColor {
display: inline-block;
margin: 0 10px 0 5px;
color: #20ebfa;
font-weight: bold;
font-size: 18px;
}
}
}
}
}
.right-monitor {
width: calc(100% - 240px);
width: calc(100% - 280px);
display: flex;
flex-direction: column;
justify-content: flex-start;
.buildingDiv {
padding-left: 54px;
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 20px;
position: relative;
.title-bg {
width: 208px;
height: 38px;
position: absolute;
left: 0;
z-index: 0;
.folw {
width: 100%;
margin-top: -0.2rem;
.changeimage {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
.flowimg {
width: 12.27rem;
height: 4.6rem;
background-size: 100% 100%;
background-repeat: no-repeat;
position: relative;
.bigMove {
width: 12.27rem;
height: 4.6rem;
position: absolute;
top: 0;
}
.flow-text {
font-size: 0.17rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #fefefe;
}
.text1 {
position: absolute;
top: 0.28rem;
left: 0.24rem;
z-index: 1;
}
.text2 {
position: absolute;
top: 0.22rem;
left: 5.3rem;
z-index: 1;
}
.text3 {
position: absolute;
top: 0.6rem;
width: 0.4rem;
right: 1.2rem;
line-height: 0.28rem;
z-index: 1;
}
.text4 {
position: absolute;
top: 2.3rem;
right: 0.5rem;
z-index: 1;
}
.text5 {
position: absolute;
top: 4.2rem;
left: 2.1rem;
z-index: 1;
}
.text6 {
position: absolute;
top: 4.27rem;
left: 0.24rem;
z-index: 1;
}
.text7 {
position: absolute;
top: 2.6rem;
left: 5.6rem;
z-index: 1;
}
.replenish {
position: absolute;
top: 0.7rem;
left: 0.9rem;
width: 1.7rem;
height: 0.34rem;
z-index: 1;
}
.supply {
position: absolute;
top: 0rem;
left: 0rem;
width: 12.3rem;
height: 4.6rem;
z-index: 0;
}
.circulate {
position: absolute;
top: 1.5rem;
left: 4.8rem;
width: 3.5rem;
height: 0.7rem;
}
.coolpum {
width: 1rem;
height: 0.78rem;
position: absolute;
top: 0.54rem;
z-index: 2;
}
.waterpum {
width: 1rem;
height: 0.78rem;
position: absolute;
top: 3.37rem;
left: 0.4rem;
}
.cirpum {
width: 1rem;
height: 0.78rem;
position: absolute;
top: 1.68rem;
left: 5.64rem;
}
.hotpum {
width: 2.2rem;
height: 2.2rem;
position: absolute;
top: 1.2rem;
left: 7.9rem;
}
.web {
width: 0.78rem;
height: 1.12rem;
position: absolute;
top: 0.26rem;
right: 0.36rem;
}
.tem {
width: 0.8rem;
height: 1.5rem;
position: absolute;
top: 1.68rem;
left: 4rem;
z-index: 3;
}
.temContainer {
width: 0.076rem;
height: 0.84rem;
background-color: #02072d;
// background-color: #11aaea;
position: absolute;
top: 2.17rem;
left: 4.36rem;
z-index: 3;
.temprogress {
background-color: #d22727;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
}
.waterBox {
position: absolute;
top: 0.3rem;
left: 2.47rem;
width: 2.86rem;
height: 3.32rem;
z-index: 2;
}
.temdiv {
font-size: 0.15rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #d22727;
position: absolute;
top: 3.26rem;
left: 4.3rem;
z-index: 3;
}
.progressContainer1 {
width: 0.42rem;
height: 2.03rem;
background-color: #dff1fa;
margin-left: 2%;
position: absolute;
top: 1.78rem;
left: 2.6rem;
border: solid 0.01rem #11aaea;
z-index: 3;
.progress {
background-color: #1c89ee;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
b {
font-family: AdobeHeitiStd-Regular;
font-size: 0.17rem;
line-height: 0.2rem;
letter-spacing: 0rem;
color: #d22727;
position: absolute;
top: -0.3rem;
z-index: 3;
}
}
.progressContainer2 {
width: 0.42rem;
height: 2.03rem;
background-color: #dff1fa;
margin-left: 2%;
position: absolute;
top: 1.45rem;
left: 2.6rem;
border: solid 0.01rem red;
z-index: 3;
.progress {
background-color: red;
width: 100%;
position: absolute;
bottom: 0;
z-index: 3;
}
b {
font-family: AdobeHeitiStd-Regular;
font-size: 0.17rem;
line-height: 0.2rem;
letter-spacing: 0rem;
color: #d22727;
position: absolute;
top: -0.3rem;
z-index: 3;
}
}
.pumname {
font-size: 0.17rem;
font-weight: normal;
font-stretch: normal;
line-height: 0.2rem;
letter-spacing: 0.01rem;
color: #fefefe;
position: absolute;
top: 0.8rem;
left: 8.8rem;
z-index: 1;
}
}
}
.title-word {
z-index: 10;
font-family: YouSheBiaoTiHei;
font-size: 24px;
color: #ffffff;
white-space: nowrap;
.changecontent {
background: #142c4e;
border-radius: 6px;
height: 300px;
padding: 15px 10px 0 10px;
overflow: hidden;
margin-top: 30px;
.tablemaeta {
font-family: SourceHanSansCN-Medium;
font-size: 18px;
font-style: italic;
color: #d1d6df;
margin-bottom: 20px;
}
}
}
.monitor-context {
height: 640px;
width: 100%;
overflow-y: auto;
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: flex-start;
flex-wrap: wrap;
align-content: flex-start;
}
}
}
.tree-container {
@ -347,6 +998,21 @@ export default {
}
}
}
@media (min-width: 1270px) and (max-width: 1490px) {
.changeimage {
transform: scale(0.9);
}
}
@media (min-width: 1120px) and (max-width: 1270px) {
.changeimage {
transform: scale(0.8);
}
}
@media (min-width: 990px) and (max-width: 1120px) {
.changeimage {
transform: scale(0.7);
}
}
</style>
<style scoped>
/* 自定义高亮颜色 */

13
src/views/temSys/temHistory/index.vue

@ -0,0 +1,13 @@
<template>
<div>历史数据</div>
</template>
<script>
export default {
}
</script>
<style>
</style>

13
src/views/temSys/temMonitor/index.vue

@ -0,0 +1,13 @@
<template>
<div>温度监测控制</div>
</template>
<script>
export default {
}
</script>
<style>
</style>
Loading…
Cancel
Save