Newer
Older
securityFront / src / views / statistics / doorCount.vue
wangxitong on 15 Mar 2021 10 KB 测试bug修改
<!--车辆进出列表-->
<template>
  <div class="app-container">
    <el-row :gutter="20">
      <!--人员出入次数-->
      <el-col :span="12">
        <el-form ref="selectForm" :inline="true" :model="personQuery" class="form-container">
          <el-row>
            <el-col :span="8">
              <el-form-item class="selectForm-container-item">
                <el-select v-model="personQuery.areaId" placeholder="请选择营门" clearable @change="fetchPersonData">
                  <el-option v-for="item in doorList" :key="item.value" :label="item.name" :value="item.value"/>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item class="selectForm-container-item">
                <el-date-picker
                  v-model="personTimeRange"
                  :picker-options="pickerOptions"
                  type="daterange"
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期" />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>

        <!-- 人员出入次数图表 -->
        <ve-line :data="personData" :title="personTitle" :settings="personSettings" style="padding-right: 20px"/>
      </el-col>

      <!--车辆出入次数-->
      <el-col :span="12">
        <el-form ref="selectForm" :inline="true" :model="carQuery" class="form-container">
          <el-row>
            <el-col :span="8">
              <el-form-item class="selectForm-container-item">
                <el-select v-model="carQuery.areaId" placeholder="请选择营门" clearable @change="fetchCarData">
                  <el-option v-for="item in doorList" :key="item.value" :label="item.name" :value="item.value"/>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item class="selectForm-container-item">
                <el-date-picker
                  v-model="carTimeRange"
                  :picker-options="pickerOptions"
                  type="daterange"
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期" />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>

        <!-- 车辆出入次数图表 -->
        <ve-line :data="carData" :title="carTitle" :settings="carSettings" style="padding-right: 20px"/>
      </el-col>
    </el-row>
  </div>
</template>

<script>
import { formatToString, parseToDate, oneDayTime } from '@/utils/calendarUtil'
import { personInOutCount, carInOutCount } from '@/api/statistics'
import { getAreaNameList, getAreaTypeBySubSystem } from '@/api/area'

const now = new Date()

