7 changed files with 225 additions and 30 deletions
@ -0,0 +1,171 @@ |
|||||
|
<script setup> |
||||
|
import { computed, onMounted, onUnmounted, ref } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import SearchBar from 'components/search-bar.vue'; |
||||
|
import { getDatas } from 'apis'; |
||||
|
import { ElMessage } from 'element-plus'; |
||||
|
import dayjs from 'dayjs'; |
||||
|
import { REALTIME_DATA_INTERVAL } from '@/config/config'; |
||||
|
|
||||
|
const page = ref({ |
||||
|
page: 1, |
||||
|
size: 50, |
||||
|
}); |
||||
|
let timer = null; |
||||
|
let apiTimer = null; |
||||
|
const store = useStore(); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const currentDeviceId = computed(() => store.state.device.currentDeviceId); // 正在操作的设备的id |
||||
|
const contentHeight = ref(600); |
||||
|
const loadingSearch = ref(false); |
||||
|
const data = ref(null); |
||||
|
|
||||
|
// 获取设备完整信息列表 |
||||
|
const getData = async () => { |
||||
|
try { |
||||
|
if (token && token.value) { |
||||
|
if (!currentDeviceId.value) { |
||||
|
return ElMessage.error('请选择站点'); |
||||
|
} |
||||
|
|
||||
|
const date = [dayjs().startOf('day').format('x'), dayjs().endOf('day').format('x')]; |
||||
|
const params = { |
||||
|
deviceId: currentDeviceId.value, |
||||
|
date, |
||||
|
page: page.value.page, |
||||
|
size: page.value.size, |
||||
|
type: 1, |
||||
|
sort: -1, |
||||
|
}; |
||||
|
|
||||
|
loadingSearch.value = true; |
||||
|
const resData = await getDatas(params); |
||||
|
loadingSearch.value = false; |
||||
|
|
||||
|
data.value = resData.data; |
||||
|
page.value = resData.page; |
||||
|
timer && clearTimeout(timer); |
||||
|
timer = null; |
||||
|
|
||||
|
// 定时轮询请求新数据 |
||||
|
if (!apiTimer) { |
||||
|
apiTimer = setInterval(() => { |
||||
|
getData(); |
||||
|
}, REALTIME_DATA_INTERVAL); |
||||
|
} |
||||
|
} else { |
||||
|
timer = setTimeout(() => { |
||||
|
getData(); |
||||
|
}, 20); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
ElMessage.error(error.message || '获取数据失败'); |
||||
|
console.log('error: ', error); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
// 设置表格高度 |
||||
|
onMounted(() => { |
||||
|
const winHeight = document.documentElement.clientHeight; |
||||
|
contentHeight.value = winHeight - 170; |
||||
|
currentDeviceId.value && getData(); |
||||
|
}); |
||||
|
|
||||
|
onUnmounted(() => { |
||||
|
apiTimer && clearInterval(apiTimer); |
||||
|
apiTimer = null; |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* 当前 码变化 |
||||
|
* 更新page 重新 取数据 |
||||
|
* @param {number} e 的页码 |
||||
|
*/ |
||||
|
const onCurrentPageChange = e => { |
||||
|
page.value.page = e; |
||||
|
getData(); |
||||
|
}; |
||||
|
|
||||
|
const onSizeChange = e => { |
||||
|
page.value.size = e; |
||||
|
getData(); |
||||
|
}; |
||||
|
|
||||
|
// 下一页 |
||||
|
const onNext = e => { |
||||
|
page.value.page = e + 1; |
||||
|
getData(); |
||||
|
}; |
||||
|
|
||||
|
// 上一页 |
||||
|
const onPrev = e => { |
||||
|
page.value.page = e - 1; |
||||
|
getData(); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 格式化时间 |
||||
|
* @param {number} time 时间戳 |
||||
|
* @returns {string} |
||||
|
*/ |
||||
|
function formatTime(time) { |
||||
|
return dayjs(new Date(time)).format('YYYY-MM-DD HH:mm:ss'); |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<template> |
||||
|
<SearchBar @search="getData" /> |
||||
|
|
||||
|
<template v-if="data"> |
||||
|
<el-table :data="data" :max-height="contentHeight" border stripe style="width: 100%"> |
||||
|
<el-table-column align="center" fixed label="设备编号" min-width="80" prop="deviceNo" /> |
||||
|
<el-table-column align="center" label="ICCID" min-width="190" prop="iccid" /> |
||||
|
<el-table-column align="center" label="IMEI" min-width="150" prop="imei" /> |
||||
|
<el-table-column align="center" label="信号强度" min-width="80" prop="signal" /> |
||||
|
<el-table-column align="center" label="基站编号" min-width="130" prop="stationNo" /> |
||||
|
<el-table-column align="center" label="硬件版本" min-width="80" prop="hardwareVersion" /> |
||||
|
<el-table-column align="center" label="软件版本" min-width="80" prop="softwareVersion" /> |
||||
|
<el-table-column align="center" label="采集时间" min-width="170"> |
||||
|
<template #default="scope"> |
||||
|
{{ formatTime(+scope.row.time) }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column align="center" label="后台接受时间" min-width="170"> |
||||
|
<template #default="scope"> |
||||
|
{{ formatTime(+scope.row.createdAt) }} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column align="center" label="太阳能电压" min-width="94" prop="solarVoltage" /> |
||||
|
<el-table-column align="center" label="蓄电池电压" min-width="94" prop="batteryVoltage" /> |
||||
|
<el-table-column align="center" label="电压百分比" min-width="94" prop="batteryVoltagePercentage" /> |
||||
|
<el-table-column align="center" label="剩余电量" min-width="94" prop="batteryVoltageRemain" /> |
||||
|
<el-table-column align="center" label="电池损耗量" min-width="94" prop="batteryLoss" /> |
||||
|
<el-table-column align="center" label="机箱温度" min-width="80" prop="deviceTemperature" /> |
||||
|
<el-table-column align="center" label="机箱湿度" min-width="80" prop="deviceHumidity" /> |
||||
|
<el-table-column align="center" label="环境温度" min-width="80" prop="environmentTemperature" /> |
||||
|
<el-table-column align="center" label="环境湿度" min-width="80" prop="environmentHumidity" /> |
||||
|
<el-table-column align="center" label="SO2" min-width="50" prop="so2" /> |
||||
|
<el-table-column align="center" label="盐分" min-width="50" prop="salt" /> |
||||
|
<el-table-column align="center" label="腐流1" min-width="60" prop="corrosion1" /> |
||||
|
<el-table-column align="center" label="腐流2" min-width="60" prop="corrosion2" /> |
||||
|
<el-table-column align="center" label="腐流3" min-width="60" prop="corrosion3" /> |
||||
|
<el-table-column align="center" label="腐流4" min-width="60" prop="corrosion4" /> |
||||
|
</el-table> |
||||
|
|
||||
|
<el-pagination |
||||
|
:current-page="page.page" |
||||
|
:default-page-size="50" |
||||
|
:page-count="page.count" |
||||
|
:page-size="page.size" |
||||
|
:page-sizes="[1, 10, 20, 50, 100]" |
||||
|
:total="page.total" |
||||
|
background |
||||
|
class="my-3 float-right" |
||||
|
layout="total, sizes, prev, pager, next, jumper" |
||||
|
@current-change="onCurrentPageChange" |
||||
|
@size-change="onSizeChange" |
||||
|
@prev-click="onPrev" |
||||
|
@next-click="onNext" |
||||
|
></el-pagination> |
||||
|
</template> |
||||
|
</template> |
Loading…
Reference in new issue