Newer
Older
smartwell_front_yizhuang / src / views / deviceStatics / components / deviceCountByDept.vue
StephanieGitHub on 8 Jul 2020 3 KB 亦庄迁移
<template>
  <div>
    <el-row>
      <el-col :span="12" :offset="6">
        <div class="chart-title">各单位设备安装情况数量统计</div>
      </el-col>
    </el-row>
    <div v-show="showDeviceType">
      <el-row :gutter="20" type="flex" justify="end">
        <el-col :span="8" style="margin-right: 30px">
          <el-select v-model="listQuery.deviceType" class="select-right" size="mini" placeholder="设备类型" clearable @change="fetchData">
            <el-option
              v-for="item in deviceTypeList"
              :key="item.value"
              :label="item.name"
              :value="item.value"/>
          </el-select>
        </el-col>
      </el-row>
    </div>
    <div>
      <ve-histogram :loading="loading" :data="chartData" :extend="extend" :settings="chartSettings" height="440px"/>
    </div>
  </div>
</template>

<script>
import { getDeviceType } from '@/api/device'
import { deviceStaticsByDept } from '@/api/dataStatics'
import 'v-charts/lib/style.css'
export default {
  name: 'DeviceCountByDept',
  data() {
    return {
      listQuery: {
        deviceType: ''
      }, // 查询条件
      showDeviceType: true, // 是否显示选择设备类型选项
      deviceTypeList: [], // 设备类型列表,下拉选项
      chartData: {
        columns: ['deptName', 'deviceCount'], // 维度和指标
        rows: [] // 数据集合
      }, // 数据
      chartSettings: {
        labelMap: {
          'deptName': '权属单位',
          'deviceCount': '设备数量(个)'
        } // 设置字段映射
      }, // 配置项
      extend: {
        xAxis: {
          axisLabel: {
            rotate: 30,
            margin: 30,
            textStyle: {
              align: 'center'
            }
          }
        },
        yAxis: {
          max: 10 // y轴最大值
        },
        series: {
          barMaxWidth: 35 // 最大柱宽度
        }
      }, // 扩展配置项
      loading: true // 加载状态
    }
  },
  created() {
    this.fetchDeviceType()
    this.fetchData()
  },
  activated() {
    this.fetchData()
  },
  methods: {
    // 获取设备类型
    fetchDeviceType() {
      getDeviceType(this.listQuery).then(response => {
        this.deviceTypeList = [{
          name: '全部设备',
          value: ''
        }]
        // 过滤掉该单位不支持的设备类型
        const deviceTypes = this.$store.getters.deviceTypes
        for (const deviceType of response.data) {
          if (deviceTypes.indexOf(deviceType.value) !== -1) {
            this.deviceTypeList.push(deviceType)
          }
        }
        if (this.deviceTypeList.length <= 1) {
          this.showDeviceType = false
        }
      })
    },
    fetchData() {
      this.loading = true
      deviceStaticsByDept(this.listQuery).then(response => {
        this.chartData.rows = response.data
        // 获取数据的最大值,来确定y轴显示范围
        const maxValue = Math.max.apply(Math, response.data.map(function(item) { return item.deviceCount }))
        if (maxValue < 10) {
          this.extend.yAxis = { max: 10 }
        } else {
          this.extend.yAxis = {}
        }
        // 解决文字较长无法全部水平展示问题:判断有几个柱需要显示,若大于6个让X轴文字倾斜30度
        if (this.chartData.rows.length > 6) {
          this.extend.xAxis = {
            axisLabel: {
              rotate: 30,
              margin: 30,
              textStyle: {
                align: 'center'
              }
            }
          }
        } else {
          this.extend.xAxis = {}
        }
        // 设置柱最大宽度
        this.extend.series = { barMaxWidth: 35 }
        this.loading = false
      })
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .chart-title{
    margin: auto;
    text-align: center;
    margin-top: 15px;
    font-size:20px;
    font-weight:600
  }
  .select-right{
    /*margin-right: 25px;*/
    margin-top: 15px;
    /*width: 200px*/
  }
</style>