export default {
  name: 'DoorCount',
  data() {
    return {
      personQuery: {
        areaId: '', // 营门(区域)id
        beginDate: '', // 开始事件
        endDate: '' // 结束事件
      }, // 人员筛选条件
      carQuery: {
        areaId: '', // 营门(区域)id
        beginDate: '', // 开始事件
        endDate: '' // 结束事件
      }, // 人员筛选条件
      doorList: [], // 营门(区域)列表
      personTimeRange: [],
      carTimeRange: [],
      listLoading: false, // 加载动画
      fullscreenLoading: false, // 全屏加载动画
      dialogFormVisible: false,
      areaType: '', // 区域类别
      personTitle: {
        text: '营门人员出入次数统计'
      },
      personSettings: {
        labelMap: {
          'staff': '内部人员',
          'visitor': '来访人员'
        },
        xAxisType: 'time',
        max: [4],
        area: true,
        metrics: ['staff', 'visitor'],
        dimension: ['date'],
        loading: this.listLoading
      },
      personData: {
        columns: ['date', 'staff', 'visitor'],
        rows: []
      },
      carTitle: {
        text: '营门车辆出入次数统计'
      },
      carSettings: {
        labelMap: {
          'staff': '内部车辆',
          'visitor': '来访车辆'
        },
        xAxisType: 'time',
        max: [4],
        area: true,
        metrics: ['staff', 'visitor'],
        dimension: ['date'],
        loading: this.listLoading
      },
      carData: {
        columns: ['date', 'staff', 'visitor'],
        rows: []
      },
      pickerOptions: {
        shortcuts: [{
          text: '最近七日',
          onClick(picker) {
            const end = now
            const start = new Date()
            start.setTime(start.getTime() - oneDayTime * 7)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近十日',
          onClick(picker) {
            const end = now
            const start = new Date()
            start.setTime(start.getTime() - oneDayTime * 10)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近三十日',
          onClick(picker) {
            const end = now
            const start = new Date()
            start.setTime(start.getTime() - oneDayTime * 30)
            picker.$emit('pick', [start, end])
          }
        }]
      }
    }
  },
  watch: {
    personTimeRange: function(newV) {
      if (newV) {
        this.personQuery.beginDate = formatToString(newV[0], 'DATE')
        this.personQuery.endDate = formatToString(newV[1], 'DATE')
      } else {
        this.personQuery.beginDate = ''
        this.personQuery.endDate = ''
      }
      this.fetchPersonData()
    },
    carTimeRange: function(newV) {
      if (newV) {
        this.carQuery.beginDate = formatToString(newV[0], 'DATE')
        this.carQuery.endDate = formatToString(newV[1], 'DATE')
      } else {
        this.carQuery.beginDate = ''
        this.carQuery.endDate = ''
      }
      this.fetchCarData()
    }
  },
  created() {
    this.initAreaType()
    this.fetchAreaNames()
  },
  activated() {
    this.fetchPersonData()// 获取数据
    this.fetchCarData() // 获取数据
  },
  methods: {
    // 查询数据
    initAreaType() {
      this.areaType = getAreaTypeBySubSystem(this.$store.getters.currentSystem.code)
    },
    fetchAreaNames() {
      getAreaNameList({ areaType: this.areaType }).then(response => {
        this.doorList = response.data
      })
    },
    // 获取列表
    fetchPersonData() {
      this.listLoading = true
      personInOutCount(this.personQuery).then(response => {
        if (response.code === 200) {
          const chartData = this.parseStatisticsData(response.data, 'person')
          this.personData.rows = chartData.rowDatas
          this.personSettings.max = [chartData.maxCount]

          this.listLoading = false
        } else {
          this.$message.error(response.message)
        }
        this.listLoading = false
      })
    },
    // 获取列表
    fetchCarData() {
      this.listLoading = true
      carInOutCount(this.carQuery).then(response => {
        if (response.code === 200) {
          const chartData = this.parseStatisticsData(response.data, 'car')
          this.carData.rows = chartData.rowDatas
          this.carSettings.max = [chartData.maxCount]

          this.listLoading = false
        } else {
          this.$message.error(response.message)
        }
        this.listLoading = false
      })
    },
    indexMethod(index) {
      return this.listQuery.limit * (this.listQuery.offset - 1) + index + 1
    },
    // 改变页容量
    handleSizeChange(val) {
      this.listQuery.limit = val
      this.fetchData()
    },
    // 改变当前页
    handleCurrentChange(val) {
      this.listQuery.offset = val
      this.fetchData()
    },
    parseStatisticsData(obj, type) {
      let staffList = []
      let visitorList = []
      if (type === 'person') {
        staffList = obj.person
        visitorList = obj.visitorPerson
      } else if (type === 'car') {
        staffList = obj.car
        visitorList = obj.visitorCar
      } else {
        return []
      }

      const rowDatas = [] // 返回的数据
      let maxCount = 4 // 返回的最大的计数值
      let indexS = 0
      let indexV = 0
      // 遍历内部人员(车辆)和来访人员(车辆),生成图表所需要的数据格式
      while (indexS < staffList.length || indexV < visitorList.length) {
        let staff = {}
        let visitor = {}

        // 获取内部人员(车辆)对象
        if (indexS < staffList.length) {
          staff = staffList[indexS]
        } else {
          staff = {}
        }

        // 获取来访人员(车辆)对象
        if (indexV < visitorList.length) {
          visitor = visitorList[indexV]
        } else {
          visitor = {}
        }

        // 如果内部人员(车辆)的队列已经取完则直接添加来访人员(车辆)
        if (typeof staff.date === 'undefined') {
          rowDatas.push({ date: visitor.date, visitor: visitor.count })
          indexV++
          maxCount = Math.max(maxCount, visitor.count)
          continue
        }

        // 如果来访人员(车辆)的队列已经取完则直接添加内部人员(车辆)
        if (typeof visitor.date === 'undefined') {
          rowDatas.push({ date: staff.date, staff: staff.count })
          indexS++
          maxCount = Math.max(maxCount, staff.count)
          continue
        }

        // 队列都还没有处理完成则比较日期的大小
        const visitorVal = parseToDate(visitor.date, 'DATE').valueOf()
        const staffVal = parseToDate(staff.date, 'DATE').valueOf()
        if (staffVal < visitorVal) {
          // 人员列表的日期比较小
          rowDatas.push({ date: staff.date, staff: staff.count })
          indexS++
          maxCount = Math.max(maxCount, staff.count)
        } else if (staffVal > visitorVal) {
          // 访客列表的日期比较小
          rowDatas.push({ date: visitor.date, visitor: visitor.count })
          indexV++
          maxCount = Math.max(maxCount, visitor.count)
        } else {
          rowDatas.push({ date: staff.date, staff: staff.count, visitor: visitor.count })
          indexS++
          indexV++
          maxCount = Math.max(maxCount, staff.count, visitor.count)
        }
      }
      // 设置最大值用以不显示小数
      maxCount = Math.ceil(maxCount * 1.1)

      // 返回生成好的图表数据
      return {
        rowDatas: rowDatas,
        maxCount: maxCount
      }
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  $tableTitleHeight:46px;
  .app-container{
    margin-bottom:20px
  }
  .table{
    margin-bottom: 20px;
  }
  .pagination-container{
    margin-bottom: 50px;
  }
  .table-title{
    background-color:rgba(76, 142, 226, 1);
    height: $tableTitleHeight;
    .title-header{
      line-height:$tableTitleHeight;
      color: white;
      font-size: 15px;
      i{
        margin-left: 5px;
        margin-right: 5px;
      }
    }
  }
  .edit_btns{
    .edit_btn{
      float:right;
      margin:7px 3px;//为了需要居中显示margin-top和bottom要用$tableTitleHeight减去按钮原高度除以2
    }
  }
</style>