odf_new/server/ZR.Vue/src/views/business/OdfCableFaults.vue
2026-03-26 07:59:28 +08:00

324 lines
12 KiB
Vue

<!--
* @Descripttion: (干线故障管理/odf_cable_faults)
* @Author: (admin)
* @Date: (2025-08-05)
-->
<template>
<div>
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
<el-form-item label="所属光缆" prop="cableId">
<el-select
v-model="queryParams.cableId"
filterable
remote
reserve-keyword
clearable
placeholder="请输入光缆名称搜索"
:remote-method="remoteCableSearch"
:loading="cableSearchLoading">
<el-option v-for="item in cableOptions" :key="item.id" :label="item.cableName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="故障时间" prop="faultTimeRange">
<el-date-picker
v-model="faultTimeRange"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
@change="handleFaultTimeChange" />
</el-form-item>
<el-form-item label="故障原因" prop="faultReason">
<el-input v-model="queryParams.faultReason" placeholder="请输入故障原因" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
<!-- 工具区域 -->
<el-row :gutter="15" class="mb10">
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['odfcablefaults:delete']" plain icon="delete" @click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" v-hasPermi="['odfcablefaults:export']" plain icon="download" @click="handleExport">
{{ $t('btn.export') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-dropdown trigger="click" v-hasPermi="['odfcablefaults:import']">
<el-button type="info" plain icon="Upload">导入</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="upload">
<importData
templateUrl="business/OdfCableFaults/importTemplate"
importUrl="/business/OdfCableFaults/importData"
@success="handleFileSuccess"></importData>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table
:data="dataList"
v-loading="loading"
ref="table"
border
header-cell-class-name="el-table-header-cell"
highlight-current-row
@sort-change="sortChange"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="id" label="Id" align="center" v-if="columns.showColumn('id')" />
<el-table-column prop="faultTime" label="故障时间" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('faultTime')" />
<el-table-column prop="personnel" label="人员" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('personnel')" />
<el-table-column prop="faultReason" label="故障原因" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('faultReason')" />
<el-table-column prop="mileage" label="表显故障里程" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('mileage')" />
<el-table-column prop="cableName" label="所属光缆" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('cableName')" />
<el-table-column prop="location" label="地点" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('location')" />
<el-table-column prop="createdAt" label="创建时间" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('createdAt')" />
<el-table-column label="操作" width="120">
<template #default="scope">
<el-button type="primary" size="small" icon="view" title="详情" @click="handlePreview(scope.row)"></el-button>
<el-button
type="danger"
size="small"
icon="delete"
title="删除"
v-hasPermi="['odfcablefaults:delete']"
@click="handleDelete(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 详情弹窗 -->
<el-dialog v-model="detailVisible" title="故障详情" width="700px" destroy-on-close>
<el-descriptions :column="2" border v-if="detailData">
<el-descriptions-item label="Id">{{ detailData.id }}</el-descriptions-item>
<el-descriptions-item label="故障时间">{{ detailData.faultTime }}</el-descriptions-item>
<el-descriptions-item label="人员">{{ detailData.personnel }}</el-descriptions-item>
<el-descriptions-item label="表显故障里程">{{ detailData.mileage }}</el-descriptions-item>
<el-descriptions-item label="所属光缆">{{ detailData.cableName }}</el-descriptions-item>
<el-descriptions-item label="地点">{{ detailData.location }}</el-descriptions-item>
<el-descriptions-item label="纬度">{{ detailData.latitude }}</el-descriptions-item>
<el-descriptions-item label="经度">{{ detailData.longitude }}</el-descriptions-item>
<el-descriptions-item label="故障原因" :span="2">{{ detailData.faultReason }}</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{ detailData.remark }}</el-descriptions-item>
<el-descriptions-item label="创建时间">{{ detailData.createdAt }}</el-descriptions-item>
<el-descriptions-item label="更新时间">{{ detailData.updatedAt }}</el-descriptions-item>
</el-descriptions>
<div v-if="detailData && detailData.images && detailData.images.length > 0" style="margin-top: 16px;">
<div style="font-weight: bold; margin-bottom: 8px;">故障图片</div>
<div style="display: flex; flex-wrap: wrap; gap: 8px;">
<el-image
v-for="(img, index) in detailData.images"
:key="index"
:src="img.imageUrl"
:preview-src-list="detailData.images.map(i => i.imageUrl)"
:initial-index="index"
fit="cover"
style="width: 120px; height: 120px; border-radius: 4px;" />
</div>
</div>
<template #footer>
<el-button @click="detailVisible = false">关闭</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="odfcablefaults">
import { listOdfCableFaults, getOdfCableFaults, delOdfCableFaults } from '@/api/business/odfcablefaults.js'
import { listOdfCables } from '@/api/business/odfcables.js'
import importData from '@/components/ImportData'
const { proxy } = getCurrentInstance()
const ids = ref([])
const loading = ref(false)
const showSearch = ref(true)
const detailVisible = ref(false)
const detailData = ref(null)
const detailLoading = ref(false)
const cableOptions = ref([])
const cableSearchLoading = ref(false)
const faultTimeRange = ref(null)
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sort: undefined,
sortType: undefined,
cableId: undefined,
beginFaultTime: undefined,
endFaultTime: undefined,
faultReason: undefined
})
const columns = ref([
{ visible: true, align: 'center', type: '', prop: 'id', label: 'Id' },
{ visible: true, align: 'center', type: '', prop: 'faultTime', label: '故障时间', showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'personnel', label: '人员', showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'faultReason', label: '故障原因', showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'mileage', label: '表显故障里程', showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'cableName', label: '所属光缆', showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'location', label: '地点', showOverflowTooltip: true },
{ visible: false, align: 'center', type: '', prop: 'latitude', label: '纬度' },
{ visible: false, align: 'center', type: '', prop: 'longitude', label: '经度' },
{ visible: true, align: 'center', type: '', prop: 'createdAt', label: '创建时间', showOverflowTooltip: true }
])
const total = ref(0)
const dataList = ref([])
const queryRef = ref()
const state = reactive({
single: true,
multiple: true
})
const { single, multiple } = toRefs(state)
// 远程搜索光缆
function remoteCableSearch(query) {
if (query) {
cableSearchLoading.value = true
listOdfCables({ cableName: query, pageNum: 1, pageSize: 50 }).then((res) => {
if (res.code == 200) {
cableOptions.value = res.data.result || []
}
cableSearchLoading.value = false
}).catch(() => {
cableSearchLoading.value = false
})
} else {
cableOptions.value = []
}
}
// 故障时间范围变化
function handleFaultTimeChange(val) {
if (val) {
queryParams.beginFaultTime = val[0]
queryParams.endFaultTime = val[1]
} else {
queryParams.beginFaultTime = undefined
queryParams.endFaultTime = undefined
}
}
function getList() {
loading.value = true
listOdfCableFaults(queryParams).then((res) => {
const { code, data } = res
if (code == 200) {
dataList.value = data.result
total.value = data.totalNum
loading.value = false
}
})
}
// 查询
function handleQuery() {
queryParams.pageNum = 1
getList()
}
// 重置查询操作
function resetQuery() {
faultTimeRange.value = null
queryParams.beginFaultTime = undefined
queryParams.endFaultTime = undefined
proxy.resetForm('queryRef')
handleQuery()
}
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.id)
state.single = selection.length != 1
state.multiple = !selection.length
}
// 自定义排序
function sortChange(column) {
var sort = undefined
var sortType = undefined
if (column.prop != null && column.order != null) {
sort = column.prop
sortType = column.order
}
queryParams.sort = sort
queryParams.sortType = sortType
handleQuery()
}
/**
* 查看详情
* @param {*} row
*/
function handlePreview(row) {
detailLoading.value = true
detailVisible.value = true
getOdfCableFaults(row.id).then((res) => {
if (res.code == 200) {
detailData.value = res.data
}
detailLoading.value = false
}).catch(() => {
detailLoading.value = false
})
}
// 删除按钮操作
function handleDelete(row) {
const Ids = row.id || ids.value
proxy
.$confirm('是否确认删除参数编号为"' + Ids + '"的数据项?', '警告', {
confirmButtonText: proxy.$t('common.ok'),
cancelButtonText: proxy.$t('common.cancel'),
type: 'warning'
})
.then(function () {
return delOdfCableFaults(Ids)
})
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
})
}
// 导出按钮操作
function handleExport() {
proxy
.$confirm('是否确认导出干线故障列表数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
await proxy.downFile('/business/OdfCableFaults/export', { ...queryParams })
})
}
// 导入成功回调
function handleFileSuccess(response) {
proxy.$modal.msgSuccess(response.msg || '导入成功')
getList()
}
handleQuery()
</script>