Bladeren bron

Merge branch 'master' of http://1.94.244.160:3000/shuzhihua/pms-iot-vue

Zimo 1 week geleden
bovenliggende
commit
9956efdfff

+ 6 - 0
src/api/iot/thingmodel/index.ts

@@ -197,6 +197,12 @@ export const ThingModelApi = {
   // 删除产品物模型
   deleteThingModel: async (id: number) => {
     return await request.delete({ url: `/iot/thing-model/delete?id=` + id })
+  },
+  // 导入通用物模型
+  importCommonThingModel: async (data) => {
+    return await request.get({
+      url: `/iot/thing-model/import-common?commonId=${data.commonId}&productId=${data.productId}`
+    })
   }
 }
 

+ 18 - 14
src/views/iot/commonThing/index.vue

@@ -27,9 +27,13 @@
           <Icon class="mr-5px" icon="ep:plus" />
           添加功能
         </el-button>
-        <el-button v-hasPermi="[`iot:thing-model:query`]" plain type="success" @click="openTSL">
+        <!-- <el-button
+          v-hasPermi="[`iot:thing-model-common:query`]"
+          plain
+          type="success"
+          @click="openTSL">
           TSL
-        </el-button>
+        </el-button> -->
       </el-form-item>
     </el-form>
   </ContentWrap>
@@ -37,43 +41,43 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-tabs>
-      <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
+      <zm-table :loading="loading" :data="list">
         <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">
+        <zm-table-column align="center" label="功能名称" prop="name" />
+        <zm-table-column align="center" label="标识符" prop="identifier" />
+        <zm-table-column align="center" label="数据类型" prop="identifier">
           <template #default="{ row }">
             {{ getDataTypeOptionsLabel(row.property?.dataType) ?? '-' }}
           </template>
-        </el-table-column>
-        <el-table-column align="left" label="数据定义" prop="identifier">
+        </zm-table-column>
+        <zm-table-column align="left" label="数据定义" prop="identifier">
           <template #default="{ row }">
             <DataDefinition :data="row" />
           </template>
-        </el-table-column>
-        <el-table-column align="center" label="操作">
+        </zm-table-column>
+        <zm-table-column align="center" label="操作">
           <template #default="scope">
             <el-button
-              v-hasPermi="[`iot:thing-model:update`]"
+              v-hasPermi="[`iot:thing-model-common:update`]"
               link
               type="primary"
               @click="openForm('update', scope.row.id)">
               编辑
             </el-button>
             <el-button
-              v-hasPermi="['iot:thing-model:delete']"
+              v-hasPermi="['iot:thing-model-common:delete']"
               link
               type="danger"
               @click="handleDelete(scope.row.id)">
               删除
             </el-button>
           </template>
-        </el-table-column>
-      </el-table>
+        </zm-table-column>
+      </zm-table>
       <!-- 分页 -->
       <Pagination
         v-model:limit="queryParams.pageSize"

+ 218 - 15
src/views/iot/thingmodel/index.vue

@@ -7,22 +7,19 @@
       :inline="true"
       :model="queryParams"
       class="-mb-15px"
-      label-width="68px"
-    >
+      label-width="68px">
       <el-form-item label="功能类型" prop="name">
         <el-select
           v-model="queryParams.type"
           class="!w-240px"
           clearable
           placeholder="请选择功能类型"
-          @change="handleQuery"
-        >
+          @change="handleQuery">
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.IOT_THING_MODEL_TYPE)"
             :key="dict.value"
             :label="dict.label"
-            :value="dict.value"
-          />
+            :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -30,11 +27,19 @@
           v-hasPermi="[`iot:thing-model:create`]"
           plain
           type="primary"
-          @click="openForm('create')"
-        >
+          @click="openForm('create')">
           <Icon class="mr-5px" icon="ep:plus" />
           添加功能
         </el-button>
+
+        <el-button
+          v-hasPermi="[`iot:thing-model:create`]"
+          plain
+          type="primary"
+          @click="importCommonTing">
+          <Icon class="mr-5px" icon="ep:plus" />
+          导入通用物模型
+        </el-button>
         <el-button v-hasPermi="[`iot:thing-model:query`]" plain type="success" @click="openTSL">
           TSL
         </el-button>
