| <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> | 
| </template> | 
|   | 
| <script> | 
| // 这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等) | 
| // 例如:import《组件名称》from'《组件路径》'; | 
| import FileSaver from 'file-saver' | 
| import XLSX from 'xlsx' | 
| export default { | 
| // import 引入的组件需要注入到对象中才能使用 | 
|   components: {}, | 
|   props: {}, | 
|   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 表示一天,明天之前包括明天不可选,只可选七天 | 
|       //   } | 
|       // } | 
|     } | 
|   }, | 
|   // 计算属性 类似于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() {}, | 
|   // 方法集合 | 
|   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 | 
|       } | 
|     }, | 
|     // 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> |