Răsfoiți Sursa

锁柜管理,硬件信息,硬件类型接口调用完毕

pm 4 luni în urmă
părinte
comite
ca373af7b5

+ 1 - 1
src/api/basic/configuration/index.ts

@@ -50,7 +50,7 @@ export const deleteIsSystemAttributeByIds = async (id: number) => {
 export const getIsSystemAttributeByKey = async (sysAttrKey: string) => {
   return await request.get({
     url: '/iscs/attribute/getSystemAttributeByKey',
-    query: { sysAttrKey }
+    params: { sysAttrKey }
   })
 }
 

+ 1 - 2
src/api/hw/hardware/lockCabinet/slots.ts

@@ -48,7 +48,6 @@ export const updateIsLockCabinetSlots = async (data: LockCabinetSlotVO) => {
 // 删除锁控机柜-仓位信息
 export const deleteIsLockCabinetSlotsBySlotIds = async (ids: number) => {
   return await request.delete({
-    url: '/iscs/lock-cabinet-slots/deleteLockCabinetSlotsList',
-    params: { ids: ids }
+    url: '/iscs/lock-cabinet-slots/deleteLockCabinetSlotsList?ids='+ids,
   })
 }

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

@@ -122,7 +122,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
           hidden: true,
           canTo: true,
           icon: 'ep:view',
-          activeMenu: '/mes/dv/technology/technologyList'
+          activeMenu: '/dv/technology/technologyList'
         }
       },
       {
@@ -135,11 +135,35 @@ const remainingRouter: AppRouteRecordRaw[] = [
           hidden: true,
           canTo: true,
           icon: 'ep:view',
-          activeMenu: '/mes/dv/technology/technologyList'
+          activeMenu: '/dv/technology/technologyList'
         }
       }
     ]
   },
+  {
+    path: '/hw',
+    component: Layout,
+    name: 'Hw',
+    meta: {
+      hidden: true
+    },
+    children: [
+      {
+        path: 'lockCabinet/lookDetail',
+        component: () => import('@/views/hw/lockCabinet/lookDetail.vue'),
+        name: 'HardwarelookDetail',
+        meta: {
+          title: '锁柜详情',
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:view',
+          activeMenu: '/hw/lockCabinet/lookDetail'
+        }
+      },
+
+    ]
+  },
   {
     path: '/dict',
     component: Layout,

+ 53 - 33
src/views/hw/hardware/information/HardwareForm.vue

@@ -28,6 +28,15 @@
 <!--            />-->
 <!--          </el-form-item>-->
 <!--        </el-col>-->
+        <el-col :span="11">
+          <el-form-item label="硬件名称" prop="hardwareName">
+            <el-input
+              v-model="formData.hardwareName"
+              placeholder="请输入硬件名称"
+            />
+          </el-form-item>
+        </el-col>
+
         <el-col :span="11">
           <el-form-item label="硬件类型" prop="hardwareTypeId">
             <el-tree-select
@@ -41,14 +50,7 @@
         </el-col>
       </el-row>
       <el-row>
-        <el-col :span="11">
-          <el-form-item label="硬件名称" prop="hardwareName">
-            <el-input
-              v-model="formData.hardwareName"
-              placeholder="请输入硬件名称"
-            />
-          </el-form-item>
-        </el-col>
+
         <el-col :span="11">
           <el-form-item label="规格型号" prop="hardwareSpec">
             <el-input
@@ -57,8 +59,6 @@
             />
           </el-form-item>
         </el-col>
-      </el-row>
-      <el-row>
         <el-col :span="11">
           <el-form-item label="序列号" prop="serialNumber">
             <el-input
@@ -68,6 +68,7 @@
           </el-form-item>
         </el-col>
       </el-row>
+
       <el-row>
         <el-col :span="11">
           <el-form-item label="可用次数" prop="availableTimes">
@@ -118,25 +119,23 @@
             />
           </el-form-item>
         </el-col>
-        <el-col :span="11">
-          <el-form-item label="状态" prop="status">
-            <el-radio-group v-model="formData.status">
-              <el-radio label="1">
-                <img src="@/assets/images/success.png" alt="" class="imgstatus" />
-                在线
-              </el-radio>
-              <el-radio label="2">
-                <img src="@/assets/images/error.png" alt="" class="imgstatus" />
-                离线
-              </el-radio>
-              <el-radio label="3">
-                <img src="@/assets/images/warn.png" alt="" class="imgstatus" />
-                异常
-              </el-radio>
-            </el-radio-group>
-          </el-form-item>
-        </el-col>
       </el-row>
+      <el-form-item label="状态" prop="status">
+        <el-radio-group v-model="formData.status">
+          <el-radio label="1">
+            <img src="@/assets/images/success.png" alt="" class="imgstatus" />
+            在线
+          </el-radio>
+          <el-radio label="2">
+            <img src="@/assets/images/error.png" alt="" class="imgstatus" />
+            离线
+          </el-radio>
+          <el-radio label="3">
+            <img src="@/assets/images/warn.png" alt="" class="imgstatus" />
+            异常
+          </el-radio>
+        </el-radio-group>
+      </el-form-item>
     </el-form>
     <template #footer>
       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
@@ -256,15 +255,36 @@ const resetForm = () => {
   formRef.value?.resetFields()
 }
 
-/** 处理选择变化 */
+// 递归查找函数
+const findOptionById = (options: any[], targetId: number): any => {
+  for (const option of options) {
+    // 检查当前节点
+    if (option.id === targetId) {
+      return option
+    }
+
+    // 如果有子节点,递归查找
+    if (option.children && option.children.length > 0) {
+      const found = findOptionById(option.children, targetId)
+      if (found) {
+        return found
+      }
+    }
+  }
+  return null
+}
+// 下拉改变函数
 const onSelectChange = (selectedId: number) => {
   formData.value.hardwareTypeId = selectedId
-  // 查找对应的 hardwareTypeName
-  const selectedOption = hardwareTypeOption.value.find(
-    (option: any) => option.id === selectedId
-  )
+
+  // 使用递归查找
+  const selectedOption = findOptionById(hardwareTypeOption.value, selectedId)
+
   if (selectedOption) {
     formData.value.hardwareTypeName = selectedOption.hardwareTypeName
+    console.log('找到匹配项:', selectedOption.hardwareTypeName)
+  } else {
+    console.warn('未找到匹配的选项,selectedId:', selectedId)
   }
 }
 

+ 9 - 9
src/views/hw/hardware/information/index.vue

@@ -34,7 +34,7 @@
           class="!w-240px"
         >
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.HARDWARE_STATUS)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.HARDWARE_STATUS)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -45,7 +45,7 @@
         <el-tree-select
           v-model="queryParams.hardwareTypeId"
           :data="hardwareTypeOption"
