211 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			211 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
| 
								 | 
							
								<!--用电、用水使用趋势-->
							 | 
						||
| 
								 | 
							
								<template>
							 | 
						||
| 
								 | 
							
								  <div id="charts" ref="charts">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  </div>
							 | 
						||
| 
								 | 
							
								</template>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script>
							 | 
						||
| 
								 | 
							
								import * as echarts from 'echarts'
							 | 
						||
| 
								 | 
							
								import {EleResize} from '@/utils/esresize';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const lodash = require('lodash')
							 | 
						||
| 
								 | 
							
								export default {
							 | 
						||
| 
								 | 
							
								  name: 'ElectricityWaterCharts',
							 | 
						||
| 
								 | 
							
								  props: {
							 | 
						||
| 
								 | 
							
								    dataSource: {
							 | 
						||
| 
								 | 
							
								      type: Array,
							 | 
						||
| 
								 | 
							
								      default: () => []
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    color: {
							 | 
						||
| 
								 | 
							
								      type: Array,
							 | 
						||
| 
								 | 
							
								      default: () => [
							 | 
						||
| 
								 | 
							
								        '#00D5FF',
							 | 
						||
| 
								 | 
							
								        '#FDBD00',
							 | 
						||
| 
								 | 
							
								        '#1978E5'
							 | 
						||
| 
								 | 
							
								      ]
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  data() {
							 | 
						||
| 
								 | 
							
								    return {}
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  watch: {
							 | 
						||
| 
								 | 
							
								    dataSource: {
							 | 
						||
| 
								 | 
							
								      deep: true,
							 | 
						||
| 
								 | 
							
								      immediate: true,
							 | 
						||
| 
								 | 
							
								      handler(value) {
							 | 
						||
| 
								 | 
							
								        if (value.length) {
							 | 
						||
| 
								 | 
							
								          this.$nextTick(() => {
							 | 
						||
| 
								 | 
							
								            this.init()
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  mounted() {
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  methods: {
							 | 
						||
| 
								 | 
							
								    init() {
							 | 
						||
| 
								 | 
							
								      let myCharts = echarts.init(this.$refs.charts)
							 | 
						||
| 
								 | 
							
								      let barCharts = this.$refs.charts
							 | 
						||
| 
								 | 
							
								      // 复制代码
							 | 
						||
| 
								 | 
							
								      let color = this.color;
							 | 
						||
| 
								 | 
							
								      let chartData = this.dataSource;
							 | 
						||
| 
								 | 
							
								      //将数据根据attr进行分组
							 | 
						||
| 
								 | 
							
								      let dataSourceByAttrObj = lodash.groupBy(chartData, 'attr')
							 | 
						||
| 
								 | 
							
								      //将不同对象的值转换成不同的数组
							 | 
						||
| 
								 | 
							
								      let dataSource = Object.values(dataSourceByAttrObj)
							 | 
						||
| 
								 | 
							
								      //过滤x轴名称
							 | 
						||
| 
								 | 
							
								      let xAxisName = []
							 | 
						||
| 
								 | 
							
								      let nameLengthMaxIndex = 0
							 | 
						||
| 
								 | 
							
								      let nameLength = 0
							 | 
						||
| 
								 | 
							
								      //找出name最多的数据
							 | 
						||
| 
								 | 
							
								      for (const index in dataSource) {
							 | 
						||
| 
								 | 
							
								        let xAxisNameList = dataSource[index].map(item => item.name) || []
							 | 
						||
| 
								 | 
							
								        if (xAxisNameList.length > nameLength) {
							 | 
						||
| 
								 | 
							
								          nameLength = xAxisNameList.length
							 | 
						||
| 
								 | 
							
								          nameLengthMaxIndex = index
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      //将挑选的name作为x轴数据
							 | 
						||
| 
								 | 
							
								      xAxisName = dataSource[nameLengthMaxIndex].map(item => item.name) || []
							 | 
						||
| 
								 | 
							
								      //获取y周值
							 | 
						||
| 
								 | 
							
								      let attrNames = Object.keys(dataSourceByAttrObj)
							 | 
						||
| 
								 | 
							
								      let seriesList = []
							 | 
						||
| 
								 | 
							
								      console.log('dataSource:', dataSource)
							 | 
						||
| 
								 | 
							
								      for (const index in dataSource) {
							 | 
						||
| 
								 | 
							
								        let yAxisDataSource = dataSource[index].map(item => item.value)
							 | 
						||
| 
								 | 
							
								        let series = {
							 | 
						||
| 
								 | 
							
								          name: attrNames[index],
							 | 
						||
| 
								 | 
							
								          backgroundStyle: {
							 | 
						||
| 
								 | 
							
								            color: 'rgba(180, 180, 180, 0.1)'
							 | 
						||
| 
								 | 
							
								          },
							 | 
						||
| 
								 | 
							
								          showBackground: true,
							 | 
						||
| 
								 | 
							
								          type: 'bar',
							 | 
						||
| 
								 | 
							
								          color: 'transparent',
							 | 
						||
| 
								 | 
							
								          yAxisIndex: 0,
							 | 
						||
| 
								 | 
							
								          barWidth: '60',
							 | 
						||
| 
								 | 
							
								          data: yAxisDataSource,
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        let topBar =
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								            data: yAxisDataSource,
							 | 
						||
| 
								 | 
							
								            type: "pictorialBar",
							 | 
						||
| 
								 | 
							
								            yAxisIndex: 0,
							 | 
						||
| 
								 | 
							
								            color: color[index],
							 | 
						||
| 
								 | 
							
								            symbol: 'rect',
							 | 
						||
| 
								 | 
							
								            symbolPosition: 'end', // 在数据结尾显示
							 | 
						||
| 
								 | 
							
								            symbolSize: [60, 20], // 「树叶大小」
							 | 
						||
| 
								 | 
							
								            symbolOffset: ['0', '0'], //「偏移量」
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        seriesList.push(topBar)
							 | 
						||
| 
								 | 
							
								        seriesList.push(series)
							 | 
						||
| 
								 | 
							
								        console.log()
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      let option = {
							 | 
						||
| 
								 | 
							
								        color: color,
							 | 
						||
| 
								 | 
							
								        legend: {
							 | 
						||
| 
								 | 
							
								          show: false,
							 | 
						||
| 
								 | 
							
								          top: 20,
							 | 
						||
| 
								 | 
							
								          left: '30%',
							 | 
						||
| 
								 | 
							
								          itemWidth: 22,
							 | 
						||
| 
								 | 
							
								          itemHeight: 22,
							 | 
						||
| 
								 | 
							
								          icon: 'circle',
							 | 
						||
| 
								 | 
							
								          textStyle: {
							 | 
						||
| 
								 | 
							
								            color: 'rgba(106,196,255,0.60)',
							 | 
						||
| 
								 | 
							
								            fontSize: 30,
							 | 
						||
| 
								 | 
							
								            padding: [0, 0, 0, 20]
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        tooltip: {
							 | 
						||
| 
								 | 
							
								          trigger: 'axis',
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        grid: {
							 | 
						||
| 
								 | 
							
								          top: 60,
							 | 
						||
| 
								 | 
							
								          containLabel: true,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        xAxis: [
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								            type: 'category',
							 | 
						||
| 
								 | 
							
								            boundaryGap: true,
							 | 
						||
| 
								 | 
							
								            axisLabel: {
							 | 
						||
| 
								 | 
							
								              fontSize: 30,
							 | 
						||
| 
								 | 
							
								              color: 'rgba(106,196,255,0.60)'
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            axisLine: {
							 | 
						||
| 
								 | 
							
								              show: true,
							 | 
						||
| 
								 | 
							
								              lineStyle: {
							 | 
						||
| 
								 | 
							
								                color: 'rgba(176,215,255,0.40)',
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            axisTick: {
							 | 
						||
| 
								 | 
							
								              show: false
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            data: xAxisName,
							 | 
						||
| 
								 | 
							
								          },
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								        yAxis: [
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								            type: 'value',
							 | 
						||
| 
								 | 
							
								            splitNumber: 5,
							 | 
						||
| 
								 | 
							
								            axisLabel: {
							 | 
						||
| 
								 | 
							
								              fontSize: 30,
							 | 
						||
| 
								 | 
							
								              color: 'rgba(106,196,255,0.60)'
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            nameTextStyle: {
							 | 
						||
| 
								 | 
							
								              color: 'rgba(106,196,255,0.60)',
							 | 
						||
| 
								 | 
							
								              fontSize: 30,
							 | 
						||
| 
								 | 
							
								              lineHeight: 40,
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            // 分割线
							 | 
						||
| 
								 | 
							
								            splitLine: {
							 | 
						||
| 
								 | 
							
								              show: false,
							 | 
						||
| 
								 | 
							
								              lineStyle: {
							 | 
						||
| 
								 | 
							
								                color: 'rgba(176,215,255,0.40)',
							 | 
						||
| 
								 | 
							
								                type: 'dashed'
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            axisLine: {
							 | 
						||
| 
								 | 
							
								              show: false,
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            axisTick: {
							 | 
						||
| 
								 | 
							
								              show: false,
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								          },
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								            splitNumber: 4,
							 | 
						||
| 
								 | 
							
								            type: 'value', scale: true, min: 0,
							 | 
						||
| 
								 | 
							
								            nameTextStyle: {color: '#fff', fontSize: 12},
							 | 
						||
| 
								 | 
							
								            // y轴线
							 | 
						||
| 
								 | 
							
								            splitLine: {show: false},
							 | 
						||
| 
								 | 
							
								            // y轴
							 | 
						||
| 
								 | 
							
								            axisLine: {lineStyle: {color: 'rgba(255, 255, 255, .35)'}},
							 | 
						||
| 
								 | 
							
								            // 文字
							 | 
						||
| 
								 | 
							
								            axisLabel: {textStyle: {fontSize: 14, color: '#fff'}},
							 | 
						||
| 
								 | 
							
								            // 刻度
							 | 
						||
| 
								 | 
							
								            axisTick: {show: false}
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								        series: seriesList,
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      myCharts.setOption(option)
							 | 
						||
| 
								 | 
							
								      let listener = function () {
							 | 
						||
| 
								 | 
							
								        myCharts.resize()
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      EleResize.on(barCharts, listener)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<style scoped lang="less">
							 | 
						||
| 
								 | 
							
								#charts {
							 | 
						||
| 
								 | 
							
								  height: 100%;
							 | 
						||
| 
								 | 
							
								  width: 100%;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</style>
							 |