Browse Source

pms 设备分类属性 修改

zhangcl 4 tháng trước cách đây
mục cha
commit
a592faf63a

+ 2 - 2
src/api/pms/deviceattrmodel/index.ts

@@ -11,9 +11,9 @@ export interface DeviceAttrModelData {
   deviceCategoryId?: number // 设备分类id
   deviceId?: number // 设备id
   templateId?: number // 设备分类模板id
-  requiredFlag?: string // 是否必填
+  requiredFlag?: number // 是否必填
   dataType: string // 数据类型,与 dataSpecs 的 dataType 保持一致
-  type: number // 属性字段类型
+  type: string // 属性字段类型
   selectOptions: DeviceTemplateAttrs // 设备属性
 }
 

+ 43 - 93
src/views/pms/devicetemplate/detail/attrsModel/AttrTemplateModelForm.vue

@@ -1,42 +1,23 @@
-<!-- 产品的物模型表单 -->
+<!-- 设备分类属性表单 -->
 <template>
   <Dialog v-model="dialogVisible" :title="dialogTitle">
     <el-form
       ref="formRef"
       v-loading="formLoading"
       :model="formData"
-      :rules="ThingModelFormRules"
+      :rules="DeviceAttrModelFormRules"
       label-width="100px"
     >
-      <el-form-item label="功能类型" prop="type">
-        <el-radio-group v-model="formData.type">
-          <el-radio-button
-            v-for="dict in getIntDictOptions(DICT_TYPE.IOT_THING_MODEL_TYPE)"
-            :key="dict.value"
-            :value="dict.value"
-          >
-            {{ dict.label }}
-          </el-radio-button>
-        </el-radio-group>
+      <el-form-item label="属性名称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入属性名称" />
       </el-form-item>
-      <el-form-item label="功能名称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入功能名称" />
-      </el-form-item>
-      <el-form-item label="标识符" prop="identifier">
-        <el-input v-model="formData.identifier" placeholder="请输入标识符" />
+      <el-form-item label="标识符" prop="code">
+        <el-input v-model="formData.code" placeholder="请输入标识符" />
       </el-form-item>
       <!-- 属性配置 -->
-      <ThingModelProperty
-        v-if="formData.type === ThingModelType.PROPERTY"
-        v-model="formData.property"
-      />
-      <!-- 服务配置 -->
-      <ThingModelService
-        v-if="formData.type === ThingModelType.SERVICE"
-        v-model="formData.service"
+      <DeviceAttrModelProperty
+        v-model="formData.selectOptions"
       />
-      <!-- 事件配置 -->
-      <ThingModelEvent v-if="formData.type === ThingModelType.EVENT" v-model="formData.event" />
       <el-form-item label="描述" prop="description">
         <el-input
           v-model="formData.description"
@@ -56,20 +37,16 @@
 </template>
 
 <script lang="ts" setup>
-import { ProductVO } from '@/api/iot/product/product'
-import ThingModelProperty from './AttrTemplateModelProperty.vue'
-import { ThingModelApi, ThingModelData } from '@/api/iot/thingmodel'
-import { IOT_PROVIDE_KEY } from '@/views/iot/utils/constants'
-import { DataSpecsDataType, ThingModelFormRules, ThingModelType } from './config'
+import DeviceAttrModelProperty from './AttrTemplateModelProperty.vue'
+import { DeviceAttrModelApi, DeviceAttrModelData } from '@/api/pms/deviceattrmodel'
+import { DataSpecsDataType, DeviceAttrModelFormRules } from './config'
 import { cloneDeep } from 'lodash-es'
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { isEmpty } from '@/utils/is'
+import { defineProps } from 'vue'
 
-/** IoT 物模型数据表单 */
+/** 设备属性 模型数据表单 */
 defineOptions({ name: 'AttrTemplateModelForm' })
 
