yanghao пре 2 дана
родитељ
комит
e02ca60838
2 измењених фајлова са 341 додато и 82 уклоњено
  1. 182 77
      src/views/pms/device/IotDeviceFormAdd.vue
  2. 159 5
      src/views/pms/device/index.vue

+ 182 - 77
src/views/pms/device/IotDeviceFormAdd.vue

@@ -1,6 +1,12 @@
 <template>
   <ContentWrap v-loading="formLoading">
-    <el-form ref="formRef" :model="formData" :rules="formRules" style="margin-right: 4em;margin-left: 0.5em" label-width="130px">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      style="margin-right: 4em; margin-left: 0.5em"
+      label-width="130px"
+    >
       <div class="title-div">
         <el-button @click="baseInfoClick" class="title-button">
           <Icon color="black" icon="ep:set-up" :size="18" class="cursor-pointer first-icon" />
@@ -16,38 +22,51 @@
       <div class="base-expandable-content" :class="{ 'is-expanded': baseIsExpanded }">
         <el-row>
           <el-col :span="8">
-            <el-form-item :label="t('iotDevice.yfClass')" prop="yfClass">
+            <el-form-item
+              :label="t('iotDevice.yfClass')"
+              prop="yfClass"
+              :required="formData.assetProperty !== 'zl'"
+            >
               <el-cascader
-                :disabled="formType==='update'&&formData.yfDeviceCode"
+                :disabled="formType === 'update' && formData.yfDeviceCode"
                 style="width: 100%"
                 v-model="formData.yfClass"
                 :options="yfclasses"
                 :props="{ expandTrigger: 'hover' }"
                 clearable
                 filterable
-                @change="handleYfClassChange" />
+                @change="handleYfClassChange"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.yfCode')" prop="yfDeviceCode">
-              <el-input v-model="formData.yfDeviceCode" :disabled="formData.yfDeviceCode" placeholder="请输入油服设备编码" />
+              <el-input
+                v-model="formData.yfDeviceCode"
+                :disabled="formData.yfDeviceCode"
+                placeholder="请输入油服设备编码"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.code')" prop="deviceCode">
-              <el-input v-model="formData.deviceCode" :disabled="formType==='update'" placeholder="请输入设备编码" />
+              <el-input
+                v-model="formData.deviceCode"
+                :disabled="formType === 'update'"
+                placeholder="请输入设备编码"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.name')" prop="deviceName">
-<!--              <el-input v-model="formData.deviceName" placeholder="请输入设备名称" />-->
+              <!--              <el-input v-model="formData.deviceName" placeholder="请输入设备名称" />-->
               <lang-input v-model="formData.deviceName" placeholder="请输入设备名称" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.dept')" prop="deptId">
               <el-tree-select
-                :disabled="formType==='update'"
+                :disabled="formType === 'update'"
                 v-model="formData.deptId"
                 :data="deptList"
                 :props="defaultProps"
@@ -56,20 +75,20 @@
                 filterable
                 placeholder="请选择所在部门"
               />
-<!--              <el-tree-select-->
-<!--                v-model="formData.deptId"-->
-<!--                :data="deptList"-->
-<!--                :props="defaultProps"-->
-<!--                check-strictly-->
-<!--                node-key="id"-->
-<!--                placeholder="请选择归属部门"-->
-<!--              />-->
+              <!--              <el-tree-select-->
+              <!--                v-model="formData.deptId"-->
+              <!--                :data="deptList"-->
+              <!--                :props="defaultProps"-->
+              <!--                check-strictly-->
+              <!--                node-key="id"-->
+              <!--                placeholder="请选择归属部门"-->
+              <!--              />-->
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('deviceForm.category')" prop="assetClass">
               <el-tree-select
-                :disabled="formType==='update'"
+                :disabled="formType === 'update'"
                 v-model="formData.assetClass"
                 :data="productClassifyList"
                 :props="defaultProps"
