|
|
@@ -0,0 +1,169 @@
|
|
|
+<!-- 设备消息列表 -->
|
|
|
+<template>
|
|
|
+ <ContentWrap>
|
|
|
+ <!-- 搜索区域 -->
|
|
|
+ <el-form :model="queryParams" inline>
|
|
|
+ <el-form-item>
|
|
|
+ <el-select v-model="queryParams.method" placeholder="所有方法" class="!w-160px" clearable>
|
|
|
+ <el-option v-for="item in methodOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-select v-model="queryParams.upstream" placeholder="上行/下行" class="!w-160px" clearable>
|
|
|
+ <el-option label="上行" value="true" />
|
|
|
+ <el-option label="下行" value="false" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" @click="handleQuery">
|
|
|
+ <Icon icon="ep:search" class="mr-5px" /> 搜索
|
|
|
+ </el-button>
|
|
|
+ <el-switch
|
|
|
+ size="large"
|
|
|
+ width="80"
|
|
|
+ v-model="autoRefresh"
|
|
|
+ class="ml-20px"
|
|
|
+ inline-prompt
|
|
|
+ active-text="定时刷新"
|
|
|
+ inactive-text="定时刷新"
|
|
|
+ style="--el-switch-on-color: #13ce66"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <!-- 消息列表 -->
|
|
|
+ <el-table v-loading="loading" :data="list" :stripe="true" class="whitespace-nowrap">
|
|
|
+ <el-table-column label="请求编号" align="center" prop="requestId" width="300" />
|
|
|
+ <el-table-column label="时间" align="center" prop="ts" width="180">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ formatDate(scope.row.ts) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="上行/下行" align="center" prop="upstream" width="140">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-tag :type="scope.row.upstream ? 'primary' : 'success'">
|
|
|
+ {{ scope.row.upstream ? '上行' : '下行' }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="是否回复" align="center" prop="reply" width="140">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.reply" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="请求方法" align="center" prop="method" width="140">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ methodOptions.find(item => item.value === scope.row.method)?.label }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="请求/响应数据" align="center" prop="params" :show-overflow-tooltip="true">
|
|
|
+ <template #default="scope">
|
|
|
+ <span v-if="scope.row.reply">
|
|
|
+ {{ `{"code":${scope.row.code},"msg":"${scope.row.msg}","data":${scope.row.data}\}` }}
|
|
|
+ </span>
|
|
|
+ <span v-else>{{ scope.row.params }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <div class="mt-10px flex justify-end">
|
|
|
+ <Pagination
|
|
|
+ :total="total"
|
|
|
+ v-model:page="queryParams.pageNo"
|
|
|
+ v-model:limit="queryParams.pageSize"
|
|
|
+ @pagination="getMessageList"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </ContentWrap>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+import { DICT_TYPE } from '@/utils/dict'
|
|
|
+import { DeviceApi } from '@/api/iot/device/device'
|
|
|
+import { formatDate } from '@/utils/formatTime'
|
|
|
+import { IotDeviceMessageMethodEnum } from '@/views/iot/utils/constants'
|
|
|
+
|
|
|
+const props = defineProps<{
|
|
|
+ deviceId: number
|
|
|
+}>()
|
|
|
+
|
|
|
+// 查询参数
|
|
|
+const queryParams = reactive({
|
|
|
+ deviceId: props.deviceId,
|
|
|
+ method: undefined,
|
|
|
+ upstream: undefined,
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 10
|
|
|
+})
|
|
|
+
|
|
|
+// 列表数据
|
|
|
+const loading = ref(false)
|
|
|
+const total = ref(0)
|
|
|
+const list = ref([])
|
|
|
+const autoRefresh = ref(false)
|
|
|
+let autoRefreshTimer: any = null // TODO @super:autoRefreshEnable,autoRefreshTimer;对应上
|
|
|
+
|
|
|
+// 消息方法选项
|
|
|
+const methodOptions = computed(() => {
|
|
|
+ return Object.values(IotDeviceMessageMethodEnum).map(item => ({
|
|
|
+ label: item.name,
|
|
|
+ value: item.method
|
|
|
+ }))
|
|
|
+})
|
|
|
+
|
|
|
+/** 查询消息列表 */
|
|
|
+const getMessageList = async () => {
|
|
|
+ if (!props.deviceId) return
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await DeviceApi.getDeviceMessagePage(queryParams)
|
|
|
+ total.value = data.total
|
|
|
+ list.value = data.list
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/** 搜索操作 */
|
|
|
+const handleQuery = () => {
|
|
|
+ queryParams.pageNo = 1
|
|
|
+ getMessageList()
|
|
|
+}
|
|
|
+
|
|
|
+/** 监听自动刷新 */
|
|
|
+watch(autoRefresh, (newValue) => {
|
|
|
+ if (newValue) {
|
|
|
+ autoRefreshTimer = setInterval(() => {
|
|
|
+ getMessageList()
|
|
|
+ }, 5000)
|
|
|
+ } else {
|
|
|
+ clearInterval(autoRefreshTimer)
|
|
|
+ autoRefreshTimer = null
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+/** 监听设备标识变化 */
|
|
|
+watch(
|
|
|
+ () => props.deviceId,
|
|
|
+ (newValue) => {
|
|
|
+ if (newValue) {
|
|
|
+ handleQuery()
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+/** 组件卸载时清除定时器 */
|
|
|
+onBeforeUnmount(() => {
|
|
|
+ if (autoRefreshTimer) {
|
|
|
+ clearInterval(autoRefreshTimer)
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+/** 初始化 */
|
|
|
+onMounted(() => {
|
|
|
+ if (props.deviceId) {
|
|
|
+ getMessageList()
|
|
|
+ }
|
|
|
+})
|
|
|
+</script>
|