Skip to content

Commit e36e485

Browse files
author
puhui999
committed
【功能完善】IOT: 产品物模型-属性
1 parent 187b5b0 commit e36e485

File tree

7 files changed

+132
-99
lines changed

7 files changed

+132
-99
lines changed

src/api/iot/thinkmodelfunction/index.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface ThingModelData {
1010
description?: string // 功能描述
1111
productId?: number // 产品编号
1212
productKey?: string // 产品标识
13+
dataType: string // 数据类型,与 dataSpecs 的 dataType 保持一致
1314
type: ProductFunctionTypeEnum // 功能类型
1415
property: ThingModelProperty // 属性
1516
event?: ThingModelEvent // 事件
@@ -53,34 +54,35 @@ export enum ProductFunctionAccessModeEnum {
5354
// IoT 产品物模型 API
5455
export const ThinkModelFunctionApi = {
5556
// 查询产品物模型分页
56-
getThinkModelFunctionPage: async (params: any) => {
57-
return await request.get({ url: `/iot/think-model-function/page`, params })
57+
getProductThingModelPage: async (params: any) => {
58+
return await request.get({ url: `/iot/product-thing-model/page`, params })
5859
},
60+
5961
// 获得产品物模型
60-
getThinkModelFunctionListByProductId: async (params: any) => {
62+
getProductThingModelListByProductId: async (params: any) => {
6163
return await request.get({
62-
url: `/iot/think-model-function/list-by-product-id`,
64+
url: `/iot/product-thing-model/list-by-product-id`,
6365
params
6466
})
6567
},
6668

6769
// 查询产品物模型详情
68-
getThinkModelFunction: async (id: number) => {
69-
return await request.get({ url: `/iot/think-model-function/get?id=` + id })
70+
getProductThingModel: async (id: number) => {
71+
return await request.get({ url: `/iot/product-thing-model/get?id=` + id })
7072
},
7173

7274
// 新增产品物模型
73-
createThinkModelFunction: async (data: ThingModelData) => {
74-
return await request.post({ url: `/iot/think-model-function/create`, data })
75+
createProductThingModel: async (data: ThingModelData) => {
76+
return await request.post({ url: `/iot/product-thing-model/create`, data })
7577
},
7678

7779
// 修改产品物模型
78-
updateThinkModelFunction: async (data: ThingModelData) => {
79-
return await request.put({ url: `/iot/think-model-function/update`, data })
80+
updateProductThingModel: async (data: ThingModelData) => {
81+
return await request.put({ url: `/iot/product-thing-model/update`, data })
8082
},
8183

8284
// 删除产品物模型
83-
deleteThinkModelFunction: async (id: number) => {
84-
return await request.delete({ url: `/iot/think-model-function/delete?id=` + id })
85+
deleteProductThingModel: async (id: number) => {
86+
return await request.delete({ url: `/iot/product-thing-model/delete?id=` + id })
8587
}
8688
}

src/views/iot/product/product/detail/ThingModel/ThingModelDataSpecs.vue

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,35 @@
2424
v-model="property.dataSpecsList"
2525
/>
2626
<!-- 布尔型配置 -->
27-
<el-form-item label="布尔值" prop="bool" v-if="property.dataType === DataSpecsDataType.BOOL">
27+
<el-form-item v-if="property.dataType === DataSpecsDataType.BOOL" label="布尔值" prop="bool">
2828
<template v-for="item in property.dataSpecsList" :key="item.value">
2929
<div class="flex items-center justify-start w-1/1 mb-5px">
3030
<span>{{ item.value }}</span>
3131
<span class="mx-2">-</span>
3232
<el-input
3333
v-model="item.name"
34-
class="w-255px!"
3534
:placeholder="`如:${item.value === 0 ? '关' : '开'}`"
35+
class="w-255px!"
3636
/>
3737
</div>
3838
</template>
3939
</el-form-item>
4040
<!-- 文本型配置 -->
41-
<el-form-item label="数据长度" prop="text" v-if="property.dataType === DataSpecsDataType.TEXT">
42-
<el-input v-model="property.length" class="w-255px!" placeholder="请输入文本字节长度">
41+
<el-form-item v-if="property.dataType === DataSpecsDataType.TEXT" label="数据长度" prop="text">
42+
<el-input v-model="property.dataSpecs.length" class="w-255px!" placeholder="请输入文本字节长度">
4343
<template #append>字节</template>
4444
</el-input>
4545
</el-form-item>
4646
<!-- 时间型配置 -->
47-
<el-form-item label="时间格式" prop="date" v-if="property.dataType === DataSpecsDataType.DATE">
48-
<el-input disabled class="w-255px!" placeholder="String类型的UTC时间戳(毫秒)" />
47+
<el-form-item v-if="property.dataType === DataSpecsDataType.DATE" label="时间格式" prop="date">
48+
<el-input class="w-255px!" disabled placeholder="String类型的UTC时间戳(毫秒)" />
4949
</el-form-item>
5050
<!-- 数组型配置-->
5151
<ThingModelArrayTypeDataSpecs
52-
v-model="property.dataSpecs"
5352
v-if="property.dataType === DataSpecsDataType.ARRAY"
53+
v-model="property.dataSpecs"
5454
/>
55+
<!-- TODO puhui999: Struct 属性待完善 -->
5556
<el-form-item label="读写类型" prop="accessMode">
5657
<el-radio-group v-model="property.accessMode">
5758
<el-radio label="rw">读写</el-radio>
@@ -84,16 +85,8 @@ const handleChange = (dataType: any) => {
8485
property.value.dataSpecsList = []
8586
property.value.dataSpecs = {}
8687
88+
property.value.dataSpecs.dataType = dataType
8789
switch (dataType) {
88-
case DataSpecsDataType.INT:
89-
property.value.dataSpecs.dataType = DataSpecsDataType.INT
90-
break
91-
case DataSpecsDataType.DOUBLE:
92-
property.value.dataSpecs.dataType = DataSpecsDataType.DOUBLE
93-
break
94-
case DataSpecsDataType.FLOAT:
95-
property.value.dataSpecs.dataType = DataSpecsDataType.FLOAT
96-
break
9790
case DataSpecsDataType.ENUM:
9891
property.value.dataSpecsList.push({
9992
dataType: DataSpecsDataType.ENUM,
@@ -110,9 +103,6 @@ const handleChange = (dataType: any) => {
110103
})
111104
}
112105
break
113-
case DataSpecsDataType.ARRAY:
114-
property.value.dataSpecs.dataType = DataSpecsDataType.ARRAY
115-
break
116106
}
117107
}
118108
</script>

src/views/iot/product/product/detail/ThingModel/ThingModelForm.vue

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
</el-form-item>
2323
<!-- 属性配置 -->
2424
<ThingModelDataSpecs
25-
v-model="formData.property"
2625
v-if="formData.type === ProductFunctionTypeEnum.PROPERTY"
26+
v-model="formData.property"
2727
/>
2828
</el-form>
2929

@@ -39,11 +39,12 @@ import { ProductVO } from '@/api/iot/product/product'
3939
import ThingModelDataSpecs from './ThingModelDataSpecs.vue'
4040
import {
4141
ProductFunctionTypeEnum,
42-
ThinkModelFunctionApi,
43-
ThingModelData
42+
ThingModelData,
43+
ThinkModelFunctionApi
4444
} from '@/api/iot/thinkmodelfunction'
4545
import { IOT_PROVIDE_KEY } from '@/views/iot/utils/constants'
4646
import { DataSpecsDataType } from './config'
47+
import { cloneDeep } from 'lodash-es'
4748
4849
defineOptions({ name: 'IoTProductThingModelForm' })
4950
@@ -58,12 +59,15 @@ const formLoading = ref(false)
5859
const formType = ref('')
5960
const formData = ref<ThingModelData>({
6061
type: ProductFunctionTypeEnum.PROPERTY,
62+
dataType: DataSpecsDataType.INT,
6163
property: {
6264
dataType: DataSpecsDataType.INT,
63-
dataSpecsList: [],
64-
dataSpecs: {}
65+
dataSpecs: {
66+
dataType: DataSpecsDataType.INT
67+
}
6568
}
6669
})
70+
// TODO puhui999: 表单校验待完善
6771
const formRules = reactive({
6872
name: [
6973
{ required: true, message: '功能名称不能为空', trigger: 'blur' },
@@ -114,7 +118,7 @@ const open = async (type: string, id?: number) => {
114118
if (id) {
115119
formLoading.value = true
116120
try {
117-
formData.value = await ThinkModelFunctionApi.getThinkModelFunction(id)
121+
formData.value = await ThinkModelFunctionApi.getProductThingModel(id)
118122
} finally {
119123
formLoading.value = false
120124
}
@@ -128,14 +132,19 @@ const submitForm = async () => {
128132
await formRef.value.validate()
129133
formLoading.value = true
130134
try {
131-
const data = formData.value as unknown as ThingModelData
135+
const data = cloneDeep(formData.value) as ThingModelData
136+
// 信息补全
132137
data.productId = product!.value.id
133138
data.productKey = product!.value.productKey
139+
data.description = data.property.description
140+
data.dataType = data.property.dataType
141+
data.property.identifier = data.identifier
142+
data.property.name = data.name
134143
if (formType.value === 'create') {
135-
await ThinkModelFunctionApi.createThinkModelFunction(data)
144+
await ThinkModelFunctionApi.createProductThingModel(data)
136145
message.success(t('common.createSuccess'))
137146
} else {
138-
await ThinkModelFunctionApi.updateThinkModelFunction(data)
147+
await ThinkModelFunctionApi.updateProductThingModel(data)
139148
message.success(t('common.updateSuccess'))
140149
}
141150
} finally {
@@ -149,10 +158,12 @@ const submitForm = async () => {
149158
const resetForm = () => {
150159
formData.value = {
151160
type: ProductFunctionTypeEnum.PROPERTY,
161+
dataType: DataSpecsDataType.INT,
152162
property: {
153163
dataType: DataSpecsDataType.INT,
154-
dataSpecsList: [],
155-
dataSpecs: {}
164+
dataSpecs: {
165+
dataType: DataSpecsDataType.INT
166+
}
156167
}
157168
}
158169
formRef.value?.resetFields()

src/views/iot/product/product/detail/ThingModel/config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,8 @@ export const dataTypeOptions = [
4343
{ value: DataSpecsDataType.STRUCT, label: 'struct (结构体)' },
4444
{ value: DataSpecsDataType.ARRAY, label: 'array (数组)' }
4545
]
46+
47+
/** 获得物体模型数据类型配置项名称 */
48+
export const getDataTypeOptionsLabel = (value: string) => {
49+
return dataTypeOptions.find((option) => option.value === value)?.label
50+
}

src/views/iot/product/product/detail/ThingModel/index.vue

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@
3232
<Icon class="mr-5px" icon="ep:refresh" />
3333
重置
3434
</el-button>
35-
<el-button plain type="primary" @click="openForm('create')">
35+
<el-button
36+
v-hasPermi="[`iot:product-thing-model:create`]"
37+
plain
38+
type="primary"
39+
@click="openForm('create')"
40+
>
3641
<Icon class="mr-5px" icon="ep:plus" />
3742
添加功能
3843
</el-button>
@@ -49,20 +54,29 @@
4954
</el-table-column>
5055
<el-table-column align="center" label="功能名称" prop="name" />
5156
<el-table-column align="center" label="标识符" prop="identifier" />
52-
<el-table-column align="center" label="数据类型" prop="identifier" />
53-
<el-table-column align="center" label="数据定义" prop="identifier" />
57+
<el-table-column align="center" label="数据类型" prop="identifier">
58+
<template #default="{ row }">
59+
{{ dataTypeOptionsLabel(row.property.dataType) ?? '-' }}
60+
</template>
61+
</el-table-column>
62+
<el-table-column align="center" label="数据定义" prop="identifier">
63+
<template #default="{ row }">
64+
<!-- TODO puhui999: 数据定义展示待完善 -->
65+
{{ row.property.dataSpecs ?? row.property.dataSpecsList }}
66+
</template>
67+
</el-table-column>
5468
<el-table-column align="center" label="操作">
5569
<template #default="scope">
5670
<el-button
57-
v-hasPermi="[`iot:think-model-function:update`]"
71+
v-hasPermi="[`iot:product-thing-model:update`]"
5872
link
5973
type="primary"
6074
@click="openForm('update', scope.row.id)"
6175
>
6276
编辑
6377
</el-button>
6478
<el-button
65-
v-hasPermi="['iot:think-model-function:delete']"
79+
v-hasPermi="['iot:product-thing-model:delete']"
6680
link
6781
type="danger"
6882
@click="handleDelete(scope.row.id)"
@@ -85,19 +99,20 @@
8599
<ThingModelForm ref="formRef" @success="getList" />
86100
</template>
87101
<script lang="ts" setup>
88-
import { ThinkModelFunctionApi, ThinkModelFunctionVO } from '@/api/iot/thinkmodelfunction'
102+
import { ThingModelData, ThinkModelFunctionApi } from '@/api/iot/thinkmodelfunction'
89103
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
90104
import ThingModelForm from './ThingModelForm.vue'
91105
import { ProductVO } from '@/api/iot/product/product'
92106
import { IOT_PROVIDE_KEY } from '@/views/iot/utils/constants'
107+
import { getDataTypeOptionsLabel } from '@/views/iot/product/product/detail/ThingModel/config'
93108
94109
defineOptions({ name: 'IoTProductThingModel' })
95110
96111
const { t } = useI18n() // 国际化
97112
const message = useMessage() // 消息弹窗
98113
99114
const loading = ref(true) // 列表的加载中
100-
const list = ref<ThinkModelFunctionVO[]>([]) // 列表的数据
115+
const list = ref<ThingModelData[]>([]) // 列表的数据
101116
const total = ref(0) // 列表的总页数
102117
const queryParams = reactive({
103118
pageNo: 1,
@@ -108,12 +123,14 @@ const queryParams = reactive({
108123
109124
const queryFormRef = ref() // 搜索的表单
110125
const product = inject<Ref<ProductVO>>(IOT_PROVIDE_KEY.PRODUCT) // 注入产品信息
126+
const dataTypeOptionsLabel = computed(() => (value: string) => getDataTypeOptionsLabel(value)) // 解析数据类型
127+
111128
/** 查询列表 */
112129
const getList = async () => {
113130
loading.value = true
114131
try {
115132
queryParams.productId = product?.value?.id || -1
116-
const data = await ThinkModelFunctionApi.getThinkModelFunctionPage(queryParams)
133+
const data = await ThinkModelFunctionApi.getProductThingModelPage(queryParams)
117134
list.value = data.list
118135
total.value = data.total
119136
} finally {
@@ -145,7 +162,7 @@ const handleDelete = async (id: number) => {
145162
// 删除的二次确认
146163
await message.delConfirm()
147164
// 发起删除
148-
await ThinkModelFunctionApi.deleteThinkModelFunction(id)
165+
await ThinkModelFunctionApi.deleteProductThingModel(id)
149166
message.success(t('common.delSuccess'))
150167
// 刷新列表
151168
await getList()

src/views/iot/product/product/detail/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<el-tab-pane label="Topic 类列表" name="topic">
99
<ProductTopic v-if="activeTab === 'topic'" :product="product" />
1010
</el-tab-pane>
11-
<el-tab-pane label="功能定义" lazy name="function">
11+
<el-tab-pane label="功能定义" lazy name="thingModel">
1212
<IoTProductThingModel ref="thingModelRef" />
1313
</el-tab-pane>
1414
<el-tab-pane label="消息解析" name="message" />

0 commit comments

Comments
 (0)