@@ -69,16 +74,14 @@
               v-hasPermi="[`iot:thing-model:update`]"
               link
               type="primary"
-              @click="openForm('update', scope.row.id)"
-            >
+              @click="openForm('update', scope.row.id)">
               编辑
             </el-button>
             <el-button
               v-hasPermi="['iot:thing-model:delete']"
               link
               type="danger"
-              @click="handleDelete(scope.row.id)"
-            >
+              @click="handleDelete(scope.row.id)">
               删除
             </el-button>
           </template>
@@ -89,17 +92,107 @@
         v-model:limit="queryParams.pageSize"
         v-model:page="queryParams.pageNo"
         :total="total"
-        @pagination="getList"
-      />
+        @pagination="getList" />
     </el-tabs>
   </ContentWrap>
 
   <!-- 表单弹窗:添加/修改 -->
   <ThingModelForm ref="formRef" @success="getList" />
   <ThingModelTSL ref="tslRef" />
+
+  <Dialog v-model="importDialogVisible" title="导入通用物模型" width="1000px">
+    <el-form
+      ref="importQueryFormRef"
+      :inline="true"
+      :model="importQueryParams"
+      class="-mb-15px"
+      label-width="68px">
+      <el-form-item label="功能类型" prop="type">
+        <el-select
+          v-model="importQueryParams.type"
+          class="!w-240px"
+          clearable
+          placeholder="请选择功能类型">
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.IOT_THING_MODEL_TYPE)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="功能名称" prop="name">
+        <el-input
+          v-model="importQueryParams.name"
+          class="!w-240px"
+          clearable
+          placeholder="请输入功能名称"
+          @keyup.enter="handleImportQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleImportQuery">
+          <Icon class="mr-5px" icon="ep:search" />
+          搜索
+        </el-button>
+        <el-button @click="resetImportQuery">
+          <Icon class="mr-5px" icon="ep:refresh" />
+          重置
+        </el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      ref="importTableRef"
+      style="margin-top: 15px"
+      v-loading="importLoading"
+      :data="commonThingList"
+      row-key="id"
+      :show-overflow-tooltip="true"
+      :stripe="true"
+      @selection-change="handleImportSelectionChange">
+      <el-table-column type="selection" width="55" :reserve-selection="true" />
+      <el-table-column align="center" label="功能类型" prop="type" width="120">
+        <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" min-width="180" />
+      <el-table-column align="center" label="标识符" prop="identifier" min-width="180" />
+      <el-table-column align="center" label="数据类型" min-width="120">
+        <template #default="{ row }">
+          {{ getDataTypeOptionsLabel(row.property?.dataType) ?? '-' }}
+        </template>
+      </el-table-column>
+      <el-table-column align="left" label="数据定义" min-width="220">
+        <template #default="{ row }">
+          <DataDefinition :data="row" />
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="mt-15px flex justify-end">
+      <Pagination
+        v-model:limit="importQueryParams.pageSize"
+        v-model:page="importQueryParams.pageNo"
+        :total="importTotal"
+        @pagination="getCommonThingList" />
+    </div>
+
+    <template #footer>
+      <div class="flex items-center">
+        <span class="mr-auto text-[var(--el-text-color-secondary)]">
+          已选 {{ selectedCommonThingRows.length }} 条
+        </span>
+        <el-button @click="closeImportDialog">取消</el-button>
+        <el-button type="primary" :loading="importSubmitting" @click="submitImportCommonThing">
+          导入
+        </el-button>
+      </div>
+    </template>
+  </Dialog>
 </template>
 <script lang="ts" setup>
-import { ThingModelApi, ThingModelData } from '@/api/iot/thingmodel'
+import { nextTick } from 'vue'
+import { ThingModelApi, ThingModelCommon, ThingModelData } from '@/api/iot/thingmodel'
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import ThingModelForm from './ThingModelForm.vue'
 import ThingModelTSL from './ThingModelTSL.vue'
