Jelajahi Sumber

pms 设备分类属性列表

zhangcl 4 bulan lalu
induk
melakukan
f7a260eeed

+ 73 - 0
src/api/pms/deviceattrmodel/index.ts

@@ -0,0 +1,73 @@
+import request from '@/config/axios'
+
+/**
+ * 设备分类属性 模型
+ */
+export interface DeviceAttrModelData {
+  id?: number // 设备属性id
+  code?: string // 设备属性编码
+  name?: string // 设备属性名称
+  description?: string // 属性描述
+  deviceCategoryId?: number // 设备分类id
+  deviceId?: number // 设备id
+  templateId?: number // 设备分类模板id
+  requiredFlag?: string // 是否必填
+  dataType: string // 数据类型,与 dataSpecs 的 dataType 保持一致
+  type: number // 属性字段类型
+  selectOptions: DeviceTemplateAttrs // 设备属性
+}
+
+/**
+ * 设备 模拟属性
+ */
+export interface SimulatorData extends DeviceAttrModelData {
+  simulateValue?: string | number // 用于存储模拟值
+}
+
+/**
+ * DeviceTemplateAttrs 类型
+ */
+export interface DeviceTemplateAttrs {
+  [key: string]: any
+}
+
+// 设备(分类)属性 模型 API
+export const DeviceAttrModelApi = {
+  // 查询 设备属性 分页
+  getDeviceAttrModelPage: async (params: any) => {
+    return await request.get({ url: `/pms/iot-device-category-template-attrs/page`, params })
+  },
+
+  // 获得设备属性列表
+  getDeviceAttrModelList: async (params: any) => {
+    return await request.get({ url: `/pms/iot-device-category-template-attrs/list`, params })
+  },
+
+  // 获得设备属性
+  getDeviceAttrModelListByDeviceCategoryId: async (params: any) => {
+    return await request.get({
+      url: `/pms/iot-device-category-template-attrs/list-by-device-category-id`,
+      params
+    })
+  },
+
+  // 查询设备属性详情
+  getDeviceAttrModel: async (id: number) => {
+    return await request.get({ url: `/pms/iot-device-category-template-attrs/get?id=` + id })
+  },
+
+  // 新增设备属性
+  createDeviceAttrModel: async (data: DeviceAttrModelData) => {
+    return await request.post({ url: `/pms/iot-device-category-template-attrs/create`, data })
+  },
+
+  // 修改设备属性
+  updateDeviceAttrModel: async (data: DeviceAttrModelData) => {
+    return await request.put({ url: `/pms/iot-device-category-template-attrs/update`, data })
+  },
+
+  // 删除设备属性
+  deleteDeviceAttrModel: async (id: number) => {
+    return await request.delete({ url: `/pms/iot-device-category-template-attrs/delete?id=` + id })
+  }
+}

+ 7 - 7
src/api/pms/devicetemplate/index.ts

@@ -21,27 +21,27 @@ export interface DeviceTemplateAttrs {
 
 // 根据设备分类id查询设备专有属性模板
 export const getAttrTemplateByDeviceCategoryId = async (params: any): Promise<any> => {
-  return await request.get({ url: '/rq/iot-device-template/list-by-device-category-id?deviceCategoryId='+ params })
+  return await request.get({ url: '/pms/iot-device-category-template/list-by-device-category-id?deviceCategoryId='+ params })
 }
 
 // 查询 设备属性模板 列表
 export const getDeviceTemplatePage = async (params: PageParam) => {
-  return await request.get({ url: '/rq/iot-device-template/page', params })
+  return await request.get({ url: '/pms/iot-device-category-template/page', params })
 }
 
 // 查询 设备属性模板 详情
 export const getDeviceTemplate = async (id: number) => {
-  return await request.get({ url: '/rq/iot-device-template/get?id=' + id })
+  return await request.get({ url: '/pms/iot-device-category-template/get?id=' + id })
 }
 
 // 新增 设备属性模板
 export const createDeviceTemplate = async (data: DeviceAttrTemplateVO) => {
-  return await request.post({ url: '/rq/iot-device-template/create', data: data })
+  return await request.post({ url: '/pms/iot-device-category-template/create', data: data })
 }
 
 // 修改 设备属性模板
 export const updateDeviceTemplate = async (params: DeviceAttrTemplateVO) => {
-  return await request.put({ url: '/rq/iot-device-template/update', data: params })
+  return await request.put({ url: '/pms/iot-device-category-template/update', data: params })
 }
 
 // 设备属性模板状态修改
@@ -50,10 +50,10 @@ export const updateDeviceTemplateStatus = (id: number, status: number) => {
     id,
     status
   }
-  return request.put({ url: '/rq/iot-device-template/update-status', data: data })
+  return request.put({ url: '/pms/iot-device-category-template/update-status', data: data })
 }
 
 // 删除 设备属性模板
 export const deleteDeviceTemplate = async (id: number) => {
-  return await request.delete({ url: '/rq/iot-device-template/delete?id=' + id })
+  return await request.delete({ url: '/pms/iot-device-category-template/delete?id=' + id })
 }