-          :props="defaultProps"
+          :props="{ value: 'id', label: 'hardwareTypeName', children: 'children' }"
           placeholder="请选择硬件类型"
           class="!w-240px"
         />
@@ -113,10 +113,10 @@
         width="150"
         :show-overflow-tooltip="true"
       />
-      <el-table-column label="硬件类型" prop="hardwareTypeName" />
-      <el-table-column label="规格型号" prop="hardwareSpec" />
-      <el-table-column label="序列号" prop="serialNumber" />
-      <el-table-column label="硬件状态" prop="status">
+      <el-table-column label="硬件类型" prop="hardwareTypeName" width="150"/>
+      <el-table-column label="规格型号" prop="hardwareSpec" width="150"/>
+      <el-table-column label="序列号" prop="serialNumber" width="150"/>
+      <el-table-column label="硬件状态" prop="status" width="150">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.HARDWARE_STATUS" :value="scope.row.status" />
         </template>
@@ -125,7 +125,7 @@
       <el-table-column
         label="启用时间"
         prop="activationTime"
-        width="120"
+        width="180"
         :formatter="dateFormatter"
       />
       <el-table-column label="可用次数" prop="availableTimes" />
@@ -167,7 +167,7 @@
 </template>
 
 <script lang="ts" setup>
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { dateFormatter } from '@/utils/formatTime'
 import { handleTree } from '@/utils/tree'
 import * as HardwareApi from '@/api/hw/hardware/information/index'
