| | |
| | | <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" |
| | | /> |
| | | </el-select> |
| | | <el-radio-group v-model="radio1" 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> |
| | | <el-date-picker |
| | | v-if="dateDisplay" |
| | | v-model="value1" |
| | | style="width:400px" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="yyyy-MM-dd" |
| | | /> |
| | | </div> |
| | | <el-button type="primary" @click="exportExcel()">报表导出</el-button> |
| | | </div> |
| | | <div class="topTitle"> |
| | | <el-table |
| | | id="exportTab" |
| | | :default-sort="{prop: 'rank', order: 'ascending'}" |
| | | :data="tableData" |
| | | border |
| | | style="width: 100%" |
| | | :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="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> |
| | | </div> |
| | | </div> |
| | | <el-tabs |
| | | v-model="activeName" |
| | | type="card" |
| | | @tab-click="handleClick" |
| | | style="height: 100%" |
| | | > |
| | | <el-tab-pane name="first" label="基于因子展示"> |
| | | <keep-alive> |
| | | <sensor /> |
| | | </keep-alive> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="监测站数据展示" name="second"> |
| | | <keep-alive> |
| | | <sensorday /> |
| | | </keep-alive> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </template> |
| | | |
| | | <script> |
| | | // 这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等) |
| | | // 例如:import《组件名称》from'《组件路径》'; |
| | | import FileSaver from 'file-saver' |
| | | import XLSX from 'xlsx' |
| | | import sensor from '@/views/reportForm/sensor' |
| | | import sensorday from '@/views/reportForm/sensorday' |
| | | export default { |
| | | // import 引入的组件需要注入到对象中才能使用 |
| | | components: {}, |
| | | props: {}, |
| | | components: { |
| | | sensor, |
| | | sensorday, |
| | | }, |
| | | data() { |
| | | // 这里存放数据 |
| | | return { |
| | | options: [], |
| | | radio1: '', |
| | | value: '', |
| | | value1: '', |
| | | reportType: 0, |
| | | monitorPointId: 0, |
| | | tableData: [], |
| | | dateDisplay: false, |
| | | newKey: 0, |
| | | timearr: null |
| | | // pickerOptions1: { |
| | | // disabledDate(time) { |
| | | // console.log(time) |
| | | // const curDate = this.value1[0] ? this.value1[0] : (new Date()).getTime()// 获取当前时间点 |
| | | // const seven = 7 * 24 * 60 * 60 * 1000 // 设定7天日期 7天 * 24小时 * 60分钟 * 60秒 * 1000 = 7天的时间戳 |
| | | // const sevenDays = curDate + seven// 当前时间点后的七天所处的日期 |
| | | // return time.getTime() < Date.now() + 8.64e7 || time.getTime() > sevenDays + 8.64e7// 8.64e7 表示一天,明天之前包括明天不可选,只可选七天 |
| | | // } |
| | | // } |
| | | activeName: 'first', |
| | | } |
| | | }, |
| | | // 计算属性 类似于data概念 |
| | | 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' |
| | | }) |
| | | } |
| | | }, |
| | | 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) { |
| | | this.dateDisplay = true |
| | | } else { |
| | | this.dateDisplay = false |
| | | } |
| | | // if (!this.newKey === 'custom') { |
| | | this.getReportForm(this.newKey) |
| | | // } |
| | | } |
| | | }, |
| | | // 生命周期 - 创建完成(可以访问当前 this 实例) |
| | | created() { |
| | | this.getMonitorPointId() |
| | | }, |
| | | // 生命周期 - 挂载完成(可以访问 DOM 元素) |
| | | mounted() { |
| | | |
| | | }, |
| | | beforeCreate() {}, // 生命周期 - 创建之前 |
| | | beforeMount() {}, // 生命周期 - 挂载之前 |
| | | beforeUpdate() {}, // 生命周期 - 更新之前 |
| | | updated() {}, // 生命周期 - 更新之后 |
| | | beforeDestroy() {}, // 生命周期 - 销毁之前 |
| | | destroyed() {}, // 生命周期 - 销毁完成 |
| | | activated() {}, |
| | | // 方法集合 |
| | | created() {}, |
| | | methods: { |
| | | // 重新添加rank排名(当表格的排序条件发生变化的时候会触发该事件) |
| | | changeTableSort() { |
| | | var sortTableData = this.$refs.mytable.tableData |
| | | // console.log(this.$refs.mytable.tableData, 111) |
| | | for (let i = 0; i < sortTableData.length; i++) { |
| | | sortTableData[i].rank = i + 1 |
| | | } |
| | | handleClick(tab, event) { |
| | | // console.log(tab, event) |
| | | }, |
| | | // 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) |
| | | |
| | | /* get binary string as output */ |
| | | var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' }) |
| | | try { |
| | | FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), '站点数据表.xlsx') |
| | | } catch (e) { |
| | | if (typeof console !== 'undefined') { |
| | | console.log(e, wbout) |
| | | } |
| | | } |
| | | return wbout |
| | | }, |
| | | // 请求站点信息 |
| | | getMonitorPointId() { |
| | | this.$request({ |
| | | url: '/monitorPoint/queryAllMonitorPoints', |
| | | method: 'get', |
| | | params: { |
| | | organizationId: this.$store.state.orgId |
| | | } |
| | | }).then((res) => { |
| | | // console.log('请求站点的信息') |
| | | // 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 }) |
| | | } |
| | | }).catch((err) => { |
| | | console.log(err) |
| | | }) |
| | | }, |
| | | // 请求报表数据 |
| | | getReportForm(key) { |
| | | 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) => { |
| | | console.log(res) |
| | | if (res.code !== 0) { |
| | | return |
| | | } |
| | | var tempData = res.data |
| | | for (let i = 0; i < tempData.length; i++) { |
| | | tempData[i].rank = i + 1 |
| | | } |
| | | this.tableData = tempData |
| | | // 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) => { |
| | | console.log(err) |
| | | }) |
| | | } |
| | | } // 如果页面有keep-alive缓存功能,这个函数会触发 |
| | | }, |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | .topSelect{ |
| | | display: flex; |
| | | margin-bottom: 20px; |
| | | padding: 20px 15px 0 15px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | span:first-child{ |
| | | flex: 1; |
| | | } |
| | | // div:last-child{ |
| | | // width: 300px; |
| | | // line-height: 40px; |
| | | // padding-left: 6px; |
| | | // } |
| | | } |
| | | .topTitle{ |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 20px; |
| | | padding: 0 15px; |
| | | } |
| | | |
| | | <style scoped> |
| | | </style> |