-const product = inject<Ref<ProductVO>>(IOT_PROVIDE_KEY.PRODUCT) // 注入产品信息
-
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 
@@ -77,17 +54,23 @@ const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const formType = ref('') // 表单的类型:create - 新增;update - 修改
-const formData = ref<ThingModelData>({
-  type: ThingModelType.PROPERTY,
+const formData = ref<DeviceAttrModelData>({
+  deviceCategoryId: -1,
   dataType: DataSpecsDataType.INT,
-  property: {
-    dataType: DataSpecsDataType.INT,
+  type: DataSpecsDataType.INT,
+  requiredFlag: 0,
+  description: '',
+  selectOptions: {
+    type: DataSpecsDataType.INT,
+    requiredFlag: '',
     dataSpecs: {
       dataType: DataSpecsDataType.INT
     }
   },
-  service: {},
-  event: {}
+})
+
+const props = defineProps({
+  deviceCategoryId: [String, Number]
 })
 
 const formRef = ref() // 表单 Ref
@@ -101,25 +84,17 @@ const open = async (type: string, id?: number) => {
   if (id) {
     formLoading.value = true
     try {
-      formData.value = await ThingModelApi.getThingModel(id)
+      formData.value = await DeviceAttrModelApi.getDeviceAttrModel(id)
       // 情况一:属性初始化
-      if (isEmpty(formData.value.property)) {
-        formData.value.dataType = DataSpecsDataType.INT
-        formData.value.property = {
-          dataType: DataSpecsDataType.INT,
+      if (isEmpty(formData.value.selectOptions)) {
+        formData.value.type = DataSpecsDataType.INT
+        formData.value.selectOptions = {
+          type: DataSpecsDataType.INT,
           dataSpecs: {
             dataType: DataSpecsDataType.INT
           }
         }
       }
-      // 情况二:服务初始化
-      if (isEmpty(formData.value.service)) {
-        formData.value.service = {}
-      }
-      // 情况三:事件初始化
-      if (isEmpty(formData.value.event)) {
-        formData.value.event = {}
-      }
     } finally {
       formLoading.value = false
     }
@@ -130,20 +105,18 @@ defineExpose({ open, close: () => (dialogVisible.value = false) })
 /** 提交表单 */
 const emit = defineEmits(['success'])
 const submitForm = async () => {
-  debugger
   await formRef.value.validate()
   formLoading.value = true
   try {
-    const data = cloneDeep(formData.value) as ThingModelData
-    // 信息补全
-    data.productId = product!.value.id
-    data.productKey = product!.value.productKey
+    const data = cloneDeep(formData.value) as DeviceAttrModelData
+    data.deviceCategoryId = props.deviceCategoryId
+    data.requiredFlag = formData.value.selectOptions.requiredFlag
     fillExtraAttributes(data)
     if (formType.value === 'create') {
-      await ThingModelApi.createThingModel(data)
+      await DeviceAttrModelApi.createDeviceAttrModel(data)
       message.success(t('common.createSuccess'))
     } else {
-      await ThingModelApi.updateThingModel(data)
+      await DeviceAttrModelApi.updateDeviceAttrModel(data)
       message.success(t('common.updateSuccess'))
     }
   } finally {
@@ -157,32 +130,11 @@ const submitForm = async () => {
 const fillExtraAttributes = (data: any) => {
   // 处理不同类型的情况
   // 属性
-  if (data.type === ThingModelType.PROPERTY) {
-    removeDataSpecs(data.property)
-    data.dataType = data.property.dataType
-    data.property.identifier = data.identifier
-    data.property.name = data.name
-    delete data.service
-    delete data.event
-  }
-  // 服务
-  if (data.type === ThingModelType.SERVICE) {
-    removeDataSpecs(data.service)
-    data.dataType = data.service.dataType
-    data.service.identifier = data.identifier
-    data.service.name = data.name
-    delete data.property
-    delete data.event
-  }
-  // 事件
-  if (data.type === ThingModelType.EVENT) {
-    removeDataSpecs(data.event)
-    data.dataType = data.event.dataType
-    data.event.identifier = data.identifier
-    data.event.name = data.name
-    delete data.property
-    delete data.service
-  }
+  removeDataSpecs(data.selectOptions)
+  data.type = data.selectOptions.type
+  data.selectOptions.identifier = data.code
+  data.selectOptions.code = data.code
+  data.selectOptions.name = data.name
 }
 /** 处理 dataSpecs 为空的情况 */
 const removeDataSpecs = (val: any) => {
@@ -197,16 +149,14 @@ const removeDataSpecs = (val: any) => {
 /** 重置表单 */
 const resetForm = () => {
   formData.value = {
-    type: ThingModelType.PROPERTY,
     dataType: DataSpecsDataType.INT,
-    property: {
-      dataType: DataSpecsDataType.INT,
+    type: DataSpecsDataType.INT,
+    selectOptions: {
+      type: DataSpecsDataType.INT,
       dataSpecs: {
         dataType: DataSpecsDataType.INT
       }
     },
-    service: {},
-    event: {}
   }
   formRef.value?.resetFields()
 }

+ 44 - 43
src/views/pms/devicetemplate/detail/attrsModel/AttrTemplateModelProperty.vue

@@ -1,11 +1,11 @@
-<!-- 产品的物模型表单(property 项) -->
+<!-- 设备属性模型表单(property 项) -->
 <template>
   <el-form-item
     :rules="[{ required: true, message: '请选择数据类型', trigger: 'change' }]"
     label="数据类型"
-    prop="property.dataType"
+    prop="selectOptions.type"
   >
-    <el-select v-model="property.dataType" placeholder="请选择数据类型" @change="handleChange">
+    <el-select v-model="selectOptions.type" placeholder="请选择数据类型" @change="handleChange">
       <!-- ARRAY 和 STRUCT 类型数据相互嵌套时,最多支持递归嵌套 2 层(父和子) -->
       <el-option
         v-for="option in getDataTypeOptions"
@@ -16,27 +16,27 @@
     </el-select>
   </el-form-item>
   <!-- 数值型配置 -->
-  <ThingModelNumberDataSpecs
+  <DeviceAttrModelNumberDataSpecs
     v-if="
       [DataSpecsDataType.INT, DataSpecsDataType.DOUBLE, DataSpecsDataType.FLOAT].includes(
-        property.dataType || ''
+        selectOptions.type || ''
       )
     "
-    v-model="property.dataSpecs"
+    v-model="selectOptions.dataSpecs"
   />
   <!-- 枚举型配置 -->
-  <ThingModelEnumDataSpecs
-    v-if="property.dataType === DataSpecsDataType.ENUM"
-    v-model="property.dataSpecsList"
+  <DeviceAttrModelEnumDataSpecs
+    v-if="selectOptions.type === DataSpecsDataType.ENUM"
+    v-model="selectOptions.dataSpecsList"
   />
   <!-- 布尔型配置 -->
-  <el-form-item v-if="property.dataType === DataSpecsDataType.BOOL" label="布尔值">
-    <template v-for="(item, index) in property.dataSpecsList" :key="item.value">
+  <el-form-item v-if="selectOptions.type === DataSpecsDataType.BOOL" label="布尔值">
+    <template v-for="(item, index) in selectOptions.dataSpecsList" :key="item.value">
       <div class="flex items-center justify-start w-1/1 mb-5px">
         <span>{{ item.value }}</span>
         <span class="mx-2">-</span>
         <el-form-item
-          :prop="`property.dataSpecsList[${index}].name`"
+          :prop="`selectOptions.dataSpecsList[${index}].name`"
           :rules="[
             { required: true, message: '枚举描述不能为空' },
             { validator: validateBoolName, trigger: 'blur' }
@@ -54,35 +54,35 @@
   </el-form-item>
   <!-- 文本型配置 -->
   <el-form-item
-    v-if="property.dataType === DataSpecsDataType.TEXT"
+    v-if="selectOptions.type === DataSpecsDataType.TEXT"
     label="数据长度"
-    prop="property.dataSpecs.length"
+    prop="selectOptions.dataSpecs.length"
   >
-    <el-input v-model="property.dataSpecs.length" class="w-255px!" placeholder="请输入文本字节长度">
+    <el-input v-model="selectOptions.dataSpecs.length" class="w-255px!" placeholder="请输入文本字节长度">
       <template #append>字节</template>
     </el-input>
   </el-form-item>
   <!-- 时间型配置 -->
-  <el-form-item v-if="property.dataType === DataSpecsDataType.DATE" label="时间格式" prop="date">
+  <el-form-item v-if="selectOptions.type === DataSpecsDataType.DATE" label="时间格式" prop="date">
     <el-input class="w-255px!" disabled placeholder="String 类型的 UTC 时间戳(毫秒)" />
   </el-form-item>
   <!-- 数组型配置-->
-  <ThingModelArrayDataSpecs
-    v-if="property.dataType === DataSpecsDataType.ARRAY"
-    v-model="property.dataSpecs"
+  <DeviceAttrModelArrayDataSpecs
+    v-if="selectOptions.type === DataSpecsDataType.ARRAY"
+    v-model="selectOptions.dataSpecs"
   />
   <!-- Struct 型配置-->
-  <ThingModelStructDataSpecs
-    v-if="property.dataType === DataSpecsDataType.STRUCT"
-    v-model="property.dataSpecsList"
+  <DeviceAttrModelStructDataSpecs
+    v-if="selectOptions.type === DataSpecsDataType.STRUCT"
+    v-model="selectOptions.dataSpecsList"
   />
-  <el-form-item v-if="!isStructDataSpecs && !isParams" label="读写类型" prop="property.accessMode">
-    <el-radio-group v-model="property.accessMode">
-      <el-radio :label="ThingModelAccessMode.READ_WRITE.value">
-        {{ ThingModelAccessMode.READ_WRITE.label }}
+  <el-form-item v-if="!isStructDataSpecs && !isParams" label="是否必填" prop="selectOptions.requiredFlag">
+    <el-radio-group v-model="selectOptions.requiredFlag">
+      <el-radio :label="DeviceAttrModelRequired.REQUIRED.value">
+        {{ DeviceAttrModelRequired.REQUIRED.label }}
       </el-radio>
-      <el-radio :label="ThingModelAccessMode.READ_ONLY.value">
-        {{ ThingModelAccessMode.READ_ONLY.label }}
+      <el-radio :label="DeviceAttrModelRequired.NOT_REQUIRED.value">
+        {{ DeviceAttrModelRequired.NOT_REQUIRED.label }}
       </el-radio>
     </el-radio-group>
   </el-form-item>
@@ -93,16 +93,16 @@ import { useVModel } from '@vueuse/core'
 import {
   DataSpecsDataType,
   dataTypeOptions,
-  ThingModelAccessMode,
+  DeviceAttrModelRequired,
   validateBoolName
 } from './config'
 import {
-  ThingModelArrayDataSpecs,
-  ThingModelEnumDataSpecs,
-  ThingModelNumberDataSpecs,
-  ThingModelStructDataSpecs
+  DeviceAttrModelArrayDataSpecs,
+  DeviceAttrModelEnumDataSpecs,
+  DeviceAttrModelNumberDataSpecs,
+  DeviceAttrModelStructDataSpecs
 } from '../dataSpecs'
-import { ThingModelProperty } from '@/api/iot/thingmodel'
+import { DeviceTemplateAttrs } from '@/api/pms/deviceattrmodel'
 import { isEmpty } from '@/utils/is'
 
 /** 设备属性模板 属性 */
@@ -110,7 +110,7 @@ defineOptions({ name: 'AttrTemplateModelProperty' })
 
 const props = defineProps<{ modelValue: any; isStructDataSpecs?: boolean; isParams?: boolean }>()
 const emits = defineEmits(['update:modelValue'])
-const property = useVModel(props, 'modelValue', emits) as Ref<ThingModelProperty>
+const selectOptions = useVModel(props, 'modelValue', emits) as Ref<DeviceTemplateAttrs>
 const getDataTypeOptions = computed(() => {
   return !props.isStructDataSpecs
     ? dataTypeOptions
@@ -122,14 +122,14 @@ const getDataTypeOptions = computed(() => {
 
 /** 属性值的数据类型切换时初始化相关数据 */
 const handleChange = (dataType: any) => {
-  property.value.dataSpecs = {}
-  property.value.dataSpecsList = []
+  selectOptions.value.dataSpecs = {}
+  selectOptions.value.dataSpecsList = []
   // 不是列表型数据才设置 dataSpecs.dataType
   ![DataSpecsDataType.ENUM, DataSpecsDataType.BOOL, DataSpecsDataType.STRUCT].includes(dataType) &&
-    (property.value.dataSpecs.dataType = dataType)
+    (selectOptions.value.dataSpecs.dataType = dataType)
   switch (dataType) {
     case DataSpecsDataType.ENUM:
-      property.value.dataSpecsList.push({
+      selectOptions.value.dataSpecsList.push({
         dataType: DataSpecsDataType.ENUM,
         name: '', // 枚举项的名称
         value: undefined // 枚举值
@@ -137,7 +137,7 @@ const handleChange = (dataType: any) => {
       break
     case DataSpecsDataType.BOOL:
       for (let i = 0; i < 2; i++) {
-        property.value.dataSpecsList.push({
+        selectOptions.value.dataSpecsList.push({
           dataType: DataSpecsDataType.BOOL,
           name: '', // 布尔值的名称
           value: i // 布尔值
@@ -147,17 +147,18 @@ const handleChange = (dataType: any) => {
   }
 }
 
-// 默认选中读写
+// 默认选中 是否必填
 watch(
-  () => property.value.accessMode,
+  () => selectOptions.value.requiredFlag,
   (val: string) => {
     if (props.isStructDataSpecs || props.isParams) {
       return
     }
-    isEmpty(val) && (property.value.accessMode = ThingModelAccessMode.READ_WRITE.value)
+    isEmpty(val) && (selectOptions.value.requiredFlag = DeviceAttrModelRequired.REQUIRED.value)
   },
   { immediate: true }
 )
+
 </script>
 
 <style lang="scss" scoped>

+ 18 - 51
src/views/pms/devicetemplate/detail/attrsModel/config.ts

@@ -55,15 +55,8 @@ export const getDataTypeOptionsLabel = (value: string) => {
   return dataType && `${dataType.value}(${dataType.label})`
 }
 
-// IOT 产品物模型类型枚举类
-export const ThingModelType = {
-  PROPERTY: 1, // 属性
-  SERVICE: 2, // 服务
-  EVENT: 3 // 事件
-} as const
-
-// IOT 产品物模型访问模式枚举类
-export const ThingModelAccessMode = {
+// 设备属性模型访问模式枚举类
+export const DeviceAttrModelAccessMode = {
   READ_WRITE: {
     label: '读写',
     value: 'rw'
@@ -74,48 +67,22 @@ export const ThingModelAccessMode = {
   }
 } as const
 
-// IOT 产品物模型服务调用方式枚举
-export const ThingModelServiceCallType = {
-  ASYNC: {
-    label: '异步调用',
-    value: 'async'
+// 设备属性模型 是否必填 枚举类
+export const DeviceAttrModelRequired = {
+  REQUIRED: {
+    label: '必填',
+    value: 1
   },
-  SYNC: {
-    label: '同步调用',
-    value: 'sync'
+  NOT_REQUIRED: {
+    label: '非必填',
+    value: 0
   }
 } as const
-export const getCallTypeByValue = (value: string): string | undefined =>
-  Object.values(ThingModelServiceCallType).find((type) => type.value === value)?.label
-
-// IOT 产品物模型事件类型枚举
-export const ThingModelEventType = {
-  INFO: {
-    label: '信息',
-    value: 'info'
-  },
-  ALERT: {
-    label: '告警',
-    value: 'alert'
-  },
-  ERROR: {
-    label: '故障',
-    value: 'error'
-  }
-} as const
-export const getEventTypeByValue = (value: string): string | undefined =>
-  Object.values(ThingModelEventType).find((type) => type.value === value)?.label
-
-// IOT 产品物模型参数是输入参数还是输出参数
-export const ThingModelParamDirection = {
-  INPUT: 'input', // 输入参数
-  OUTPUT: 'output' // 输出参数
-} as const
 
 /** 公共校验规则 */
-export const ThingModelFormRules = {
+export const DeviceAttrModelFormRules = {
   name: [
-    { required: true, message: '功能名称不能为空', trigger: 'blur' },
+    { required: true, message: '属性名称不能为空', trigger: 'blur' },
     {
       pattern: /^[\u4e00-\u9fa5a-zA-Z0-9][\u4e00-\u9fa5a-zA-Z0-9\-_/\.]{0,29}$/,
       message:
@@ -123,8 +90,8 @@ export const ThingModelFormRules = {
       trigger: 'blur'
     }
   ],
-  type: [{ required: true, message: '功能类型不能为空', trigger: 'blur' }],
-  identifier: [
+  type: [{ required: true, message: '数据类型不能为空', trigger: 'blur' }],
+  code: [
     { required: true, message: '标识符不能为空', trigger: 'blur' },
     {
       pattern: /^[a-zA-Z0-9_]{1,50}$/,
@@ -149,8 +116,8 @@ export const ThingModelFormRules = {
       trigger: 'blur'
     }
   ],
-  'property.dataSpecs.childDataType': [{ required: true, message: '元素类型不能为空' }],
-  'property.dataSpecs.size': [
+  'selectOptions.dataSpecs.childDataType': [{ required: true, message: '元素类型不能为空' }],
+  'selectOptions.dataSpecs.size': [
     { required: true, message: '元素个数不能为空' },
     {
       validator: (_: any, value: any, callback: any) => {
@@ -167,7 +134,7 @@ export const ThingModelFormRules = {
       trigger: 'blur'
     }
   ],
-  'property.dataSpecs.length': [
+  'selectOptions.dataSpecs.length': [
     { required: true, message: '请输入文本字节长度', trigger: 'blur' },
     {
       validator: (_: any, value: any, callback: any) => {
@@ -184,7 +151,7 @@ export const ThingModelFormRules = {
       trigger: 'blur'
     }
   ],
-  'property.accessMode': [{ required: true, message: '请选择读写类型', trigger: 'change' }]
+  'selectOptions.accessMode': [{ required: true, message: '请选择读写类型', trigger: 'change' }]
 }
 
 /** 校验布尔值名称 */

+ 1 - 5
src/views/pms/devicetemplate/detail/attrsModel/index.vue

@@ -78,13 +78,11 @@
     </el-tabs>
   </ContentWrap>
   <!-- 表单弹窗:添加/修改 -->
-  <AttrTemplateModelForm ref="formRef" @success="getList" />
+  <AttrTemplateModelForm ref="formRef" @success="getList" :deviceCategoryId="deviceCategoryId" />
 </template>
 <script lang="ts" setup>
 import { DeviceAttrModelApi, DeviceAttrModelData } from '@/api/pms/deviceattrmodel'
 import AttrTemplateModelForm from './AttrTemplateModelForm.vue'
-import * as DeviceTemplateApi from '@/api/pms/devicetemplate'
-import { IOT_PROVIDE_KEY } from '@/views/iot/utils/constants'
 import { getDataTypeOptionsLabel } from './config'
 import { DataDefinition } from '../components'
 import {useTagsViewStore} from "@/store/modules/tagsView";
@@ -110,14 +108,12 @@ const queryParams = reactive({
 })
 
 const queryFormRef = ref() // 搜索的表单
-const template = inject<Ref<DeviceTemplateApi.DeviceAttrTemplateVO>>(IOT_PROVIDE_KEY.DEVICE_ATTR_TEMPLATE) // 注入设备属性模板信息
 const dataTypeOptionsLabel = computed(() => (value: string) => getDataTypeOptionsLabel(value)) // 解析数据类型
 
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
   try {
-    // queryParams.deviceCategoryId = template?.value?.deviceCategoryId || -1
     queryParams.deviceCategoryId = deviceCategoryId
     const data = await DeviceAttrModelApi.getDeviceAttrModelPage(queryParams)
     list.value = data.list

+ 5 - 5
src/views/pms/devicetemplate/detail/dataSpecs/ThingModelArrayDataSpecs.vue → src/views/pms/devicetemplate/detail/dataSpecs/DeviceAttrModelArrayDataSpecs.vue

@@ -1,6 +1,6 @@
 <!-- dataType:array 数组类型 -->
 <template>
-  <el-form-item label="元素类型" prop="property.dataSpecs.childDataType">
+  <el-form-item label="元素类型" prop="selectOptions.dataSpecs.childDataType">
     <el-radio-group v-model="dataSpecs.childDataType" @change="handleChange">
       <template v-for="item in dataTypeOptions" :key="item.value">
         <el-radio
@@ -17,11 +17,11 @@
       </template>
     </el-radio-group>
   </el-form-item>
-  <el-form-item label="元素个数" prop="property.dataSpecs.size">
+  <el-form-item label="元素个数" prop="selectOptions.dataSpecs.size">
     <el-input v-model="dataSpecs.size" placeholder="请输入数组中的元素个数" />
   </el-form-item>
   <!-- Struct 型配置-->
-  <ThingModelStructDataSpecs
+  <DeviceAttrModelStructDataSpecs
     v-if="dataSpecs.childDataType === DataSpecsDataType.STRUCT"
     v-model="dataSpecs.dataSpecsList"
   />
@@ -30,10 +30,10 @@
 <script lang="ts" setup>
 import { useVModel } from '@vueuse/core'
 import { DataSpecsDataType, dataTypeOptions } from '../attrsModel/config'
-import ThingModelStructDataSpecs from './ThingModelStructDataSpecs.vue'
+import DeviceAttrModelStructDataSpecs from './DeviceAttrModelStructDataSpecs.vue'
 
 /** 数组型的 dataSpecs 配置组件 */
-defineOptions({ name: 'ThingModelArrayDataSpecs' })
+defineOptions({ name: 'DeviceAttrModelArrayDataSpecs' })
 
 const props = defineProps<{ modelValue: any }>()
 const emits = defineEmits(['update:modelValue'])

+ 3 - 3
src/views/pms/devicetemplate/detail/dataSpecs/ThingModelEnumDataSpecs.vue → src/views/pms/devicetemplate/detail/dataSpecs/DeviceAttrModelEnumDataSpecs.vue

@@ -15,7 +15,7 @@
         class="flex items-center justify-between mb-5px"
       >
         <el-form-item
-          :prop="`property.dataSpecsList[${index}].value`"
+          :prop="`selectOptions.dataSpecsList[${index}].value`"
           :rules="[
             { required: true, message: '枚举值不能为空' },
             { validator: validateEnumValue, trigger: 'blur' }
@@ -26,7 +26,7 @@
         </el-form-item>
         <span class="mx-2">~</span>
         <el-form-item
-          :prop="`property.dataSpecsList[${index}].name`"
+          :prop="`selectOptions.dataSpecsList[${index}].name`"
           :rules="[
             { required: true, message: '枚举描述不能为空' },
             { validator: validateEnumName, trigger: 'blur' }
@@ -48,7 +48,7 @@ import { DataSpecsDataType, DataSpecsEnumOrBoolDataVO } from '../attrsModel/conf
 import { isEmpty } from '@/utils/is'
 
 /** 枚举型的 dataSpecs 配置组件 */
-defineOptions({ name: 'ThingModelEnumDataSpecs' })
+defineOptions({ name: 'DeviceAttrModelEnumDataSpecs' })
 
 const props = defineProps<{ modelValue: any }>()
 const emits = defineEmits(['update:modelValue'])

+ 8 - 5
src/views/pms/devicetemplate/detail/dataSpecs/ThingModelNumberDataSpecs.vue → src/views/pms/devicetemplate/detail/dataSpecs/DeviceAttrModelNumberDataSpecs.vue

@@ -1,5 +1,6 @@
 <!-- dataType:number 数组类型 -->
 <template>
+  <!--
   <el-form-item label="取值范围">
     <div class="flex items-center justify-between">
       <el-form-item
@@ -8,7 +9,7 @@
           { validator: validateMin, trigger: 'blur' }
         ]"
         class="mb-0"
-        prop="property.dataSpecs.min"
+        prop="selectOptions.dataSpecs.min"
       >
         <el-input v-model="dataSpecs.min" placeholder="请输入最小值" />
       </el-form-item>
@@ -19,7 +20,7 @@
           { validator: validateMax, trigger: 'blur' }
         ]"
         class="mb-0"
-        prop="property.dataSpecs.max"
+        prop="selectOptions.dataSpecs.max"
       >
         <el-input v-model="dataSpecs.max" placeholder="请输入最大值" />
       </el-form-item>
@@ -31,14 +32,16 @@
       { validator: validateStep, trigger: 'blur' }
     ]"
     label="步长"
-    prop="property.dataSpecs.step"
+    prop="selectOptions.dataSpecs.step"
   >
     <el-input v-model="dataSpecs.step" placeholder="请输入步长" />
   </el-form-item>
+  -->
+
   <el-form-item
     :rules="[{ required: true, message: '请选择单位' }]"
     label="单位"
-    prop="property.dataSpecs.unit"
+    prop="selectOptions.dataSpecs.unit"
   >
     <el-select
       :model-value="dataSpecs.unit ? dataSpecs.unitName + '-' + dataSpecs.unit : ''"
@@ -63,7 +66,7 @@ import { DataSpecsNumberDataVO } from '../attrsModel/config'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 
 /** 数值型的 dataSpecs 配置组件 */
-defineOptions({ name: 'ThingModelNumberDataSpecs' })
+defineOptions({ name: 'DeviceAttrModelNumberDataSpecs' })
 
 const props = defineProps<{ modelValue: any }>()
 const emits = defineEmits(['update:modelValue'])

+ 7 - 7
src/views/pms/devicetemplate/detail/dataSpecs/ThingModelStructDataSpecs.vue → src/views/pms/devicetemplate/detail/dataSpecs/DeviceAttrModelStructDataSpecs.vue

@@ -26,17 +26,17 @@
       ref="structFormRef"
       v-loading="formLoading"
       :model="formData"
-      :rules="ThingModelFormRules"
+      :rules="DeviceAttrModelFormRules"
       label-width="100px"
     >
-      <el-form-item label="参数名称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入功能名称" />
+      <el-form-item label="属性名称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入属性名称" />
       </el-form-item>
       <el-form-item label="标识符" prop="identifier">
         <el-input v-model="formData.identifier" placeholder="请输入标识符" />
       </el-form-item>
       <!-- 属性配置 -->
-      <ThingModelProperty v-model="formData.property" is-struct-data-specs />
+      <AttrTemplateModelProperty v-model="formData.selectOptions" is-struct-data-specs />
     </el-form>
 
     <template #footer>
@@ -48,12 +48,12 @@
 
 <script lang="ts" setup>
 import { useVModel } from '@vueuse/core'
-import ThingModelProperty from '../attrsModel/AttrTemplateModelProperty.vue'
-import { DataSpecsDataType, ThingModelFormRules } from '../attrsModel/config'
+import AttrTemplateModelProperty from '../attrsModel/AttrTemplateModelProperty.vue'
+import { DataSpecsDataType, DeviceAttrModelFormRules } from '../attrsModel/config'
 import { isEmpty } from '@/utils/is'
 
 /** Struct 型的 dataSpecs 配置组件 */
-defineOptions({ name: 'ThingModelStructDataSpecs' })
+defineOptions({ name: 'DeviceAttrModelStructDataSpecs' })
 
 const props = defineProps<{ modelValue: any }>()
 const emits = defineEmits(['update:modelValue'])

+ 8 - 8
src/views/pms/devicetemplate/detail/dataSpecs/index.ts

@@ -1,11 +1,11 @@
-import ThingModelEnumDataSpecs from './ThingModelEnumDataSpecs.vue'
-import ThingModelNumberDataSpecs from './ThingModelNumberDataSpecs.vue'
-import ThingModelArrayDataSpecs from './ThingModelArrayDataSpecs.vue'
-import ThingModelStructDataSpecs from './ThingModelStructDataSpecs.vue'
+import DeviceAttrModelEnumDataSpecs from './DeviceAttrModelEnumDataSpecs.vue'
+import DeviceAttrModelNumberDataSpecs from './DeviceAttrModelNumberDataSpecs.vue'
+import DeviceAttrModelArrayDataSpecs from './DeviceAttrModelArrayDataSpecs.vue'
+import DeviceAttrModelStructDataSpecs from './DeviceAttrModelStructDataSpecs.vue'
 
 export {
-  ThingModelEnumDataSpecs,
-  ThingModelNumberDataSpecs,
-  ThingModelArrayDataSpecs,
-  ThingModelStructDataSpecs
+  DeviceAttrModelEnumDataSpecs,
+  DeviceAttrModelNumberDataSpecs,
+  DeviceAttrModelArrayDataSpecs,
+  DeviceAttrModelStructDataSpecs
 }