| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 | <template>  <div class="component_box" style="padding-top: 10px">    <div class="header">{{ title }}</div>    <div>      <el-tabs v-model="activeName" @tab-click="handleClick">        <el-tab-pane          v-for="t in types"          :key="t.value"          :label="t.text"          :name="t.value"        ></el-tab-pane>      </el-tabs>    </div>    <div      ref="chart"      style="width: 100%; height: calc(100% - 40px)"      @mouseenter="handleMouseEnter"      @mouseleave="handleMouseLeave"    ></div>  </div></template><script>const types = [  {    text: "近七天",    value: "0",  },  {    text: "近七周",    value: "1",  },  {    text: "近半年",    value: "2",  },];import { alarmTrend } from "@/api/iot/board";import * as echarts from "echarts";import { getNextPeriod } from "@/views/board/utils.js";export default {  props: {    orgId: {      type: String,      isRequired: true,    },  },  data() {    return {      types,      data: {        date: [], //x轴的日期        total: [], //报警总数        countByType: [], //按分类统计的报警总数      },      title: "近七天告警趋势",      isMouseOver: false,      activeName: types[0].value,    };  },  components: {},  computed: {},  watch: {    orgId: {      deep: true,      handler(val) {        this.resetTimer();        this.getData();      },    },    data: {      deep: true,      handler() {        this.initMap();      },    },  },  created() {    this.maxDisplay = 16;    this.refreshTime = 1 * 60 * 1000;    this.isMouseOver = false;  },  async mounted() {    window.addEventListener("resize", this.windowResize);  },  beforeDestroy() {    this.timer && clearInterval(this.timer);    this.timer = null;    window.removeEventListener("resize", this.windowResize);  },  methods: {    handleClick() {      this.title = types[this.activeName].text + "告警趋势";      this.resetTimer();      this.getData();    },    handleMouseEnter() {      this.isMouseOver = true;    },    handleMouseLeave() {      this.isMouseOver = false;    },    async getData() {      let r = (await alarmTrend(this.orgId, this.activeName)).data;      let data = {        date: [], //x轴的日期        total: [], //报警总数        countByType: [], //按分类统计的报警总数      };      let monitorCount = [];      let fireCount = [];      let environmentCount = [];      for (let item of r) {        data.total.push(item.total);        monitorCount.push(item.monitorCount);        fireCount.push(item.fireCount);        environmentCount.push(item.environmentCount);        data.date.push(item.date);      }      data.countByType.push(monitorCount);      data.countByType.push(fireCount);      data.countByType.push(environmentCount);      this.data = data;    },    windowResize() {      this.myChart && this.myChart.resize();    },    initMap() {      this.myChart && this.myChart.dispose();      let c = this.$refs["chart"];      // 基于准备好的dom,初始化echarts实例      this.myChart = echarts.init(c);      var data = {        id: "multipleBarsLines",        title: types[this.activeName].text + "告警趋势",        legendBar: ["报警总数"],        symbol: "", //数值是否带百分号        --默认为空 ''        legendLine: ["监控设备", "消防设备", "环境监测"],        // xAxis: ["9月19", "9月20", "9月21", "9月22", "9月23", "9月24", "9月25"],        // yAxis: [[8, 10, 10, 11, 4, 13, 8]],        // lines: [        //     [4, 3, 2, 4, 2, 1, 1],        //     [2, 1, 4, 2, 3, 2, 4],        //     [1, 0, 2, 1, 1, 2, 1],        // ],        barColor: ["#3FA7DC", "#7091C4", "#5170A2"], //柱子颜色 必填参数        lineColor: ["#D9523F"], // 折线颜色      };      /////////////end/////////      var myData = (() => {        var yAxis = [this.data.total] || [];        var lines = this.data.countByType || [];        var legendBar = data.legendBar || [];        var legendLine = data.legendLine || [];        var symbol = data.symbol || " ";        var seriesArr = [];        var legendArr = [];        yAxis &&          yAxis.forEach((item, index) => {            legendArr.push({              name: legendBar && legendBar.length > 0 && legendBar[index],            });            seriesArr.push({              name: legendBar && legendBar.length > 0 && legendBar[index],              type: "bar",              barGap: "0.5px",              data: item,              barWidth: data.barWidth || 12,              label: {                show: true,                formatter: "{c}" + symbol,                position: "top",                color: "#fff",                fontStyle: "normal",                fontFamily: "微软雅黑",                textAlign: "left",                fontSize: 11,              },              itemStyle: {                borderRadius: 4,                color: data.barColor[index],              },            });          });        lines &&          lines.forEach((item, index) => {            legendArr.push({              name: legendLine && legendLine.length > 0 && legendLine[index],            });            seriesArr.push({              name: legendLine && legendLine.length > 0 && legendLine[index],              type: "line",              data: item,              itemStyle: {                color: data.lineColor[index],                lineStyle: {                  width: 3,                  type: "solid",                },              },              label: {                show: false, //折线上方label控制显示隐藏                position: "top",              },              symbol: "circle",              symbolSize: 10,            });          });        return {          seriesArr,          legendArr,        };      })();      //   console.info(myData);      let option = {        // title: {        //   show: false,        //   top: "5%",        //   left: "3%",        //   text: data.title,        //   textStyle: {        //     fontSize: 18,        //     color: "#fff",        //   },        //   subtext: data.subTitle,        //   link: "",        // },        tooltip: {          trigger: "axis",          formatter: function (params) {            var time = "";            var str = "";            for (var i of params) {              time = i.name.replace(/\n/g, "") + "<br/>";              if (i.data == "null" || i.data == null) {                str += i.seriesName + ":无数据" + "<br/>";              } else {                str += i.seriesName + ":" + i.data + data.symbol + "<br/>";              }            }            return time + str;          },          axisPointer: {            type: "none",          },        },        legend: {          right: data.legendRight || "30%",          top: "3%",          right: "5%",          itemGap: 16,          itemWidth: 10,          itemHeight: 10,          data: myData.legendArr,          textStyle: {            color: "#fff",            fontStyle: "normal",            fontFamily: "微软雅黑",            fontSize: 12,          },        },        grid: {          x: 30,          y: 60,          x2: 30,          y2: 60,        },        xAxis: {          type: "category",          data: this.data.date,          axisTick: {            show: false,          },          axisLine: {            show: true,            lineStyle: {              color: "#1AA1FD",            },            symbol: ["none", "arrow"],          },          axisLabel: {            show: true,            interval: "0",            lineHeight: 16,            padding: [2, 2, 0, 2],            height: 50,            fontSize: 12,            rich: {              Sunny: {                height: 50,                // width: 60,                padding: [0, 5, 0, 5],                align: "center",              },            },            formatter: function (params, index) {              var newParamsName = "";              var splitNumber = 6;              var paramsNameNumber = params && params.length;              //   if (paramsNameNumber && paramsNameNumber <= 4) {              //     splitNumber = 4;              //   } else if (paramsNameNumber >= 5 && paramsNameNumber <= 7) {              //     splitNumber = 5;              //   } else if (paramsNameNumber >= 8 && paramsNameNumber <= 9) {              //     splitNumber = 5;              //   } else if (paramsNameNumber >= 10 && paramsNameNumber <= 14) {              //     splitNumber = 5;              //   } else {              //     params = params && params.slice(0, 15);              //   }              var provideNumber = splitNumber; //一行显示几个字              var rowNumber = Math.ceil(paramsNameNumber / provideNumber) || 0;              if (paramsNameNumber > provideNumber) {                for (var p = 0; p < rowNumber; p++) {                  var tempStr = "";                  var start = p * provideNumber;                  var end = start + provideNumber;                  if (p == rowNumber - 1) {                    tempStr = params.substring(start, paramsNameNumber);                  } else {                    tempStr = params.substring(start, end) + "\n";                  }                  newParamsName += tempStr;                }              } else {                newParamsName = params;              }              params = newParamsName;              return "{Sunny|" + params + "}";            },            color: "#1AA1FD",          },        },        yAxis: {          axisLine: {            show: true,            lineStyle: {              color: "#1AA1FD",            },            symbol: ["none", "arrow"],          },          type: "value",          axisTick: {            show: false,          },          axisLabel: {            show: false,          },          splitLine: {            show: false,            lineStyle: {              color: "#1AA1FD",              type: "solid",            },          },        },        series: myData.seriesArr,      };      // 使用刚指定的配置项和数据显示图表。      if (option && typeof option === "object") {        this.myChart.setOption(option);      }    },    resetTimer() {      this.timer && clearInterval(this.timer);      this.timer = setInterval(() => {        if (this.isMouseOver) {          return;        }        this.activeName = getNextPeriod(this.types, this.activeName);        this.getData();      }, this.refreshTime);    },  },};</script><style scoped src="./../css/index.css"></style><style lang="scss" scoped>.header {  position: absolute;  top: calc(15px + 20px);  left: calc(18px + 3%);  font-size: 20px;  // font-weight: 700;}.component_box {  ::v-deep .el-tabs__nav-scroll {    justify-content: right !important;  }}</style>
 |