装备台账

This commit is contained in:
itcast 2025-10-29 18:40:16 +08:00
parent 5d9703e026
commit e7f903991f
1 changed files with 418 additions and 145 deletions

View File

@ -7,18 +7,66 @@
<!-- 只有在未折叠状态显示标题 -->
<span class="card-title">装备分类</span>
</div>
<el-form
ref="queryFormLeft"
v-show="showSearch"
:model="queryParams"
:rules="queryRules"
style="margin-top: 20px; padding: 0 15px;"
>
<el-form-item prop="name" style="margin-bottom: 0;">
<el-input
v-model="treeSearchKey"
placeholder="搜索"
@keyup.enter.native="getDeviceListByTreeSearch"
class="tree-search-input"
>
<template #suffix>
<div class="tree-search-buttons">
<el-button
icon="el-icon-search"
size="mini"
@click="getDeviceListByTreeSearch"
title="查询"
class="search-btn-embedded"
/>
<el-button
icon="el-icon-refresh"
size="mini"
@click="resetTreeSearch"
title="重置"
class="search-btn-embedded"
style="margin-left: 0;"
/>
</div>
</template>
</el-input>
</el-form-item>
</el-form>
<!-- 树组件折叠时隐藏 -->
<el-tree
v-if="!collapsed"
v-show="!collapsed"
:data="treeData"
:props="defaultProps"
:indent="6"
@node-click="handleNodeClick"
default-expand-all
:default-expanded-keys="defaultExpandedKeys"
class="tree-container"
:loading="treeLoading"
/>
</div>
<div style="position: relative; width: 20px; height: calc(100vh - 130px); margin-left: 5px">
<!-- 右侧折叠/展开按钮 -->
<el-button
@ -79,7 +127,7 @@
filterable
style="width: 100%"
>
<el-option v-for="item in provinceList" :key="item.value" :label="item.label" :value="item.value" />
<el-option v-for="item in provinceList" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
@ -103,12 +151,12 @@
</el-col>
<el-col :span="6">
<el-form-item label="类型分支" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入类型分支" clearable />
<el-input v-model="queryParams.name" placeholder="请输入类型分支" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="规格型号" prop="specificationModel">
<el-input v-model="queryParams.specificationModel" placeholder="请输入规格型号" clearable />
<el-input v-model="queryParams.specificationModel" placeholder="请输入规格型号" clearable/>
</el-form-item>
</el-col>
</el-row>
@ -124,7 +172,7 @@
@change="majorChange"
style="width: 100%"
>
<el-option v-for="item in majorList" :key="item.value" :label="item.label" :value="item.value" />
<el-option v-for="item in majorList" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
@ -152,7 +200,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="装备编码" prop="code">
<el-input v-model="queryParams.code" placeholder="请输入装备编码" clearable />
<el-input v-model="queryParams.code" placeholder="请输入装备编码" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -208,12 +256,12 @@
</el-col>
<el-col :span="6">
<el-form-item label="原始编码" prop="originalCode">
<el-input v-model="queryParams.originalCode" placeholder="请输入装备原始编码" clearable />
<el-input v-model="queryParams.originalCode" placeholder="请输入装备原始编码" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="使用年限" prop="serviceLife">
<el-input v-model="queryParams.serviceLife" placeholder="请输入使用年限" clearable />
<el-input v-model="queryParams.serviceLife" placeholder="请输入使用年限" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -235,12 +283,12 @@
</el-col>
<el-col :span="6">
<el-form-item label="特征项" prop="featureItem">
<el-input v-model="queryParams.featureItem" placeholder="请输入特征项" clearable />
<el-input v-model="queryParams.featureItem" placeholder="请输入特征项" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="特征值" prop="featureValue">
<el-input v-model="queryParams.featureValue" placeholder="请输入特征值" clearable />
<el-input v-model="queryParams.featureValue" placeholder="请输入特征值" clearable/>
</el-form-item>
</el-col>
</el-row>
@ -254,6 +302,7 @@
<el-button
icon="el-icon-refresh"
style="float: right; margin-left: 20px"
type="primary"
size="mini"
@click="resetQuery"
>
@ -306,15 +355,6 @@
>
装备退役
</el-button>
<el-button
type="primary"
size="mini"
icon="el-icon-document-checked"
@click="onHandleReturn"
class="operation-btn"
>
装备退库
</el-button>
<el-button
type="primary"
size="mini"
@ -354,10 +394,9 @@
:key="Date.now()"
@selection-change="handleSelectionChange"
v-loading="tableLoading"
border stripe
>
<el-table-column align="center" show-overflow-tooltip type="selection" width="50" />
<el-table-column align="center" show-overflow-tooltip type="index" label="序号" width="50" />
<el-table-column align="center" show-overflow-tooltip type="selection" width="50"/>
<el-table-column align="center" show-overflow-tooltip type="index" label="序号" width="50"/>
<el-table-column
v-for="(item, index) in columns"
v-if="item.visible"
@ -451,42 +490,42 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="公司名称" prop="companyName">
<el-input v-model="formData.companyName" disabled />
<el-input v-model="formData.companyName" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工主工序" prop="mainGx">
<el-input v-model="formData.mainGx" disabled />
<el-input v-model="formData.mainGx" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工子工序" prop="childGx">
<el-input v-model="formData.childGx" disabled />
<el-input v-model="formData.childGx" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备大类" prop="devCategory">
<el-input v-model="formData.devCategory" disabled />
<el-input v-model="formData.devCategory" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备小类" prop="devSubcategory">
<el-input v-model="formData.devSubcategory" disabled />
<el-input v-model="formData.devSubcategory" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="类型分支" prop="name">
<el-input v-model="formData.name" disabled />
<el-input v-model="formData.name" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="devModel">
<el-input v-model="formData.devModel" disabled />
<el-input v-model="formData.devModel" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备编号" prop="code">
<el-input v-model="formData.code" disabled />
<el-input v-model="formData.code" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -510,57 +549,57 @@
</el-col>
<el-col :span="12">
<el-form-item label="使用到期时间" prop="expireTime">
<el-input v-model="formData.expireTime" disabled />
<el-input v-model="formData.expireTime" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计数单位" prop="unitName">
<el-input v-model="formData.unitName" disabled />
<el-input v-model="formData.unitName" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产权单位" prop="propertyCompany">
<el-input v-model="formData.propertyCompany" disabled />
<el-input v-model="formData.propertyCompany" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产原值" prop="buyPrice">
<el-input v-model="formData.buyPrice" disabled />
<el-input v-model="formData.buyPrice" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产日期" prop="productionDate">
<el-input v-model="formData.productionDate" disabled />
<el-input v-model="formData.productionDate" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="使用年限" prop="workingHours">
<el-input v-model="formData.workingHours" disabled />
<el-input v-model="formData.workingHours" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在项目" prop="onProject">
<el-input v-model="formData.onProject" disabled />
<el-input v-model="formData.onProject" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="person">
<el-input v-model="formData.person" disabled />
<el-input v-model="formData.person" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="personPhone">
<el-input v-model="formData.personPhone" disabled />
<el-input v-model="formData.personPhone" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下次维保日期" prop="nextCheckTime">
<el-input v-model="formData.nextCheckTime" disabled />
<el-input v-model="formData.nextCheckTime" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产厂商" prop="brand">
<el-input v-model="formData.brand" disabled />
<el-input v-model="formData.brand" disabled/>
</el-form-item>
</el-col>
</el-row>
@ -583,42 +622,42 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="公司名称" prop="companyName">
<el-input v-model="formData.companyName" />
<el-input v-model="formData.companyName"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工主工序" prop="mainGx">
<el-input v-model="formData.mainGx" />
<el-input v-model="formData.mainGx"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工子工序" prop="childGx">
<el-input v-model="formData.childGx" />
<el-input v-model="formData.childGx"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备大类" prop="devCategory">
<el-input v-model="formData.devCategory" />
<el-input v-model="formData.devCategory"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备小类" prop="devSubcategory">
<el-input v-model="formData.devSubcategory" />
<el-input v-model="formData.devSubcategory"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="类型分支" prop="name">
<el-input v-model="formData.name" />
<el-input v-model="formData.name"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="devModel">
<el-input v-model="formData.devModel" />
<el-input v-model="formData.devModel"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备编号" prop="code">
<el-input v-model="formData.code" disabled />
<el-input v-model="formData.code" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -653,17 +692,17 @@
</el-col>
<el-col :span="12">
<el-form-item label="计数单位" prop="unitName">
<el-input v-model="formData.unitName" />
<el-input v-model="formData.unitName"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产权单位" prop="propertyCompany">
<el-input v-model="formData.propertyCompany" />
<el-input v-model="formData.propertyCompany"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产原值" prop="buyPrice">
<el-input v-model="formData.buyPrice" type="number" />
<el-input v-model="formData.buyPrice" type="number"/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -679,22 +718,22 @@
</el-col>
<el-col :span="12">
<el-form-item label="使用年限" prop="workingHours">
<el-input v-model="formData.workingHours" type="number" />
<el-input v-model="formData.workingHours" type="number"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在项目" prop="onProject">
<el-input v-model="formData.onProject" />
<el-input v-model="formData.onProject"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="person">
<el-input v-model="formData.person" />
<el-input v-model="formData.person"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="personPhone">
<el-input v-model="formData.personPhone" />
<el-input v-model="formData.personPhone"/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -710,10 +749,10 @@
</el-col>
<el-col :span="12">
<el-form-item label="生产厂商" prop="brand">
<el-input v-model="formData.brand" />
<el-input v-model="formData.brand"/>
</el-form-item>
</el-col>
<el-col :span="12"> </el-col>
<el-col :span="12"></el-col>
<!-- 添加特征项按钮 -->
<el-col :span="24" style="text-align: center; margin-top: 10px">
@ -737,7 +776,7 @@
<!-- 弹框 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<el-table :data="dialogList" fit highlight-current-row style="width: 100%" :max-height="500">
<el-table-column type="index" width="55" label="序号" align="center" />
<el-table-column type="index" width="55" label="序号" align="center"/>
<el-table-column label="附件名称" prop="fileName" align="center">
<!-- 插槽 -->
<template v-slot="{ row }">
@ -764,14 +803,18 @@ import {
getDeviceDetailAPI,
getManufacturerSelectApi
} from '@/api/EquipmentLedger/index.js'
import { firstLevel, secondAndThirdLevel } from '@/api/EquipmentEntryApply'
import { getMaxFeatureAPI, getProvinceListAPI } from '@/api/EquipmentLedger/equ-out.js'
import { deptTreeSelect } from '@/api/system/user'
import {firstLevel, secondAndThirdLevel} from '@/api/EquipmentEntryApply'
import {getMaxFeatureAPI, getProvinceListAPI} from '@/api/EquipmentLedger/equ-out.js'
import {deptTreeSelect} from '@/api/system/user'
export default {
name: 'EquipmentLedger',
data() {
return {
treeSearchKey: '', //
defaultExpandedKeys: [], //id
showSearch: true,
total: 0,
tableHeight: 510,
@ -813,51 +856,51 @@ export default {
serviceLifeList: [], // 使
manufacturerList: [], //
columns: [
{ key: 0, label: `所属省份`, prop: 'province', visible: true },
{ key: 1, label: `产权单位`, prop: 'propertyUnit', visible: true },
{ key: 2, label: `专业`, prop: 'major', visible: true },
{ key: 3, label: `工序`, prop: 'process', visible: true },
{ key: 4, label: `装备类目`, prop: 'devType', visible: true },
{ key: 5, label: `类型分支`, prop: 'name', visible: true },
{ key: 6, label: `规格型号`, prop: 'specificationModel', visible: true },
{ key: 7, label: `装备编码`, prop: 'code', visible: true },
{ key: 8, label: `装备状态`, prop: 'status', visible: true },
{ key: 44, label: `上下架状态`, prop: 'upDownStatus', visible: true },
{ key: 9, label: `使用年限`, prop: 'serviceLife', visible: true },
{ key: 10, label: `使用项目`, prop: 'usingProject', visible: true },
{ key: 11, label: `使用到期时间`, prop: 'expirationTime', visible: true },
{ key: 12, label: `使用次数`, prop: 'usageCount', visible: true },
{ key: 13, label: `维修次数`, prop: 'repairCount', visible: true },
{ key: 14, label: `装备原始编码`, prop: 'originalCode', visible: true },
{ key: 15, label: `计量单位`, prop: 'unit', visible: true },
{ key: 16, label: `生产厂家`, prop: 'manufacturer', visible: true },
{ key: 17, label: `出厂日期`, prop: 'productionDate', visible: true },
{ key: 18, label: `采购日期`, prop: 'purchaseDate', visible: true },
{ key: 19, label: `资产原值(元)`, prop: 'originalValue', visible: true },
{ key: 20, label: `最大使用年限(年)`, prop: 'maxServiceLifeYears', visible: true },
{ key: 21, label: `下次维保日期`, prop: 'nextMaintenanceDate', visible: true },
{ key: 22, label: `装备外观`, prop: 'appearanceImages', visible: true },
{ key: 23, label: `合格证`, prop: 'certificates', visible: true },
{ key: 24, label: `定期检验报告`, prop: 'inspectionReports', visible: true },
{ key: 25, label: `采购发票`, prop: 'purchaseInvoices', visible: true },
{ key: 26, label: `特征项1`, prop: 'featureItem1', visible: true },
{ key: 27, label: `特征值1`, prop: 'featureValue1', visible: true },
{ key: 28, label: `特征项2`, prop: 'featureItem2', visible: true },
{ key: 29, label: `特征值2`, prop: 'featureValue2', visible: true },
{ key: 30, label: `特征项3`, prop: 'featureItem3', visible: true },
{ key: 31, label: `特征值3`, prop: 'featureValue3', visible: true },
{ key: 32, label: `特征项4`, prop: 'featureItem4', visible: true },
{ key: 33, label: `特征值4`, prop: 'featureValue4', visible: true },
{ key: 34, label: `特征项5`, prop: 'featureItem5', visible: true },
{ key: 35, label: `特征值5`, prop: 'featureValue5', visible: true },
{ key: 36, label: `特征项6`, prop: 'featureItem6', visible: true },
{ key: 37, label: `特征值6`, prop: 'featureValue6', visible: true },
{ key: 38, label: `特征项7`, prop: 'featureItem7', visible: true },
{ key: 39, label: `特征值7`, prop: 'featureValue7', visible: true },
{ key: 40, label: `特征项8`, prop: 'featureItem8', visible: true },
{ key: 41, label: `特征值8`, prop: 'featureValue8', visible: true },
{ key: 42, label: `特征项9`, prop: 'featureItem9', visible: true },
{ key: 43, label: `特征值9`, prop: 'featureValue9', visible: true },
{key: 0, label: `所属省份`, prop: 'province', visible: true},
{key: 1, label: `产权单位`, prop: 'propertyUnit', visible: true},
{key: 2, label: `专业`, prop: 'major', visible: true},
{key: 3, label: `工序`, prop: 'process', visible: true},
{key: 4, label: `装备类目`, prop: 'devType', visible: true},
{key: 5, label: `类型分支`, prop: 'name', visible: true},
{key: 6, label: `规格型号`, prop: 'specificationModel', visible: true},
{key: 7, label: `装备编码`, prop: 'code', visible: true},
{key: 8, label: `装备状态`, prop: 'status', visible: true},
{key: 44, label: `上下架状态`, prop: 'upDownStatus', visible: true},
{key: 9, label: `使用年限`, prop: 'serviceLife', visible: true},
{key: 10, label: `使用项目`, prop: 'usingProject', visible: true},
{key: 11, label: `使用到期时间`, prop: 'expirationTime', visible: true},
{key: 12, label: `使用次数`, prop: 'usageCount', visible: true},
{key: 13, label: `维修次数`, prop: 'repairCount', visible: true},
{key: 14, label: `装备原始编码`, prop: 'originalCode', visible: true},
{key: 15, label: `计量单位`, prop: 'unit', visible: true},
{key: 16, label: `生产厂家`, prop: 'manufacturer', visible: true},
{key: 17, label: `出厂日期`, prop: 'productionDate', visible: true},
{key: 18, label: `采购日期`, prop: 'purchaseDate', visible: true},
{key: 19, label: `资产原值(元)`, prop: 'originalValue', visible: true},
{key: 20, label: `最大使用年限(年)`, prop: 'maxServiceLifeYears', visible: true},
{key: 21, label: `下次维保日期`, prop: 'nextMaintenanceDate', visible: true},
{key: 22, label: `装备外观`, prop: 'appearanceImages', visible: true},
{key: 23, label: `合格证`, prop: 'certificates', visible: true},
{key: 24, label: `定期检验报告`, prop: 'inspectionReports', visible: true},
{key: 25, label: `采购发票`, prop: 'purchaseInvoices', visible: true},
{key: 26, label: `特征项1`, prop: 'featureItem1', visible: true},
{key: 27, label: `特征值1`, prop: 'featureValue1', visible: true},
{key: 28, label: `特征项2`, prop: 'featureItem2', visible: true},
{key: 29, label: `特征值2`, prop: 'featureValue2', visible: true},
{key: 30, label: `特征项3`, prop: 'featureItem3', visible: true},
{key: 31, label: `特征值3`, prop: 'featureValue3', visible: true},
{key: 32, label: `特征项4`, prop: 'featureItem4', visible: true},
{key: 33, label: `特征值4`, prop: 'featureValue4', visible: true},
{key: 34, label: `特征项5`, prop: 'featureItem5', visible: true},
{key: 35, label: `特征值5`, prop: 'featureValue5', visible: true},
{key: 36, label: `特征项6`, prop: 'featureItem6', visible: true},
{key: 37, label: `特征值6`, prop: 'featureValue6', visible: true},
{key: 38, label: `特征项7`, prop: 'featureItem7', visible: true},
{key: 39, label: `特征值7`, prop: 'featureValue7', visible: true},
{key: 40, label: `特征项8`, prop: 'featureItem8', visible: true},
{key: 41, label: `特征值8`, prop: 'featureValue8', visible: true},
{key: 42, label: `特征项9`, prop: 'featureItem9', visible: true},
{key: 43, label: `特征值9`, prop: 'featureValue9', visible: true},
],
tableData: [],
tableColumns: 0,
@ -905,9 +948,9 @@ export default {
},
//
formRules: {
name: [{ required: true, message: '请输入类型分支', trigger: 'blur' }],
code: [{ required: true, message: '请输入装备编号', trigger: 'blur' }],
changeStatus: [{ required: true, message: '请选择装备状态', trigger: 'change' }],
name: [{required: true, message: '请输入类型分支', trigger: 'blur'}],
code: [{required: true, message: '请输入装备编号', trigger: 'blur'}],
changeStatus: [{required: true, message: '请选择装备状态', trigger: 'change'}],
},
maxFeatureCount: 5, //
dialogVisible: false,
@ -960,7 +1003,7 @@ export default {
this.processList = []
this.queryParams.process = ''
} else {
secondAndThirdLevel({ firstLevelId: item }).then((res) => {
secondAndThirdLevel({firstLevelId: item}).then((res) => {
if (res.code === 200) {
this.processList = this.convertToSubTree(res.data)
}
@ -1062,9 +1105,6 @@ export default {
onHandleRetire() {
this.$router.push('/equipment/equ-retire')
},
onHandleReturn() {
this.$router.push('/equipment/equStore')
},
/**
* 导出数据
@ -1075,7 +1115,7 @@ export default {
try {
let fileName = `装备台账_${new Date().getTime()}.xLsx`
let url = '/material-mall/device/export'
const params = { ...this.queryParams }
const params = {...this.queryParams}
console.log('🚀 ~ 导出 ~ params:', params)
this.download(url, params, fileName)
} catch (error) {
@ -1083,22 +1123,227 @@ export default {
}
},
/**
* 获取左侧树形结构数据
*/
async getDeviceTree() {
try {
this.treeLoading = true
const res = await getDeviceTreeAPI()
this.treeData = res.data ? [res.data] : []
this.treeLoading = true;
const res = await getDeviceTreeAPI();
this.treeData = res.data ? [res.data] : [];
// 👇
console.log('treeData', JSON.stringify(this.treeData, null, 2));
// ID
this.defaultExpandedKeys = [];
// ID
this.collectFirstAndSecondLevelKeys(this.treeData);
console.log('✅ defaultExpandedKeys:', this.defaultExpandedKeys);
// 3. DOM
this.$nextTick(() => {
this.defaultExpandedKeys = [...this.defaultExpandedKeys];
});
console.log('默认展开的第一级和第二级节点ID:', this.defaultExpandedKeys);
} catch (error) {
this.$message.error('获取树形结构失败:' + (error.message || '未知错误'))
console.error(error)
this.$message.error('获取树形结构失败:' + (error.message || '未知错误'));
console.error(error);
} finally {
this.treeLoading = false
this.treeLoading = false;
}
},
/**
* 收集第一级和第二级节点的ID第三级默认不展开
*/
collectFirstAndSecondLevelKeys(nodes) {
if (!nodes || !nodes.length) return;
nodes.forEach(firstLevelNode => {
//
if (firstLevelNode.id) {
this.defaultExpandedKeys.push(firstLevelNode.id);
console.log(`展开第一级节点: ${firstLevelNode.name}, ID: ${firstLevelNode.id}`);
}
//
if (firstLevelNode.children && firstLevelNode.children.length) {
//
firstLevelNode.children.forEach(secondLevelNode => {
if (secondLevelNode.id) {
this.defaultExpandedKeys.push(secondLevelNode.id);
console.log(`展开第二级节点: ${secondLevelNode.name}, ID: ${secondLevelNode.id}`);
//
}
});
}
});
},
/**
* 左侧树查询匹配节点显示自身及下一级但默认只显示到第二级
*/
async getDeviceListByTreeSearch() {
try {
// 1.
const searchKey = this.treeSearchKey ? this.treeSearchKey.trim() : '';
//
if (!searchKey) {
await this.resetTreeSearch();
return;
}
// 2.
this.treeLoading = true;
const res = await getDeviceTreeAPI();
const originalTreeData = res.data ? [res.data] : [];
// 3.
const filteredTreeData = this.filterTreeWithNextLevel(originalTreeData, searchKey);
// 4. ID
const expandedIds = [];
this.collectMatchedNodeIds(filteredTreeData, searchKey, expandedIds);
// 5.
this.treeData = filteredTreeData;
this.defaultExpandedKeys = expandedIds;
// 6.
if (filteredTreeData.length === 0 || this.isTreeEmpty(filteredTreeData)) {
this.$message.info('未找到匹配的类型分支');
} else {
this.$message.success(`找到 ${expandedIds.length} 个匹配项`);
}
} catch (error) {
this.$message.error('树形查询失败:' + (error.message || '未知错误'));
console.error(error);
} finally {
this.treeLoading = false;
}
},
/**
* 辅助方法筛选节点并包含下一级
*/
filterTreeWithNextLevel(treeData, key) {
if (!treeData || !treeData.length) return [];
return treeData
.map(node => {
//
const newNode = {...node};
const isNodeMatch = key ? node.name.includes(key) : true;
if (isNodeMatch) {
//
if (newNode.children && newNode.children.length) {
//
newNode.children = [...newNode.children];
}
return newNode;
} else {
//
if (newNode.children && newNode.children.length) {
const filteredChildren = this.filterTreeWithNextLevel(newNode.children, key);
if (filteredChildren.length > 0) {
newNode.children = filteredChildren;
return newNode;
}
}
return null;
}
})
.filter(node => node !== null);
},
/**
* 辅助方法收集所有匹配关键词的节点ID用于默认展开
* @param {Array} treeData - 筛选后的树形数据
* @param {String} key - 查询关键词
* @param {Array} expandedIds - 存储展开节点ID的数组
*/
collectMatchedNodeIds(treeData, key, expandedIds) {
if (!treeData || !treeData.length) return;
treeData.forEach(node => {
// ID
if (key ? node.name.includes(key) : true) {
if (node.id) expandedIds.push(node.id);
}
//
if (node.children && node.children.length) {
this.collectMatchedNodeIds(node.children, key, expandedIds);
}
});
},
/**
* 辅助方法检查树是否为空没有任何有效节点
*/
isTreeEmpty(treeData) {
if (!treeData || !treeData.length) return true;
//
for (const node of treeData) {
if (node && node.id) {
return false; //
}
if (node.children && node.children.length) {
if (!this.isTreeEmpty(node.children)) {
return false; //
}
}
}
return true;
},
/**
* 左侧树重置仅恢复树形原始状态不联动右侧列表
*/
/**
* 左侧树重置恢复树形原始状态默认显示到第二级
*/
async resetTreeSearch() {
try {
// 1.
if (this.$refs.queryFormLeft) {
this.$refs.queryFormLeft.resetFields();
}
this.treeSearchKey = ''; //
this.queryParams.typeId = undefined; // ID
// 2.
this.treeLoading = true;
const res = await getDeviceTreeAPI();
this.treeData = res.data ? [res.data] : [];
// ID
this.defaultExpandedKeys = [];
//
this.collectFirstAndSecondLevelKeys(this.treeData);
this.$message.success('树形查询已重置');
} catch (error) {
this.$message.error('树形重置失败:' + (error.message || '未知错误'));
console.error(error);
} finally {
this.treeLoading = false;
}
},
/**
* 获取右侧列表数据
*/
@ -1135,7 +1380,7 @@ export default {
async onHandlePreview(row) {
// this.formData = row
// this.previewDialogVisible = true
this.$router.push({ path: '/equipment/details', query: { id: row.maId } })
this.$router.push({path: '/equipment/details', query: {id: row.maId}})
},
/**
@ -1346,7 +1591,7 @@ export default {
async getDeviceStatusCount() {
try {
const res = await getDeviceStatusCountAPI()
const { inStock, ownUse, share, underRepair } = res.data || {}
const {inStock, ownUse, share, underRepair} = res.data || {}
this.inStock = inStock || 0
this.ownUse = ownUse || 0
this.share = share || 0
@ -1401,10 +1646,16 @@ export default {
//
await this.getDeviceList()
},
}
</script>
<style scoped lang="scss">
<style scoped>
.app-container {
padding: 20px;
background-color: #f5f7fa;
@ -1693,27 +1944,49 @@ export default {
flex-direction: row;
}
::v-deep .el-table {
//
&.el-table--striped .el-table__body {
tr.el-table__row--striped td {
background-color: #F6FBFA !important; //
}
}
.el-table__header {
background: #E9F0EE;
th {
background: #E9F0EE !important;
color: #606266;
font-weight: 600;
height: 50px;
}
}
&.el-table--striped .el-table__body tr.el-table__row:hover>td.el-table__cell {
background-color: #CCF1E9 !important;
}
}
/* 简洁紧凑版树搜索输入框样式 */
.tree-search-input ::v-deep .el-input__inner {
padding-right: 65px;
border-radius: 4px;
}
.tree-search-input ::v-deep .el-input__suffix {
right: 0;
display: flex;
align-items: center;
}
.tree-search-buttons {
display: flex;
align-items: center;
height: 100%;
gap: 0; /* 关键:移除按钮间距 */
}
.search-btn-embedded {
border: none !important;
background: transparent !important;
color: #909399 !important;
border-radius: 0 !important;
padding: 11px 8px !important; /* 适中的内边距 */
height: 100% !important;
min-width: 24px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
.search-btn-embedded:hover {
color: #409EFF !important;
background-color: #f5f7fa !important;
}
.tree-search-input ::v-deep .el-input__clear {
right: 55px;
}
</style>