装备配置率配置问题修改

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) {
return request({
url: '/material-mall/deptConfig/getOwnEquipmentList',
@ -73,17 +87,21 @@ export function getConfigurationDetails(data) {
})
}
export function exportStatsData() {
return request({
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) {
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-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 type="primary" style="float: right;margin-right: 20px;color: #FFFFFF" size="small" icon="el-icon-refresh"
@click="updateConfiguration"
>
更新数据
</el-button>
</div>
<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="公司名称" prop="deptName" min-width="150" 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="lineNum" min-width="120" align="center">
<template slot-scope="scope">
<span class="link" @click="handleCellClick(scope.row.deptId, 0)">{{ scope.row.lineNum }}</span>
@ -43,7 +49,7 @@
<template #header>
<span class="custom-sort-header">
总配置率
<i class="el-icon-sort" style="color: #2cbab2" />
<i class="el-icon-sort" style="color: #2cbab2"/>
</span>
</template>
</el-table-column>
@ -60,19 +66,19 @@
>
<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="装备名称" prop="typeName" min-width="120" 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="configValue" 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="configRate" 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="rentOutNum" 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="序号" type="index" width="60" 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="type" 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="configDescription" 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="shareNum" 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="remark" min-width="150" align="center"/>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button @click="detailDialogVisible = false">关闭</el-button>
@ -83,7 +89,12 @@
<script>
import * as echarts from 'echarts'
import { getConfigurationTotal, exportStatsData, getConfigurationDetails } from '@/api/system/equipmentNew'
import {
getConfigurationTotal,
exportStatsData,
getConfigurationDetails,
updateConfiguration
} from '@/api/system/equipmentNew'
export default {
name: 'ConfigStatsPage',
@ -93,7 +104,7 @@ export default {
searchForm: {
companyName: '',
voltageLevel: '',
terrainType: '',
terrainType: ''
},
tableData: [],
tableLoading: false,
@ -108,11 +119,11 @@ export default {
detailTableLoading: false,
//
currentClickRow: null,
currentClickType: '', // line(线)/cable()/substation()
currentClickType: '' // line(线)/cable()/substation()
}
},
mounted() {
this.$nextTick(async () => {
this.$nextTick(async() => {
await this.initPage()
})
},
@ -186,12 +197,12 @@ export default {
if (this.activeTab === 1) {
this.chartInstance.setOption({
xAxis: { data: xAxis },
series: [{ name: '总配置率', data: total }],
series: [{ name: '总配置率', data: total }]
})
} else {
this.chartInstance.setOption({
xAxis: { data: xAxis },
series: [{ data: xianlu }, { data: dianlan }, { data: biandian }],
series: [{ data: xianlu }, { data: dianlan }, { data: biandian }]
})
}
@ -209,15 +220,15 @@ export default {
style: {
text: '单位:分',
fill: '#666',
fontSize: 14,
},
fontSize: 14
}
},
grid: {
top: 60,
left: '3%',
right: '4%',
bottom: '15%',
containLabel: true,
containLabel: true
},
xAxis: {
type: 'category',
@ -234,8 +245,8 @@ export default {
}
}
return res
},
},
}
}
},
yAxis: { type: 'value' },
series: [
@ -252,13 +263,13 @@ export default {
y2: 1,
colorStops: [
{ offset: 0, color: '#5EDDCA' },
{ offset: 1, color: '#32E1C6' },
],
},
{ offset: 1, color: '#32E1C6' }
]
}
},
data: [],
},
],
data: []
}
]
}
},
@ -267,7 +278,7 @@ export default {
return {
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' },
axisPointer: { type: 'shadow' }
},
// 👉
@ -278,8 +289,8 @@ export default {
style: {
text: '单位:分',
fill: '#666',
fontSize: 14,
},
fontSize: 14
}
},
// 👉
@ -291,9 +302,9 @@ export default {
icon: 'roundRect',
textStyle: {
color: '#666',
fontSize: 14,
fontSize: 14
},
data: ['线路装备配置率', '电缆设备配置率', '变电设备配置率'],
data: ['线路装备配置率', '电缆设备配置率', '变电设备配置率']
},
grid: {
@ -301,7 +312,7 @@ export default {
right: '4%',
bottom: '15%',
top: 60,
containLabel: true,
containLabel: true
},
xAxis: {
@ -319,19 +330,19 @@ export default {
}
}
return res
},
},
}
}
},
yAxis: {
type: 'value',
type: 'value'
},
series: [
this.barSeries('线路装备配置率', ['#46A8FF', '#7BC2FF']),
this.barSeries('电缆设备配置率', ['#5EDDCA', '#32E1C6']),
this.barSeries('变电设备配置率', ['#FDBE56', '#FFC468']),
],
this.barSeries('变电设备配置率', ['#FDBE56', '#FFC468'])
]
}
},
@ -350,14 +361,27 @@ export default {
y2: 1,
colorStops: [
{ 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
async exportTableData() {
this.$loading({ text: '正在导出,请稍候...' })
@ -388,7 +412,7 @@ export default {
// ++
const params = {
deptId: deptId,
configType: configType,
configType: configType
}
const res = await getConfigurationDetails(params)
if (res.code === 200) {
@ -401,8 +425,8 @@ export default {
} finally {
this.detailTableLoading = false
}
},
},
}
}
}
</script>
@ -446,6 +470,7 @@ export default {
::v-deep.el-loading-mask {
background-color: #e5eef5;
}
::v-deep.el-loading-spinner {
position: absolute;
top: 40%;
@ -458,6 +483,7 @@ export default {
background-repeat: no-repeat;
background-position: center;
}
::v-deep.el-loading-spinner > svg {
display: none;
}
@ -505,6 +531,7 @@ export default {
.tabs {
display: flex;
align-items: center;
.tab-item {
line-height: 24px;
margin-right: 16px;
@ -512,6 +539,7 @@ export default {
font-size: 16px;
font-weight: 400;
cursor: pointer;
&.active {
color: #2cbab2;
border-bottom: 2px solid #2cbab2;

View File

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

View File

@ -34,10 +34,12 @@
align="center"
show-overflow-tooltip
/>
<el-table-column label="操作" align="center" width="200">
<el-table-column label="操作" align="center" width="250">
<template slot-scope="scope">
<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="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>
</template>
</el-table-column>
@ -105,6 +107,12 @@ export default {
handleEditClick(row) {
this.$emit('edit', row)
},
handleMoveUpClick(row) {
this.$emit('moveUp', row)
},
handleMoveDownClick(row) {
this.$emit('moveDown', row)
},
//
handleDeleteClick(row) {
this.$emit('delete', row)