268 lines
7.2 KiB
Vue
Raw Normal View History

2025-11-03 17:56:26 +08:00
<template>
2025-11-14 14:58:33 +08:00
<div>
<el-drawer v-model="visible" size="700px" :show-close="false">
<template #header="{ close, titleId, titleClass }">
<div class="drawer-header">
<el-icon class="el-icon--close" @click="close">
<Close />
</el-icon>
<h4 :id="titleId" :class="titleClass">{{ title }}</h4>
</div>
</template>
<div v-if="equipment" class="drawer-content">
<!-- 基础信息 -->
<div class="info-box">
<div class="info-title-block">
<span class="title-text">基础信息</span>
</div>
<div class="info-content-block flex">
<div class="left-wrapper">
<div class="info-item-list-wrapper">
<div class="info-item" v-for="(item, index) in showDataConfig['基础信息']" :key="index">
<div class="label">{{ item.label }}</div>
<div class="value">{{ equipment[item.name] }}</div>
</div>
</div>
</div>
<div class="right-wrapper">
<div>
<el-tag v-if="equipment.sbzt === '完好'" type="success" size="small">完好</el-tag>
<el-tag v-if="equipment.sbzt === '损坏'" type="danger" size="small">损坏</el-tag>
<el-tag v-if="equipment.sbzt === '报废'" type="danger" size="small">报废</el-tag>
</div>
<div class="photo-block">
<el-image v-if="defaultPhoto" style="width: 100%; height: 100%" :src="defaultPhoto" :zoom-rate="1.2"
:max-scale="7" :min-scale="0.2" :preview-src-list="photos" show-progress :initial-index="4"
fit="cover" />
<div v-else class="no-photo">
<span>暂无图片</span>
</div>
</div>
</div>
</div>
</div>
<!-- 设备位置 -->
<DetailInfoBox class="detail-info-box" :data="equipment" :title="'设备位置'" :dataConfig="showDataConfig['设备位置']" />
<!-- 设备管理情况 -->
<DetailInfoBox class="detail-info-box" :data="equipment" :title="'设备管理情况'"
:dataConfig="showDataConfig['设备管理情况']" />
</div>
<!-- 设备情况 -->
<template v-for="(item, index) in statusList">
<DetailInfoBox class="detail-info-box" :data="item" :title="index == 0 ? '设备情况' : ''"
:dataConfig="showDataConfig['设备情况']" />
</template>
</el-drawer>
2025-11-03 17:56:26 +08:00
</div>
</template>
<script setup>
2025-11-14 14:58:33 +08:00
import { ref } from 'vue'
import { Close } from '@element-plus/icons-vue'
import DetailInfoBox from '@/component/DetailInfoBox/DetailInfoBox.vue'
import { formatDate } from '../../../../shared/utils'
const visible = ref(false)
const title = ref('设备详情')
const equipment = ref(null)
const statusList = ref([])
const defaultPhoto = ref('')
const photos = ref([])
const showDialog = (data) => {
equipment.value = data.equipment || {}
statusList.value = data.statusList || []
photos.value = data.photos?.length ? data.photos.map((item) => item.photoUrl) : []
defaultPhoto.value = photos.value && photos.value[0] || null
visible.value = true
}
const showDataConfig = ref({
'基础信息':
[{
"label": "设备名称",
"name": "sbmc"
}, {
"label": "设备大类",
"name": "sbdl"
}, {
"label": "设备类型",
"name": "sblx"
}, {
"label": "设备编号",
"name": "sbbh"
}, {
"label": "设备型号",
"name": "sbxh"
}, {
"label": "生产商",
"name": "sccj"
}, {
"label": "所属服务站",
"name": "yhzmc"
}, {
"label": "上传人",
"name": "czy"
}, {
"label": "上传时间",
"name": "tjsj"
}, {
"label": "备注",
"name": "remark"
}],
"设备位置": [{ "label": "设备位置", "name": "sbwz" }, { "label": "设备经度", "name": "jd" }, { "label": "设备纬度", "name": "wd" }],
"设备管理情况": [
{ "label": "设备管理人员", "name": "glry" },
{ "label": "操作员", "name": "czy" },
{
"label": "购置日期", "name": "gzrq",
"value": (item) => {
return formatDate(item.gzrq)
}
},
{ "label": "购买费用(万元)", "name": "gmfy" },
{ "label": "应急设备", "name": "sfyjsb" },
{ "label": "纳入市级补助范围", "name": "sfnrsjbz" },
{ "label": "辐射范围", "name": "fsfw" }
],
"设备情况": [
{
"label": (item) => {
if (item.equipmentStatus == '正常') return '设备状态'
if (item.equipmentStatus == '损坏') return '损坏原因'
if (item.equipmentStatus == '报废') return '报废原因'
},
"value": (item) => {
if (item.equipmentStatus == '正常') return '正常'
if (item.equipmentStatus == '损坏') return item.statusDesc
if (item.equipmentStatus == '报废') return item.statusDesc
}
},
{
"label": "上报时间",
"value": (item) => {
return formatDate(item.reportTime)
}
},
{
"label": "上报人",
"name": "userName"
}
]
})
defineExpose({
showDialog
})
2025-11-03 17:56:26 +08:00
</script>
2025-11-14 14:58:33 +08:00
<style lang="scss" scoped>
.drawer-header {
display: flex;
align-items: center;
.el-icon--close {
font-size: 20px;
margin-right: 10px;
cursor: pointer;
}
}
.info-box {
width: 100%;
.info-title-block {
margin: 10px 0;
.title-text {
font-size: 16px;
font-weight: 600;
}
}
.info-content-block {
width: 100%;
padding: 15px;
background-color: #fff;
border-radius: 6px;
.info-item-list-wrapper {
display: grid;
width: 100%;
row-gap: 15px;
.info-item {
display: flex;
align-items: center;
width: 100%;
.label {
display: flex;
align-items: center;
font-size: 14px;
margin-right: 10px;
line-height: 14px;
white-space: nowrap;
&::after {
content: ":"
}
}
.value {
line-height: 14px;
font-size: 14px;
white-space: nowrap;
}
}
}
}
.info-content-block.flex {
display: flex;
justify-content: space-between;
.right-wrapper {
display: flex;
gap: 30px;
.photo-block {
width: 150px;
height: 167px;
.no-photo {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background-color: #f5f5f5;
border-radius: 6px;
color: #999;
}
}
}
}
}
:deep(.detail-info-box) {
.info-item-list-wrapper {
grid-template-columns: repeat(3, 1fr);
}
}
:deep(.el-drawer__header) {
margin-bottom: 20px;
}
:deep(.el-drawer__body) {
padding: 15px;
background-color: rgb(242, 242, 242);
}
2025-11-03 17:56:26 +08:00
</style>