Mosqkiller/src/views/counter/logs.vue

253 lines
7.1 KiB
Vue

<template>
<div class="app-container">
<div class="filter-container">
<el-input
@keyup.enter.native="handleFilter"
@keyup.esc.native="handleEsc"
size="small" style="width: 220px;"
class="filter-item"
:placeholder="$t('counter.logSeachContent')" v-model="logsListQuery.device">
</el-input>
<div class="date-selector filter-item">
<el-date-picker
v-model="dateRange"
size="small"
type="daterange"
align="right"
:range-separator="$t('counter.to')"
:start-placeholder="$t('counter.start_date')"
:end-placeholder="$t('counter.end_date')"
:picker-options="pickerOptions"
value-format="yyyy-MM-dd"
@change="handleDateSelect"
/>
</div>
<el-button class="filter-item" size="small" type="primary" v-waves icon="el-icon-search" @click="handleFilter">{{$t('table.search')}}</el-button>
<el-button :disabled="downloadDisabled" class="filter-item export" :loading="downloadLoading" size="small"
type="primary" icon="el-icon-document" @click="handleDownload">{{ $t('table.export') }}</el-button>
</div>
<el-table
v-loading="listLoading"
:data="logList"
style="width: 100%"
:default-sort = "{prop: 'calc_time', order: 'descending'}"
>
<el-table-column
type="index"
:label="$t('counter.sn')">
</el-table-column>
<el-table-column
prop="device_id"
:label="$t('counter.device')"
sortable
min-width="150">
</el-table-column>
<el-table-column
prop="device_name"
:label="$t('counter.deviceName')"
sortable
min-width="150">
</el-table-column>
<el-table-column
prop="signal"
:label="$t('counter.signal')"
min-width="80">
</el-table-column>
<el-table-column
sortable
prop="mosq_count"
:label="$t('counter.count')"
min-width="100">
</el-table-column>
<el-table-column
prop="energy"
:label="$t('counter.energy')"
min-width="100">
</el-table-column>
<el-table-column
prop="coordinate"
:label="$t('counter.coordinate')"
min-width="280px"
:formatter="coordinate">
</el-table-column>
<el-table-column
prop="calc_time"
:label="$t('counter.time')"
min-width="150">
</el-table-column>
</el-table>
<div class="pagination-container">
<el-pagination background
:current-page="1"
:page-sizes="[10,20,30,50]"
:page-size="logsListQuery.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div>
</template>
<script>
import { fetchDeviceLogs } from '@/api/counter'
import waves from '@/directive/waves' // 水波纹指令
import { parseTime } from '@/utils'
export default {
name: 'count',
directives: {
waves
},
data() {
return {
logList: [],
logExportList: [],
listLoading: true,
total: 0,
logsListQuery: {
device: undefined,
limit: 10,
page: 1,
start: undefined,
end: undefined
},
pickerOptions: null,
dateRange: undefined,
downloadLoading: false,
downloadDisabled: false,
filename: undefined
}
},
methods: {
async getDeviceLogs(params, type = 'table') {
await fetchDeviceLogs(params).then(response => {
if (type === 'table') {
this.logList = response.data.results
}
if (type === 'export') {
this.logExportList = response.data.results
}
this.total = response.data.count
this.listLoading = false
})
},
coordinate(row, column) {
return row.longitude + ', ' + row.latitude
},
handleCurrentChange(page) {
// console.log(page)
this.listLoading = true
this.logsListQuery.page = page
this.getDeviceLogs(this.logsListQuery)
},
handleSizeChange(val) {
this.logsListQuery.limit = val
this.getDeviceLogs(this.logsListQuery)
},
handleFilter() {
this.logsListQuery.page = 1
this.getDeviceLogs(this.logsListQuery)
},
handleEsc() {
this.logsListQuery.page = 1
this.logsListQuery.device = undefined
this.getDeviceLogs(this.logsListQuery)
},
handleDateSelect(value) {
if (value === null) {
this.logsListQuery.start = undefined
this.logsListQuery.end = undefined
} else {
const [start, end] = value
this.logsListQuery.start = start
this.logsListQuery.end = end
}
// this.getDeviceLogs(this.logsListQuery)
},
async handleDownload() {
const start = this.logsListQuery.start
const end = this.logsListQuery.end
if (!start || !end) {
this.$message({
message: 'Please select the start/end date',
type: 'warning'
})
return
}
this.downloadLoading = true
const exportQuery = Object.assign({}, this.logsListQuery)
exportQuery.limit = 5000
await this.getDeviceLogs(exportQuery, 'export')
this.filename = 'Device Log List ' + String(start).replace(/-/g, '') + '_' + String(end).replace(/-/g, '') + '.xlsx'
import('@/vendor/Export2Excel').then(excel => {
const tHeader = ['Id', 'Time', 'Device ID', 'Device Name', 'Signal', 'Count', 'Energy', 'Coordinate']
const filterVal = ['id', 'calc_time', 'device_id', 'device_name', 'signal', 'mosq_count', 'energy', 'coordinate']
const list = this.logExportList
const data = this.formatJson(filterVal, list)
excel.export_json_to_excel({
header: tHeader,
data,
filename: this.filename,
autoWidth: this.autoWidth,
bookType: this.bookType
})
this.downloadLoading = false
this.logsListQuery.limit = 10
})
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => {
if (j === 'timestamp') {
return parseTime(v[j])
} else {
return v[j]
}
}))
}
},
created() {
this.getDeviceLogs(this.logsListQuery)
},
deactivated() {
this.$destroy(true)
}
}
</script>
<style lang="scss" scoped>
.date-selector {
margin-left: 10px;
}
.date-selector /deep/ .el-date-editor .el-range-separator {
margin-right: 10px !important;
}
@media only screen and (max-width: 768px) {
.filter-container {
display: block;
.filter-item {
display: block;
float: left;
margin: 0 0 15px 10px;
}
.date-selector {
margin-left: 0;
margin-bottom: 0;
}
.time-selector {
margin-left: 0;
}
}
}
</style>
<style lang="scss">
@media only screen and (max-width: 500px) {
.el-date-range-picker {
width: 100% !important;
}
.el-date-range-picker__content {
float: none;
width: 80%;
}
}
</style>