2026-03-27 17:47:09 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="main">
|
2026-03-30 10:57:32 +08:00
|
|
|
|
<div class="top_title">
|
|
|
|
|
|
<img
|
|
|
|
|
|
class="title_bg"
|
|
|
|
|
|
src="../../assets/RiskWarning_img/一级标题栏bg@2x.png"
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
/>
|
|
|
|
|
|
<div class="title_img_box">
|
2026-04-02 16:35:45 +08:00
|
|
|
|
<img
|
|
|
|
|
|
class="title_img1"
|
|
|
|
|
|
src="../../assets/RiskWarning_img/位图@2x.png"
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
<img
|
|
|
|
|
|
class="title_img2"
|
|
|
|
|
|
src="../../assets/RiskWarning_img/渝路畅行-风险预警一键响应@2x.png"
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
<!-- 四个角的装饰 -->
|
|
|
|
|
|
<div class="corner corner-top-left"></div>
|
|
|
|
|
|
<div class="corner corner-top-right"></div>
|
|
|
|
|
|
<div class="corner corner-bottom-left"></div>
|
|
|
|
|
|
<div class="corner corner-bottom-right"></div>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
<!-- 中心数据展示卡片 -->
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<centerInfoCard
|
|
|
|
|
|
:type="showCenterCard.type"
|
|
|
|
|
|
:peopleCount="showCenterCard.value"
|
|
|
|
|
|
roadCount="117"
|
|
|
|
|
|
@click="handleCenterCardClick"
|
|
|
|
|
|
/>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
|
|
|
|
|
|
<div class="left">
|
2026-03-30 10:57:32 +08:00
|
|
|
|
<left
|
2026-04-15 16:40:35 +08:00
|
|
|
|
:dateRange="getdateRange"
|
2026-03-30 15:36:12 +08:00
|
|
|
|
@openImpactDetail="openDialog('impactPoint')"
|
2026-03-30 10:57:32 +08:00
|
|
|
|
@openWarningInfo="openDialog('warningInfo')"
|
|
|
|
|
|
@openImpactPoint="openDialog('impactPoint')"
|
2026-03-31 18:10:34 +08:00
|
|
|
|
@openAIResult="openDialog('aiWarningResult')"
|
2026-03-30 10:57:32 +08:00
|
|
|
|
@openWarningSituation="openDialog('warningSituation')"
|
|
|
|
|
|
@openResponseStatus="openDialog('responseStatus')"
|
|
|
|
|
|
@openDispatchDistrict="openDialog('dispatchDistrict')"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
@showCenterCard="(item) => handleCenterCardClick(item)"
|
2026-03-30 10:57:32 +08:00
|
|
|
|
></left>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
<div class="right">
|
2026-03-30 10:57:32 +08:00
|
|
|
|
<right
|
2026-04-15 16:40:35 +08:00
|
|
|
|
:dateRange="getdateRange"
|
2026-04-08 18:47:57 +08:00
|
|
|
|
@openResourceDetail="openResourceDetail"
|
2026-03-30 10:57:32 +08:00
|
|
|
|
@openClearanceSituation="openDialog('clearanceSituation')"
|
|
|
|
|
|
@openControlSituation="openDialog('controlSituation')"
|
|
|
|
|
|
></right>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
<!-- 地图中心 -->
|
|
|
|
|
|
<div class="center">
|
2026-03-30 15:36:12 +08:00
|
|
|
|
<!-- 地图底层 -->
|
|
|
|
|
|
<div class="map-layer">
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<ChongqingMap
|
|
|
|
|
|
ref="chongqingMapRef"
|
2026-04-15 16:40:35 +08:00
|
|
|
|
:activeitem="activeitem"
|
|
|
|
|
|
:dateRange="getdateRange"
|
|
|
|
|
|
:roadItem="roadItem"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
@districtClick="handleDistrictClick"
|
|
|
|
|
|
/>
|
2026-03-30 15:36:12 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 地图遮罩层 -->
|
|
|
|
|
|
<div class="map-mask" aria-hidden="true"></div>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
<div class="bottom">
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<bottom
|
2026-04-15 16:40:35 +08:00
|
|
|
|
@roadItemClick="roadItemClick"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
@changeActiveIndex="changeActiveIndex"
|
|
|
|
|
|
@clearMapMarkers="clearMapMarkers"
|
|
|
|
|
|
></bottom>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</div>
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<top
|
|
|
|
|
|
class="top"
|
|
|
|
|
|
@openAIResult="openDialog('aiWarningResult')"
|
|
|
|
|
|
@dateRangeChange="handleDateRangeChange"
|
|
|
|
|
|
></top>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<!-- 农村公路对话框 -->
|
|
|
|
|
|
<responseSituationDiaLog
|
|
|
|
|
|
v-model:visible="dialogVisible.responseSituation"
|
2026-04-14 09:55:12 +08:00
|
|
|
|
:allCountyData="allCountyData"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
@close="closeDialog('responseSituation')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 预警信息对话框 -->
|
|
|
|
|
|
<warningInfoDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.warningInfo"
|
|
|
|
|
|
@close="closeDialog('warningInfo')"
|
|
|
|
|
|
@responseStatus="openDialog('responseStatus')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 事件详情对话框 -->
|
|
|
|
|
|
<eventDetailDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.eventDetail"
|
|
|
|
|
|
@close="closeDialog('eventDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 确认对话框 -->
|
|
|
|
|
|
<confirmDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.confirm"
|
|
|
|
|
|
:title="confirmConfig.title"
|
|
|
|
|
|
:message="confirmConfig.message"
|
|
|
|
|
|
:confirm-text="confirmConfig.confirmText"
|
|
|
|
|
|
:cancel-text="confirmConfig.cancelText"
|
|
|
|
|
|
@confirm="closeDialog('confirm')"
|
|
|
|
|
|
@cancel="closeDialog('confirm')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 风险点详情对话框 -->
|
|
|
|
|
|
<riskPointDetailDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.riskPointDetail"
|
|
|
|
|
|
@close="closeDialog('riskPointDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 影响点情况对话框 -->
|
|
|
|
|
|
<impactPointDialog
|
2026-04-15 16:40:35 +08:00
|
|
|
|
:handleImpactItem="handleImpactItem"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
v-model:visible="dialogVisible.impactPoint"
|
|
|
|
|
|
@close="closeDialog('impactPoint')"
|
|
|
|
|
|
@detail="openDialog('impactPointDetail')"
|
2026-04-15 16:40:35 +08:00
|
|
|
|
@itemClick="handleImpactPointClick"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 影响点详情对话框 -->
|
|
|
|
|
|
<impactPointDetailDialog
|
2026-04-15 16:40:35 +08:00
|
|
|
|
:item="impactPointDetailItem"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
v-model:visible="dialogVisible.impactPointDetail"
|
|
|
|
|
|
@close="closeDialog('impactPointDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 响应点详情对话框 -->
|
|
|
|
|
|
<responsePointDetailDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.responsePointDetail"
|
|
|
|
|
|
@close="closeDialog('responsePointDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 响应点信息对话框 -->
|
|
|
|
|
|
<responsePointInfoDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.responsePointInfo"
|
|
|
|
|
|
@close="closeDialog('responsePointInfo')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 响应状态对话框 -->
|
|
|
|
|
|
<responseStatusDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.responseStatus"
|
|
|
|
|
|
@close="closeDialog('responseStatus')"
|
2026-04-15 16:40:35 +08:00
|
|
|
|
@detail="openDialog('responsePointDetail')"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- AI预警处理结果对话框 -->
|
|
|
|
|
|
<aiWarningResultDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.aiWarningResult"
|
|
|
|
|
|
@close="closeDialog('aiWarningResult')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 潼南基本信息对话框 -->
|
|
|
|
|
|
<tongnanInfoDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.tongnanInfo"
|
|
|
|
|
|
@close="closeDialog('tongnanInfo')"
|
|
|
|
|
|
@call="openDialog('confirm')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 项目对话框 -->
|
|
|
|
|
|
<tongnanResponsibleDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.tongnanResponsible"
|
2026-04-14 09:55:12 +08:00
|
|
|
|
:allCountyData="allCountyData"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
@close="closeDialog('tongnanResponsible')"
|
|
|
|
|
|
@detail="openDialog('tongnanInfo')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 抢通情况对话框 -->
|
|
|
|
|
|
<clearanceSituationDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.clearanceSituation"
|
|
|
|
|
|
@close="closeDialog('clearanceSituation')"
|
|
|
|
|
|
@detail="openDialog('eventDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 管控情况对话框 -->
|
|
|
|
|
|
<controlSituationDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.controlSituation"
|
|
|
|
|
|
@close="closeDialog('controlSituation')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 调度详情对话框 -->
|
|
|
|
|
|
<dispatchDetailDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.dispatchDetail"
|
|
|
|
|
|
@close="closeDialog('dispatchDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 调度区县情况对话框 -->
|
|
|
|
|
|
<dispatchDistrictDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.dispatchDistrict"
|
|
|
|
|
|
@close="closeDialog('dispatchDistrict')"
|
|
|
|
|
|
@dispatchClick="openDialog('dispatchDetail')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 国省道对话框 -->
|
|
|
|
|
|
<tongnanTeamDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.tongnanTeam"
|
2026-04-14 09:55:12 +08:00
|
|
|
|
:allCountyData="allCountyData"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
@close="closeDialog('tongnanTeam')"
|
|
|
|
|
|
@view="openDialog('tongnanInfo')"
|
|
|
|
|
|
/>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 预警情况对话框 -->
|
|
|
|
|
|
<warningSituationDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.warningSituation"
|
|
|
|
|
|
@close="closeDialog('warningSituation')"
|
|
|
|
|
|
@impactClick="openDialog('impactPoint')"
|
2026-04-15 16:40:35 +08:00
|
|
|
|
@impactClickItem="handleImpactClickItem"
|
2026-04-13 11:38:11 +08:00
|
|
|
|
/>
|
2026-03-31 18:10:34 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
<!-- 隧道信息对话框 -->
|
|
|
|
|
|
<tunnelInfoDialog
|
|
|
|
|
|
v-model:visible="dialogVisible.tunnelInfo"
|
|
|
|
|
|
@close="closeDialog('tunnelInfo')"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup>
|
2026-04-03 18:08:42 +08:00
|
|
|
|
import { ref, onMounted, provide } from "vue";
|
2026-04-02 16:35:45 +08:00
|
|
|
|
import useMapStore from "@/map/stores/mapStore";
|
|
|
|
|
|
import { useMapBase } from "../cockpit/composables/useMapBase";
|
2026-03-27 17:47:09 +08:00
|
|
|
|
import left from "./left.vue";
|
|
|
|
|
|
import right from "./right.vue";
|
|
|
|
|
|
import bottom from "./bottom.vue";
|
|
|
|
|
|
import top from "./top.vue";
|
2026-03-31 18:10:34 +08:00
|
|
|
|
import ChongqingMap from "./component/ChongqingMap.vue";
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
|
|
|
|
|
// 引入所有弹窗组件
|
2026-04-03 18:08:42 +08:00
|
|
|
|
import responseSituationDiaLog from "./Dialog/responseSituationDiaLog.vue";
|
|
|
|
|
|
import warningInfoDialog from "./Dialog/warningInfoDialog.vue";
|
|
|
|
|
|
import eventDetailDialog from "./Dialog/eventDetailDialog.vue";
|
|
|
|
|
|
import confirmDialog from "./Dialog/confirmDialog.vue";
|
|
|
|
|
|
import riskPointDetailDialog from "./Dialog/riskPointDetailDialog.vue";
|
|
|
|
|
|
import impactPointDialog from "./Dialog/impactPointDialog.vue";
|
|
|
|
|
|
import impactPointDetailDialog from "./Dialog/impactPointDetailDialog.vue";
|
|
|
|
|
|
import responsePointDetailDialog from "./Dialog/responsePointDetailDialog.vue";
|
|
|
|
|
|
import responsePointInfoDialog from "./Dialog/responsePointInfoDialog.vue";
|
|
|
|
|
|
import responseStatusDialog from "./Dialog/responseStatusDialog.vue";
|
|
|
|
|
|
import aiWarningResultDialog from "./Dialog/aiWarningResultDialog.vue";
|
|
|
|
|
|
import tongnanInfoDialog from "./Dialog/tongnanInfoDialog.vue";
|
|
|
|
|
|
import tongnanResponsibleDialog from "./Dialog/tongnanResponsibleDialog.vue";
|
|
|
|
|
|
import clearanceSituationDialog from "./Dialog/clearanceSituationDialog.vue";
|
|
|
|
|
|
import controlSituationDialog from "./Dialog/controlSituationDialog.vue";
|
|
|
|
|
|
import dispatchDetailDialog from "./Dialog/dispatchDetailDialog.vue";
|
|
|
|
|
|
import dispatchDistrictDialog from "./Dialog/dispatchDistrictDialog.vue";
|
|
|
|
|
|
import tongnanTeamDialog from "./Dialog/tongnanTeamDialog.vue";
|
|
|
|
|
|
import warningSituationDialog from "./Dialog/warningSituationDialog.vue";
|
|
|
|
|
|
import tunnelInfoDialog from "./Dialog/tunnelInfoDialog.vue";
|
2026-04-13 11:38:11 +08:00
|
|
|
|
import centerInfoCard from "./Dialog/centerInfoCard.vue";
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-13 11:38:11 +08:00
|
|
|
|
import "./component/el-select.scss";
|
|
|
|
|
|
import "./component/date-picker-theme.scss";
|
2026-04-08 15:34:49 +08:00
|
|
|
|
|
2026-03-30 10:57:32 +08:00
|
|
|
|
// 弹窗显示状态
|
|
|
|
|
|
const dialogVisible = ref({
|
|
|
|
|
|
responseSituation: false,
|
|
|
|
|
|
warningInfo: false,
|
|
|
|
|
|
eventDetail: false,
|
|
|
|
|
|
confirm: false,
|
|
|
|
|
|
riskPointDetail: false,
|
|
|
|
|
|
impactPoint: false,
|
|
|
|
|
|
impactPointDetail: false,
|
|
|
|
|
|
responsePointDetail: false,
|
|
|
|
|
|
responsePointInfo: false,
|
|
|
|
|
|
responseStatus: false,
|
|
|
|
|
|
aiWarningResult: false,
|
|
|
|
|
|
tongnanInfo: false,
|
|
|
|
|
|
tongnanResponsible: false,
|
|
|
|
|
|
clearanceSituation: false,
|
|
|
|
|
|
controlSituation: false,
|
|
|
|
|
|
dispatchDetail: false,
|
|
|
|
|
|
dispatchDistrict: false,
|
|
|
|
|
|
tongnanTeam: false,
|
2026-04-13 11:38:11 +08:00
|
|
|
|
warningSituation: false,
|
|
|
|
|
|
tunnelInfo: false,
|
2026-03-30 10:57:32 +08:00
|
|
|
|
});
|
2026-04-15 16:40:35 +08:00
|
|
|
|
const activeitem = ref({});
|
2026-04-08 18:47:57 +08:00
|
|
|
|
|
2026-04-09 14:53:44 +08:00
|
|
|
|
// 日期范围
|
2026-04-15 16:40:35 +08:00
|
|
|
|
const getdateRange = ref([]);
|
2026-04-09 14:53:44 +08:00
|
|
|
|
|
|
|
|
|
|
// 处理日期范围变化
|
|
|
|
|
|
const handleDateRangeChange = (val) => {
|
|
|
|
|
|
console.log("日期范围变化:", val);
|
2026-04-15 16:40:35 +08:00
|
|
|
|
getdateRange.value = val;
|
2026-04-09 14:53:44 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-04-08 18:47:57 +08:00
|
|
|
|
// 地图组件引用
|
|
|
|
|
|
const chongqingMapRef = ref(null);
|
|
|
|
|
|
|
|
|
|
|
|
// 切换导航项时触发
|
|
|
|
|
|
const changeActiveIndex = (index) => {
|
2026-04-15 16:40:35 +08:00
|
|
|
|
activeitem.value = index;
|
|
|
|
|
|
};
|
|
|
|
|
|
const roadItem = ref({});
|
|
|
|
|
|
const roadItemClick = (item) => {
|
|
|
|
|
|
console.log("点击路段:", item);
|
|
|
|
|
|
roadItem.value = item;
|
2026-04-08 18:47:57 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 打开资源详情(队伍、人员、装备、物资)
|
|
|
|
|
|
const openResourceDetail = (item) => {
|
|
|
|
|
|
console.log("打开资源详情:", item);
|
|
|
|
|
|
// 判断是否为队伍或人员
|
|
|
|
|
|
if (item.label === "全市普通公路抢险队伍" || item.label === "人员") {
|
|
|
|
|
|
// 调用地图组件的获取应急力量方法
|
|
|
|
|
|
if (chongqingMapRef.value) {
|
|
|
|
|
|
chongqingMapRef.value.getEmergencyForceData();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 打开对应的弹窗
|
|
|
|
|
|
const key = item.label.toLowerCase().replace(/[^a-z]/g, "");
|
|
|
|
|
|
if (dialogVisible.value[key] !== undefined) {
|
|
|
|
|
|
dialogVisible.value[key] = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 清除地图标记
|
|
|
|
|
|
const clearMapMarkers = () => {
|
|
|
|
|
|
console.log("清除地图标记");
|
|
|
|
|
|
if (chongqingMapRef.value) {
|
|
|
|
|
|
chongqingMapRef.value.clearProjectMarkers();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
|
|
|
|
|
// 打开弹窗
|
|
|
|
|
|
const openDialog = (dialogName) => {
|
|
|
|
|
|
dialogVisible.value[dialogName] = true;
|
|
|
|
|
|
};
|
2026-04-15 16:40:35 +08:00
|
|
|
|
const impactPointDetailItem = ref({});
|
|
|
|
|
|
// 处理影响点点击
|
|
|
|
|
|
const handleImpactPointClick = (item) => {
|
|
|
|
|
|
console.log("影响点点击:", item);
|
|
|
|
|
|
impactPointDetailItem.value = item;
|
|
|
|
|
|
};
|
|
|
|
|
|
const handleImpactItem = ref({});
|
|
|
|
|
|
const handleImpactClickItem = (item) => {
|
|
|
|
|
|
console.log("影响点点击详情:", item);
|
|
|
|
|
|
handleImpactItem.value = item;
|
|
|
|
|
|
};
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
|
|
|
|
|
// 关闭弹窗
|
|
|
|
|
|
const closeDialog = (dialogName) => {
|
2026-03-31 18:10:34 +08:00
|
|
|
|
// 关闭弹窗时,重置弹窗数据
|
2026-04-02 16:35:45 +08:00
|
|
|
|
console.log("关闭弹窗", dialogName);
|
2026-03-30 10:57:32 +08:00
|
|
|
|
dialogVisible.value[dialogName] = false;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 确认对话框配置
|
|
|
|
|
|
const confirmConfig = ref({
|
|
|
|
|
|
title: "提示",
|
|
|
|
|
|
message: "是否拨打电话?",
|
|
|
|
|
|
confirmText: "确定",
|
|
|
|
|
|
cancelText: "取消",
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 打开确认对话框
|
|
|
|
|
|
const openConfirm = (config) => {
|
|
|
|
|
|
confirmConfig.value = { ...confirmConfig.value, ...config };
|
|
|
|
|
|
dialogVisible.value.confirm = true;
|
|
|
|
|
|
};
|
|
|
|
|
|
// 中心信息卡片显示状态
|
|
|
|
|
|
const showCenterCard = ref(false);
|
2026-04-14 09:55:12 +08:00
|
|
|
|
const allCountyData = ref({});
|
2026-04-13 11:38:11 +08:00
|
|
|
|
// 处理区县点击
|
|
|
|
|
|
const handleDistrictClick = (item) => {
|
2026-04-14 09:55:12 +08:00
|
|
|
|
console.log("区县点击:", item);
|
|
|
|
|
|
allCountyData.value = item;
|
2026-04-13 11:38:11 +08:00
|
|
|
|
if (item.data.roadType == "national") {
|
|
|
|
|
|
// 国省道
|
|
|
|
|
|
openDialog("tongnanTeam");
|
|
|
|
|
|
} else if (item.data.roadType == "rural") {
|
|
|
|
|
|
openDialog("responseSituation");
|
|
|
|
|
|
} else if (item.data.type == "project" && item.data.roadType == "-") {
|
|
|
|
|
|
// 项目
|
|
|
|
|
|
openDialog("tongnanResponsible");
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 处理中心卡片点击
|
|
|
|
|
|
const handleCenterCardClick = (item) => {
|
|
|
|
|
|
console.log("中心卡片点击:", item);
|
|
|
|
|
|
|
|
|
|
|
|
// 调用地图组件的方法打开中心信息卡片弹窗
|
|
|
|
|
|
if (chongqingMapRef.value && item.data) {
|
|
|
|
|
|
const cardData = {
|
|
|
|
|
|
title: getCardTitleByType(item.type),
|
|
|
|
|
|
dataList: item.data,
|
|
|
|
|
|
};
|
|
|
|
|
|
chongqingMapRef.value.openCenterCard(cardData);
|
|
|
|
|
|
|
|
|
|
|
|
// 如果数据中包含区县信息,定位到第一个区县
|
|
|
|
|
|
if (
|
|
|
|
|
|
item.data.length > 0 &&
|
|
|
|
|
|
(item.data[0].countyName || item.data[0].name)
|
|
|
|
|
|
) {
|
|
|
|
|
|
const firstCounty = item.data[0].countyName || item.data[0].name;
|
|
|
|
|
|
chongqingMapRef.value.locateToDistrict(firstCounty);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 根据类型获取卡片标题
|
|
|
|
|
|
const getCardTitleByType = (type) => {
|
|
|
|
|
|
const titleMap = {
|
|
|
|
|
|
first: "国省道调度",
|
|
|
|
|
|
second: "农村公路调度",
|
|
|
|
|
|
third: "建设工程调度",
|
|
|
|
|
|
};
|
|
|
|
|
|
return titleMap[type] || "调度统计";
|
|
|
|
|
|
};
|
|
|
|
|
|
const handleCenterCardClickType = (item) => {
|
|
|
|
|
|
console.log(item.data);
|
|
|
|
|
|
showCenterCard.value = true;
|
|
|
|
|
|
// if (item.type === "second") {
|
|
|
|
|
|
// openDialog("tongnanTeam");
|
|
|
|
|
|
// } else if (item.type === "third") {
|
|
|
|
|
|
// openDialog("responseSituation");
|
|
|
|
|
|
// } else if (item.type === "first") {
|
|
|
|
|
|
// openDialog("warningSituation");
|
|
|
|
|
|
// }
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-04-03 18:08:42 +08:00
|
|
|
|
// 兄弟组件通信机制
|
|
|
|
|
|
const refreshLeftData = ref(null);
|
2026-04-13 16:38:07 +08:00
|
|
|
|
const refreshRightData = ref(null);
|
2026-04-03 18:08:42 +08:00
|
|
|
|
|
|
|
|
|
|
// 提供刷新函数给子组件
|
|
|
|
|
|
const setRefreshLeftData = (callback) => {
|
|
|
|
|
|
refreshLeftData.value = callback;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-04-13 16:38:07 +08:00
|
|
|
|
// 提供刷新函数给 right.vue
|
|
|
|
|
|
const setRefreshRightData = (callback) => {
|
|
|
|
|
|
refreshRightData.value = callback;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-04-03 18:08:42 +08:00
|
|
|
|
// 触发刷新函数
|
|
|
|
|
|
const triggerRefreshLeftData = () => {
|
|
|
|
|
|
if (refreshLeftData.value) {
|
|
|
|
|
|
refreshLeftData.value();
|
|
|
|
|
|
}
|
2026-04-13 16:38:07 +08:00
|
|
|
|
// 同时触发 right.vue 刷新
|
|
|
|
|
|
if (refreshRightData.value) {
|
|
|
|
|
|
refreshRightData.value();
|
|
|
|
|
|
}
|
2026-04-03 18:08:42 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 提供通信机制给子组件
|
2026-04-13 11:38:11 +08:00
|
|
|
|
provide("setRefreshLeftData", setRefreshLeftData);
|
|
|
|
|
|
provide("triggerRefreshLeftData", triggerRefreshLeftData);
|
2026-04-15 16:40:35 +08:00
|
|
|
|
provide("setRefreshRightData", setRefreshRightData);
|
|
|
|
|
|
provide("getdateRange", getdateRange);
|
2026-04-03 18:08:42 +08:00
|
|
|
|
|
2026-03-30 15:36:12 +08:00
|
|
|
|
// ==================== 地图状态管理 ====================
|
|
|
|
|
|
|
2026-04-02 16:35:45 +08:00
|
|
|
|
const mapStore = useMapStore();
|
2026-03-30 15:36:12 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 加载地图的业务底图与聚焦中心点
|
|
|
|
|
|
*/
|
2026-04-02 16:35:45 +08:00
|
|
|
|
const mapBase = useMapBase(mapStore);
|
2026-03-30 15:36:12 +08:00
|
|
|
|
|
|
|
|
|
|
// ==================== 生命周期 ====================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 组件挂载后初始化地图
|
|
|
|
|
|
*/
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
|
// 加载地图业务底图 并 聚焦中心点
|
2026-04-02 16:35:45 +08:00
|
|
|
|
mapBase.loadBaseData();
|
|
|
|
|
|
});
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
2026-03-30 10:57:32 +08:00
|
|
|
|
// 视频屏幕自适应 - 基于视口宽度动态调整
|
|
|
|
|
|
// 基准宽度 1920px,使用 vw 单位实现自适应
|
|
|
|
|
|
@function vw($px) {
|
|
|
|
|
|
@return calc($px / 1920 * 100vw);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-27 17:47:09 +08:00
|
|
|
|
.main {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
background-image: url("../../assets/RiskWarning_img/遮罩层.png");
|
|
|
|
|
|
background-size: cover;
|
|
|
|
|
|
background-position: center;
|
|
|
|
|
|
}
|
2026-03-30 10:57:32 +08:00
|
|
|
|
.top_title {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: vw(100);
|
|
|
|
|
|
z-index: 100;
|
|
|
|
|
|
|
|
|
|
|
|
.title_bg {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.title_img_box {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
top: 50%;
|
|
|
|
|
|
left: 50%;
|
|
|
|
|
|
transform: translate(-50%, -50%);
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
gap: vw(10);
|
|
|
|
|
|
}
|
2026-03-27 17:47:09 +08:00
|
|
|
|
|
2026-03-30 10:57:32 +08:00
|
|
|
|
.title_img1 {
|
|
|
|
|
|
width: vw(40);
|
|
|
|
|
|
height: vw(40);
|
|
|
|
|
|
min-width: 28px;
|
|
|
|
|
|
min-height: 28px;
|
2026-03-31 18:10:34 +08:00
|
|
|
|
object-fit: contain;
|
2026-03-30 10:57:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.title_img2 {
|
|
|
|
|
|
height: vw(40);
|
2026-04-03 18:08:42 +08:00
|
|
|
|
min-height: 40px;
|
2026-03-31 18:10:34 +08:00
|
|
|
|
width: auto;
|
2026-04-03 18:08:42 +08:00
|
|
|
|
width: vw(550);
|
2026-03-31 18:10:34 +08:00
|
|
|
|
object-fit: contain;
|
2026-03-30 10:57:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-27 17:47:09 +08:00
|
|
|
|
.left {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
left: 0;
|
2026-04-03 18:08:42 +08:00
|
|
|
|
top: vw(60);
|
2026-03-30 10:57:32 +08:00
|
|
|
|
width: 25%;
|
2026-04-03 18:08:42 +08:00
|
|
|
|
height: calc(100% - #{vw(60)});
|
2026-04-13 11:38:11 +08:00
|
|
|
|
z-index: 3;
|
2026-03-27 17:47:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.right {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
right: 0;
|
2026-04-03 18:08:42 +08:00
|
|
|
|
top: vw(60);
|
2026-03-30 10:57:32 +08:00
|
|
|
|
width: 25%;
|
2026-04-03 18:08:42 +08:00
|
|
|
|
height: calc(100% - #{vw(60)});
|
2026-04-13 11:38:11 +08:00
|
|
|
|
z-index: 3;
|
2026-03-27 17:47:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.bottom {
|
|
|
|
|
|
position: absolute;
|
2026-04-02 16:35:45 +08:00
|
|
|
|
bottom: 5px;
|
|
|
|
|
|
left: 25%;
|
|
|
|
|
|
width: 50%;
|
|
|
|
|
|
height: 43%;
|
2026-03-27 17:47:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.top {
|
|
|
|
|
|
position: absolute;
|
2026-04-02 16:35:45 +08:00
|
|
|
|
top: vw(100);
|
|
|
|
|
|
left: 25%;
|
|
|
|
|
|
width: 50%;
|
2026-04-13 11:38:11 +08:00
|
|
|
|
z-index: 4;
|
2026-03-30 10:57:32 +08:00
|
|
|
|
// height: 15%;
|
2026-03-27 17:47:09 +08:00
|
|
|
|
// background-color: #15293B;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.center {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
// left: 25%;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
2026-04-13 11:38:11 +08:00
|
|
|
|
z-index: 2;
|
2026-03-27 17:47:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-30 15:36:12 +08:00
|
|
|
|
/* 地图底层 - 填满整个容器 */
|
|
|
|
|
|
.map-layer {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
inset: 0;
|
|
|
|
|
|
z-index: 0;
|
|
|
|
|
|
/* 不设置 pointer-events,让地图保持可交互 */
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 地图遮罩层 - 覆盖在地图之上 */
|
|
|
|
|
|
.map-mask {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
inset: 0;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
|
/* 不阻挡交互 */
|
2026-04-02 16:35:45 +08:00
|
|
|
|
background: url(../../assets/RiskWarning_img/遮罩层.png) no-repeat
|
|
|
|
|
|
center/cover;
|
2026-03-30 15:36:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-27 17:47:09 +08:00
|
|
|
|
// 四个角的装饰
|
|
|
|
|
|
.corner {
|
|
|
|
|
|
position: absolute;
|
2026-04-02 16:35:45 +08:00
|
|
|
|
width: vw(20);
|
|
|
|
|
|
height: vw(20);
|
|
|
|
|
|
border: 1px solid #40a9ff;
|
2026-03-27 17:47:09 +08:00
|
|
|
|
z-index: 100;
|
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
|
|
|
|
|
|
|
&.corner-top-left {
|
2026-04-03 18:08:42 +08:00
|
|
|
|
top: vw(60);
|
2026-03-30 10:57:32 +08:00
|
|
|
|
left: vw(10);
|
2026-03-27 17:47:09 +08:00
|
|
|
|
border-right: none;
|
|
|
|
|
|
border-bottom: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
&.corner-top-right {
|
2026-04-03 18:08:42 +08:00
|
|
|
|
top: vw(60);
|
2026-03-30 10:57:32 +08:00
|
|
|
|
right: vw(10);
|
2026-03-27 17:47:09 +08:00
|
|
|
|
border-left: none;
|
|
|
|
|
|
border-bottom: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
&.corner-bottom-left {
|
2026-03-30 10:57:32 +08:00
|
|
|
|
bottom: vw(10);
|
|
|
|
|
|
left: vw(10);
|
2026-03-27 17:47:09 +08:00
|
|
|
|
border-right: none;
|
|
|
|
|
|
border-top: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
&.corner-bottom-right {
|
2026-03-30 10:57:32 +08:00
|
|
|
|
bottom: 0;
|
|
|
|
|
|
right: vw(10);
|
2026-03-27 17:47:09 +08:00
|
|
|
|
border-left: none;
|
|
|
|
|
|
border-top: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-30 10:57:32 +08:00
|
|
|
|
|
2026-04-08 15:34:49 +08:00
|
|
|
|
// 下拉选项浮窗
|
|
|
|
|
|
.el-popper {
|
|
|
|
|
|
// 下拉选项
|
|
|
|
|
|
.el-select-dropdown {
|
|
|
|
|
|
background: #122c46;
|
|
|
|
|
|
.el-select-dropdown__item {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
background-color: #122c46;
|
|
|
|
|
|
text-stroke: 0px #3a6fbf;
|
|
|
|
|
|
-webkit-text-stroke: 0px #3a6fbf;
|
|
|
|
|
|
height: 40px;
|
|
|
|
|
|
|
|
|
|
|
|
&.is-hovering {
|
|
|
|
|
|
background: #0f2e6d;
|
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
|
color: #7bc8ef;
|
|
|
|
|
|
text-stroke: 0px #7bc8ef;
|
|
|
|
|
|
font-style: normal;
|
|
|
|
|
|
text-transform: none;
|
|
|
|
|
|
-webkit-text-stroke: 0px #7bc8ef;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-27 17:47:09 +08:00
|
|
|
|
</style>
|