+ 2 - 2
src/router/modules/remaining.ts

@@ -80,8 +80,8 @@ const remainingRouter: AppRouteRecordRaw[] = [
     children: [
       {
         path: 'template/detail/:id',
-        component: () => import('@/views/pms/devicetemplate/detail/index.vue'),
-        name: 'DeviceAttrTemplateDetail',
+        component: () => import('@/views/pms/devicetemplate/detail/attrsModel/index.vue'),
+        name: 'DeviceAttrTemplateModel',
         meta: {
           title: '设备属性模板详情',
           noCache: false,

+ 2 - 1
src/views/iot/utils/constants.ts

@@ -1,4 +1,5 @@
 /** iot 依赖注入 KEY */
 export const IOT_PROVIDE_KEY = {
-  PRODUCT: 'IOT_PRODUCT'
+  PRODUCT: 'IOT_PRODUCT',
+  DEVICE_ATTR_TEMPLATE: 'DEVICE_ATTR_TEMPLATE',
 }

+ 32 - 26
src/views/pms/devicetemplate/detail/attrsModel/index.vue

@@ -1,4 +1,4 @@
-<!-- 产品的物模型列表 -->
+<!-- 设备分类属性列表 -->
 <template>
   <ContentWrap>
     <!-- 搜索工作栏 -->
@@ -19,13 +19,13 @@
           重置
         </el-button>
         <el-button
-          v-hasPermi="[`iot:thing-model:create`]"
+          v-hasPermi="[`pms:iot-device-category-template-attrs:create`]"
           plain
           type="primary"
           @click="openForm('create')"
         >
           <Icon class="mr-5px" icon="ep:plus" />
-          添加功能
+          添加属性
         </el-button>
       </el-form-item>
     </el-form>
@@ -35,19 +35,14 @@
   <ContentWrap>
     <el-tabs>
       <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
-        <el-table-column align="center" label="功能类型" prop="type">
-          <template #default="scope">
-            <dict-tag :type="DICT_TYPE.IOT_THING_MODEL_TYPE" :value="scope.row.type" />
-          </template>
-        </el-table-column>
-        <el-table-column align="center" label="功能名称" prop="name" />
-        <el-table-column align="center" label="标识符" prop="identifier" />
-        <el-table-column align="center" label="数据类型" prop="identifier">
+        <el-table-column align="center" label="属性名称" prop="name" />
+        <el-table-column align="center" label="标识符" prop="code" />
+        <el-table-column align="center" label="数据类型" prop="code">
           <template #default="{ row }">
-            {{ dataTypeOptionsLabel(row.property?.dataType) ?? '-' }}
+            {{ dataTypeOptionsLabel(row.selectOptions?.type) ?? '-' }}
           </template>
         </el-table-column>
-        <el-table-column align="left" label="数据定义" prop="identifier">
+        <el-table-column align="left" label="数据定义" prop="code">
           <template #default="{ row }">
             <DataDefinition :data="row" />
           </template>
@@ -55,7 +50,7 @@
         <el-table-column align="center" label="操作">
           <template #default="scope">
             <el-button
-              v-hasPermi="[`iot:thing-model:update`]"
+              v-hasPermi="[`pms:iot-device-category-template-attrs:update`]"
               link
               type="primary"
               @click="openForm('update', scope.row.id)"
@@ -63,7 +58,7 @@
               编辑
             </el-button>
             <el-button
-              v-hasPermi="['iot:thing-model:delete']"
+              v-hasPermi="['pms:iot-device-category-template-attrs:delete']"
               link
               type="danger"
               @click="handleDelete(scope.row.id)"
@@ -83,42 +78,48 @@
     </el-tabs>
   </ContentWrap>
   <!-- 表单弹窗:添加/修改 -->
-  <ThingModelForm ref="formRef" @success="getList" />
+  <AttrTemplateModelForm ref="formRef" @success="getList" />
 </template>
 <script lang="ts" setup>
-import { ThingModelApi, ThingModelData } from '@/api/iot/thingmodel'
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import ThingModelForm from './AttrTemplateModelForm.vue'
-import { ProductVO } from '@/api/iot/product/product'
+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";
+
+const { delView } = useTagsViewStore() // 视图操作
+const route = useRoute()
+const { currentRoute } = useRouter()
 
 defineOptions({ name: 'DeviceAttrTemplateModel' })
 
+const deviceCategoryId = route.params.id // 设备分类id
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 
 const loading = ref(true) // 列表的加载中
-const list = ref<ThingModelData[]>([]) // 列表的数据
+const list = ref<DeviceAttrModelData[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   type: undefined,
-  productId: -1
+  deviceCategoryId: -1
 })
 
 const queryFormRef = ref() // 搜索的表单
-const product = inject<Ref<ProductVO>>(IOT_PROVIDE_KEY.PRODUCT) // 注入产品信息
+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.productId = product?.value?.id || -1
-    const data = await ThingModelApi.getThingModelPage(queryParams)
+    // queryParams.deviceCategoryId = template?.value?.deviceCategoryId || -1
+    queryParams.deviceCategoryId = deviceCategoryId
+    const data = await DeviceAttrModelApi.getDeviceAttrModelPage(queryParams)
     list.value = data.list
     total.value = data.total
   } finally {
@@ -151,7 +152,7 @@ const handleDelete = async (id: number) => {
     // 删除的二次确认
     await message.delConfirm()
     // 发起删除
-    await ThingModelApi.deleteThingModel(id)
+    await DeviceAttrModelApi.deleteDeviceAttrModel(id)
     message.success(t('common.delSuccess'))
     // 刷新列表
     await getList()
@@ -160,6 +161,11 @@ const handleDelete = async (id: number) => {
 
 /** 初始化 **/
 onMounted(() => {
+  if (!deviceCategoryId) {
+    message.warning('参数错误,设备属性模板不能为空!')
+    delView(unref(currentRoute))
+    return
+  }
   getList()
 })
 </script>

+ 11 - 24
src/views/pms/devicetemplate/detail/components/DataDefinition.vue

@@ -1,61 +1,48 @@
 <template>
   <!-- 属性 -->
-  <template v-if="data.type === ThingModelType.PROPERTY">
     <!-- 非列表型:数值 -->
     <div
       v-if="
         [DataSpecsDataType.INT, DataSpecsDataType.DOUBLE, DataSpecsDataType.FLOAT].includes(
-          data.property.dataType
+          data.selectOptions.type
         )
       "
     >
-      取值范围:{{ `${data.property.dataSpecs.min}~${data.property.dataSpecs.max}` }}
+      取值范围:{{ `${data.selectOptions.dataSpecs.min}~${data.selectOptions.dataSpecs.max}` }}
     </div>
     <!-- 非列表型:文本 -->
-    <div v-if="DataSpecsDataType.TEXT === data.property.dataType">
-      数据长度:{{ data.property.dataSpecs.length }}
+    <div v-if="DataSpecsDataType.TEXT === data.selectOptions.type">
+      数据长度:{{ data.selectOptions.dataSpecs.length }}
     </div>
     <!-- 列表型: 数组、结构、时间(特殊) -->
     <div
       v-if="
         [DataSpecsDataType.ARRAY, DataSpecsDataType.STRUCT, DataSpecsDataType.DATE].includes(
-          data.property.dataType
+          data.selectOptions.type
         )
       "
     >
       -
     </div>
     <!-- 列表型: 布尔值、枚举 -->
-    <div v-if="[DataSpecsDataType.BOOL, DataSpecsDataType.ENUM].includes(data.property.dataType)">
-      <div> {{ DataSpecsDataType.BOOL === data.property.dataType ? '布尔值' : '枚举值' }}:</div>
-      <div v-for="item in data.property.dataSpecsList" :key="item.value">
+    <div v-if="[DataSpecsDataType.BOOL, DataSpecsDataType.ENUM].includes(data.selectOptions.type)">
+      <div> {{ DataSpecsDataType.BOOL === data.selectOptions.dataType ? '布尔值' : '枚举值' }}:</div>
+      <div v-for="item in data.selectOptions.dataSpecsList" :key="item.value">
         {{ `${item.name}-${item.value}` }}
       </div>
     </div>
-  </template>
-  <!-- 服务 -->
-  <div v-if="data.type === ThingModelType.SERVICE">
-    调用方式:{{ getCallTypeByValue(data.service!.callType) }}
-  </div>
-  <!-- 事件 -->
-  <div v-if="data.type === ThingModelType.EVENT">
-    事件类型:{{ getEventTypeByValue(data.event!.type) }}
-  </div>
 </template>
 
 <script lang="ts" setup>
 import {
   DataSpecsDataType,
-  getCallTypeByValue,
-  getEventTypeByValue,
-  ThingModelType
-} from '@/views/iot/thingmodel/config'
-import { ThingModelData } from '@/api/iot/thingmodel'
+} from '@/views/pms/devicetemplate/detail/attrsModel/config'
+import { DeviceAttrModelData } from '@/api/pms/deviceattrmodel'
 
 /** 数据定义展示组件 */
 defineOptions({ name: 'DataDefinition' })
 
-defineProps<{ data: ThingModelData }>()
+defineProps<{ data: DeviceAttrModelData }>()
 </script>
 
 <style lang="scss" scoped></style>

+ 2 - 7
src/views/pms/devicetemplate/detail/index.vue

@@ -14,7 +14,7 @@ import TemplateDetailsHeader from './TemplateDetailsHeader.vue'
 import DeviceAttrTemplateModel from '@/views/pms/devicetemplate/detail/attrsModel/index.vue'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import { useRouter } from 'vue-router'
-import { IOT_PROVIDE_KEY } from '@/views/iot/utils/constants'
+import {IOT_PROVIDE_KEY} from "@/views/iot/utils/constants";
 
 defineOptions({ name: 'DeviceAttrTemplateDetail' })
 
@@ -28,7 +28,7 @@ const loading = ref(true) // 加载中
 const template = ref<DeviceTemplateApi.DeviceAttrTemplateVO>({} as DeviceTemplateApi.DeviceAttrTemplateVO) // 模板详情
 const activeTab = ref('attrModel') // 默认为 属性列表 标签页
 
-// provide(IOT_PROVIDE_KEY.PRODUCT, product) // 提供产品信息给产品信息详情页的所有子组件
+provide(IOT_PROVIDE_KEY.DEVICE_ATTR_TEMPLATE, template) // 提供设备属性模板信息给详情页的子组件
 
 /** 获取 设备属性模板 详情 */
 const getTemplateData = async (id: number) => {
@@ -48,10 +48,5 @@ onMounted(async () => {
     return
   }
   await getTemplateData(id)
-  // 处理 tab 参数
-  const { tab } = route.query
-  if (tab) {
-    activeTab.value = tab as string
-  }
 })
 </script>

+ 2 - 2
src/views/pms/devicetemplate/index.vue

@@ -122,7 +122,7 @@
                 <el-button
                   type="primary"
                   link
-                  @click="openDetail(scope.row.id)"
+                  @click="openDetail(scope.row.deviceCategoryId)"
                 >
                   <Icon icon="ep:edit" />查看
                 </el-button>
@@ -241,7 +241,7 @@ const openForm = (type: string, id?: number) => {
 
 /** 打开详情 */
 const openDetail = (id: number) => {
-  push({ name: 'DeviceAttrTemplateDetail', params: { id } })
+  push({ name: 'DeviceAttrTemplateModel', params: { id } })
 }
 
 /** 修改 设备属性模板 状态 */