@@ -267,7 +267,7 @@ const handleDelete = async (id?: number) => {
 const getHardwareTypeTree = async () => {
   const data = { pageNo: 1, pageSize: -1 }
   const response = await HardwareTypeApi.listHardwareType(data)
-  hardwareTypeOption.value = handleTree(response.list)
+  hardwareTypeOption.value = handleTree(response.list,'id','parentTypeId')
 }
 
 /** 初始化 **/

+ 171 - 139
src/views/hw/lockCabinet/MapData.vue

@@ -1,13 +1,39 @@
 <template>
   <ContentWrap>
     <div class="time-card">
-      <Icon icon="ep:time" class="mr-5px" />
+      <Icon icon="ep:timer" class="mr-5px"  :size="35"/>
       <div class="time-content">
         <div class="label">最后更新</div>
         <div class="time">{{ updateTime }}</div>
       </div>
     </div>
-    <div ref="container" class="map-container"></div>
+
+    <div class="map-container">
+      <v-stage :config="stageConfig" ref="stageRef">
+        <v-layer ref="layerRef">
+          <!-- 动态渲染仓位行 -->
+          <template v-for="(rowSlots, rowIndex) in groupedSlots" :key="rowIndex">
+            <!-- 行容器 -->
+            <v-rect :config="getRowBoxConfig(rowIndex)" />
+
+            <!-- 仓位图标 -->
+            <template v-for="(slot, slotIndex) in rowSlots" :key="`${rowIndex}-${slotIndex}`">
+              <v-image
+                :config="getSlotImageConfig(slot, rowIndex, slotIndex, rowSlots)"
+                @click="handleSlotClick(slot)"
+              />
+
+              <!-- 异常图标 -->
+              <v-image
+                v-if="slot.status === '1'"
+                :config="getExceptionImageConfig(slot, rowIndex, slotIndex, rowSlots)"
+                @click="showErrorDialog(slot)"
+              />
+            </template>
+          </template>
+        </v-layer>
+      </v-stage>
+    </div>
 
     <Dialog v-model="dialogVisible" title="异常信息" width="400">
       <h4 class="text-center font-bold">{{ errorInfo }}</h4>
@@ -19,51 +45,147 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted } from 'vue'
-import Konva from 'konva'
-import { getIsSystemAttributeByKey } from '@/api/system/configuration'
-import { getIsLockCabinetSlotsPage } from '@/api/mes/lockCabinet/slots'
-
+import { ref, computed, onMounted } from 'vue'
+import { getIsSystemAttributeByKey } from '@/api/basic/configuration/index'
+import { getIsLockCabinetSlotsPage } from '@/api/hw/hardware/lockCabinet/slots'
+import { formatDate } from '@/utils/formatTime'
 defineOptions({ name: 'LockCabinetMap' })
 
 const props = defineProps<{
   cabinetId: string
 }>()
 
-const stage = ref<Konva.Stage | null>(null)
-const layer = ref<Konva.Layer | null>(null)
+const stageRef = ref()
+const layerRef = ref()
 const cachedResults = ref<Record<string, string>>({})
-const cachedImages = ref<Record<string, Konva.Image>>({})
+const cachedImages = ref<Record<string, HTMLImageElement>>({})
 const slotData = ref<any[]>([])
 const dialogVisible = ref(false)
 const errorInfo = ref('')
 const updateTime = ref<string | null>(null)