@@ -124,6 +217,22 @@ const queryParams = reactive({
 
 const queryFormRef = ref() // 搜索的表单
 const product = inject<Ref<ProductVO>>(IOT_PROVIDE_KEY.PRODUCT) // 注入产品信息
+const importDialogVisible = ref(false)
+const importLoading = ref(false)
+const importSubmitting = ref(false)
+const importTotal = ref(0)
+const commonThingList = ref<ThingModelData[]>([])
+const selectedCommonThingRows = ref<ThingModelData[]>([])
+const selectedCommonThingMap = ref<Record<number, ThingModelData>>({})
+const importQueryFormRef = ref()
+const importTableRef = ref()
+const importQueryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  type: undefined,
+  name: undefined,
+  productId: -1
+})
 
 /** 查询列表 */
 const getList = async () => {
@@ -144,6 +253,100 @@ const handleQuery = () => {
   getList()
 }
 
+const getCommonThingList = async () => {
+  importLoading.value = true
+  try {
+    const data = await ThingModelCommon.getCommonThingModelPage(importQueryParams)
+    commonThingList.value = data.list
+    importTotal.value = data.total
+  } finally {
+    importLoading.value = false
+  }
+
+  await nextTick()
+  restoreImportSelection()
+}
+
+const handleImportQuery = () => {
+  importQueryParams.pageNo = 1
+  getCommonThingList()
+}
+
+const resetImportQuery = () => {
+  importQueryFormRef.value?.resetFields()
+  importQueryParams.pageNo = 1
+  handleImportQuery()
+}
+
+const handleImportSelectionChange = (selection: ThingModelData[]) => {
+  const currentPageIds = new Set(
+    commonThingList.value
+      .map((item) => item.id)
+      .filter((id): id is number => typeof id === 'number')
+  )
+
+  currentPageIds.forEach((id) => {
+    delete selectedCommonThingMap.value[id]
+  })
+
+  selection.forEach((item) => {
+    if (typeof item.id === 'number') {
+      selectedCommonThingMap.value[item.id] = item
+    }
+  })
+
+  selectedCommonThingRows.value = Object.values(selectedCommonThingMap.value)
+}
+
+const restoreImportSelection = () => {
+  if (!importTableRef.value) return
+
+  commonThingList.value.forEach((item) => {
+    const selected = typeof item.id === 'number' && !!selectedCommonThingMap.value[item.id]
+    importTableRef.value.toggleRowSelection(item, selected)
+  })
+}
+
+const importCommonTing = async () => {
+  importDialogVisible.value = true
+  selectedCommonThingRows.value = []
+  selectedCommonThingMap.value = {}
+  importQueryParams.pageNo = 1
+  await getCommonThingList()
+}
+
+const closeImportDialog = () => {
+  importDialogVisible.value = false
+  selectedCommonThingRows.value = []
+  selectedCommonThingMap.value = {}
+  importTableRef.value?.clearSelection()
+}
+
+const submitImportCommonThing = async () => {
+  if (!selectedCommonThingRows.value.length) {
+    message.warning('请选择要导入的通用物模型')
+    return
+  }
+  if (!product?.value?.id) {
+    message.warning('未获取到当前产品信息')
+    return
+  }
+
+  importSubmitting.value = true
+  try {
+    await ThingModelApi.importCommonThingModel({
+      commonId: selectedCommonThingRows.value.map((item) => item.id).join(','),
+      productId: product.value.id
+    })
+
+    message.success('导入成功')
+    closeImportDialog()
+    await getList()
+  } finally {
+    importSubmitting.value = false
+  }
+}
+
 /** 添加/修改操作 */
 const formRef = ref()
 const openForm = (type: string, id?: number) => {

+ 8 - 0
src/views/pms/fiveDailyReportSummary/index.vue

@@ -188,6 +188,14 @@ function formatCellValue(row, prop) {
 
 function handleDeptCellClick(row) {
   const rowType = String(row?.type || selectedDeptType.value || '1')
+
+  if (rowType === '2' && row?.projectDeptId) {
+    query.value.deptId = row.projectDeptId
+    currentDeptName.value = row.projectDeptName || row.deptDisplayName || '5号国'
+    selectedDeptType.value = '2'
+    return
+  }
+
   const targetQuery = {
     deptId: String(query.value.deptId || defaultDeptId),
     createTime: Array.isArray(query.value.createTime) ? query.value.createTime : undefined,