| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted } from "vue"; |
| | | import { deviceDictList, getDictName } from "@/constant/dict.js"; |
| | | import { ref, onMounted, watch, onBeforeUnmount } from "vue"; |
| | | import { createPoint, removeEntities } from "@/utils/map"; |
| | | import { useSimStore } from "@/store/simulation"; |
| | | import { initeWaterPrimitiveView } from "@/utils/water"; //相机flyTo函数,后续options列表中有对应经纬度后弃用 |
| | | import { useRoute, onBeforeRouteUpdate } from 'vue-router'; |
| | | const simStore = useSimStore(); |
| | | onBeforeRouteUpdate((to, from, next) => { |
| | | if (to.path !== '/yhgl') { |
| | | handleCleanup(); |
| | | } |
| | | next(); |
| | | }); |
| | | const route = useRoute(); |
| | | |
| | | // 定义一个响应式引用存储设备列表 |
| | | const deviceListAll = ref([]); |
| | | |
| | | // 当前选中的区域 |
| | | onBeforeUnmount(() => { |
| | | if (route.path !== '/yhgl') { |
| | | handleCleanup(); |
| | | } |
| | | }); |
| | | const selectValue = ref("孙胡沟"); |
| | | |
| | | // 区域选项 |
| | | const options = ref([ |
| | | { value: "孙胡沟", label: "孙胡沟" }, |
| | | { value: "鱼水洞后沟", label: "鱼水洞后沟" }, |
| | | // 其他选项... |
| | | { |
| | | value: "孙胡沟", |
| | | label: "孙胡沟", |
| | | }, |
| | | { |
| | | value: "鱼水洞后沟", |
| | | label: "鱼水洞后沟", |
| | | }, |
| | | { |
| | | value: "于家西沟", |
| | | label: "于家西沟", |
| | | }, |
| | | { |
| | | value: "北河沟", |
| | | label: "北河沟", |
| | | }, |
| | | { |
| | | value: "龙泉峪村", |
| | | label: "龙泉峪村", |
| | | }, |
| | | ]); |
| | | |
| | | // 树形结构属性配置 |
| | | const treeProps = { |
| | | label: "deviceName", |
| | | children: "children", |
| | | const districtList = ref([]); |
| | | const loading = ref(true); // 控制加载状态 |
| | | |
| | | function handleClick(district) { |
| | | const entity = viewer.entities.getById(district.hdId); |
| | | if (entity) { |
| | | viewer.flyTo(entity, { |
| | | offset: { |
| | | heading: Cesium.Math.toRadians(0), |
| | | pitch: Cesium.Math.toRadians(-45), |
| | | range: 4000, |
| | | }, |
| | | }); |
| | | } |
| | | } |
| | | const handleCleanup = async () => { |
| | | await Promise.all(districtList.value.map(item => removeEntities(item.hdId))); |
| | | } |
| | | const initializeDevicePoints = async () => { |
| | | await Promise.all(districtList.value.map(async (item, index) => { |
| | | // 根据需求可增删 |
| | | item.id = item.hdId; |
| | | item.name = item.hdName; |
| | | item.latitude = item.lat; |
| | | item.longitude = item.lon; |
| | | item.showBillboard = true; |
| | | item.type = item.disasterType; |
| | | item.className = "district"; |
| | | await createPoint(item); |
| | | // 打印每个设备的名称和设备类型 |
| | | // console.log(`设备名称: ${item.id}, 设备类型: ${item.name}`); |
| | | })); |
| | | }; |
| | | // 根据区域名称过滤数据 |
| | | const filterDataByArea = async (areaName) => { |
| | | handleCleanup(); |
| | | if (!areaName || !simStore.DangerPoint || simStore.DangerPoint.length === 0) { |
| | | districtList.value = []; |
| | | return; |
| | | } |
| | | |
| | | districtList.value = simStore.DangerPoint.filter((item) => |
| | | item.position?.includes(areaName) |
| | | ); |
| | | await initializeDevicePoints(); |
| | | }; |
| | | |
| | | // 处理区域变化事件 |
| | | const handleChange = (areaName) => { |
| | | const handleChange = (item) => { |
| | | const areaName = item; |
| | | if (!areaName) { |
| | | console.error("请选择一个区域"); |
| | | ElMessage.warning("请选择一个区域"); |
| | | return; |
| | | } |
| | | selectValue.value = areaName; // 更新选中的区域值 |
| | | console.log(deviceListAll.value); // 这里已包含所有区域的数据 |
| | | filterDataByArea(areaName); |
| | | }; |
| | | |
| | | // 计算属性:将设备列表转换为树形结构,依据当前选中的区域 |
| | | const deviceTree = computed(() => { |
| | | const typeMap = {}; |
| | | |
| | | // 过滤出属于当前选中区域的设备 |
| | | const filteredDevices = deviceListAll.value.filter(device => |
| | | device.deviceName.includes(selectValue.value) |
| | | ); |
| | | |
| | | // 按设备类型分组 |
| | | filteredDevices.forEach((device) => { |
| | | const typeName = getDictName(deviceDictList, device.dictDeviceType); |
| | | |
| | | if (!typeName) { |
| | | console.warn("未找到设备类型:", device); |
| | | return; |
| | | } |
| | | |
| | | if (!typeMap[typeName]) { |
| | | typeMap[typeName] = []; |
| | | } |
| | | // 直接使用原始的设备名称,不进行任何替换操作 |
| | | typeMap[typeName].push({ |
| | | ...device, |
| | | deviceName: device.deviceName.trim(), // 只去除首尾空格 |
| | | }); |
| | | }); |
| | | |
| | | // 转换为树形结构 |
| | | return Object.keys(typeMap).map((typeName) => ({ |
| | | deviceName: typeName, |
| | | children: typeMap[typeName], |
| | | })); |
| | | watch(() => simStore.DangerShowSwitch, (newValue, oldValue) => { |
| | | if (newValue) { |
| | | initializeDevicePoints(); |
| | | } else { |
| | | handleCleanup() |
| | | } |
| | | }); |
| | | // 监听 simStore.DangerPoint 变化 |
| | | watch( |
| | | () => simStore.DangerPoint, |
| | | (newVal) => { |
| | | if (newVal && newVal.length > 0) { |
| | | filterDataByArea(selectValue.value); |
| | | loading.value = false; // 数据加载完成 |
| | | } else { |
| | | handleCleanup(); |
| | | districtList.value = []; |
| | | loading.value = true; // 数据未准备就绪 |
| | | } |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | | |
| | | // 假设在组件初始化之前,deviceListAll 已被填充了所有区域的数据 |
| | | // 如果不是这样,则需要保留对 loadDeviceList 的调用,或者找到一种方法来预填充 deviceListAll |
| | | onMounted(() => { |
| | | // 如果需要在此处加载全部数据,请取消注释以下行并确保 getDeviceInfo 返回所有区域的数据 |
| | | // loadDeviceList(""); |
| | | handleCleanup() |
| | | initeWaterPrimitiveView() |
| | | // 默认先检查一遍数据 |
| | | if (simStore.DangerPoint && simStore.DangerPoint.length > 0) { |
| | | filterDataByArea("孙胡沟"); |
| | | loading.value = false; |
| | | } else { |
| | | loading.value = true; |
| | | } |
| | | }); |
| | | </script> |
| | | |