-const container = ref<HTMLElement>()
-
-/** 初始化 Konva */
-const initKonva = () => {
-  if (!container.value) return
-  stage.value = new Konva.Stage({
-    container: container.value,
-    width: 900,
-    height: 800
-  })
-  layer.value = new Konva.Layer()
-  stage.value.add(layer.value)
+
+// Stage 配置
+const stageConfig = {
+  width: 900,
+  height: 1000
+}
+
+// 计算属性:按行分组仓位数据
+const groupedSlots = computed(() => {
+  const grouped: Record<string, any[]> = {}
+  for (const slot of slotData.value) {
+    const key = `${slot.row}`
+    if (!grouped[key]) grouped[key] = []
+    grouped[key].push(slot)
+  }
+
+  // 按行号排序
+  return Object.keys(grouped)
+    .sort((a, b) => Number(a) - Number(b))
+    .map(rowKey => grouped[rowKey])
+})
+
+// 获取行容器配置
+const getRowBoxConfig = (rowIndex: number) => {
+  const startY = 20
+  const rowHeight = 120
+  const rowGap = 20
+  const boxWidth = 860
+  const centerX = stageConfig.width / 2
+  const boxStartX = centerX - boxWidth / 2
+
+  return {
+    x: boxStartX,
+    y: startY + rowIndex * (rowHeight + rowGap),
+    width: boxWidth,
+    height: rowHeight,
+    stroke: 'black',
+    strokeWidth: 2,
+    fill: 'transparent'
+  }
+}
+
+// 获取仓位图标配置
+const getSlotImageConfig = (slot: any, rowIndex: number, slotIndex: number, rowSlots: any[]) => {
+  const { slotType, isOccupied } = slot
+  let baseKey = ''
+
+  if (slotType === '0') {
+    baseKey = isOccupied === '1' ? 'icon.locker.normal' : 'icon.locker.out'
+  } else {
+    baseKey = isOccupied === '1' ? 'icon.padlock.normal' : 'icon.padlock.out'
+  }
+
+  const baseUrl = cachedResults.value[baseKey]
+  if (!baseUrl || !cachedImages.value[baseUrl]) {
+    return null
+  }
+
+  const width = slotType === '0' ? 110 : 40
+  const height = 90
+  const startY = 20
+  const rowHeight = 120
+  const rowGap = 20
+  const padding = 20
+  const boxWidth = 860
+  const centerX = stageConfig.width / 2
+  const boxStartX = centerX - boxWidth / 2
+
+  // 计算位置
+  const totalSlots = rowSlots.length
+  const spacing = totalSlots > 1
+    ? (boxWidth - 2 * padding - totalSlots * width) / (totalSlots - 1)
+    : 0
+
+  const x = boxStartX + padding + slotIndex * (width + spacing)
+  const y = startY + rowIndex * (rowHeight + rowGap) + (rowHeight - height) / 2
+  return {
+    x,
+    y,
+    width,
+    height,
+    image: cachedImages.value[baseUrl],
+    listening: true
+  }
+}
+
+// 获取异常图标配置
+const getExceptionImageConfig = (slot: any, rowIndex: number, slotIndex: number, rowSlots: any[]) => {
+  const exUrl = cachedResults.value['icon.locker.exception']
+  console.log('getExceptionImageConfig', exUrl)
+  if (!exUrl || !cachedImages.value[exUrl]) {
+    return null
+  }
+
+  const slotConfig = getSlotImageConfig(slot, rowIndex, slotIndex, rowSlots)
+  if (!slotConfig) return null
+
+  const exWidth = 30
+  const exHeight = 30
+
+  return {
+    x: slotConfig.x + (slotConfig.width - exWidth) / 2,
+    y: slotConfig.y + (slotConfig.height - exHeight) / 2,
+    width: exWidth,
+    height: exHeight,
+    image: cachedImages.value[exUrl],
+    listening: true
+  }
 }
 
-/** 获取数据 */
+// 获取数据
 const getData = async () => {
   const data = {
     pageNo: 1,
     pageSize: -1,
     cabinetId: props.cabinetId
   }
+
   try {
     const res = await getIsLockCabinetSlotsPage(data)
-    updateTime.value = res.records[0]?.updateTime
-    slotData.value = res.records || []
 
+    updateTime.value = formatDate(res.list[0].createTime)
+    slotData.value = res.list || []
     const icons = [
       'icon.locker.normal',
       'icon.locker.out',
@@ -71,152 +193,59 @@ const getData = async () => {
       'icon.padlock.out',
       'icon.locker.exception'
     ]
+
     const results = await Promise.all(icons.map(key => getIsSystemAttributeByKey(key)))
     cachedResults.value = icons.reduce((map, key, idx) => {
-      map[key] = results[idx].data?.sysAttrValue || ''
+      map[key] = results[idx].sysAttrValue || ''
       return map
     }, {} as Record<string, string>)
 
     await preloadImages()
-    renderSlots()
   } catch (err) {
     console.error('获取数据失败:', err)
   }
 }
 
-/** 显示错误对话框 */
+// 显示错误对话框
 const showErrorDialog = (slot: any) => {
   errorInfo.value = slot.remark || '未知异常'
   dialogVisible.value = true
 }
 
-/** 预加载图片 */
+// 处理仓位点击
+const handleSlotClick = (slot: any) => {
+  console.log('点击仓位:', slot)
+  // 可以在这里添加仓位点击逻辑
+}
+
+// 预加载图片
 const preloadImages = async () => {
+
   const urls = Object.values(cachedResults.value)
   const promises = urls.map(url => loadImageOnce(url))
   await Promise.all(promises)
 }
 
-/** 渲染仓位 */
-const renderSlots = async () => {
-  if (!layer.value) return
-  layer.value.destroyChildren()
-
-  const grouped: Record<string, any[]> = {}
-  for (const slot of slotData.value) {
-    const key = `${slot.row}`
-    if (!grouped[key]) grouped[key] = []
-    grouped[key].push(slot)
-  }
-
-  const rows = Object.keys(grouped).sort((a, b) => Number(a) - Number(b))
-  const startY = 20
-  const rowHeight = 120
-  const rowGap = 20
-
-  for (let i = 0; i < rows.length; i++) {
-    const rowSlots = grouped[rows[i]]
-    await renderSlotRow(rowSlots, startY + i * (rowHeight + rowGap), rowHeight)
-  }
-
-  layer.value.draw()
-}
-
-/** 渲染仓位行 */
-const renderSlotRow = async (slots: any[], boxTopY: number, boxHeight: number) => {
-  if (!layer.value || !stage.value) return
-
-  const padding = 20
-  const boxWidth = 860
-  const centerX = stage.value.width() / 2
-  const boxStartX = centerX - boxWidth / 2
-
-  const box = new Konva.Rect({
-    x: boxStartX,
-    y: boxTopY,
-    width: boxWidth,
-    height: boxHeight,
-    stroke: 'black',
-    strokeWidth: 2
-  })
-  layer.value.add(box)
-
-  const loadedImages = []
-  for (const slot of slots) {
-    const { slotType, isOccupied } = slot
-    let baseKey = ''
-    if (slotType === '0') {
-      baseKey = isOccupied === '1' ? 'icon.locker.normal' : 'icon.locker.out'
-    } else {
-      baseKey = isOccupied === '1' ? 'icon.padlock.normal' : 'icon.padlock.out'
-    }
-    const baseUrl = cachedResults.value[baseKey]
-    if (!baseUrl || !cachedImages.value[baseUrl]) continue
-
-    const imageNode = cachedImages.value[baseUrl].clone()
-    const width = slotType === '0' ? 110 : 40
-    const height = 90
-    imageNode.setAttrs({ width, height })
-
-    loadedImages.push({ imageNode, slot, width, height })
-  }
-
-  const totalSlots = loadedImages.length
-  const spacing = totalSlots > 1
-    ? (boxWidth - 2 * padding - totalSlots * loadedImages[0].width) / (totalSlots - 1)
-    : 0
-  let currentX = boxStartX + padding
-
-  for (const { imageNode, slot, width, height } of loadedImages) {
-    imageNode.setAttrs({
-      x: currentX,
-      y: boxTopY + (boxHeight - height) / 2
-    })
-    layer.value.add(imageNode)
-
-    if (slot.status === '1') {
-      const exUrl = cachedResults.value['icon.locker.exception']
-      if (exUrl && cachedImages.value[exUrl]) {
-        const exImage = cachedImages.value[exUrl].clone()
-        const exWidth = 30
-        const exHeight = 30
-        exImage.setAttrs({
-          x: currentX + (width - exWidth) / 2,
-          y: boxTopY + (boxHeight - exHeight) / 2,
-          width: exWidth,
-          height: exHeight
-        })
-        exImage.on('click', () => {
-          showErrorDialog(slot)
-        })
-        layer.value.add(exImage)
-      }
-    }
-
-    currentX += width + spacing
-  }
-}
-
-/** 加载图片 */
+// 加载图片
 const loadImageOnce = (url: string) => {
-  if (cachedImages.value[url]) return Promise.resolve(cachedImages.value[url])
+  if (cachedImages.value[url]) {
+    return Promise.resolve(cachedImages.value[url])
+  }
 
-  return new Promise<Konva.Image>((resolve, reject) => {
+  return new Promise<HTMLImageElement>((resolve, reject) => {
     const img = new window.Image()
     img.crossOrigin = 'Anonymous'
     img.src = url
     img.onload = () => {
-      const konvaImage = new Konva.Image({ image: img })
-      cachedImages.value[url] = konvaImage
-      resolve(konvaImage)
+      cachedImages.value[url] = img
+      resolve(img)
     }
     img.onerror = reject
   })
 }
 
-/** 初始化 **/
+// 初始化
 onMounted(async () => {
-  initKonva()
   await getData()
 })
 </script>
@@ -230,7 +259,10 @@ onMounted(async () => {
   border-radius: 8px;
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
   transition: all 0.3s;
-
+  .mr-5px {
+    font-size: 20px;
+    color: rgb(64, 158, 254);
+  }
   &.glow {
     box-shadow: 0 0 15px rgba(64, 158, 255, 0.5);
   }
@@ -250,7 +282,7 @@ onMounted(async () => {
 
 .map-container {
   width: 900px;
-  height: 400px;
+  height: 800px;
   margin: 0 auto;
 }
 </style>

+ 8 - 8
src/views/hw/lockCabinet/SlotForm.vue

@@ -49,7 +49,7 @@
           class="!w-240px"
         >
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.SLOT_TYPE)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.SLOT_TYPE)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -73,7 +73,7 @@
       <el-form-item label="是否被占用" prop="isOccupied">
         <el-radio-group v-model="formData.isOccupied">
           <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.ISOCCUPIED_STATUS)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.ISOCCUPIED_STATUS)"
             :key="dict.value"
             :label="dict.value"
           >
@@ -84,7 +84,7 @@
       <el-form-item
         label="占用仓位的硬件Id"
         prop="hardwareId"
-        v-if="formData.isOccupied === '1'"
+        v-if="formData.isOccupied == '1'"
       >
         <el-select
           v-model="formData.hardwareId"
@@ -104,7 +104,7 @@
       <el-form-item label="状态" prop="status">
         <el-radio-group v-model="formData.status">
           <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.SLOT_STATUS)"
+            v-for="dict in getStrDictOptions(DICT_TYPE.SLOT_STATUS)"
             :key="dict.value"
             :label="dict.value"
           >
@@ -129,7 +129,7 @@
 
 <script lang="ts" setup>
 import { ref, reactive } from 'vue'
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import * as SlotApi from '@/api/hw/hardware/lockCabinet/slots'
 import * as lockCabinetApi from '@/api/hw/hardware/lockCabinet/index'
 import * as HardwareApi from '@/api/hw/hardware/information/index'
@@ -249,8 +249,8 @@ const handleSelectHardware = (value: string) => {
 const getCabinetList = async () => {
   const data = { pageNo: 1, pageSize: -1 }
   const response = await lockCabinetApi.getIsLockCabinetPage(data)
-  cabinetOptions.value = response.records.map(item => ({
-    value: item.cabinetId,
+  cabinetOptions.value = response.list.map(item => ({
+    value: item.id,
     label: item.cabinetName
   }))
 }
@@ -259,7 +259,7 @@ const getCabinetList = async () => {
 const getHardwareList = async () => {
   const data = { pageNo: 1, pageSize: -1 }
   const response = await HardwareApi.listHardware(data)
-  hardwareOptions.value = response.records.map(item => ({
+  hardwareOptions.value = response.list.map(item => ({
     value: item.id,
     label: item.hardwareName
   }))

+ 4 - 4
src/views/hw/lockCabinet/LookList.vue → src/views/hw/lockCabinet/SlotsList.vue

@@ -113,7 +113,7 @@
           <el-button
             link
             type="primary"
-            @click="openForm('update', scope.row.slotId)"
+            @click="openForm('update', scope.row.id)"
             v-hasPermi="['mes:hw:work:update']"
           >
             编辑
@@ -121,7 +121,7 @@
           <el-button
             link
             type="danger"
-            @click="handleDelete(scope.row.slotId)"
+            @click="handleDelete(scope.row.id)"
             v-hasPermi="['mes:hw:work:delete']"
           >
             删除
@@ -174,7 +174,7 @@ const getList = async () => {
   loading.value = true
   try {
     const data = await SlotApi.getIsLockCabinetSlotsPage(queryParams)
-    list.value = data.records
+    list.value = data.list
     total.value = data.total
   } finally {
     loading.value = false
@@ -195,7 +195,7 @@ const resetQuery = () => {
 
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: any[]) => {
-  selectedIds.value = selection.map(item => item.slotId)
+  selectedIds.value = selection.map(item => item.id)
 }
 
 /** 添加/修改操作 */

+ 3 - 3
src/views/hw/lockCabinet/index.vue

@@ -213,7 +213,7 @@ const getList = async () => {
   loading.value = true
   try {
     const data = await LockCabinetApi.getIsLockCabinetPage(queryParams)
-    list.value = data.records
+    list.value = data.list
     total.value = data.total
   } finally {
     loading.value = false
@@ -246,9 +246,9 @@ const openForm = (type: string, id?: number) => {
 /** 查看详情 */
 const lookDetail = (row: any) => {
   router.push({
-    path: '/mes/hw/lockCabinet/LookDetail',
+    path: '/hw/lockCabinet/lookDetail',
     query: {
-      cabinetId: row.cabinetId
+      id: row.id
     }
   })
 }

+ 1 - 1
src/views/hw/lockCabinet/lookDetail.vue

@@ -11,7 +11,7 @@
 <script lang="ts" setup>
 import { ref, computed } from 'vue'
 import { useRoute } from 'vue-router'
-import LookList from './LookList.vue'
+import LookList from './SlotsList.vue'
 import MapData from './MapData.vue'
 
 defineOptions({ name: 'LockCabinetDetail' })