guoshipeng
2023-07-06 63c0ecf98f3705b4c70e4bafee5f325966a5777b
src/views/reportForm/index.vue
@@ -1,34 +1,49 @@
<template>
  <div style="width:100%">
    <div class="topSelect">
      <div>
        <el-select v-model="value" placeholder="选择站点" style="width: 300px;">
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
      <div class="topSelect">
        <el-cascader
          v-model="newMac"
          :options="options"
          :props="props"
          collapse-tags
          clearable
          placeholder="选择设备"
          style="width: 21rem"
          />
        </el-select>
        <el-radio-group v-model="radio1" style="margin-left:20px">
          <el-radio-button label="时报" />
        <div>
          <el-radio-group v-model="select1" style="margin-left: 20px">
            <el-radio-button label="小时报" />
          <el-radio-button label="日报" />
          <el-radio-button label="周报" />
          <el-radio-button label="月报" />
          <el-radio-button label="自定义" />
        </el-radio-group>
        </div>
        <component
          :is="dataType"
          style="padding-left: 0; margin-left: 30px"
          @sendPickerChild="showPickerChild"
          class="select11"
        />
        <el-date-picker
          v-if="dateDisplay"
          v-model="value1"
          style="width:400px"
          v-model="newData"
          style="width: 400px; margin-left: 10px"
          type="daterange"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          value-format="yyyy-MM-dd"
          value-format="yyyy-MM-dd HH"
        />
      </div>
        <el-button
          type="primary"
          @click="getReportForm()"
          style="margin-left: 10px"
          >查询</el-button
        >
      <el-button type="primary" @click="exportExcel()">报表导出</el-button>
      </div>
    </div>
    <div class="topTitle">
      <el-table
@@ -37,69 +52,28 @@
        :data="tableData"
        border
        style="width: 100%"
        max-height="800"
        :stripe="true"
        @sort-change="changeTableSort"
      >
        <el-table-column
          prop="rank"
          label="排名"
        />
        <el-table-column
          prop="deviceName"
          label="设备"
          width="180"
        />
        <el-table-column
          prop="responsibleUnit"
          label="责任单位"
          width="180"
        />
        <el-table-column
          prop="time"
          label="时间"
          width="180"
        />
        <el-table-column
          prop="aqi"
          label="AQI"
          sortable
        />
        <el-table-column prop="rank" label="排名" />
        <el-table-column prop="deviceName" label="设备" width="180" />
        <el-table-column prop="responsibleUnit" label="责任单位" width="180" />
        <el-table-column prop="time" label="时间" width="180" />
        <el-table-column prop="aqi" label="AQI" sortable />
        <el-table-column
          prop="comIndex"
          label="综合指数"
          width="130"
          sortable
        />
        <el-table-column
          prop="a34004"
          label="PM2.5"
          sortable
        />
        <el-table-column
          prop="a34002"
          label="PM10"
          sortable
        />
        <el-table-column
          prop="a21026"
          label="SO2"
          sortable
        />
        <el-table-column
          prop="a21004"
          label="NO2"
          sortable
        />
        <el-table-column
          prop="a21005"
          label="CO"
          sortable
        />
        <el-table-column
          prop="a05024"
          label="O3_8H"
          sortable
        />
        <el-table-column prop="a34004" label="PM2.5" sortable />
        <el-table-column prop="a34002" label="PM10" sortable />
        <el-table-column prop="a21026" label="SO2" sortable />
        <el-table-column prop="a21004" label="NO2" sortable />
        <el-table-column prop="a21005" label="CO" sortable />
        <el-table-column prop="a05024" label="O3_8H" sortable />
        <el-table-column prop="a99054" label="TVOC" sortable />
      </el-table>
    </div>
  </div>
