This commit is contained in:
huangchenhao 2026-04-16 14:05:25 +08:00
commit 11882c188c
23 changed files with 801 additions and 510 deletions

View File

@ -0,0 +1,47 @@
<template>
<div class="block-item">
<slot v-if="title" name="header">
<div class="header">
<div class="header-title">{{ title }}</div>
<div class="header-extra" v-if="$slots.headerExtra">
<slot name="headerExtra"></slot>
</div>
</div>
</slot>
<slot />
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
const props = defineProps({
title: {
type: String,
default: ''
},
})
</script>
<style scoped lang="scss">
.block-item {
position: relative;
width: 100%;
& + .block-item {
margin-top: 10px;
}
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 18px;
}
.header-title {
font-weight: 500;
font-size: 15px;
color: #4a4a4a;
line-height: 16px;
}
</style>

View File

@ -0,0 +1,65 @@
<template>
<div class="dynamic-data">
<span class="info-label">{{ config.label }}</span>
<span class="info-value">{{ getModelValue() || '-' }}</span>
</div>
</template>
<script setup>
import { onMounted, ref, inject, toRaw } from 'vue'
const formData = inject('formData')
const props = defineProps({
config: {
type: Object,
default: () => ({})
}
})
const getModelValue = () => {
if (props.config.value !== null && props.config.value !== undefined && props.config.value !== '') return props.config.value
if (typeof props.config.value == 'function') return props.config.value(formData.value)
if (!props.config.prop) {
console.error('请配置prop属性', toRaw(props.config))
return null
}
const keys = props.config.prop?.split('.')
let current = formData.value
for (const key of keys) {
if (typeof current != 'object' || !current[key]) return null
current = current[key]
}
return current
}
</script>
<style scoped lang="scss">
.dynamic-data {
display: flex;
align-items: flex-start;
line-height: 1.5;
& + .dynamic-data {
margin-top: 10px;
}
&.margin {
margin-top: 10px;
}
.info-label {
white-space: nowrap;
flex-shrink: 0;
color: #909399;
font-size: 14px;
}
.info-value {
flex: 1;
color: #606266;
font-size: 14px;
word-break: break-all;
}
}
</style>

View File

