guonan
2025-05-16 a9c4f7775e82d93638e607fa6c5fafe22f5310b4
src/components/tools/Detail.vue
@@ -1,233 +1,223 @@
<template>
   <div class="detail" ref="detailRef">
      <div class="detail-top">{{ detailTitle }}</div>
      <div class="detail-close" @click="closeMsg"></div>
      <div class="detail-context">
         <div v-for="(item, key) in detailList" :key="key" class="detail-item">
            <div class="detail-name">{{ item.name }}</div>
            <div class="detail-value" :title="item.value">{{ item.value || "--" }}</div>
         </div>
      </div>
   </div>
  <div class="detail" ref="detailRef">
    <div class="detail-top">{{ detailTitle }}</div>
    <div class="detail-close" @click="closeMsg"></div>
    <div class="detail-context">
      <div v-for="(item, key) in detailList" :key="key" class="detail-item">
        <div class="detail-name">{{ item.name }}</div>
        <div class="detail-value" :title="item.value">
          {{ item.value || "--" }}
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
   import { ref, onMounted, nextTick, onUnmounted } from "vue";
   import { showDeviceDetail, deviceDetail, className, dialogPositon } from "@/store"
import { ref, onMounted, nextTick, onUnmounted } from "vue";
import {
  showDeviceDetail,
  deviceDetail,
  className,
  dialogPositon,
} from "@/store";
   // props: {
   //    deviceDetail: {
   //       type: Object,
   //       default: {
   //          deviceCode: "1101161102180100031040",
   //          deviceId: "1554360448383913986",
   //          deviceName: "怀柔区琉璃庙镇孙胡沟村于家西沟次声仪1040",
   //          dictDeviceType: "1437295832",
   //          latitude: 40.563822,
   //          longitude: 116.592648,
   //          type: "次生仪",
   //          name: "怀柔区琉璃庙镇孙胡沟村于家西沟次声仪1040",
   //          id: "1554360448383913986",
   //       },
   //    },
   // },
   const detailList = ref([])
   const detailTitle = ref("设备详情")
   function closeMsg() {
      showDeviceDetail.value = false
      coloseDialog()
   }
   function handlDeviceDetail() {
      const name = deviceDetail.value.name.split("孙胡沟")[1] || deviceDetail.value.deviceName
      detailTitle.value = name
      detailList.value = [
         {
            name: "设备编号",
            value: deviceDetail.value.deviceCode || Math.floor(Math.random() * 100000),
         },
         {
            name: "设备类型",
            value: deviceDetail.value.type || "",
         },
         {
            name: "安装时间",
            value: "2024-01-15 12:55:18",
         },
         {
            name: "更新时间",
            value: "2025-02-15 8:15:28",
         },
         {
            name: "设备位置",
            value: deviceDetail.value.name.split("孙胡沟")[0] || cityData.listData[0],
         },
      ]
   }
   function handleDistrictDetail() {
      const name = deviceDetail.value.name || deviceDetail.value.district
      detailTitle.value = name
      detailList.value = [
         {
            name: "隐患类型",
            value: deviceDetail.value.type || "泥石流",
         },
         // {
         //    name: "威胁人数",
         //    value: deviceDetail.value.type || "",
         // },
         {
            name: "主管科长",
            value: "张浩",
         },
         {
            name: "主管镇长",
            value: "刘佳斌",
         },
         {
            name: "群测群防",
            value: deviceDetail.value.groupMonitor,
         },
         {
            name: "隐患位置",
            value: deviceDetail.value.district,
         },
         {
            name: "预防方案",
            value: deviceDetail.value.preventionPlan,
         },
      ]
   }
   function loadClassNameDetail() {
      if (className.value == "device") {
         handlDeviceDetail()
      } else if (className.value == "district") {
         handleDistrictDetail()
      }
   }
   const detailRef = ref(null)
   //展示属性框
   function calcDialogPostion() {
    const position = dialogPositon.value;
    if (!position) {
        console.error("dialogPositon is null or invalid");
        return;
    }
const detailList = ref([]);
const detailTitle = ref("设备详情");
function closeMsg() {
  showDeviceDetail.value = false;
  coloseDialog();
}
// 监测设备具体信息
function handlDeviceDetail() {
  const name = deviceDetail.value.name;
  detailTitle.value = name;
  detailList.value = [
    {
      name: "设备编号",
      value:
        deviceDetail.value.deviceCode || Math.floor(Math.random() * 100000),
    },
    {
      name: "设备类型",
      value: deviceDetail.value.type || "",
    },
    {
      name: "安装时间",
      value: "2024-01-15 12:55:18" || deviceDetail.value.startTime,
    },
    {
      name: "更新时间",
      value: "2025-02-15 8:15:28",
    },
    {
      name: "设备位置",
      value: deviceDetail.value.deviceForShort || cityData.listData[0],
      //   value: deviceDetail.value.name.split("孙胡沟")[0] || cityData.listData[0],
    },
  ];
}
// 隐患点具体信息
function handleDistrictDetail() {
  const name = deviceDetail.value.hdName;
  detailTitle.value = name;
  detailList.value = [
    {
      name: "隐患类型",
      value: deviceDetail.value.disasterType || "泥石流",
    },
    {
      name: "主管科长",
      value: "张浩",
    },
    {
      name: "主管镇长",
      value: deviceDetail.value.supervisorAlcaldeUserName,
    },
    {
      name: "群测群防",
      value: deviceDetail.value.groupTestGroupDefenseUserName,
    },
    {
      name: "隐患位置",
      value: deviceDetail.value.position,
    },
    {
      name: "预防方案",
      value: deviceDetail.value.preventionSuggestion,
    },
  ];
}
function loadClassNameDetail() {
  if (className.value == "device") {
    handlDeviceDetail();
  } else if (className.value == "district") {
    handleDistrictDetail();
  }
}
const detailRef = ref(null);
//展示属性框
function calcDialogPostion() {
  const position = dialogPositon.value;
  if (!position) {
    console.error("dialogPositon is null or invalid");
    return;
  }
    const bubble = detailRef.value;
    if (!bubble) {
        console.error("detailRef is null, DOM not ready");
        return;
    }
  const bubble = detailRef.value;
  if (!bubble) {
    console.error("detailRef is null, DOM not ready");
    return;
  }
    let winpos = window.viewer.scene.cartesianToCanvasCoordinates(position);
    if (!winpos || isNaN(winpos.x) || isNaN(winpos.y)) {
        console.error("Invalid canvas coordinates:", winpos);
        return;
    }
  let winpos = window.viewer.scene.cartesianToCanvasCoordinates(position);
  if (!winpos || isNaN(winpos.x) || isNaN(winpos.y)) {
    console.error("Invalid canvas coordinates:", winpos);
    return;
  }
    let poph = bubble.offsetHeight;
    bubble.style.left = winpos.x - 200 + "px";
    let top = winpos.y - poph - 50;
    bubble.style.top = top + "px";
  let poph = bubble.offsetHeight;
  bubble.style.left = winpos.x - 200 + "px";
  let top = winpos.y - poph - 50;
  bubble.style.top = top + "px";
}
   //关闭属性框
   const coloseDialog = () => {
      window.viewer.scene.postRender.removeEventListener(calcDialogPostion)
   }
   onMounted(() => {
    loadClassNameDetail();
    nextTick(() => {
        window.viewer.scene.postRender.addEventListener(calcDialogPostion);
    });
//关闭属性框
const coloseDialog = () => {
  window.viewer.scene.postRender.removeEventListener(calcDialogPostion);
};
onMounted(() => {
  loadClassNameDetail();
  nextTick(() => {
    window.viewer.scene.postRender.addEventListener(calcDialogPostion);
  });
});
onUnmounted(() => {
   // 解决dom中offHeight报错
    window.viewer.scene.postRender.removeEventListener(calcDialogPostion);
  // 解决dom中offHeight报错
  window.viewer.scene.postRender.removeEventListener(calcDialogPostion);
});
</script>
<style lang="less" scoped>
   .detail {
      background: url("@/assets/img/tools/messagebg.png");
      background-size: 100% 100%;
      width: 24.4375rem;
      height: 24.5rem;
      position: absolute;
      top: 30%;
      right: 30%;
   }
.detail {
  background: url("@/assets/img/tools/messagebg.png");
  background-size: 100% 100%;
  width: 24.4375rem;
  height: 24.5rem;
  position: absolute;
  top: 30%;
  right: 30%;
}
   .detail-top {
      position: absolute;
      top: 0.3125rem;
      left: 1.25rem;
      font-weight: 700;
      font-size: 1.125rem;
      font-weight: 700;
      color: #fff;
      line-height: 2.5rem;
      width: 16.875rem;
      cursor: pointer;
   }
.detail-top {
  position: absolute;
  top: 0.3125rem;
  left: 1.25rem;
  font-weight: 700;
  font-size: 1.125rem;
  font-weight: 700;
  color: #fff;
  line-height: 2.5rem;
  width: 16.875rem;
  cursor: pointer;
}
   .detail-close {
      position: absolute;
      right: 0.1875rem;
      top: 0rem;
      width: 1.25rem;
      height: 1.25rem;
      text-align: center;
      line-height: 1.25rem;
      text-align: center;
.detail-close {
  position: absolute;
  right: 0.1875rem;
  top: 0rem;
  width: 1.25rem;
  height: 1.25rem;
  text-align: center;
  line-height: 1.25rem;
  text-align: center;
      font-weight: 700;
      font-size: 1.125rem;
      font-weight: 700;
      color: #fff;
      cursor: pointer;
   }
  font-weight: 700;
  font-size: 1.125rem;
  font-weight: 700;
  color: #fff;
  cursor: pointer;
}
   .detail-context {
      position: absolute;
      top: 3.8rem;
      left: 1.25rem;
      width: 21.875rem;
   }
.detail-context {
  position: absolute;
  top: 3.8rem;
  left: 1.25rem;
  width: 21.875rem;
}
   .detail-item {
      display: flex;
      height: 1.4375rem;
      margin-top: 0.9375rem;
      margin-left: 0.625rem;
   }
   .detail-name {
      width: 100px;
      font-weight: 700;
      color: #94e0c4;
      &::after {
         content: ":";
      }
   }
.detail-item {
  display: flex;
  height: 1.4375rem;
  margin-top: 0.9375rem;
  margin-left: 0.625rem;
}
.detail-name {
  width: 100px;
  font-weight: 700;
  color: #94e0c4;
  &::after {
    content: ":";
  }
}
   .detail-value {
      color: #e1eee9;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
      width: 250px;
   }
.detail-value {
  color: #e1eee9;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  width: 250px;
}
   .detail-btn {
      background: url("@/assets/img/tools/messagebtn.png") no-repeat;
      position: absolute;
      bottom: 3.75rem;
      right: 3.75rem;
      width: 6.5625rem;
      height: 1.625rem;
      text-align: center;
      color: #fff;
      cursor: pointer;
   }
.detail-btn {
  background: url("@/assets/img/tools/messagebtn.png") no-repeat;
  position: absolute;
  bottom: 3.75rem;
  right: 3.75rem;
  width: 6.5625rem;
  height: 1.625rem;
  text-align: center;
  color: #fff;
  cursor: pointer;
}
</style>