@@ -83,7 +102,12 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.status')" prop="deviceStatus">
-              <el-select v-model="formData.deviceStatus" :placeholder="t('deviceForm.choose')" :disabled="formType==='update'" clearable>
+              <el-select
+                v-model="formData.deviceStatus"
+                :placeholder="t('deviceForm.choose')"
+                :disabled="formType === 'update'"
+                clearable
+              >
                 <el-option
                   v-for="dict in getStrDictOptions(DICT_TYPE.PMS_DEVICE_STATUS)"
                   :key="dict.label"
@@ -116,8 +140,20 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8" >
-            <div style="display: flex;flex-direction: row">
+
+          <el-col :span="8">
+            <el-form-item label="车牌号" prop="carNo">
+              <el-input clearable v-model="formData.carNo" placeholder="请输入车牌号" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="8">
+            <el-form-item label="设备号" prop="deviceNo">
+              <el-input clearable v-model="formData.deviceNo" placeholder="请输入设备号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <div style="display: flex; flex-direction: row">
               <el-form-item :label="t('deviceForm.model')" prop="model" style="width: 86%">
                 <el-input
                   clearable
@@ -143,13 +179,18 @@
               <UploadImg v-model="formData.picUrl" :disabled="isDetail" height="60px" />
             </el-form-item>
           </el-col>
-          <el-col :span="16">
+          <el-col :span="8">
             <el-form-item :label="t('deviceForm.remark')" prop="remark">
-              <el-input v-model="formData.remark" type="textarea" :placeholder="t('deviceForm.remarkHolder')" />
+              <el-input
+                v-model="formData.remark"
+                type="textarea"
+                :placeholder="t('deviceForm.remarkHolder')"
+              />
             </el-form-item>
           </el-col>
         </el-row>
       </div>
+
       <div class="title-div">
         <el-button @click="zzInfoClick" class="title-button">
           <Icon color="black" icon="ep:set-up" :size="18" class="cursor-pointer first-icon" />
@@ -221,7 +262,11 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('deviceForm.ni')" prop="nameplate">
-              <el-input v-model="formData.nameplate" type="textarea" :placeholder="t('deviceForm.niHolder')"/>
+              <el-input
+                v-model="formData.nameplate"
+                type="textarea"
+                :placeholder="t('deviceForm.niHolder')"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -241,56 +286,82 @@
       <div class="cw-expandable-content" :class="{ 'is-expanded': cwIsExpanded }">
         <el-row>
           <el-col :span="8">
-            <el-form-item :label="formData.assetProperty==='zy'?'采购价格':'租赁价格'" prop="plPrice">
+            <el-form-item
+              :label="formData.assetProperty === 'zy' ? '采购价格' : '租赁价格'"
+              prop="plPrice"
+            >
               <el-input
                 v-model="formData.plPrice"
                 @input="handleInput(formData.plPrice, 'plPrice')"
-                :placeholder="formData.assetProperty==='zy'?'请输入采购价格':'请输入租赁价格'"
+                :placeholder="formData.assetProperty === 'zy' ? '请输入采购价格' : '请输入租赁价格'"
               />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item :label="formData.assetProperty==='zy'?'采购日期':'租赁日期'" prop="plDate">
+            <el-form-item
+              :label="formData.assetProperty === 'zy' ? '采购日期' : '租赁日期'"
+              prop="plDate"
+            >
               <el-date-picker
                 style="width: 150%"
                 v-model="formData.plDate"
                 type="date"
                 value-format="x"
-                :placeholder="formData.assetProperty==='zy'?'请输入采购日期':'请输入租赁日期'"
+                :placeholder="formData.assetProperty === 'zy' ? '请输入采购日期' : '请输入租赁日期'"
               />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item :label="formData.assetProperty==='zy'?'折旧年限':'租赁年限'" prop="plYear">
-              <el-input v-model="formData.plYear" type="number" :placeholder="formData.assetProperty==='zy'?'请输入折旧年限':'请输入租赁年限'" />
+            <el-form-item
+              :label="formData.assetProperty === 'zy' ? '折旧年限' : '租赁年限'"
+              prop="plYear"
+            >
+              <el-input
+                v-model="formData.plYear"
+                type="number"
+                :placeholder="formData.assetProperty === 'zy' ? '请输入折旧年限' : '请输入租赁年限'"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item :label="formData.assetProperty==='zy'?'折旧开始日期':'租赁开始日期'" prop="plStartDate">
+            <el-form-item
+              :label="formData.assetProperty === 'zy' ? '折旧开始日期' : '租赁开始日期'"
+              prop="plStartDate"
+            >
               <el-date-picker
                 style="width: 150%"
                 v-model="formData.plStartDate"
                 type="date"
                 value-format="x"
