feat:DeviceDetailsSimulator

This commit is contained in:
alwayssuper 2025-01-03 22:33:40 +08:00
parent 61ebe5b9a2
commit 5e8aad7703
2 changed files with 180 additions and 43 deletions

View File

@ -45,6 +45,11 @@ export const ThingModelApi = {
return await request.get({ url: `/iot/thing-model/page`, params })
},
// 获得产品物模型列表
getThingModelList: async (params: any) => {
return await request.get({ url: `/iot/thing-model/list`, params })
},
// 获得产品物模型
getThingModelListByProductId: async (params: any) => {
return await request.get({

View File

@ -10,16 +10,83 @@
<!-- 属性上报 -->
<el-tab-pane label="属性上报" name="property">
<ContentWrap>
<el-table v-loading="loading" :data="propertyList" :stripe="true">
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column label="值" align="center" width="80">
<template #default="scope">
<el-input v-model="scope.row.value" class="!w-60px" />
</template>
</el-table-column>
<el-table-column label="功能名称" align="center" prop="name" />
<el-table-column label="标识符" align="center" prop="identifier" />
<el-table-column label="数据类型" align="center" prop="dataType" />
<el-table-column label="数据定义" align="center" prop="specs" :show-overflow-tooltip="true" />
<el-table-column align="center" label="功能名称" prop="name" />
<el-table-column align="center" label="标识符" prop="identifier" />
<el-table-column align="center" label="数据类型" prop="identifier">
<template #default="{ row }">
{{ dataTypeOptionsLabel(row.property?.dataType) ?? '-' }}
</template>
</el-table-column>
<el-table-column align="left" label="数据定义" prop="identifier">
<template #default="{ row }">
<!-- 属性 -->
<template v-if="row.type === ThingModelType.PROPERTY">
<!-- 非列表型数值 -->
<div
v-if="
[
DataSpecsDataType.INT,
DataSpecsDataType.DOUBLE,
DataSpecsDataType.FLOAT
].includes(row.property.dataType)
"
>
取值范围{{
`${row.property.dataSpecs.min}~${row.property.dataSpecs.max}`
}}
</div>
<!-- 非列表型文本 -->
<div v-if="DataSpecsDataType.TEXT === row.property.dataType">
数据长度{{ row.property.dataSpecs.length }}
</div>
<!-- 列表型: 数组结构时间特殊 -->
<div
v-if="
[
DataSpecsDataType.ARRAY,
DataSpecsDataType.STRUCT,
DataSpecsDataType.DATE
].includes(row.property.dataType)
"
>
-
</div>
<!-- 列表型: 布尔值枚举 -->
<div
v-if="
[DataSpecsDataType.BOOL, DataSpecsDataType.ENUM].includes(
row.property.dataType
)
"
>
<div>
{{
DataSpecsDataType.BOOL === row.property.dataType
? '布尔值'
: '枚举值'
}}
</div>
<div v-for="item in row.property.dataSpecsList" :key="item.value">
{{ `${item.name}-${item.value}` }}
</div>
</div>
</template>
<!-- 服务 -->
<div v-if="row.type === ThingModelType.SERVICE">
调用方式{{ getCallTypeByValue(row.service.callType) }}
</div>
<!-- 事件 -->
<div v-if="row.type === ThingModelType.EVENT">
事件类型{{ getEventTypeByValue(row.event.type) }}
</div>
</template>
</el-table-column>
</el-table>
<div class="mt-10px">
<el-button type="primary" @click="handlePropertyReport">发送</el-button>
@ -39,7 +106,12 @@
<el-table-column label="功能名称" align="center" prop="name" />
<el-table-column label="标识符" align="center" prop="identifier" />
<el-table-column label="数据类型" align="center" prop="dataType" />
<el-table-column label="数据定义" align="center" prop="specs" :show-overflow-tooltip="true" />
<el-table-column
label="数据定义"
align="center"
prop="specs"
:show-overflow-tooltip="true"
/>
</el-table>
<div class="mt-10px">
<el-button type="primary" @click="handleEventReport">发送</el-button>
@ -51,8 +123,12 @@
<el-tab-pane label="状态变更" name="status">
<ContentWrap>
<div class="flex gap-4">
<el-button type="primary" @click="handleDeviceState('online')">设备上线</el-button>
<el-button type="primary" @click="handleDeviceState('offline')">设备下线</el-button>
<el-button type="primary" @click="handleDeviceState('online')"
>设备上线</el-button
>
<el-button type="primary" @click="handleDeviceState('offline')"
>设备下线</el-button
>
</div>
</ContentWrap>
</el-tab-pane>
@ -74,7 +150,12 @@
<el-table-column label="功能名称" align="center" prop="name" />
<el-table-column label="标识符" align="center" prop="identifier" />
<el-table-column label="数据类型" align="center" prop="dataType" />
<el-table-column label="数据定义" align="center" prop="specs" :show-overflow-tooltip="true" />
<el-table-column
label="数据定义"
align="center"
prop="specs"
:show-overflow-tooltip="true"
/>
</el-table>
<div class="mt-10px">
<el-button type="primary" @click="handlePropertyGet">获取</el-button>
@ -107,15 +188,44 @@
<script setup lang="ts">
import { ProductVO } from '@/api/iot/product/product'
import { ThingModelApi, ThingModelData } from '@/api/iot/thingmodel'
import { DeviceApi, DeviceVO } from '@/api/iot/device/device'
import DeviceDetailsLog from './DeviceDetailsLog.vue'
import {
DataSpecsDataType,
getCallTypeByValue,
getDataTypeOptionsLabel,
getEventTypeByValue,
ThingModelType
} from '@/views/iot/thingmodel/config'
const message = useMessage() //
const loading = ref(false)
const activeTab = ref('up')
const subTab = ref('property')
const queryParams = reactive({
type: undefined,
productId: -1
})
const dataTypeOptionsLabel = computed(() => (value: string) => getDataTypeOptionsLabel(value)) //
const props = defineProps<{ product: ProductVO; device: DeviceVO }>()
const list = ref<ThingModelData[]>([]) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
queryParams.productId = props.product?.id || -1
const data = await ThingModelApi.getThingModelList(queryParams)
list.value = data
console.log(data)
console.log(list.value)
console.log(queryParams)
} finally {
loading.value = false
}
}
//
interface TableItem {
@ -126,40 +236,62 @@ interface TableItem {
value: string | number
}
//
const propertyList = ref<TableItem[]>([
{
name: '电量',
identifier: 'power',
dataType: 'int32',
specs: '',
value: ''
},
{
name: '设备型号',
identifier: 'DeviceType',
dataType: 'text',
specs: '{ "length": "128" }',
value: ''
},
{
name: '信号强度',
identifier: 'rssi',
dataType: 'int32',
specs: '{ "min": "-127", "max": "127" }',
value: ''
},
{
name: '门状态',
identifier: 'doorStatus',
dataType: 'enum',
specs: '{ "0": "关", "1": "开" }',
value: ''
}
])
//
const propertyList = computed(() => {
return list.value
.filter((item) => item.type === 'property')
.map((item) => ({
name: item.name,
identifier: item.identifier,
dataType: item.dataType,
specs: item.specs,
value: ''
}))
})
//
const eventList = ref<TableItem[]>([])
const eventList = computed(() => {
return list.value
.filter((item) => item.type === 'event')
.map((item) => ({
name: item.name,
identifier: item.identifier,
dataType: item.dataType,
specs: item.specs,
value: ''
}))
})
// todo:
watch(
[activeTab, subTab],
([newActiveTab, newSubTab]) => {
//
if (newActiveTab === 'up') {
switch (newSubTab) {
case 'property':
queryParams.type = 1
break
case 'event':
queryParams.type = 3
break
// case 'status':
// queryParams.type = 'status'
// break
}
} else if (newActiveTab === 'down') {
switch (newSubTab) {
case 'propertyDebug':
queryParams.type = 1
break
case 'service':
queryParams.type = 2
break
}
}
getList() //
},
{ immediate: true }
)
//
const handlePropertyReport = async () => {
@ -187,6 +319,6 @@ const handlePropertyGet = async () => {
//
onMounted(() => {
// TODO:
getList()
})
</script>