alarmRate.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <template>
  2. <div class="component_box">
  3. <div ref="chart" style="width: 100%; height: 100%;" @mouseenter="handleMouseEnter"
  4. @mouseleave="handleMouseLeave"></div>
  5. </div>
  6. </template>
  7. <script>
  8. import { alarmRate } from '@/api/iot/board'
  9. export default {
  10. props: {
  11. orgId: {
  12. type: String,
  13. isRequired: true,
  14. },
  15. },
  16. data() {
  17. return {
  18. data: {
  19. normalCount: 0,
  20. alarmCount: 0
  21. },
  22. // activeName: types[0].value,
  23. };
  24. },
  25. components: {},
  26. computed: {},
  27. watch: {
  28. orgId: {
  29. deep: true,
  30. handler(val) {
  31. this.resetTimer();
  32. this.getData();
  33. },
  34. },
  35. data: {
  36. deep: true,
  37. handler() {
  38. this.initMap();
  39. },
  40. },
  41. },
  42. created() {
  43. this.refreshTime = 1 * 10 * 1000;
  44. this.isMouseOver = false;
  45. },
  46. async mounted() {
  47. window.addEventListener("resize", this.windowResize);
  48. },
  49. beforeDestroy() {
  50. this.timer && clearInterval(this.timer);
  51. this.timer = null;
  52. window.removeEventListener("resize", this.windowResize);
  53. },
  54. methods: {
  55. handleClick() {
  56. this.resetTimer();
  57. this.getData();
  58. },
  59. handleMouseEnter() {
  60. this.isMouseOver = true;
  61. },
  62. handleMouseLeave() {
  63. this.isMouseOver = false;
  64. },
  65. async getData() {
  66. let r = (await alarmRate(this.orgId))
  67. .data;
  68. this.data = r;
  69. },
  70. windowResize() {
  71. this.myChart && this.myChart.resize();
  72. },
  73. initMap() {
  74. this.myChart && this.myChart.dispose();
  75. let c = this.$refs["chart"];
  76. // 基于准备好的dom,初始化echarts实例
  77. this.myChart = echarts.init(
  78. c
  79. );
  80. option = {
  81. title: {
  82. text: "设备告警状态",
  83. top: 35,
  84. left: 20,
  85. textStyle: {
  86. fontSize: 18,
  87. color: "#fff",
  88. },
  89. },
  90. tooltip: {
  91. trigger: "item",
  92. formatter: "{a} <br/>{b}: {c} ({d}%)",
  93. },
  94. legend: {
  95. right: 20,
  96. top: 35,
  97. data: ["告警", "正常"],
  98. textStyle: {
  99. color: "#fff",
  100. },
  101. },
  102. series: [
  103. {
  104. name: "设备告警状态",
  105. type: "pie",
  106. radius: ["0", "60%"],
  107. center: ["50%", "60%"],
  108. // color: ['#e72325', '#98e002', '#2ca3fd'],
  109. color: ["#F6A645", "#13D0B2", "#2ca3fd"],
  110. label: {
  111. normal: {
  112. formatter: "{b}\n{d}%",
  113. },
  114. },
  115. data: [
  116. {
  117. value: this.data.alarmCount,
  118. name: "告警",
  119. },
  120. {
  121. value: this.data.normalCount,
  122. name: "正常",
  123. selected: true,
  124. },
  125. ],
  126. },
  127. ],
  128. };
  129. // 使用刚指定的配置项和数据显示图表。
  130. if (option && typeof option === "object") {
  131. this.myChart.setOption(option);
  132. }
  133. },
  134. resetTimer() {
  135. this.timer && clearInterval(this.timer);
  136. this.timer = setInterval(() => {
  137. if (this.isMouseOver) {
  138. return;
  139. }
  140. // this.activeName = getNextPeriod(this.types, this.activeName);
  141. this.getData();
  142. }, this.refreshTime);
  143. },
  144. },
  145. };
  146. </script>
  147. <style scoped src="./../css/index.css"></style>