-                :placeholder="formData.assetProperty==='zy'?'请选择折旧开始日期':'请选择租赁开始日期'"
+                :placeholder="
+                  formData.assetProperty === 'zy' ? '请选择折旧开始日期' : '请选择租赁开始日期'
+                "
               />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item :label="formData.assetProperty==='zy'?'已提折旧月数':'已租赁月数'" prop="plMonthed">
+            <el-form-item
+              :label="formData.assetProperty === 'zy' ? '已提折旧月数' : '已租赁月数'"
+              prop="plMonthed"
+            >
               <el-input
                 v-model="formData.plMonthed"
                 type="number"
-                :placeholder="formData.assetProperty==='zy'?'请输入已提折旧月数':'请输入已租赁月数'"
+                :placeholder="
+                  formData.assetProperty === 'zy' ? '请输入已提折旧月数' : '请输入已租赁月数'
+                "
               />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item :label="formData.assetProperty==='zy'?'已提折旧金额':'已租赁金额'" prop="plAmounted">
+            <el-form-item
+              :label="formData.assetProperty === 'zy' ? '已提折旧金额' : '已租赁金额'"
+              prop="plAmounted"
+            >
               <el-input
                 v-model="formData.plAmounted"
                 @input="handleInput(formData.plAmounted, 'plAmounted')"
-                :placeholder="formData.assetProperty==='zy'?'请输入已提折旧金额':'已租赁金额'"
+                :placeholder="formData.assetProperty === 'zy' ? '请输入已提折旧金额' : '已租赁金额'"
               />
             </el-form-item>
           </el-col>
@@ -320,7 +391,12 @@
       <div class="qt-expandable-content" :class="{ 'is-expanded': qtIsExpanded }">
         <el-row>
           <el-col v-for="field in list" :key="field.sort" :span="8">
-            <el-form-item label-width="180px" :label="field.name" :prop="field.code" :rules="field.rules">
+            <el-form-item
+              label-width="180px"
+              :label="field.name"
+              :prop="field.code"
+              :rules="field.rules"
+            >
               <!-- 文本输入 -->
               <el-input
                 v-if="field.type === 'text'"
@@ -332,7 +408,7 @@
               <el-select
                 v-else-if="field.type === 'enum'"
                 v-model="formData[field.code]"
-                :placeholder="'请输入'+field.name"
+                :placeholder="'请输入' + field.name"
                 clearable
                 filterable
               >
@@ -383,7 +459,7 @@
     </el-form>
   </ContentWrap>
   <BrandList ref="brandFormRef" @choose="brandChoose" />
-  <ModelList ref="modelFormRef" @choose="modelChoose" :brand = "formData.brand" />
+  <ModelList ref="modelFormRef" @choose="modelChoose" :brand="formData.brand" />
   <CustomerList ref="customerZzFormRef" @choose="customerZzChoose" />
   <CustomerList ref="customerSupplierFormRef" @choose="customerSupplierChoose" />
 </template>
@@ -397,9 +473,10 @@ import * as DeptApi from '@/api/system/dept'
 import * as ProductClassifyApi from '@/api/pms/productclassify'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { useTagsViewStore } from '@/store/modules/tagsView'
-import {DeviceAttrModelApi} from "@/api/pms/deviceattrmodel";
-import {IotYfClassifyApi} from "@/api/pms/yfclass";
-import { useRefreshStore } from '@/store/modules/pms/refreshStore';
+import { DeviceAttrModelApi } from '@/api/pms/deviceattrmodel'
+import { IotYfClassifyApi } from '@/api/pms/yfclass'
+import { useRefreshStore } from '@/store/modules/pms/refreshStore'
+import { watch, nextTick } from 'vue'
 
 /** 设备台账 表单 */
 defineOptions({ name: 'DeviceDetailAddd' })