@ -0,0 +1,48 @@
<template>
<div class="dynamic-detail">
<template v-for="(config, configIndex) in configList" :key="configIndex">
<DynamicDetailItem :config="config" />
</template>
</div>
</template>
<script setup>
import { onMounted, watch, ref, provide, computed } from 'vue'
import DynamicDetailItem from './DynamicDetailItem.vue'
const props = defineProps({
configList: {
type: Array,
default: () => []
},
modelValue: {
type: Object,
default: () => {}
}
})
const computedModelValue = computed(() => {
return props.modelValue
})
provide('formData', computedModelValue)
const formRef = ref(null)
//
const getDefaultFormValue = () => {
const form = {}
props.formConfig.forEach((config) => {
form[config.name] = config.default !== undefined ? config.default : ''
})
return form
}
defineExpose({
getDefaultFormValue,
formComponent: formRef.value
})
</script>
<style scoped lang="scss">
.form-wrapper {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
</style>

View File

@ -0,0 +1,45 @@
<template>
<template v-if="isShow() && !config.slot && checkLayout(config)">
<DynamicLayout :config="config">
<DynamicDetailItem v-for="(item, index) in config.children" :key="index" :config="item" />
</DynamicLayout>
</template>
<template v-if="isShow() && !config.slot && !checkLayout(config)">
<el-col class="col-item" :span="config.span">
<DynamicData style="width: 100%" :config="config" />
</el-col>
</template>
<template v-if="isShow() && config.slot">
<slot />
</template>
</template>
<script setup>
import { onMounted, ref , inject} from 'vue'
import DynamicLayout from './DynamicLayout.vue'
import DynamicData from './DynamicData.vue'
const layoutTypes = ['card', 'block', 'row']
const checkLayout = (config) => {
return layoutTypes.includes(config?.type)
}
const formData = inject('formData')
const props = defineProps({
config: {
type: Object,
default: () => ({})
}
})
const isShow = () => {
if(props.config.show === false) return false
if(typeof props.config.show === 'function') return props.config.show(formData)
return true
}
</script>
<style scoped lang="scss">
.col-item {
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,34 @@
<template>
<template v-if="config.type == 'card'">
<el-card shadow="never">
<template #header>
<div class="section-header">
<span class="section-title">{{ config.label }}</span>
</div>
</template>
<slot />
</el-card>
</template>
<template v-else-if="config.type == 'block'">
<BlockItem :title="config.label">
<slot />
</BlockItem>
</template>
<template v-else-if="config.type == 'row'">
<el-row v-bind="config.componentProps">
<slot />
</el-row>
</template>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import BlockItem from './BlockItem.vue';
const props = defineProps({
config: {
type: Object,
default: () => ({})
},
})
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,47 @@
<template>
<div class="block-item">
<slot v-if="title" name="header">
<div class="header">
<div class="header-title">{{ title }}</div>
<div class="header-extra" v-if="$slots.headerExtra">
<slot name="headerExtra"></slot>
</div>
</div>
</slot>
<slot />
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
const props = defineProps({
title: {
type: String,
default: ''
},
})
</script>
<style scoped lang="scss">
.block-item {
position: relative;
width: 100%;
& + .block-item {
margin-top: 10px;
}
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 18px;
}
.header-title {
font-weight: 500;
font-size: 15px;
color: #4a4a4a;
line-height: 16px;
}
</style>

View File

@ -0,0 +1,111 @@
<template>
<div class="dynamic-control">
<template v-if="config.type == 'input'">
<el-input
style="width: 100%"
:modelValue="getModelValue()"
@update:modelValue="changeModelValue"
:placeholder="config.componentProps?.placeholder"
:clearable="true"
/>
</template>
<template v-if="config.type == 'inputNumber'">
<el-input-number
style="width: 100%"
:modelValue="getModelValue()"
@update:modelValue="changeModelValue"
:placeholder="config.componentProps?.placeholder"
:clearable="true"
/>
</template>
<template v-if="config.type == 'radio'">
<el-radio-group
style="width: 100%"
:modelValue="getModelValue()"
@update:modelValue="changeModelValue"
:placeholder="config.componentProps?.placeholder"
>
<el-radio v-for="(option, i) in config.options" :value="option.value">{{
option.label
}}</el-radio>
</el-radio-group>
</template>
<template v-if="config.type == 'select'">
<el-select
style="width: 100%"
:modelValue="getModelValue()"
@update:modelValue="changeModelValue"
:placeholder="config.componentProps?.placeholder"
>
<el-option
v-for="(option, i) in config.options"
:key="i"
:label="option.label"
:value="option.value"
></el-option>
</el-select>
</template>
<template v-if="config.type == 'date'">
<el-date-picker
style="width: 100%"
:modelValue="getModelValue()"
type="date"
@update:modelValue="changeModelValue"
:placeholder="config.componentProps?.placeholder"
/>
</template>
</div>
</template>
<script setup>
import { onMounted, ref, inject, toRaw } from 'vue'
const formData = inject('formData')
const props = defineProps({
config: {
type: Object,
default: () => ({}),
},
})
const getModelValue = () => {
if(!props.config.prop) {
console.error('请配置prop属性', toRaw(props.config))
return null
}
const keys = props.config.prop?.split('.')
let current = formData.value
for (const key of keys) {
if (typeof current != 'object' || !current[key]) return null
current = current[key]
}
return current
}
const changeModelValue = (value) => {
if(!props.config.prop) {
return null
}
// 1. 'event.name' '.'
const keys = props.config.prop?.split('.')
// 2.
let current = formData.value
for (let i = 0; i < keys.length - 1; i++) {
const key = keys[i]
//
if (!current[key] || typeof current[key] !== 'object') {
current[key] = {}
}
current = current[key]
}
// 3.
current[keys[keys.length - 1]] = value
}
</script>
<style scoped lang="scss"></style>

View File

@ -1,91 +1,52 @@
<template> <template>
<div class="dynamic-form"> <div class="dynamic-form">
<el-form class="form-wrapper" :model="modelValue" ref="formRef"> <el-form class="form-wrapper" :model="modelValue" ref="formRef">
<el-form-item v-for="(config, index) in formConfig" :key="index" :prop="config['prop']" <template v-for="(config, configIndex) in configList" :key="configIndex">
:label="config['label']" :rules="config['rules']" label-position="right"> <DynamicFormItem :config="config" />
</template>
<template v-if="config.type == 'input'"> </el-form>
<el-input :modelValue="modelValue[config.name]" </div>
@update:modelValue="(event) => changeValue(config, event)"
:placeholder="config.componentProps?.placeholder" :clearable="true" />
</template>
<template v-if="config.type == 'inputNumber'">
<el-input-number :modelValue="modelValue[config.name]"
@update:modelValue="(event) => changeValue(config, event)"
:placeholder="config.componentProps?.placeholder" :clearable="true" />
</template>
<template v-if="config.type == 'radio'">
<el-radio-group :modelValue="modelValue[config.name]"
@update:modelValue="(event) => changeValue(config, event)"
:placeholder="config.componentProps?.placeholder">
<el-radio v-for="(option, i) in config.options" :value="option.value">{{ option.label
}}</el-radio>
</el-radio-group>
</template>
<template v-if="config.type == 'select'">
<el-select :modelValue="modelValue[config.name]"
@update:modelValue="(event) => changeValue(config, event)"
:placeholder="config.componentProps?.placeholder">
<el-option v-for="(option, i) in config.options" :key="i" :label="option.label"
:value="option.value"></el-option>
</el-select>
</template>
<template v-if="config.type == 'date'">
<el-date-picker :modelValue="modelValue[config.name]" type="date"
@update:modelValue="(event) => changeValue(config, event)"
:placeholder="config.componentProps?.placeholder" />
</template>
</el-form-item>
</el-form>
</div>
</template> </template>
<script setup> <script setup>
import { onMounted, watch, ref } from 'vue'; import { onMounted, watch, ref, provide } from 'vue'
import DynamicFormItem from './DynamicFormItem.vue'
const props = defineProps({ const props = defineProps({
formConfig: { configList: {
type: Array, type: Array,
default: () => [] default: () => []
}, },
modelValue: { modelValue: {
type: Object, type: Object,
default: () => { } default: () => {}
} }
}) })
const emit = defineEmits(['update:modelValue'])
const computedModelValue = computed(() => {
return props.modelValue
})
provide('formData', computedModelValue)
const formRef = ref(null) const formRef = ref(null)
const changeValue = (config, value) => {
const form = { ...props.modelValue }
form[config.name] = value
emit('update:modelValue', form)
}
// //
const getDefaultFormValue = () => { const getDefaultFormValue = () => {
const form = {} const form = {}
props.formConfig.forEach(config => { props.formConfig.forEach((config) => {
form[config.name] = config.default !== undefined ? config.default : '' form[config.name] = config.default !== undefined ? config.default : ''
}) })
return form return form
} }
defineExpose({ defineExpose({
getDefaultFormValue, getDefaultFormValue,
formComponent: formRef.value, formComponent: formRef.value
}) })
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.form-wrapper { .form-wrapper {
display: grid; display: grid;
grid-template-columns: 1fr; grid-template-columns: 1fr;
gap: 16px; gap: 16px;
} }
</style> </style>

View File

@ -0,0 +1,37 @@
<template>
<template v-if="!config.slot && checkLayout(config)">
<DynamicLayout :config="config">
<DynamicFormItem v-for="(item, index) in config.children" :key="index" :config="item" />
</DynamicLayout>
</template>
<template v-if="!config.slot && !checkLayout(config)">
<el-col :span="config.span">
<el-form-item :label="config.label" :prop="config.prop">
<DynamicControl style="width: 100%" :config="config" />
</el-form-item>
</el-col>
</template>
<template v-if="config.slot">
<slot />
</template>
</template>
<script setup>
import { onMounted, ref } from 'vue';
import DynamicLayout from './DynamicLayout.vue';
import DynamicControl from './DynamicControl.vue';
const layoutTypes = ['card', 'block', 'row']
const checkLayout = (config) => {
return layoutTypes.includes(config?.type)
};
const props = defineProps({
config: {
type: Object,
default: () => ({})
}
})
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,39 @@
<template>
<template v-if="config.type == 'card'">
<el-card>
<template #header>
<div class="section-header">
<span class="section-title">{{ config.label }}</span>
</div>
</template>
<slot />
</el-card>
</template>
<template v-else-if="config.type == 'block'">
<BlockItem :title="config.label">
<slot />
</BlockItem>
</template>
<template v-else-if="config.type == 'row'">
<el-row v-bind="config.componentProps">
<slot />
</el-row>
</template>
<template v-else-if="config.type == 'col'">
<el-col v-bind="config.componentProps">
<slot />
</el-col>
</template>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import BlockItem from './BlockItem.vue';
const props = defineProps({
config: {
type: Object,
default: () => ({})
},
})
</script>
<style scoped lang="scss"></style>

View File

@ -258,6 +258,7 @@ const routes = [
component: () => import('../views/DisasterManagement/IceDisasterReport/IceDisasterReportPC.vue'), component: () => import('../views/DisasterManagement/IceDisasterReport/IceDisasterReportPC.vue'),
meta: { meta: {
title: '冰雪灾害上报', title: '冰雪灾害上报',
parentRoute: 'disasterManagement',
breadcrumb: true breadcrumb: true
} }
}, },
@ -266,6 +267,7 @@ const routes = [
component: () => import('../views/DisasterManagement/IceDisasterDetail/IceDisasterDetailPC.vue'), component: () => import('../views/DisasterManagement/IceDisasterDetail/IceDisasterDetailPC.vue'),
meta: { meta: {
title: '冰雪灾害详情', title: '冰雪灾害详情',
parentRoute: 'disasterManagement',
breadcrumb: true breadcrumb: true
} }
}, },
@ -274,6 +276,7 @@ const routes = [
component: () => import('../views/DisasterManagement/WaterDisasterReport/WaterDisasterReportPC.vue'), component: () => import('../views/DisasterManagement/WaterDisasterReport/WaterDisasterReportPC.vue'),
meta: { meta: {
title: '水毁灾害上报', title: '水毁灾害上报',
parentRoute: 'disasterManagement',
breadcrumb: true breadcrumb: true
} }
}, },
@ -283,6 +286,7 @@ const routes = [
component: () => import('../views/DisasterManagement/WaterDisasterDetail/WaterDisasterDetailPC.vue'), component: () => import('../views/DisasterManagement/WaterDisasterDetail/WaterDisasterDetailPC.vue'),
meta: { meta: {
title: '水毁事件详情', title: '水毁事件详情',
parentRoute: 'disasterManagement',
breadcrumb: true breadcrumb: true
} }
} }

