装备配置率配置问题修改

This commit is contained in:
jiang 2026-02-02 15:13:44 +08:00
parent 3b981e1308
commit 4f931ac21f
4 changed files with 238 additions and 97 deletions

View File

@ -10,6 +10,20 @@ export function listUser(query) {
}) })
} }
export function moveUp(id) {
return request({
url: '/material-mall/deptConfig/moveUp/' + id,
method: 'post'
})
}
export function moveDown(id) {
return request({
url: '/material-mall/deptConfig/moveDown/' + id,
method: 'post'
})
}
export function getOwnEquipmentList(query) { export function getOwnEquipmentList(query) {
return request({ return request({
url: '/material-mall/deptConfig/getOwnEquipmentList', url: '/material-mall/deptConfig/getOwnEquipmentList',
@ -73,17 +87,21 @@ export function getConfigurationDetails(data) {
}) })
} }
export function exportStatsData() { export function exportStatsData() {
return request({ return request({
url: '/material-mall/deptConfig/exportStatsData', url: '/material-mall/deptConfig/exportStatsData',
method: 'get', method: 'get'
}) })
} }
// 获取使用项目的下拉选
export const getUseProjectListAPI = () => {
return request({
url: '/material-mall/decChange/getProList',
method: 'POST',
data: {}
})
}
export function insertResource(data) { export function insertResource(data) {
return request({ return request({
@ -280,5 +298,15 @@ export function confirmPassword(password) {
}) })
} }
export function updateConfiguration(data) {
return request({
url: '/material-mall/deptConfig/updateConfiguration',
method: 'post',
data: data
})
}

View File

@ -17,13 +17,19 @@
<div class="table-card"> <div class="table-card">
<div class="table-header"> <div class="table-header">
<el-button type="primary" style="float: right" icon="el-icon-download" @click="exportTableData"> <el-button type="primary" style="float: right" size="small" icon="el-icon-download" @click="exportTableData">
导出数据 导出数据
</el-button> </el-button>
<el-button type="primary" style="float: right;margin-right: 20px;color: #FFFFFF" size="small" icon="el-icon-refresh"
@click="updateConfiguration"
>
更新数据
</el-button>
</div> </div>
<el-table :data="tableData" border stripe :fit="true" class="stats-table"> <el-table :data="tableData" border stripe :fit="true" class="stats-table">
<el-table-column label="序号" type="index" width="60" align="center" /> <el-table-column label="序号" type="index" width="60" align="center"/>
<el-table-column label="公司名称" prop="deptName" min-width="150" align="center" /> <el-table-column label="公司名称" prop="deptName" min-width="150" align="center"/>
<el-table-column label="线路设备配置率" prop="lineNum" min-width="120" align="center"> <el-table-column label="线路设备配置率" prop="lineNum" min-width="120" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span class="link" @click="handleCellClick(scope.row.deptId, 0)">{{ scope.row.lineNum }}</span> <span class="link" @click="handleCellClick(scope.row.deptId, 0)">{{ scope.row.lineNum }}</span>
@ -43,7 +49,7 @@
<template #header> <template #header>
<span class="custom-sort-header"> <span class="custom-sort-header">
总配置率 总配置率
<i class="el-icon-sort" style="color: #2cbab2" /> <i class="el-icon-sort" style="color: #2cbab2"/>
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -60,19 +66,19 @@
> >
<el-table :data="detailTableData" border stripe v-loading="detailTableLoading" max-height="600px"> <el-table :data="detailTableData" border stripe v-loading="detailTableLoading" max-height="600px">
<!-- 明细表格列匹配用户提供的表格结构 --> <!-- 明细表格列匹配用户提供的表格结构 -->
<el-table-column label="序号" type="index" width="60" align="center" /> <el-table-column label="序号" type="index" width="60" align="center"/>
<el-table-column label="装备名称" prop="typeName" min-width="120" align="center" /> <el-table-column label="装备名称" prop="typeName" min-width="120" align="center"/>
<el-table-column label="电压等级" prop="vol" min-width="100" align="center" /> <el-table-column label="电压等级" prop="vol" min-width="100" align="center"/>
<el-table-column label="地理特征" prop="type" min-width="100" align="center" /> <el-table-column label="地理特征" prop="type" min-width="100" align="center"/>
<el-table-column label="配置标准(台)" prop="configValue" min-width="100" align="center" /> <el-table-column label="配置标准(台)" prop="configValue" min-width="100" align="center"/>
<el-table-column label="装备种类" prop="jijuType" min-width="100" align="center" /> <el-table-column label="装备种类" prop="jijuType" min-width="100" align="center"/>
<el-table-column label="配置说明" prop="configDescription" min-width="120" align="center" /> <el-table-column label="配置说明" prop="configDescription" min-width="120" align="center"/>
<el-table-column label="装备配置率赋值" prop="configRate" min-width="120" align="center" /> <el-table-column label="装备配置率赋值" prop="configRate" min-width="120" align="center"/>
<el-table-column label="自有装配数量" prop="ownNum" min-width="120" align="center" /> <el-table-column label="自有装配数量" prop="ownNum" min-width="120" align="center"/>
<el-table-column label="共享装备数量" prop="shareNum" min-width="120" align="center" /> <el-table-column label="共享装备数量" prop="shareNum" min-width="120" align="center"/>
<el-table-column label="外租装备数量" prop="rentOutNum" min-width="120" align="center" /> <el-table-column label="外租装备数量" prop="rentOutNum" min-width="120" align="center"/>
<el-table-column label="装备实际配置率" prop="baseAddNum" min-width="120" align="center" /> <el-table-column label="装备实际配置率" prop="baseAddNum" min-width="120" align="center"/>
<el-table-column label="特殊装备配备原因" prop="remark" min-width="150" align="center" /> <el-table-column label="特殊装备配备原因" prop="remark" min-width="150" align="center"/>
</el-table> </el-table>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="detailDialogVisible = false">关闭</el-button> <el-button @click="detailDialogVisible = false">关闭</el-button>
@ -83,7 +89,12 @@
<script> <script>
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { getConfigurationTotal, exportStatsData, getConfigurationDetails } from '@/api/system/equipmentNew' import {
getConfigurationTotal,
exportStatsData,
getConfigurationDetails,
updateConfiguration
} from '@/api/system/equipmentNew'
export default { export default {
name: 'ConfigStatsPage', name: 'ConfigStatsPage',
@ -93,7 +104,7 @@ export default {
searchForm: { searchForm: {
companyName: '', companyName: '',
voltageLevel: '', voltageLevel: '',
terrainType: '', terrainType: ''
}, },
tableData: [], tableData: [],
tableLoading: false, tableLoading: false,
@ -108,11 +119,11 @@ export default {
detailTableLoading: false, detailTableLoading: false,
// //
currentClickRow: null, currentClickRow: null,
currentClickType: '', // line(线)/cable()/substation() currentClickType: '' // line(线)/cable()/substation()
} }
}, },
mounted() { mounted() {
this.$nextTick(async () => { this.$nextTick(async() => {
await this.initPage() await this.initPage()
}) })
}, },
@ -186,12 +197,12 @@ export default {
if (this.activeTab === 1) { if (this.activeTab === 1) {
this.chartInstance.setOption({ this.chartInstance.setOption({
xAxis: { data: xAxis }, xAxis: { data: xAxis },
series: [{ name: '总配置率', data: total }], series: [{ name: '总配置率', data: total }]
}) })
} else { } else {
this.chartInstance.setOption({ this.chartInstance.setOption({
xAxis: { data: xAxis }, xAxis: { data: xAxis },
series: [{ data: xianlu }, { data: dianlan }, { data: biandian }], series: [{ data: xianlu }, { data: dianlan }, { data: biandian }]
}) })
} }
@ -209,15 +220,15 @@ export default {
style: { style: {
text: '单位:分', text: '单位:分',
fill: '#666', fill: '#666',
fontSize: 14, fontSize: 14
}, }
}, },
grid: { grid: {
top: 60, top: 60,
left: '3%', left: '3%',
right: '4%', right: '4%',
bottom: '15%', bottom: '15%',
containLabel: true, containLabel: true
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
@ -234,8 +245,8 @@ export default {
} }
} }
return res return res
}, }
}, }
}, },
yAxis: { type: 'value' }, yAxis: { type: 'value' },
series: [ series: [
@ -252,13 +263,13 @@ export default {
y2: 1, y2: 1,
colorStops: [ colorStops: [
{ offset: 0, color: '#5EDDCA' }, { offset: 0, color: '#5EDDCA' },
{ offset: 1, color: '#32E1C6' }, { offset: 1, color: '#32E1C6' }
], ]
}, }
}, },
data: [], data: []
}, }
], ]
} }
}, },
@ -267,7 +278,7 @@ export default {
return { return {
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
axisPointer: { type: 'shadow' }, axisPointer: { type: 'shadow' }
}, },
// 👉 // 👉
@ -278,8 +289,8 @@ export default {
style: { style: {
text: '单位:分', text: '单位:分',
fill: '#666', fill: '#666',
fontSize: 14, fontSize: 14
}, }
}, },
// 👉 // 👉
@ -291,9 +302,9 @@ export default {
icon: 'roundRect', icon: 'roundRect',
textStyle: { textStyle: {
color: '#666', color: '#666',
fontSize: 14, fontSize: 14
}, },
data: ['线路装备配置率', '电缆设备配置率', '变电设备配置率'], data: ['线路装备配置率', '电缆设备配置率', '变电设备配置率']
}, },
grid: { grid: {
@ -301,7 +312,7 @@ export default {
right: '4%', right: '4%',
bottom: '15%', bottom: '15%',
top: 60, top: 60,
containLabel: true, containLabel: true
}, },
xAxis: { xAxis: {
@ -319,19 +330,19 @@ export default {
} }
} }
return res return res
}, }
}, }
}, },
yAxis: { yAxis: {
type: 'value', type: 'value'
}, },
series: [ series: [
this.barSeries('线路装备配置率', ['#46A8FF', '#7BC2FF']), this.barSeries('线路装备配置率', ['#46A8FF', '#7BC2FF']),
this.barSeries('电缆设备配置率', ['#5EDDCA', '#32E1C6']), this.barSeries('电缆设备配置率', ['#5EDDCA', '#32E1C6']),
this.barSeries('变电设备配置率', ['#FDBE56', '#FFC468']), this.barSeries('变电设备配置率', ['#FDBE56', '#FFC468'])
], ]
} }
}, },
@ -350,14 +361,27 @@ export default {
y2: 1, y2: 1,
colorStops: [ colorStops: [
{ offset: 0, color: colors[0] }, { offset: 0, color: colors[0] },
{ offset: 1, color: colors[1] }, { offset: 1, color: colors[1] }
], ]
}, }
}, },
data: [], data: []
}
},
async updateConfiguration() {
this.$loading({ text: '正在更新,请稍候...' })
try {
const res = await updateConfiguration({})
if (res.code === 200) {
this.$message.success(res.msg)
}
} catch (err) {
console.error('导出失败:', err)
this.$message.error('导出失败,请稍后重试')
} finally {
this.$loading().close()
} }
}, },
// loading // loading
async exportTableData() { async exportTableData() {
this.$loading({ text: '正在导出,请稍候...' }) this.$loading({ text: '正在导出,请稍候...' })
@ -388,7 +412,7 @@ export default {
// ++ // ++
const params = { const params = {
deptId: deptId, deptId: deptId,
configType: configType, configType: configType
} }
const res = await getConfigurationDetails(params) const res = await getConfigurationDetails(params)
if (res.code === 200) { if (res.code === 200) {
@ -401,8 +425,8 @@ export default {
} finally { } finally {
this.detailTableLoading = false this.detailTableLoading = false
} }
}, }
}, }
} }
</script> </script>
@ -446,6 +470,7 @@ export default {
::v-deep.el-loading-mask { ::v-deep.el-loading-mask {
background-color: #e5eef5; background-color: #e5eef5;
} }
::v-deep.el-loading-spinner { ::v-deep.el-loading-spinner {
position: absolute; position: absolute;
top: 40%; top: 40%;
@ -458,6 +483,7 @@ export default {
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
} }
::v-deep.el-loading-spinner > svg { ::v-deep.el-loading-spinner > svg {
display: none; display: none;
} }
@ -505,6 +531,7 @@ export default {
.tabs { .tabs {
display: flex; display: flex;
align-items: center; align-items: center;
.tab-item { .tab-item {
line-height: 24px; line-height: 24px;
margin-right: 16px; margin-right: 16px;
@ -512,6 +539,7 @@ export default {
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
cursor: pointer; cursor: pointer;
&.active { &.active {
color: #2cbab2; color: #2cbab2;
border-bottom: 2px solid #2cbab2; border-bottom: 2px solid #2cbab2;

View File

@ -54,6 +54,8 @@
:empty-text="`暂无${tab.label}装备配置数据`" :empty-text="`暂无${tab.label}装备配置数据`"
@add="handleTableAdd" @add="handleTableAdd"
@relate="handleTableRelate" @relate="handleTableRelate"
@moveUp="handleMoveUpClick"
@moveDown="handleMoveDownClick"
@edit="handleTableEdit" @edit="handleTableEdit"
@delete="handleTableDelete" @delete="handleTableDelete"
@pagination="(page) => handleTablePagination(tab.key, page)" @pagination="(page) => handleTablePagination(tab.key, page)"
@ -394,7 +396,7 @@
v-for="item in categoryList" v-for="item in categoryList"
:key="item.uniqueKey" :key="item.uniqueKey"
:label="`${item.equipmentName}(${item.devType})`" :label="`${item.equipmentName}(${item.devType})`"
:value="item.equipmentName" :value="item.typeId"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -478,9 +480,17 @@
<!-- 筛选条件 --> <!-- 筛选条件 -->
<div class="search-form"> <div class="search-form">
<el-form :inline="true" :model="searchForm.sharing" class="demo-form-inline"> <el-form :inline="true" :model="searchForm.sharing" class="demo-form-inline">
<el-form-item label="订单编号">
<el-input
v-model="searchForm.sharing.orderNumber"
placeholder="请输入订单编号"
clearable
size="small"
/>
</el-form-item>
<el-form-item label="装备名称"> <el-form-item label="装备名称">
<el-input <el-input
v-model="searchForm.sharing.equipmentName" v-model="searchForm.sharing.name"
placeholder="请输入装备名称" placeholder="请输入装备名称"
clearable clearable
size="small" size="small"
@ -488,23 +498,19 @@
</el-form-item> </el-form-item>
<el-form-item label="装备类型"> <el-form-item label="装备类型">
<el-select <el-select
v-model="searchForm.sharing.equipmentType" v-model="searchForm.sharing.category"
placeholder="请选择装备类型" placeholder="请选择装备类型"
clearable clearable
size="small" size="small"
> >
<el-option <el-option label="装备" :value="0"/>
v-for="item in equipmentTypeOptions" <el-option label="工具" :value="1"/>
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="所属单位"> <el-form-item label="规格型号">
<el-input <el-input
v-model="searchForm.sharing.deptName" v-model="searchForm.sharing.specificationModel"
placeholder="请输入所属单位" placeholder="请输入规格型号"
clearable clearable
size="small" size="small"
/> />
@ -531,6 +537,7 @@
:key="column.prop" :key="column.prop"
:label="column.label" :label="column.label"
:prop="column.prop" :prop="column.prop"
align="center"
:min-width="column.minWidth || 100" :min-width="column.minWidth || 100"
> >
<template v-slot="scope" v-if="column.prop === 'category'"> <template v-slot="scope" v-if="column.prop === 'category'">
@ -583,7 +590,7 @@
<el-form :inline="true" :model="searchForm.rental" class="demo-form-inline"> <el-form :inline="true" :model="searchForm.rental" class="demo-form-inline">
<el-form-item label="装备名称"> <el-form-item label="装备名称">
<el-input <el-input
v-model="searchForm.rental.equipmentName" v-model="searchForm.rental.name"
placeholder="请输入装备名称" placeholder="请输入装备名称"
clearable clearable
size="small" size="small"
@ -591,27 +598,44 @@
</el-form-item> </el-form-item>
<el-form-item label="装备类型"> <el-form-item label="装备类型">
<el-select <el-select
v-model="searchForm.rental.equipmentType" v-model="searchForm.rental.type"
placeholder="请选择装备类型" placeholder="请选择装备类型"
clearable clearable
filterable
size="small" size="small"
> >
<el-option <el-option
v-for="item in equipmentTypeOptions" v-for="item in categoryList"
:key="item.value" :key="item.uniqueKey"
:label="item.label" :label="`${item.equipmentName}(${item.devType})`"
:value="item.value" :value="item.typeId"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="租赁公司"> <el-form-item label="租赁公司">
<el-input <el-input
v-model="searchForm.rental.companyName" v-model="searchForm.rental.rentalCompany"
placeholder="请输入租赁公司" placeholder="请输入租赁公司"
clearable clearable
size="small" size="small"
/> />
</el-form-item> </el-form-item>
<el-form-item label="所属项目">
<el-select
v-model="searchForm.rental.proCode"
placeholder="请选择所属项目"
clearable
filterable
size="small"
>
<el-option
v-for="item in proList"
:key="item.proCode"
:label="item.proName"
:value="item.proCode"
/>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" size="small" @click="handleRentalSearch">查询</el-button> <el-button type="primary" size="small" @click="handleRentalSearch">查询</el-button>
<el-button size="small" @click="resetRentalSearch">重置</el-button> <el-button size="small" @click="resetRentalSearch">重置</el-button>
@ -634,6 +658,7 @@
:key="column.prop" :key="column.prop"
:label="column.label" :label="column.label"
:prop="column.prop" :prop="column.prop"
align="center"
:min-width="column.minWidth || 100" :min-width="column.minWidth || 100"
> >
<template v-slot="scope" v-if="column.prop === 'category'"> <template v-slot="scope" v-if="column.prop === 'category'">
@ -692,7 +717,10 @@ import {
getOwnEquipmentList, getOwnEquipmentList,
getSharingEquipmentList, getSharingEquipmentList,
getRentalEquipmentList, getRentalEquipmentList,
saveInstanceSelection saveInstanceSelection,
getUseProjectListAPI,
moveUp,
moveDown
} from '@/api/system/equipmentNew' } from '@/api/system/equipmentNew'
export default { export default {
@ -821,6 +849,7 @@ export default {
treeLoading: false, treeLoading: false,
deptOptions: [], deptOptions: [],
categoryList: [], categoryList: [],
proList: [],
deptName: '', deptName: '',
treeProps: { children: 'children', label: 'deptName' }, treeProps: { children: 'children', label: 'deptName' },
currentDeptId: null, currentDeptId: null,
@ -905,14 +934,16 @@ export default {
specificationModel: '' specificationModel: ''
}, },
sharing: { sharing: {
equipmentName: '', name: '',
equipmentType: '', category: '',
deptName: '' specificationModel: '',
orderNumber: ''
}, },
rental: { rental: {
equipmentName: '', name: '',
equipmentType: '', type: '',
companyName: '' proCode: '',
rentalCompany: ''
} }
}, },
@ -1016,6 +1047,12 @@ export default {
})) }))
} }
}, },
async getProList() {
const res = await getUseProjectListAPI()
if (res.code === 200) {
this.proList = res.data
}
},
async getDeptTree() { async getDeptTree() {
try { try {
this.treeLoading = true this.treeLoading = true
@ -1153,6 +1190,39 @@ export default {
this.initForm('main') this.initForm('main')
this.dialogOpen = true this.dialogOpen = true
}, },
async handleMoveUpClick(row) {
this.$loading({ text: '正在上移,请稍候...' })
try {
const res = await moveUp(row.id)
if (res.code === 200) {
this.$message.success('上移成功')
await this.loadMainTabData(row.configType)
} else {
this.$message.error(res.message || '上移失败')
}
} catch (err) {
console.error('上移失败:', err)
} finally {
this.$loading().close()
}
},
async handleMoveDownClick(row) {
this.$loading({ text: '正在下移,请稍候...' })
try {
const res = await moveDown(row.id)
if (res.code === 200) {
this.$message.success('下移成功')
await this.loadMainTabData(row.configType)
} else {
this.$message.error(res.message || '下移失败')
}
} catch (err) {
console.error('下移失败:', err)
} finally {
this.$loading().close()
}
},
async handleTableEdit(row) { async handleTableEdit(row) {
if (!row?.id) return if (!row?.id) return
const tab = this.mainTabList.find(item => item.name === row.configType) const tab = this.mainTabList.find(item => item.name === row.configType)
@ -1486,9 +1556,10 @@ export default {
async handleInstanceSharingAdd() { async handleInstanceSharingAdd() {
// //
this.searchForm.sharing = { this.searchForm.sharing = {
equipmentName: '', name: '',
equipmentType: '', category: '',
deptName: '' specificationModel: '',
orderNumber: ''
} }
this.selectedSharingRows = [] this.selectedSharingRows = []
// //
@ -1526,9 +1597,10 @@ export default {
}, },
resetSharingSearch() { resetSharingSearch() {
this.searchForm.sharing = { this.searchForm.sharing = {
equipmentName: '', name: '',
equipmentType: '', category: '',
deptName: '' specificationModel: '',
orderNumber: ''
} }
this.tableData.sharing.pageNum = 1 this.tableData.sharing.pageNum = 1
this.loadSharingEquipmentData() this.loadSharingEquipmentData()
@ -1581,15 +1653,19 @@ export default {
async handleInstanceRentalAdd() { async handleInstanceRentalAdd() {
// //
this.searchForm.rental = { this.searchForm.rental = {
equipmentName: '', name: '',
equipmentType: '', type: '',
companyName: '' proCode: '',
rentalCompany: ''
} }
this.selectedRentalRows = [] this.selectedRentalRows = []
// //
this.tableData.rental.pageNum = 1 this.tableData.rental.pageNum = 1
// //
await this.loadRentalEquipmentData() await this.loadRentalEquipmentData()
await this.getCategoryList()
await this.getProList()
this.categoryList = this.categoryList.filter(item => item.type != 1)
this.rentalOpen = true this.rentalOpen = true
}, },
async loadRentalEquipmentData() { async loadRentalEquipmentData() {
@ -1621,9 +1697,10 @@ export default {
}, },
resetRentalSearch() { resetRentalSearch() {
this.searchForm.rental = { this.searchForm.rental = {
equipmentName: '', name: '',
equipmentType: '', type: '',
companyName: '' proCode: '',
rentalCompany: ''
} }
this.tableData.rental.pageNum = 1 this.tableData.rental.pageNum = 1
this.loadRentalEquipmentData() this.loadRentalEquipmentData()

View File

@ -34,10 +34,12 @@
align="center" align="center"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="操作" align="center" width="200"> <el-table-column label="操作" align="center" width="250">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click="handleRelateClick(scope.row)">关联</el-button> <el-button type="text" @click="handleRelateClick(scope.row)">关联</el-button>
<el-button type="text" @click="handleEditClick(scope.row)">编辑</el-button> <el-button type="text" @click="handleEditClick(scope.row)">编辑</el-button>
<el-button type="text" @click="handleMoveUpClick(scope.row)">上移</el-button>
<el-button type="text" @click="handleMoveDownClick(scope.row)">下移</el-button>
<el-button type="text" text-color="danger" @click="handleDeleteClick(scope.row)">删除</el-button> <el-button type="text" text-color="danger" @click="handleDeleteClick(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -105,6 +107,12 @@ export default {
handleEditClick(row) { handleEditClick(row) {
this.$emit('edit', row) this.$emit('edit', row)
}, },
handleMoveUpClick(row) {
this.$emit('moveUp', row)
},
handleMoveDownClick(row) {
this.$emit('moveDown', row)
},
// //
handleDeleteClick(row) { handleDeleteClick(row) {
this.$emit('delete', row) this.$emit('delete', row)