@@ -110,14 +84,39 @@
// 例如:import《组件名称》from'《组件路径》';
import FileSaver from 'file-saver'
import XLSX from 'xlsx'
import DatePicker from '@/components/Form/DatePicker'
import MouthPicker from '@/components/Form/MouthPicker'
import HourPicker from '@/components/Form/HourPicker'
import HourPicker1 from '@/components/Form/HourPicker1'
import CustomPicker from '@/components/Form/CustomPicker'
import CustomPicker1 from '@/components/Form/CustomPicker1'
import TimePicker1 from '@/components/Form/TimePicker1'
import weekPicker from '@/components/Form/weekPicker'
export default {
// import 引入的组件需要注入到对象中才能使用
  components: {},
  components: {
    DatePicker,
    MouthPicker,
    HourPicker,
    CustomPicker,
    CustomPicker1,
    TimePicker1,
    HourPicker1,
    weekPicker,
  },
  props: {},
  data() {
    // 这里存放数据
    return {
      newData: [],
      props: { multiple: true },
      newMac: '',
      newMac1: [],
      options: [],
      select1: '小时报',
      dataType: 'HourPicker1',
      unit: '0',
      radio1: '',
      value: '',
      value1: '',
@@ -126,7 +125,7 @@
      tableData: [],
      dateDisplay: false,
      newKey: 0,
      timearr: null
      timearr: null,
      // pickerOptions1: {
      //   disabledDate(time) {
      //     console.log(time)
@@ -142,60 +141,45 @@
  computed: {},
  // 监控data中的数据变化
  watch: {
    value(n, o) {
      this.monitorPointId = n
    },
    value1(n, o) {
      var timearr = this.getAll(n[0], n[1])
      if (timearr.length <= 7) {
        this.getReportForm(this.newKey)
      } else {
        this.$message({
          message: '日期天数不能大于7天',
          type: 'warning'
        })
    select1(nv, ov) {
      if (nv === '日报') {
        this.dataType = 'HourPicker'
        this.unit = 1
      } else if (nv === '月报') {
        this.dataType = 'DatePicker'
        this.unit = 3
      } else if (nv === '周报') {
        this.dataType = 'weekPicker'
        this.unit = 2
      } else if (nv === '小时报') {
        this.dataType = 'HourPicker1'
        this.unit = 0
      }
    },
    radio1(n, o) {
      // var newKey
      switch (n) {
        case '时报':
          this.newKey = 0
          break
        case '日报':
          this.newKey = 1
          break
        case '周报':
          this.newKey = 2
          break
        case '月报':
          this.newKey = 3
          break
        case '自定义':
          this.newKey = 4
          break
        default:
          this.newKey = 4
          break
      }
      if (this.newKey === 4) {
      if (nv === '自定义') {
        this.newData = []
        this.dateDisplay = true
        this.unit = null
        this.dataType = ''
      } else {
        this.dateDisplay = false
      }
      // if (!this.newKey === 'custom') {
      this.getReportForm(this.newKey)
      // }
    }
  },
    newMac(newVal, oldval) {
      this.newMac1 = []
      for (let i = 0; i < newVal.length; i++) {
        // console.log(newVal[i], 111)
        this.newMac1.push(newVal[i][1][1])
      }
      // 设备更新后,重新获取因子数据
    },
  },
  // 生命周期 - 创建完成(可以访问当前 this 实例)
  created() {
    this.getMonitorPointId()
    this.getData()
  },
  // 生命周期 - 挂载完成(可以访问 DOM 元素)
  mounted() {
  },
  mounted() {},
  beforeCreate() {}, // 生命周期 - 创建之前
  beforeMount() {}, // 生命周期 - 挂载之前
  beforeUpdate() {}, // 生命周期 - 更新之前
@@ -205,6 +189,9 @@
  activated() {},
  // 方法集合
  methods: {
    showPickerChild(data) {
      this.newData = data
    },
    // 重新添加rank排名(当表格的排序条件发生变化的时候会触发该事件)
    changeTableSort() {
      var sortTableData = this.$refs.mytable.tableData
@@ -213,111 +200,27 @@
        sortTableData[i].rank = i + 1
      }
    },
    // changeTableSort({ column, prop, order }) {
    //   var sortTableData = this.$refs.mytable.tableData
    //   for (let i = 0; i < sortTableData.length; i++) {
    //     sortTableData[i].rank = i + 1
    //   }
    // },
    // 计算自定义天数
    // 计算续住的总日期列表
    getAll(begin, end) {
      const arr1 = begin.split('-') // 这里可以换成/  就2020/01/1 这种
      const arr2 = end.split('-')
      const arr1_ = new Date()
      const arrTime = []
      // console.log(arr1, arr2, arr1_)
      arr1_.setUTCFullYear(arr1[0], arr1[1] - 1, arr1[2])
      const arr2_ = new Date()
      arr2_.setUTCFullYear(arr2[0], arr2[1] - 1, arr2[2])
      const unixDb = arr1_.getTime()
      const unixDe = arr2_.getTime()
      for (let k = unixDb; k <= unixDe;) {
        arrTime.push(this.datetimeparse(k, 'YY-MM-DD'))
        k = k + 24 * 60 * 60 * 1000
      }
      return arrTime
    },
    // 时间格式处理
    datetimeparse(timestamp, format, prefix) {
      if (typeof timestamp === 'string') {
        timestamp = Number(timestamp)
      }
      // 转换时区
      const currentZoneTime = new Date(timestamp)
      let currentTimestamp = currentZoneTime.getTime()
      const offsetZone = currentZoneTime.getTimezoneOffset() / 60 // 如果offsetZone>0是西区,西区晚
      let offset = null
      // 客户端时间与服务器时间保持一致,固定北京时间东八区。
      offset = offsetZone + 8
      currentTimestamp = currentTimestamp + offset * 3600 * 1000
      let newtimestamp = null
      if (currentTimestamp) {
        if (currentTimestamp.toString().length === 13) {
          newtimestamp = currentTimestamp.toString()
        } else if (currentTimestamp.toString().length === 10) {
          newtimestamp = currentTimestamp + '000'
        } else {
          newtimestamp = null
        }
      } else {
        newtimestamp = null
      }
      const dateobj = newtimestamp ? new Date(parseInt(newtimestamp)) : new Date()
      const YYYY = dateobj.getFullYear()
      const MM = dateobj.getMonth() > 8 ? dateobj.getMonth() + 1 : '0' + (dateobj.getMonth() + 1)
      const DD = dateobj.getDate() > 9 ? dateobj.getDate() : '0' + dateobj.getDate()
      const HH = dateobj.getHours() > 9 ? dateobj.getHours() : '0' + dateobj.getHours()
      const mm = dateobj.getMinutes() > 9 ? dateobj.getMinutes() : '0' + dateobj.getMinutes()
      const ss = dateobj.getSeconds() > 9 ? dateobj.getSeconds() : '0' + dateobj.getSeconds()
      let output = ''
      let separator = '/'
      if (format) {
        separator = format.match(/-/) ? '-' : '/'
        output += format.match(/yy/i) ? YYYY : ''
        output += format.match(/MM/) ? (output.length ? separator : '') + MM : ''
        output += format.match(/dd/i) ? (output.length ? separator : '') + DD : ''
        output += format.match(/hh/i) ? (output.length ? ' ' : '') + HH : ''
        output += format.match(/mm/) ? (output.length ? ':' : '') + mm : ''
        output += format.match(/ss/i) ? (output.length ? ':' : '') + ss : ''
      } else {
        output += YYYY + separator + MM + separator + DD
      }
      output = prefix ? (prefix + output) : output
      return newtimestamp ? output : ''
    },
    getTime() {
      if (this.form.beginTime && this.form.endTime) {
        var beginTime = this.formatTime(this.form.beginTime, 1)
        var endTime = this.formatTime(this.form.endTime, 1)
        var dateBegin = new Date(beginTime)
        var dateEnd = new Date(endTime)
        if (dateBegin.getTime() > dateEnd.getTime()) {
          this.form.beginTime = null
          this.form.endTime = null
          alert('开始时间不能大于结束时间!')
          return
        }
        this.difference(dateBegin, dateEnd)
      }
    },
    difference(dateBegin, dateEnd) {
      var dateDiff = dateEnd.getTime() - dateBegin.getTime()// 时间差的毫秒数
      var dayDiff = Math.ceil(dateDiff / (24 * 3600 * 1000))// 计算出相差天数
      this.form.alltime = dayDiff
    },
    // 导出报表
    exportExcel() {
      /* generate workbook object from table */
      var xlsxParam = { raw: true } // 导出的内容只做解析,不进行格式转换
      var wb = XLSX.utils.table_to_book(document.querySelector('#exportTab'), xlsxParam)
      var wb = XLSX.utils.table_to_book(
        document.querySelector('#exportTab'),
        xlsxParam
      )
      /* get binary string as output */
      var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
      var wbout = XLSX.write(wb, {
        bookType: 'xlsx',
        bookSST: true,
        type: 'array',
      })
      try {
        FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), '站点数据表.xlsx')
        FileSaver.saveAs(
          new Blob([wbout], { type: 'application/octet-stream' }),
          '站点数据表.xlsx'
        )
      } catch (e) {
        if (typeof console !== 'undefined') {
          console.log(e, wbout)
@@ -326,35 +229,55 @@
      return wbout
    },
    // 请求站点信息
    getMonitorPointId() {
    getData() {
      this.$request({
        url: '/monitorPoint/queryAllMonitorPoints',
        url: '/monitorPoint/queryMonitorPoints',
        method: 'get',
        params: {
          organizationId: this.$store.state.orgId
        }
      }).then((res) => {
        // console.log('请求站点的信息')
          organizationId: this.$store.state.orgId,
        },
      })
        .then((res) => {
          // console.log('这是index页面左侧设备数据')
        // console.log(res)
        for (let i = 0; i < res.data.length; i++) {
          this.options.push({ value: res.data[i].id, label: res.data[i].name })
          this.defaultData = res.data.monitorPoints
          for (let i = 0; i < this.defaultData.length; i++) {
            this.options.push({
              value: this.defaultData[i].name,
              label: this.defaultData[i].name,
            })
            this.options[i].children = []
            for (let j = 0; j < this.defaultData[i].devices.length; j++) {
              this.options[i].children.push({
                value: [
                  this.defaultData[i].devices[j].name,
                  this.defaultData[i].devices[j].mac,
                ],
                label: this.defaultData[i].devices[j].name,
              })
        }
      }).catch((err) => {
        console.log(err)
          }
        })
        .catch((error) => {
          console.log(error)
      })
    },
    // 请求报表数据
    getReportForm(key) {
    getReportForm() {
      this.$request({
        url: '/dataDisplay/monitorPointDataDisplay',
        method: 'get',
        params: {
          monitorPointId: this.monitorPointId,
          reportType: key === 4 ? null : key,
          startTime: key === 4 ? this.value1[0] : null,
          endTime: key === 4 ? this.value1[1] : null
        }
      }).then((res) => {
        method: 'post',
        data: {
          macs: this.newMac1,
          reportType: this.unit,
          // monitorPointId: this.monitorPointId,
          // reportType: key === 4 ? null : key,
          startTime: this.unit === 2 ? this.newData : this.newData[0],
          endTime: this.unit === 2 ? null : this.newData[1],
          // times: this.newData instanceof Array ? this.newData : [this.newData],
        },
      })
        .then((res) => {
        console.log(res)
        if (res.code !== 0) {
          return
@@ -367,11 +290,12 @@
        // for (let i = 0; i < res.data.data.length; i++) {
        //   this.tableData.push({ ranking: this.defaultData[i].rank, name: this.defaultData[i].name, responsibleUnit: this.defaultData[i].responsibleUnit, time: this.defaultData[i].time, AQI: this.defaultData[i].AQI, compositeIndex: this.defaultData[i].compositeIndex, PM2_5: this.defaultData[i].PM2_5, PM10: this.defaultData[i].PM10, SO2: this.defaultData[i].SO2, NO2: this.defaultData[i].NO2, CO: this.defaultData[i].CO, O3: this.defaultData[i].O3 })
        // }
      }).catch((err) => {
        })
        .catch((err) => {
        console.log(err)
      })
    }
  } // 如果页面有keep-alive缓存功能,这个函数会触发
    },
  }, // 如果页面有keep-alive缓存功能,这个函数会触发
}
</script>
<style scoped lang="scss">
@@ -379,11 +303,11 @@
    display: flex;
    margin-bottom: 20px;
    padding: 20px 15px 0 15px;
    display: flex;
    justify-content: space-between;
    span:first-child{
        flex: 1;
    }
  // display: flex;
  // justify-content: space-between;
  // span:first-child {
  //   flex: 1;
  // }
    // div:last-child{
    //     width: 300px;
    //     line-height: 40px;
@@ -396,4 +320,7 @@
    margin-bottom: 20px;
    padding: 0 15px;
}
.select11 {
  width: 20% !important;
}
</style>