View File

@ -323,7 +323,7 @@ const handleDetail = (row) => {
router.push({ path: '/waterDisasterDetail', query: { id: row.id } }) router.push({ path: '/waterDisasterDetail', query: { id: row.id } })
} }
if (row.disasterType == 'ICE_SNOW') { if (row.disasterType == 'ICE_SNOW') {
router.push({ path: '/iceDisasterDetail', query: { id: row.id } }) router.push({ path: '/iceDisasterDetail', query: { id: row.relationId } })
} }
} }
@ -333,7 +333,7 @@ const handleEdit = (row) => {
router.push({ path: '/waterDisasterDetail', query: { id: row.id, mode: 'edit' } }) router.push({ path: '/waterDisasterDetail', query: { id: row.id, mode: 'edit' } })
} }
if (row.disasterType == 'ICE_SNOW') { if (row.disasterType == 'ICE_SNOW') {
router.push({ path: '/iceDisasterDetail', query: { id: row.id, mode: 'edit' } }) router.push({ path: '/iceDisasterDetail', query: { id: row.relationId, mode: 'edit' } })
} }
} }

View File

@ -1,238 +1,13 @@
<template> <template>
<div class="web-detail-container"> <div class="web-detail-container">
<!-- 页面头部 -->
<div class="page-header">
<div class="header-left">
<el-button :icon="ArrowLeft" @click="handleClickBack">返回</el-button>
<h2 class="page-title">冰雪事件详情</h2>
</div>
<div class="header-right">
<el-tag :type="getEventStatusType()" size="large">
{{ getEventStatusText() }}
</el-tag>
</div>
</div>
<div class="content-container"> <div class="content-container">
<div class="left-panel"> <div class="left-panel">
<!-- 基本信息卡片 --> <DynamicDetail v-model="detailData" :config-list="detailConfig" />
<el-card class="info-card" shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">基本信息</span>
</div>
</template>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">事件类型</span>
<span class="info-value">冰雪事件</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">路况类别</span>
<span class="info-value">{{ detailData.roadConditionType || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">是否阻断</span>
<span class="info-value">{{ detailData.event?.isBlocked ? '是' : '否' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">抢险进度</span>
<span class="info-value">{{ detailData.event?.repairProgress || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">处理措施</span>
<span class="info-value">{{ getBaseDisposalMeasures() }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">水毁处数</span>
<span class="info-value">{{ detailData.event?.damageCount || 0 }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">阻断里程</span>
<span class="info-value">{{ detailData.event?.blockedMileage ? detailData.event.blockedMileage + '公里' : '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">地点路线</span>
<span class="info-value">{{ detailData.occurLocation || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">起点桩号</span>
<span class="info-value">{{ detailData.event?.startStakeNo || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">止点桩号</span>
<span class="info-value">{{ detailData.event?.endStakeNo || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">路况位置</span>
<span class="info-value">{{ detailData.event?.blockedPointName || detailData.occurLocation || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">阻断点小地名</span>
<span class="info-value">{{ detailData.event?.blockedPointName || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">所属区县</span>
<span class="info-value">{{ detailData.event?.district || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="info-label">发生时间</span>
<span class="info-value">{{ detailData.occurTime || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20" class="info-row">
<el-col :span="8">
<div class="info-item">
<span class="info-label">是否恢复重建</span>
<span class="info-value">{{ detailData.event?.needsRecovery ? '是' : '否' }}</span>
</div>
</el-col>
<el-col :span="16" v-if="detailData.event?.needsRecovery">
<div class="info-item">
<span class="info-label">恢复重建预估费用</span>
<span class="info-value">{{ detailData.event?.estimatedRecoveryCost ? detailData.event.estimatedRecoveryCost + '万元' : '-' }}</span>
</div>
</el-col>
</el-row>
</el-card>
<!-- 填报信息卡片 -->
<el-card class="info-card" shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">填报信息</span>
</div>
</template>
<div v-if="hasReportData">
<div v-for="(report, index) in allReports" :key="index" class="report-section">
<div class="report-header">
<span class="report-title">{{ report?.title }}</span>
<span class="report-meta">时间{{ report.reportTime || '-' }}</span>
</div>
<div class="content-wrapper">
<div class="basic-info-wrapper">
<div class="info-list">
<div class="info-item">
<span class="info-label">现场描述</span>
<span class="info-value">{{ report.siteDescription || '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">处置措施</span>
<span class="info-value">{{ report.disposalMeasures || '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">实际恢复时间</span>
<span class="info-value">{{ report.actualRecoverTime || '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">预计恢复时间</span>
<span class="info-value">{{ report.expectRecoverTime || '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">填报人</span>
<span class="info-value">{{ report.reporterName ? report.reporterName : '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">联系电话</span>
<span class="info-value">{{ report.phone ? report.phone : '-' }}</span>
</div>
</div>
<div class="file-list">
<FileUpload v-model="report.fileList" :readonly="!isEdit" />
</div>
</div>
<div class="detal-info-wrapper">
<template v-if="report.showDetail">
<LossListDetail :modelValue="report.lossList" :col-span="8" />
<el-row :gutter="24">
<el-col :span="8">
<div class="info-item margin">
<span class="info-label">投入机械</span>
<span class="info-value">{{ report.investedMachinery ? report.investedMachinery + '台/班' : '-'}}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item margin">
<span class="info-label">投入人力</span>
<span class="info-value">{{ report.investedManpower ? report.investedManpower + '人次' : '-'}}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item margin">
<span class="info-label">投入资金</span>
<span class="info-value">{{ report.investedFunds ? report.investedFunds + '万元' : '-'}}</span>
</div>
</el-col>
</el-row>
</template>
<el-button style="margin-top: 30px" type="primary" link @click="report.showDetail = !report.showDetail">
{{ report.showDetail ? '点击关闭详情' : '点击查看详情' }}
</el-button>
</div>
</div>
</div>
</div>
<el-empty v-else description="暂无填报信息" :image-size="100" />
</el-card>
<!-- 底部按钮 -->
<!-- <div class="footer-buttons">
<el-button type="primary" size="large" @click="handleContinueReport" class="footer-btn"> 续报 </el-button>
</div> -->
</div> </div>
<div class="right-panel" v-if="isEdit"> <!-- <div class="right-panel" v-if="isEdit">
<ContinueReport ref="continueReport" @refresh="getDisasterDetail" /> <ContinueReport ref="continueReport" @refresh="getDisasterDetail" />
</div> </div> -->
</div> </div>
</div> </div>
</template> </template>
@ -245,6 +20,8 @@ import { ArrowLeft, Picture, VideoCamera } from '@element-plus/icons-vue'
import ContinueReport from './IceDisasterContinueReportPC.vue' import ContinueReport from './IceDisasterContinueReportPC.vue'
import { request } from '@shared/utils/request' import { request } from '@shared/utils/request'
import FileUpload from '@/component/FileUpload/FileUpload.vue' import FileUpload from '@/component/FileUpload/FileUpload.vue'
import detailConfig from './detailConfig'
import DynamicDetail from '@/component/DynamicDetail/DynamicDetail.vue'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
@ -291,57 +68,6 @@ const hasReportData = computed(() => {
return allReports.value.length > 0 return allReports.value.length > 0
}) })
//
const getEventStatusText = () => {
return eventStatus.value === 1 ? '已解除' : '未解除'
}
//
const getEventStatusType = () => {
return eventStatus.value === 1 ? 'success' : 'danger'
}
const getBaseDisposalMeasures = () => {
const firstItem = allReports.value[0]
if (!firstItem) return '-'
return formatDisposalMeasures(firstItem.disposalMeasures || '') || '-'
}
//
const formatDisposalMeasures = (measures) => {
if (!measures) return ''
const measureMap = {
半幅封闭: '半幅封闭',
全副封闭: '全副封闭',
便道通行: '便道通行',
正常通行: '正常通行'
}
return measures
.split(',')
.map((m) => measureMap[m.trim()] || m.trim())
.join('、')
}
//
const getLossDescription = (report) => {
const lossList = report?.lossList
if (!lossList || lossList.length === 0) return '-'
const totalVolume = lossList.reduce((sum, loss) => {
const volume = (loss.length || 0) * (loss.width || 0) * (loss.height || 0)
return sum + volume
}, 0)
const totalAmount = lossList.reduce((sum, loss) => sum + (loss.totalAmount || 0), 0)
return `${totalVolume}方,共损失${totalAmount}万元`
}
//
const getVehicleStrandedText = (report) => {
const count = report?.strandedVehicleCount || 0
return count > 0 ? `有车滞留,共${count}` : '无车滞留'
}
// //
const getDisasterDetail = async () => { const getDisasterDetail = async () => {
@ -353,9 +79,8 @@ const getDisasterDetail = async () => {
try { try {
const result = await request({ const result = await request({
url: `/snow-ops-platform/water-damage/getById`, url: `/snow-ops-platform/event/getById?id=${route.query.id}`,
method: 'get', method: 'get',
params: { id }
}) })
if (result?.data) { if (result?.data) {
@ -601,6 +326,5 @@ onMounted(() => {
overflow: hidden; overflow: hidden;
} }
.file-list { .file-list {
} }
</style> </style>

View File

@ -0,0 +1,111 @@
export default [
{
type: 'card',
label: '基础信息',
children: [
{
type: 'row',
children: [
{
span: 8,
label: '事件类型',
value: '冰雪事件',
},
{
span: 8,
label: '路况类别',
prop: 'event.routeNo'
},
{
span: 8,
label: '处理措施',
prop: 'event.disposalMeasures'
}
]
},
{
type: 'row',
children: [
{
span: 8,
label: '地点路线',
prop: 'event.occurLocation'
},
{
span: 8,
label: '起点桩号',
prop: 'event.startStakeNo'
},
{
span: 8,
label: '止点桩号',
prop: 'event.endStakeNo'
}
]
},
{
type: 'row',
children: [
{
span: 8,
label: '路况位置',
prop: 'event.occurLocation'
},
{
span: 8,
label: '阻断点小地名',
prop: 'event.occurLocation'
},
{
span: 8,
label: '地点路线',
prop: 'event.occurLocation'
}
]
},
{
type: 'row',
children: [
{
span: 24,
label: '受灾里程',
prop: 'event.disasterMileage'
}
]
},
{
type: 'row',
children: [
{
span: 8,
label: '所属区县',
prop: 'event.district'
},
{
span: 8,
label: '发现时间',
prop: 'event.occurTime'
}
]
},
{
type: 'row',
children: [
{
span: 8,
label: '是否需要恢复重建',
prop: 'event.actualRecoverTime'
},
{
show: (formData) => {
return formData.event?.actualRecoverTime
},
span: 8,
label: '恢复重建预估费用(万元)',
prop: 'event.estimatedRecoveryCost'
}
]
}
]
}
]

View File

@ -1,11 +1,5 @@
<template> <template>
<div class="disaster-form-page"> <div class="disaster-form-page">
<el-page-header style="margin-bottom: 10px;" @back="router.go(-1)" class="page-header">
<template #content>
<span class="title">{{ '冰雪灾害填报' }}</span>
</template>
</el-page-header>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px" class="disaster-form" @submit.prevent> <el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px" class="disaster-form" @submit.prevent>
<!-- 基本信息区块 --> <!-- 基本信息区块 -->
<el-card class="form-section" shadow="never"> <el-card class="form-section" shadow="never">

View File

@ -149,7 +149,7 @@ const props = defineProps({
}) })
// Emits // Emits
const emit = defineEmits(['input', 'change', 'submit']) const emit = defineEmits(['input', 'change'])
// //
const formData = reactive({ const formData = reactive({
@ -293,14 +293,6 @@ const calibrateTime = () => {
// //
const validate = () => { const validate = () => {
if (!formData.occurTime) {
ElMessage.warning('请填写发生时间')
return false
}
if (!formData.routeNo) {
ElMessage.warning('请填写线路编号')
return false
}
return true return true
} }
@ -354,13 +346,6 @@ const resetForm = () => {
disposalMeasureValue.value = '' disposalMeasureValue.value = ''
} }
//
const submit = () => {
if (validate()) {
emit('submit', getFormData())
}
}
const handleSubmit = async () => { const handleSubmit = async () => {
// //
if (!validate()) { if (!validate()) {

View File

@ -1,17 +1,5 @@
<template> <template>
<div class="web-detail-container"> <div class="web-detail-container">
<!-- 页面头部 -->
<div class="page-header">
<div class="header-left">
<el-button :icon="ArrowLeft" @click="handleClickBack">返回</el-button>
<h2 class="page-title">水毁事件详情</h2>
</div>
<div class="header-right">
<el-tag :type="getEventStatusType()" size="large">
{{ getEventStatusText() }}
</el-tag>
</div>
</div>
<div class="content-container"> <div class="content-container">
<div class="left-panel"> <div class="left-panel">
@ -293,16 +281,6 @@ const hasReportData = computed(() => {
return allReports.value.length > 0 return allReports.value.length > 0
}) })
//
const getEventStatusText = () => {
return eventStatus.value === 1 ? '已解除' : '未解除'
}
//
const getEventStatusType = () => {
return eventStatus.value === 1 ? 'success' : 'danger'
}
const getBaseDisposalMeasures = () => { const getBaseDisposalMeasures = () => {
const firstItem = allReports.value[0] const firstItem = allReports.value[0]
if (!firstItem) return '-' if (!firstItem) return '-'

View File

@ -1,11 +1,5 @@
<template> <template>
<div class="disaster-form-page"> <div class="disaster-form-page">
<el-page-header style="margin-bottom: 10px;" @back="router.go(-1)" class="page-header">
<template #content>
<span class="title">{{ '水毁灾害填报' }}</span>
</template>
</el-page-header>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px" class="disaster-form" @submit.prevent> <el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px" class="disaster-form" @submit.prevent>
<!-- 基本信息区块 --> <!-- 基本信息区块 -->
<el-card class="form-section" shadow="never"> <el-card class="form-section" shadow="never">

View File

@ -22,7 +22,7 @@
<div <div
v-for="(item, index) in impactData" v-for="(item, index) in impactData"
:key="index" :key="index"
@click="handleClick(index)" @click="handleClick(index, item)"
class="stat-card" class="stat-card"
:style="{ :style="{
backgroundImage: `url(${cardType == index ? selectedIcon : unselectedIcon})`, backgroundImage: `url(${cardType == index ? selectedIcon : unselectedIcon})`,
@ -350,11 +350,11 @@ const tableColumns = ref(bridgeColumns);
const tableData = ref([]); const tableData = ref([]);
// //
const impactData = ref([ const impactData = ref([
{ name: "影响桥梁", count: 0, icon: Icon0 }, { name: "影响路段", count: 0, icon: Icon4, type: "路段" },
{ name: "影响边坡", count: 0, icon: Icon1 }, { name: "影响桥梁", count: 0, icon: Icon0, type: "桥梁" },
{ name: "影响隧道", count: 0, icon: Icon2 }, { name: "影响隧道", count: 0, icon: Icon2, type: "隧道" },
{ name: "影响项目", count: 0, icon: Icon3 }, { name: "影响边坡", count: 0, icon: Icon1, type: "边坡" },
{ name: "影响路段", count: 0, icon: Icon4 }, { name: "影响项目", count: 0, icon: Icon3, type: "项目" },
]); ]);
// //
const loadBarChartData = async () => { const loadBarChartData = async () => {
@ -401,6 +401,7 @@ const loadBarChartData = async () => {
}; };
const cardType = ref("0"); const cardType = ref("0");
const cardTypeVal = ref("路段");
// cardType // cardType
const getColumnsByType = (type) => { const getColumnsByType = (type) => {
@ -417,11 +418,11 @@ const getColumnsByType = (type) => {
// cardType API // cardType API
const getApiUrlByType = (type) => { const getApiUrlByType = (type) => {
const urlMap = { const urlMap = {
0: "/snow-ops-platform/weather-warning/affected-object/bridge", 桥梁: "/snow-ops-platform/weather-warning/affected-object/bridge",
1: "/snow-ops-platform/weather-warning/affected-object/slope", 边坡: "/snow-ops-platform/weather-warning/affected-object/slope",
2: "/snow-ops-platform/weather-warning/affected-object/tunnel", 隧道: "/snow-ops-platform/weather-warning/affected-object/tunnel",
3: "/snow-ops-platform/weather-warning/affected-object/project", 项目: "/snow-ops-platform/weather-warning/affected-object/project",
4: "/snow-ops-platform/weather-warning/affected-object/road-section", 路段: "/snow-ops-platform/weather-warning/affected-object/road-section",
}; };
return ( return (
urlMap[type] || "/snow-ops-platform/weather-warning/affected-object/bridge" urlMap[type] || "/snow-ops-platform/weather-warning/affected-object/bridge"
@ -429,9 +430,10 @@ const getApiUrlByType = (type) => {
}; };
// //
const handleClick = (type) => { const handleClick = (index, item) => {
tableData.value = []; tableData.value = [];
cardType.value = type + ""; cardType.value = index + "";
cardTypeVal.value = item.type;
// //
tableColumns.value = getColumnsByType(cardType.value); tableColumns.value = getColumnsByType(cardType.value);
// //
@ -507,15 +509,6 @@ const getTimeParams = () => {
}; };
// //
const processUnifiedData = (item, type) => { const processUnifiedData = (item, type) => {
//
const typeMap = {
0: "桥梁",
1: "边坡",
2: "隧道",
3: "项目",
4: "路段",
};
// //
const getLevelClass = (level) => { const getLevelClass = (level) => {
const levelMap = { const levelMap = {
@ -551,7 +544,7 @@ const processUnifiedData = (item, type) => {
item.ADMINISTRATIVE_REGION || item.ADMINISTRATIVE_REGION ||
"-", "-",
// //
pointType: typeMap[type] || "-", pointType: impactData.value[type].type || "-",
// //
pointLocation: pointLocation:
item.GL1_QLMC || item.GL1_QLMC ||
@ -604,7 +597,7 @@ const processUnifiedData = (item, type) => {
}; };
// BASE_GLQL // BASE_GLQL
if (type === "0") { if (cardTypeVal.value === "桥梁") {
return { return {
...baseData, ...baseData,
// - 使 // - 使
@ -645,7 +638,7 @@ const processUnifiedData = (item, type) => {
} }
// BASE_GLSD // BASE_GLSD
if (type === "2") { if (cardTypeVal.value === "隧道") {
return { return {
...baseData, ...baseData,
// - 使 // - 使
@ -686,7 +679,7 @@ const processUnifiedData = (item, type) => {
} }
// BASE_XJLD线 // BASE_XJLD线
if (type === "4") { if (cardTypeVal.value === "路段") {
return { return {
...baseData, ...baseData,
// - 使 // - 使
@ -725,7 +718,7 @@ const processUnifiedData = (item, type) => {
} }
// SQL // SQL
if (type === "3") { if (cardTypeVal.value === "项目") {
return { return {
...baseData, ...baseData,
// - 使COUNTY // - 使COUNTY
@ -801,31 +794,41 @@ const fetchData = async () => {
const timeParams = getTimeParams(); const timeParams = getTimeParams();
// cardType API URL // cardType API URL
const apiUrl = getApiUrlByType(cardType.value); const apiUrl = getApiUrlByType(cardTypeVal.value);
const res = await request({ const res = await request({
url: apiUrl, url: apiUrl,
method: "GET", method: "GET",
params: timeParams, params: timeParams,
}); });
//
if (res.code === "00000" && res.data) { if (cardTypeVal.value == "路段") {
// if (res.data) {
const allData = res.data; tableData.value = res.data.map((item, index) => ({
total.value = allData.length || 0; ...processDataByType(item, cardType.value),
id: index + 1,
// }));
const startIndex = (currentPage.value - 1) * pageSize.value; total.value = res.total || 0;
const endIndex = startIndex + pageSize.value; }
const currentPageData = allData.slice(startIndex, endIndex);
tableData.value = currentPageData.map((item, index) => ({
...processDataByType(item, cardType.value),
id: startIndex + index + 1,
}));
} else { } else {
tableData.value = []; if (res.code === "00000" && res.data) {
total.value = 0; //
const allData = res.data;
total.value = allData.length || 0;
//
const startIndex = (currentPage.value - 1) * pageSize.value;
const endIndex = startIndex + pageSize.value;
const currentPageData = allData.slice(startIndex, endIndex);
tableData.value = currentPageData.map((item, index) => ({
...processDataByType(item, cardType.value),
id: startIndex + index + 1,
}));
} else {
tableData.value = [];
total.value = 0;
}
} }
} catch (error) { } catch (error) {
console.error("获取影响点数据失败:", error); console.error("获取影响点数据失败:", error);

View File

@ -123,31 +123,36 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
warningitem: {
type: Object,
default: () => ({}),
},
}); });
const emit = defineEmits(["update:visible", "close", "impactClick"]); const emit = defineEmits(["update:visible", "close", "impactClick"]);
//
const getDefaultDateRange = () => {
const now = new Date();
const start = new Date(now.getFullYear(), now.getMonth(), 1);
const end = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59);
return [start, end];
};
// //
const dateRange = ref(getDefaultDateRange()); const dateRange = ref([]);
onMounted(() => { onMounted(() => {
filterForm.value = { //
riskLeve: "", if (props.visible) {
countyName: "", initDialogData();
isEnded: "", }
dateRange: dateRange.value,
};
fetchWarningData();
}); });
// warningitem
watch(
() => props.warningitem,
(newVal) => {
console.log("warningitem 变化:", newVal);
if (newVal && Object.keys(newVal).length > 0) {
filterForm.value.riskLeve = newVal.label || "";
currentPage.value = 1;
}
},
{ deep: true },
);
// //
watch( watch(
() => getdateRange.value, () => getdateRange.value,
@ -156,11 +161,9 @@ watch(
if (newVal && newVal.length === 2) { if (newVal && newVal.length === 2) {
dateRange.value = newVal; dateRange.value = newVal;
filterForm.value.dateRange = newVal; filterForm.value.dateRange = newVal;
//
fetchWarningData();
} }
}, },
{ deep: true, immediate: true }, { deep: true },
); );
// //
@ -230,7 +233,7 @@ const fetchWarningData = async () => {
loading.value = true; loading.value = true;
try { try {
const params = { const params = {
offset: currentPage.value, offset: (currentPage.value - 1) * pageSize.value,
limit: pageSize.value, limit: pageSize.value,
start: "", start: "",
end: "", end: "",
@ -335,31 +338,88 @@ const handleImpactClick = (item) => {
// //
const handleSizeChange = (val) => { const handleSizeChange = (val) => {
pageSize.value = val; pageSize.value = val;
console.log("分页大小变化:", val);
currentPage.value = 1;
fetchWarningData(); fetchWarningData();
}; };
const handleCurrentChange = (val) => { const handleCurrentChange = (val) => {
console.log("当前页码变化:", val);
currentPage.value = val; currentPage.value = val;
fetchWarningData(); fetchWarningData();
}; };
//
const initDialogData = () => {
//
if (getdateRange.value && getdateRange.value.length === 2) {
dateRange.value = getdateRange.value;
}
// warningitem
if (props.warningitem && Object.keys(props.warningitem).length > 0) {
filterForm.value = {
riskLeve: props.warningitem.label || "",
countyName: props.warningitem.countyName || "",
isEnded: "",
dateRange: dateRange.value,
};
} else {
filterForm.value = {
riskLeve: "",
countyName: "",
isEnded: "",
dateRange: dateRange.value,
};
}
//
currentPage.value = 1;
console.log("初始化筛选条件:", filterForm.value);
fetchWarningData();
};
//
const resetData = () => {
//
tableData.value = [];
total.value = 0;
currentPage.value = 1;
//
filterForm.value = {
riskLeve: "",
countyName: "",
isEnded: "",
dateRange: [],
};
//
dateRange.value = [];
};
// visible // visible
watch( watch(
() => props.visible, () => props.visible,
(newVal) => { (newVal) => {
if (newVal) { if (newVal) {
currentPage.value = 1; //
fetchWarningData(); initDialogData();
} else {
//
resetData();
} }
}, },
); );
// //
watch( watch(
() => filterForm.value, () => filterForm.value,
() => { (newVal, oldVal) => {
currentPage.value = 1; console.log("筛选条件变化:===========", newVal, oldVal);
fetchWarningData(); //
if (oldVal && Object.keys(oldVal).length > 0) {
currentPage.value = 1;
fetchWarningData();
}
}, },
{ deep: true }, { deep: true },
); );

View File

@ -230,7 +230,7 @@ const showCountyCardsOnMap = (dataList) => {
// //
handleCenterCardItemClick(item); handleCenterCardItemClick(item);
// //
mapInstance.setView(center, 10); // mapInstance.setView(center, 10);
// //
emit("districtClick", { emit("districtClick", {
name: countyName, name: countyName,
@ -248,10 +248,10 @@ const showCountyCardsOnMap = (dataList) => {
}); });
// //
if (countyCardMarkers.length > 0) { // if (countyCardMarkers.length > 0) {
const group = new window.L.featureGroup(countyCardMarkers); // const group = new window.L.featureGroup(countyCardMarkers);
mapInstance.fitBounds(group.getBounds().pad(0.2)); // mapInstance.fitBounds(group.getBounds().pad(0.2));
} // }
}; };
// //
@ -312,13 +312,13 @@ const getTimeParams = (type) => {
let start = ""; let start = "";
let end = ""; let end = "";
if (props.dateRange && props.dateRange.length === 2) { if (props.dateRange && props.dateRange.length === 2) {
start = formatDateTime(props.dateRange[0]) || ""; start = formatDateTime(props.dateRange[0]) || "";
end = formatDateTime(props.dateRange[1]) || ""; end = formatDateTime(props.dateRange[1]) || "";
} }
// //
if(props.roadItem && type === "road"){ // if(props.roadItem && type === "road"){
// end = props.roadItem.endTime || ""; // // end = props.roadItem.endTime || "";
} // }
return { return {
start: start, start: start,
end: end, end: end,
@ -370,7 +370,7 @@ const getAffectedBridgeData = async () => {
method: "GET", method: "GET",
params: timeParams, params: timeParams,
}); });
if (res.code === "00000" && res.data) { if (res.data) {
res.data.forEach((item) => { res.data.forEach((item) => {
item.COORDINATE_POINT = [item.GL1_QLJD, item.GL1_QLWD]; item.COORDINATE_POINT = [item.GL1_QLJD, item.GL1_QLWD];
if ( if (
@ -382,8 +382,7 @@ const getAffectedBridgeData = async () => {
} }
}); });
} }
// affectedBridgeData.value = res.data; console.log("受影响桥梁数据:", affectedBridgeData.value);
addProjectMarkers(affectedBridgeData.value, bridgeIcon, "bridge"); addProjectMarkers(affectedBridgeData.value, bridgeIcon, "bridge");
} catch (error) { } catch (error) {
console.error("获取受影响桥梁数据失败:", error); console.error("获取受影响桥梁数据失败:", error);
@ -391,8 +390,6 @@ const getAffectedBridgeData = async () => {
} }
}; };
const affectedTunnelData = ref([]);
const tunnelInfoDialogRef = ref(null); const tunnelInfoDialogRef = ref(null);
// //
const getAffectedTunnelData = async () => { const getAffectedTunnelData = async () => {
@ -403,7 +400,6 @@ const getAffectedTunnelData = async () => {
method: "GET", method: "GET",
params: timeParams, params: timeParams,
}); });
console.log("受影响隧道数据:", res);
if (res.code === "00000" && res.data) { if (res.code === "00000" && res.data) {
res.data.forEach((item) => { res.data.forEach((item) => {
item.COORDINATE_POINT = [ item.COORDINATE_POINT = [
@ -414,9 +410,7 @@ const getAffectedTunnelData = async () => {
tunnelInfoDialogRef.value.push(item); tunnelInfoDialogRef.value.push(item);
} }
}); });
// tunnelInfoDialogRef.value = res.data; console.log("受影响隧道数据:", tunnelInfoDialogRef.value);
console.log("受影响隧道数据:", res.data);
addProjectMarkers(tunnelInfoDialogRef.value, tunnelIcon2, "tunnel"); addProjectMarkers(tunnelInfoDialogRef.value, tunnelIcon2, "tunnel");
} }
return []; return [];
@ -426,9 +420,8 @@ const getAffectedTunnelData = async () => {
} }
}; };
const affectedProjectData = ref([]);
// //
const affectedProjectData = ref([]);
const getAffectedProjectData = async () => { const getAffectedProjectData = async () => {
try { try {
const timeParams = getTimeParams(); const timeParams = getTimeParams();
@ -469,25 +462,24 @@ const getAffectedProjectData = async () => {
} }
}; };
const affectedRoadSectionData = ref([]);
// //
const affectedRoadSectionData = ref([]);
const getAffectedRoadSectionData = async () => { const getAffectedRoadSectionData = async () => {
try { try {
const timeParams = getTimeParams(road); const timeParams = getTimeParams();
const res = await request({ const res = await request({
url: "/snow-ops-platform/weather-warning/affected-object/road-section", url: "/snow-ops-platform/weather-warning/affected-object/road-section",
method: "GET", method: "GET",
params: timeParams, params: timeParams,
}); });
console.log("受影响路段数据:", res); console.log("受影响路段数据:", res);
if (res.code === "00000" && res.data) { if (res.data) {
res.data.forEach((item) => { res.data.forEach((item) => {
item.COORDINATE_POINT = JSON.parse(item.STARTPOINT); item.COORDINATE_POINT = JSON.parse(item.STARTPOINT);
}); });
affectedRoadSectionData.value = res.data; affectedRoadSectionData.value = res.data;
// //
console.log("开始添加项目标记..."); console.log("受影响路段数据:", affectedRoadSectionData.value);
addProjectMarkers(affectedRoadSectionData.value, tunnelLineIcon, "road"); addProjectMarkers(affectedRoadSectionData.value, tunnelLineIcon, "road");
} }
return []; return [];
@ -568,8 +560,8 @@ const addProjectMarkers = (data, iconUrl, type = "project") => {
return; return;
} }
// // //
// clearProjectMarkers(); clearProjectMarkers();
// //
const projectIconObj = window.L.icon({ const projectIconObj = window.L.icon({
@ -1171,7 +1163,7 @@ const locateToDistrict = (countyName) => {
const center = bounds.getCenter(); const center = bounds.getCenter();
// //
mapInstance.setView(center, 10); // mapInstance.setView(center, 10);
// //
if (selectedLayer) { if (selectedLayer) {

View File

@ -35,6 +35,7 @@
<div class="left"> <div class="left">
<left <left
:dateRange="getdateRange" :dateRange="getdateRange"
@warningClick="handleWarningClick"
@openImpactDetail="openDialog('impactPoint')" @openImpactDetail="openDialog('impactPoint')"
@openWarningInfo="openDialog('warningInfo')" @openWarningInfo="openDialog('warningInfo')"
@openImpactPoint="openDialog('impactPoint')" @openImpactPoint="openDialog('impactPoint')"
@ -212,6 +213,7 @@
<!-- 预警情况对话框 --> <!-- 预警情况对话框 -->
<warningSituationDialog <warningSituationDialog
v-model:visible="dialogVisible.warningSituation" v-model:visible="dialogVisible.warningSituation"
:warningitem="warningitem"
@close="closeDialog('warningSituation')" @close="closeDialog('warningSituation')"
@impactClick="openDialog('impactPoint')" @impactClick="openDialog('impactPoint')"
@impactClickItem="handleImpactClickItem" @impactClickItem="handleImpactClickItem"
@ -356,6 +358,12 @@ const closeDialog = (dialogName) => {
console.log("关闭弹窗", dialogName); console.log("关闭弹窗", dialogName);
dialogVisible.value[dialogName] = false; dialogVisible.value[dialogName] = false;
}; };
//
const warningitem = ref({});
const handleWarningClick = (item) => {
console.log("气象预警点击:", item);
warningitem.value = item;
};
// //
const confirmConfig = ref({ const confirmConfig = ref({

View File

@ -229,6 +229,7 @@ const emit = defineEmits([
"openDispatchDistrict", "openDispatchDistrict",
"openImpactDetail", "openImpactDetail",
"showCenterCard", "showCenterCard",
"warningClick",
]); ]);
// //
@ -244,7 +245,10 @@ const handleStatClick = (item) => {
// //
const handleWarningCardClick = (item) => { const handleWarningCardClick = (item) => {
console.log("item:", item);
emit("openWarningSituation", item); emit("openWarningSituation", item);
//
emit("warningClick", item);
}; };
// //