@@ -428,7 +505,7 @@ const brandLabel = ref('') // 表单的类型:create - 新增;update - 修
 const zzLabel = ref('') // 表单的类型:create - 新增;update - 修改
 const supplierLabel = ref('') // 表单的类型:create - 新增;update - 修改
 const yfclasses = ref([])
-const refreshStore = useRefreshStore();
+const refreshStore = useRefreshStore()
 const formData = ref({
   id: undefined,
   deviceCode: undefined,
@@ -463,10 +540,24 @@ const formData = ref({
   infoRemark: undefined,
   infoUrl: undefined,
   templateJson: undefined,
-  assetClass: undefined
+  assetClass: undefined,
+  carNo: undefined,
+  deviceNo: undefined
 })
 const formRules = reactive({
-  yfClass: [{ required: true, message: '编码类别不能为空', trigger: 'blur' }],
+  yfClass: [
+    {
+      validator: (rule, value, callback) => {
+        // 当资产性质为租赁('zl')时,yfClass非必填;否则必填
+        if (formData.value.assetProperty === 'zl' || value) {
+          callback() // 租赁资产或有值时通过验证
+        } else {
+          callback(new Error('编码类别不能为空')) // 非租赁资产且无值时失败
+        }
+      },
+      trigger: 'blur'
+    }
+  ],
   yfCode: [{ required: true, message: '油服编码不能为空', trigger: 'blur' }],
   assetClass: [{ required: true, message: '资产类别不能为空', trigger: 'blur' }],
   deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
@@ -476,18 +567,33 @@ const formRules = reactive({
   deviceStatus: [{ required: true, message: '设备状态不能为空', trigger: 'blur' }],
   assetProperty: [{ required: true, message: '资产性质不能为空', trigger: 'blur' }],
   manufacturerId: [{ required: true, message: '制造商id不能为空', trigger: 'blur' }],
-  manDate: [{ required: true, message: '生产日期不能为空', trigger: 'blur' }]
+  manDate: [{ required: true, message: '生产日期不能为空', trigger: 'blur' }],
+  carNo: [{ required: true, message: '车牌号不能为空', trigger: 'blur' }],
+  deviceNo: [{ required: true, message: '设备号不能为空', trigger: 'blur' }]
 })
 
+watch(
+  () => formData.value.assetProperty,
+  (newVal) => {
+    nextTick(() => {
+      if (formRef.value) {
+        // 重新验证 yfClass 和 yfCode 字段
+        formRef.value.validateField('yfClass')
+      }
+    })
+  },
+  { immediate: true }
+)
+
 const list = ref([])
 
 const assetclasschange = () => {
   const assetClass = formData.value.assetClass
-  DeviceAttrModelApi.getDeviceAttrModelListByDeviceCategoryId(assetClass).then(res => {
-    if (res){
+  DeviceAttrModelApi.getDeviceAttrModelListByDeviceCategoryId(assetClass).then((res) => {
+    if (res) {
       res.forEach((item) => {
         if (item.requiredFlag) {
-          const rule = {required: true, message: item.name+'不能为空', trigger: 'blur'}
+          const rule = { required: true, message: item.name + '不能为空', trigger: 'blur' }
           item.rules = []
           item.rules.push(rule)
         }
@@ -498,18 +604,18 @@ const assetclasschange = () => {
     }
   })
 }
-const handleYfClassChange = async (value) =>{
+const handleYfClassChange = async (value) => {
   console.log(value)
   const prefix = value.join('')
   const last = await IotDeviceApi.getMaxCode(prefix)
-  formData.value.yfDeviceCode = prefix+last
+  formData.value.yfDeviceCode = prefix + last
 }
 const brandChoose = (row) => {
   formData.value.brand = row.id
   // brandLabel.value = row.value
   formData.value.brandName = row.label
 }
-const brandClear = () =>{
+const brandClear = () => {
   formData.value.brand = undefined
   formData.value.brandName = undefined
 }
@@ -530,7 +636,7 @@ const customerZzChoose = (row) => {
   // zzLabel.value = row.name
   formData.value.manufacturerName = row.name
 }
-const zzClear = () =>{
+const zzClear = () => {
   formData.value.manufacturerId = undefined
   formData.value.manufacturerName = undefined
 }
@@ -540,7 +646,7 @@ const openForm = () => {
   brandFormRef.value.open()
 }
 const modelFormRef = ref()
-const openModelForm = () =>{
+const openModelForm = () => {
   modelFormRef.value.open()
 }
 const customerSupplierFormRef = ref()
@@ -589,7 +695,7 @@ const handleInput = (value, obj) => {
 
 const close = () => {
   delView(unref(currentRoute))
-  push({ name: 'IotDevicePms', params:{}})
+  push({ name: 'IotDevicePms', params: {} })
   // delView(unref(currentRoute))
   // push({
   //   name: 'IotDevicePms',
@@ -620,13 +726,13 @@ const submitForm = async () => {
   formLoading.value = true
   try {
     if (list.value) {
-      list.value = list.value.map(item => ({
+      list.value = list.value.map((item) => ({
         ...item,
         value: formData.value[item.code] // 自定义属性生成逻辑
       }))
       formData.value.templateJson = JSON.stringify(list.value)
     }
-    formData.value.yfClass = formData.value.yfClass.join(',');
+    formData.value.yfClass = formData.value.yfClass ? formData.value.yfClass.join(',') : ''
     const data = formData.value as unknown as IotDeviceVO
     if (formType.value === 'create') {
       await IotDeviceApi.createIotDevice(data)
@@ -638,11 +744,11 @@ const submitForm = async () => {
     dialogVisible.value = false
     // 发送操作成功的事件
     //emit('success')
-    const sourcePage = query.source as string;
+    const sourcePage = query.source as string
 
     // 如果有来源页面标识,触发原页面的刷新
     if (sourcePage) {
-      refreshStore.triggerRefresh(sourcePage);
+      refreshStore.triggerRefresh(sourcePage)
     }
     close()
   } finally {
@@ -658,20 +764,20 @@ onMounted(async () => {
   formData.value.assetProperty = 'zy'
   // 修改时,设置数据
   if (id) {
-    formType.value = 'update';
+    formType.value = 'update'
     formLoading.value = true
     try {
-      const iotDevice = await IotDeviceApi.getIotDevice(id);
+      const iotDevice = await IotDeviceApi.getIotDevice(id)
       formData.value = iotDevice
-      formData.value.brandName = iotDevice.brandName;
-      formData.value.manufacturerName = iotDevice.zzName;
-      formData.value.supplierName = iotDevice.supplierName;
-      list.value = JSON.parse(iotDevice.templateJson);
+      formData.value.brandName = iotDevice.brandName
+      formData.value.manufacturerName = iotDevice.zzName
+      formData.value.supplierName = iotDevice.supplierName
+      list.value = JSON.parse(iotDevice.templateJson)
       if (iotDevice.yfClass) {
-        formData.value.yfClass = iotDevice.yfClass.split(',');
+        formData.value.yfClass = iotDevice.yfClass.split(',')
       }
       list.value.forEach((item) => {
-        formData.value[item.code] = item.value;
+        formData.value[item.code] = item.value
       })
     } finally {
       formLoading.value = false
@@ -680,11 +786,11 @@ onMounted(async () => {
     if (deptId) {
       formData.value.deptId = Number(deptId)
     }
-    formType.value = 'create';
+    formType.value = 'create'
   }
-  await IotYfClassifyApi.getChildrenList().then(res => {
+  await IotYfClassifyApi.getChildrenList().then((res) => {
     yfclasses.value = res
-  });
+  })
 })
 /** 重置表单 */
 const resetForm = () => {
@@ -717,8 +823,7 @@ const resetForm = () => {
     infoRemark: undefined,
     infoUrl: undefined,
     templateJson: undefined,
-    assetClass: undefined,
-
+    assetClass: undefined
   }
   formRef.value?.resetFields()
 }
@@ -726,13 +831,13 @@ const resetForm = () => {
 
 <style scoped lang="scss">
 .base-expandable-content {
-  max-height: 0; /* 初始高度为0 */
+  max-height: 0px; /* 初始高度为0 */
   overflow: hidden; /* 隐藏溢出的内容 */
   transition: max-height 0.3s ease; /* 平滑过渡效果 */
 }
 
 .base-expandable-content.is-expanded {
-  min-height: 260px; /* 或者根据内容设定一个合适的最大高度 */
+  min-height: 360px; /* 或者根据内容设定一个合适的最大高度 */
 }
 .zz-expandable-content {
   max-height: 0; /* 初始高度为0 */
@@ -761,18 +866,18 @@ const resetForm = () => {
 .qt-expandable-content.is-expanded {
   max-height: 1200px; /* 或者根据内容设定一个合适的最大高度 */
 }
-.title-button{
+.title-button {
   font-size: 18px;
   border: none;
 }
-.title-div{
+.title-div {
   margin-bottom: 20px;
   margin-top: 10px;
 }
-.cursor-pointer{
+.cursor-pointer {
   vertical-align: middle;
 }
-.first-icon{
+.first-icon {
   margin-bottom: 2px;
 }
 </style>

+ 159 - 5
src/views/pms/device/index.vue

@@ -48,6 +48,25 @@
               class="!w-200px"
             />
           </el-form-item>
+          <el-form-item label="车牌号" prop="carNo">
+            <el-input
+              v-model="queryParams.carNo"
+              placeholder="请输入车牌号"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-200px"
+            />
+          </el-form-item>
+
+          <el-form-item label="设备号" prop="deviceNo">
+            <el-input
+              v-model="queryParams.deviceNo"
+              placeholder="请输入设备号"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-200px"
+            />
+          </el-form-item>
           <el-form-item :label="t('iotDevice.brand')" prop="brandName">
             <el-input
               v-model="queryParams.brandName"
@@ -155,7 +174,7 @@
           height="65vh"
           @sort-change="handleSortChange"
         >
-          <el-table-column :label="t('iotDevice.serial')" width="70" align="center">
+          <el-table-column :label="t('iotDevice.serial')" width="70" align="center" fixed="left">
             <template #default="scope">
               {{ scope.$index + 1 }}
             </template>
@@ -166,21 +185,97 @@
             align="center"
             prop="yfDeviceCode"
             width="150"
-          />
+            fixed="left"
+          >
+            <template #header>
+              <span
+                style="display: inline-block"
+                class="text-[#ad9399] w-[70px] text-[12px] cursor-pointer z-[999] justify-center flex items-center"
+              >
+                <el-popover placement="bottom" :width="200" trigger="hover">
+                  <template #reference>
+                    <div class="flex items-center">
+                      <span> 油服编码 </span> <Icon icon="ep:arrow-down" />
+                    </div>
+                  </template>
+                  <el-input
+                    v-model="queryParams.yfDeviceCode"
+                    placeholder="请输入油服编码"
+                    style="width: 150px"
+                    clearable
+                    @keyup.enter="handleQuery"
+                  />
+                </el-popover>
+              </span>
+            </template>
+          </el-table-column>
           <el-table-column
             :label="t('iotDevice.code')"
             sortable
             align="center"
             prop="deviceCode"
             width="150"
+            fixed="left"
+          >
+            <template #header>
+              <span
+                style="display: inline-block"
+                class="text-[#ad9399] w-[70px] text-[12px] cursor-pointer z-[999] justify-center flex items-center"
+              >
+                <el-popover placement="bottom" :width="200" trigger="hover">
+                  <template #reference>
+                    <div class="flex items-center">
+                      <span> 历史编码 </span> <Icon icon="ep:arrow-down" />
+                    </div>
+                  </template>
+                  <el-input
+                    v-model="queryParams.deviceCode"
+                    placeholder="请输入历史编码"
+                    style="width: 150px"
+                    clearable
+                    @keyup.enter="handleQuery"
+                  />
+                </el-popover>
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="设备号"
+            sortable
+            align="center"
+            prop="deviceNo"
+            width="120"
+            fixed="left"
           />
           <el-table-column
             :label="t('iotDevice.name')"
             sortable
             align="center"
             prop="deviceName"
-            min-width="250"
+            min-width="280"
           >
+            <template #header>
+              <span
+                style="display: inline-block"
+                class="text-[#ad9399] w-[70px] text-[12px] cursor-pointer z-[999] justify-center flex items-center"
+              >
+                <el-popover placement="bottom" :width="200" trigger="hover">
+                  <template #reference>
+                    <div class="flex items-center">
+                      <span> 设备名称 </span> <Icon icon="ep:arrow-down" />
+                    </div>
+                  </template>
+                  <el-input
+                    v-model="queryParams.deviceName"
+                    placeholder="请输入设备名称"
+                    style="width: 150px"
+                    clearable
+                    @keyup.enter="handleQuery"
+                  />
+                </el-popover>
+              </span>
+            </template>
+
             <template #default="scope">
               <el-link :underline="false" type="primary" @click="handleDetail(scope.row.id)">
                 {{ scope.row.deviceName }}
@@ -197,8 +292,27 @@
             :label="t('iotDevice.status')"
             align="center"
             prop="deviceStatus"
-            min-width="90"
+            min-width="150"
           >
+            <template #header>
+              <div class="flex items-center justify-center pb-[1px]">
+                <el-dropdown @command="handleCommand">
+                  <span class="text-[#ad9399] text-[12px] cursor-pointer flex items-center">
+                    <span> 设备状态 </span> <Icon icon="ep:arrow-down" />
+                  </span>
+                  <template #dropdown>
+                    <el-dropdown-menu>
+                      <el-dropdown-item
+                        v-for="item in getStrDictOptions(DICT_TYPE.PMS_DEVICE_STATUS)"
+                        :key="item.label"
+                        :command="item.value"
+                        >{{ item.label }}</el-dropdown-item
+                      >
+                    </el-dropdown-menu>
+                  </template>
+                </el-dropdown>
+              </div>
+            </template>
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.PMS_DEVICE_STATUS" :value="scope.row.deviceStatus" />
             </template>
@@ -209,6 +323,25 @@
             prop="assetProperty"
             min-width="110"
           >
+            <template #header>
+              <div class="flex items-center justify-center pb-[1px]">
+                <el-dropdown @command="handleAssetProperty">
+                  <span class="text-[#ad9399] text-[12px] cursor-pointer flex items-center">
+                    <span> 资产性质 </span> <Icon icon="ep:arrow-down" />
+                  </span>
+                  <template #dropdown>
+                    <el-dropdown-menu>
+                      <el-dropdown-item
+                        v-for="item in getStrDictOptions(DICT_TYPE.PMS_ASSET_PROPERTY)"
+                        :key="item.label"
+                        :command="item.value"
+                        >{{ item.label }}</el-dropdown-item
+                      >
+                    </el-dropdown-menu>
+                  </template>
+                </el-dropdown>
+              </div>
+            </template>
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.PMS_ASSET_PROPERTY" :value="scope.row.assetProperty" />
             </template>
@@ -219,6 +352,9 @@
             prop="assetClassName"
             min-width="170"
           />
+
+          <el-table-column label="车牌号" align="center" prop="carNo" min-width="170" />
+          <el-table-column label="所在地点" align="center" prop="address" min-width="170" />
           <el-table-column
             :label="t('deviceForm.mfg')"
             align="center"
@@ -357,7 +493,10 @@ const queryParams = reactive({
   creator: undefined,
   sortingFields: [],
   assetClass: undefined,
-  yfDeviceCode: undefined
+  yfDeviceCode: undefined,
+  carNo: undefined,
+  deviceNo: undefined,
+  assetClassName: undefined
 })
 const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中
@@ -372,6 +511,16 @@ const shou = (tree) => {
   }
 }
 
+const handleCommand = (command) => {
+  queryParams.deviceStatus = command
+  getList()
+}
+
+const handleAssetProperty = (command) => {
+  queryParams.assetProperty = command
+  getList()
+}
+
 const handleSortChange = (params: any) => {
   //console.log(`排序字段: ${prop}, 排序方式: ${order}`);
   queryParams.sortingFields = []
@@ -484,4 +633,9 @@ onMounted(async () => {
   top: 0px;
   z-index: 2000;
 }
+
+::v-deep .el-tooltip__trigger {
+  border: none !important;
+  outline: none !important;
+}
 </style>