alarmTrend.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  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 { alarmTrend } 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. date: [], //x轴的日期
  20. total: [], //报警总数
  21. countByType: [],//按分类统计的报警总数
  22. },
  23. isMouseOver: false,
  24. // activeName: types[0].value,
  25. };
  26. },
  27. components: {},
  28. computed: {},
  29. watch: {
  30. orgId: {
  31. deep: true,
  32. handler(val) {
  33. this.resetTimer();
  34. this.getData();
  35. },
  36. },
  37. data: {
  38. deep: true,
  39. handler() {
  40. this.initMap();
  41. },
  42. },
  43. },
  44. created() {
  45. this.types = types;
  46. this.maxDisplay = 16;
  47. this.refreshTime = 1 * 10 * 1000;
  48. this.isMouseOver = false;
  49. },
  50. async mounted() {
  51. window.addEventListener("resize", this.windowResize);
  52. },
  53. beforeDestroy() {
  54. this.timer && clearInterval(this.timer);
  55. this.timer = null;
  56. window.removeEventListener("resize", this.windowResize);
  57. },
  58. methods: {
  59. // handleClick() {
  60. // this.resetTimer();
  61. // this.getData();
  62. // },
  63. handleMouseEnter() {
  64. this.isMouseOver = true;
  65. },
  66. handleMouseLeave() {
  67. this.isMouseOver = false;
  68. },
  69. async getData() {
  70. let r = (await alarmTrend(this.orgId))
  71. .data;
  72. let data = {
  73. date: [], //x轴的日期
  74. total: [], //报警总数
  75. countByType: [],//按分类统计的报警总数
  76. };
  77. let monitorCount = [];
  78. let fireCount = [];
  79. let environmentCount = [];
  80. for (let item of r) {
  81. data.total.push(item.total);
  82. monitorCount.push(item.monitorCount);
  83. fireCount.push(item.fireCount);
  84. environmentCount.push(item.environmentCount);
  85. data.date.push(item.orgName);
  86. }
  87. data.countByType.push(monitorCount)
  88. data.countByType.push(fireCount)
  89. data.countByType.push(environmentCount);
  90. this.data = data;
  91. },
  92. windowResize() {
  93. this.myChart && this.myChart.resize();
  94. },
  95. initMap() {
  96. this.myChart && this.myChart.dispose();
  97. let c = this.$refs["chart"];
  98. // 基于准备好的dom,初始化echarts实例
  99. this.myChart = echarts.init(
  100. c
  101. );
  102. var data = {
  103. id: "multipleBarsLines",
  104. title: "近7天告警趋势",
  105. legendBar: ["报警总数"],
  106. symbol: "", //数值是否带百分号 --默认为空 ''
  107. legendLine: ["监控设备", "消防设备", "环境监测"],
  108. // xAxis: ["9月19", "9月20", "9月21", "9月22", "9月23", "9月24", "9月25"],
  109. // yAxis: [[8, 10, 10, 11, 4, 13, 8]],
  110. // lines: [
  111. // [4, 3, 2, 4, 2, 1, 1],
  112. // [2, 1, 4, 2, 3, 2, 4],
  113. // [1, 0, 2, 1, 1, 2, 1],
  114. // ],
  115. barColor: ["#3FA7DC", "#7091C4", "#5170A2"], //柱子颜色 必填参数
  116. lineColor: ["#D9523F"], // 折线颜色
  117. };
  118. /////////////end/////////
  119. var myData = (function test() {
  120. var yAxis = this.data.total || [];
  121. var lines = this.data.countByType || [];
  122. var legendBar = data.legendBar || [];
  123. var legendLine = data.legendLine || [];
  124. var symbol = data.symbol || " ";
  125. var seriesArr = [];
  126. var legendArr = [];
  127. yAxis &&
  128. yAxis.forEach((item, index) => {
  129. legendArr.push({
  130. name: legendBar && legendBar.length > 0 && legendBar[index],
  131. });
  132. seriesArr.push({
  133. name: legendBar && legendBar.length > 0 && legendBar[index],
  134. type: "bar",
  135. barGap: "0.5px",
  136. data: item,
  137. barWidth: data.barWidth || 12,
  138. label: {
  139. normal: {
  140. show: true,
  141. formatter: "{c}" + symbol,
  142. position: "top",
  143. textStyle: {
  144. color: "#fff",
  145. fontStyle: "normal",
  146. fontFamily: "微软雅黑",
  147. textAlign: "left",
  148. fontSize: 11,
  149. },
  150. },
  151. },
  152. itemStyle: {
  153. //图形样式
  154. normal: {
  155. barBorderRadius: 4,
  156. color: data.barColor[index],
  157. },
  158. },
  159. });
  160. });
  161. lines &&
  162. lines.forEach((item, index) => {
  163. legendArr.push({
  164. name: legendLine && legendLine.length > 0 && legendLine[index],
  165. });
  166. seriesArr.push({
  167. name: legendLine && legendLine.length > 0 && legendLine[index],
  168. type: "line",
  169. data: item,
  170. itemStyle: {
  171. normal: {
  172. color: data.lineColor[index],
  173. lineStyle: {
  174. width: 3,
  175. type: "solid",
  176. },
  177. },
  178. },
  179. label: {
  180. normal: {
  181. show: false, //折线上方label控制显示隐藏
  182. position: "top",
  183. },
  184. },
  185. symbol: "circle",
  186. symbolSize: 10,
  187. });
  188. });
  189. return {
  190. seriesArr,
  191. legendArr,
  192. };
  193. })();
  194. option = {
  195. title: {
  196. show: true,
  197. top: "10%",
  198. left: "3%",
  199. text: data.title,
  200. textStyle: {
  201. fontSize: 18,
  202. color: "#fff",
  203. },
  204. subtext: data.subTitle,
  205. link: "",
  206. },
  207. tooltip: {
  208. trigger: "axis",
  209. formatter: function (params) {
  210. var time = "";
  211. var str = "";
  212. for (var i of params) {
  213. time = i.name.replace(/\n/g, "") + "<br/>";
  214. if (i.data == "null" || i.data == null) {
  215. str += i.seriesName + ":无数据" + "<br/>";
  216. } else {
  217. str += i.seriesName + ":" + i.data + symbol + "%<br/>";
  218. }
  219. }
  220. return time + str;
  221. },
  222. axisPointer: {
  223. type: "none",
  224. },
  225. },
  226. legend: {
  227. right: data.legendRight || "30%",
  228. top: "12%",
  229. right: "5%",
  230. itemGap: 16,
  231. itemWidth: 10,
  232. itemHeight: 10,
  233. data: myData.legendArr,
  234. textStyle: {
  235. color: "#fff",
  236. fontStyle: "normal",
  237. fontFamily: "微软雅黑",
  238. fontSize: 12,
  239. },
  240. },
  241. grid: {
  242. x: 30,
  243. y: 80,
  244. x2: 30,
  245. y2: 60,
  246. },
  247. xAxis: {
  248. type: "category",
  249. data: this.data.date,
  250. axisTick: {
  251. show: false,
  252. },
  253. axisLine: {
  254. show: true,
  255. lineStyle: {
  256. color: "#1AA1FD",
  257. },
  258. symbol: ["none", "arrow"],
  259. },
  260. axisLabel: {
  261. show: true,
  262. interval: "0",
  263. textStyle: {
  264. lineHeight: 16,
  265. padding: [2, 2, 0, 2],
  266. height: 50,
  267. fontSize: 12,
  268. },
  269. rich: {
  270. Sunny: {
  271. height: 50,
  272. // width: 60,
  273. padding: [0, 5, 0, 5],
  274. align: "center",
  275. },
  276. },
  277. formatter: function (params, index) {
  278. var newParamsName = "";
  279. var splitNumber = 5;
  280. var paramsNameNumber = params && params.length;
  281. if (paramsNameNumber && paramsNameNumber <= 4) {
  282. splitNumber = 4;
  283. } else if (paramsNameNumber >= 5 && paramsNameNumber <= 7) {
  284. splitNumber = 4;
  285. } else if (paramsNameNumber >= 8 && paramsNameNumber <= 9) {
  286. splitNumber = 5;
  287. } else if (paramsNameNumber >= 10 && paramsNameNumber <= 14) {
  288. splitNumber = 5;
  289. } else {
  290. params = params && params.slice(0, 15);
  291. }
  292. var provideNumber = splitNumber; //一行显示几个字
  293. var rowNumber = Math.ceil(paramsNameNumber / provideNumber) || 0;
  294. if (paramsNameNumber > provideNumber) {
  295. for (var p = 0; p < rowNumber; p++) {
  296. var tempStr = "";
  297. var start = p * provideNumber;
  298. var end = start + provideNumber;
  299. if (p == rowNumber - 1) {
  300. tempStr = params.substring(start, paramsNameNumber);
  301. } else {
  302. tempStr = params.substring(start, end) + "\n";
  303. }
  304. newParamsName += tempStr;
  305. }
  306. } else {
  307. newParamsName = params;
  308. }
  309. params = newParamsName;
  310. return "{Sunny|" + params + "}";
  311. },
  312. color: "#1AA1FD",
  313. },
  314. },
  315. yAxis: {
  316. axisLine: {
  317. show: true,
  318. lineStyle: {
  319. color: "#1AA1FD",
  320. },
  321. symbol: ["none", "arrow"],
  322. },
  323. type: "value",
  324. axisTick: {
  325. show: false,
  326. },
  327. axisLabel: {
  328. show: false,
  329. },
  330. splitLine: {
  331. show: false,
  332. lineStyle: {
  333. color: "#1AA1FD",
  334. type: "solid",
  335. },
  336. },
  337. },
  338. series: myData.seriesArr,
  339. };
  340. // 使用刚指定的配置项和数据显示图表。
  341. if (option && typeof option === "object") {
  342. this.myChart.setOption(option);
  343. }
  344. },
  345. resetTimer() {
  346. this.timer && clearInterval(this.timer);
  347. this.timer = setInterval(() => {
  348. if (this.isMouseOver) {
  349. return;
  350. }
  351. this.activeName = getNextPeriod(this.types, this.activeName);
  352. this.getData();
  353. }, this.refreshTime);
  354. },
  355. },
  356. };
  357. </script>
  358. <style scoped src="./../css/index.css"></style>