riku
2025-03-14 8372d022614a1897120802cf1bac90d61651177f
src/views/satellitetelemetry/component/SatelliteMixTool.vue
@@ -11,25 +11,49 @@
      title="走航融合"
      draggable
      :modal="false"
      width="400px"
      width="420px"
    >
      <template #default>
        <el-row>
          <OptionMission v-model="mission"></OptionMission>
          <el-text size="small" :type="fusionData ? 'success' : 'warning'">{{
          <!-- <OptionMission v-model="mission"></OptionMission> -->
          <el-form :inline="true">
            <el-form-item label="走航融合">
              <el-select
                v-model="selectedfusionData"
                multiple
                clearable
                @change="handleChange"
                placeholder="选择任务"
                size="small"
                class="w-200"
                :loading="fusionLoading"
              >
                <el-option
                  v-for="(s, i) in fusionDataList"
                  :key="i"
                  :label="timeFormatter(s.dataTime)"
                  :value="i"
                />
              </el-select>
            </el-form-item>
            <el-form-item>
              <el-button
                type="primary"
                class="el-button-custom"
                size="small"
                :disabled="!gridCellList || selectedfusionData.length == 0"
                @click="handleFusionClick"
              >
                {{ '叠加融合' }}
              </el-button>
            </el-form-item>
          </el-form>
          <!-- <el-text size="small" :type="fusionData ? 'success' : 'warning'">{{
            fusionData ? '走航数据已融合' : '走航数据未融合'
          }}</el-text>
          }}</el-text> -->
        </el-row>
        <el-row>
          <el-button
            type="primary"
            class="el-button-custom"
            size="small"
            :disabled="!gridCellList || !fusionData"
            @click="handleFusionClick"
          >
            {{ '叠加融合' }}
          </el-button>
        <div class="m-t-8">网格要素</div>
        <el-row class="m-t-8">
          <el-button
            type="primary"
            class="el-button-custom"
@@ -38,17 +62,6 @@
          >
            {{ gridVisible ? '隐藏融合' : '显示融合' }}
          </el-button>
          <el-button
            type="primary"
            class="el-button-custom"
            size="small"
            :loading="loading"
            @click="handleUnderwayClick"
          >
            {{ underwayVisible ? '隐藏走航路线' : '显示走航路线' }}
          </el-button>
        </el-row>
        <el-row class="m-t-8">
          <el-button
            type="primary"
            class="el-button-custom"
@@ -65,6 +78,17 @@
          >
            {{ dataVisible ? '隐藏数据' : '显示数据' }}
          </el-button>
        </el-row>
        <div class="m-t-8">网格样式</div>
        <el-row class="m-t-8">
          <el-button
            type="primary"
            class="el-button-custom"
            size="small"
            @click="handleOpacityClick"
          >
            {{ !isOpacity ? '透明化' : '取消透明化' }}
          </el-button>
          <el-button
            type="primary"
            class="el-button-custom"
@@ -73,13 +97,19 @@
          >
            {{ isStandardColor ? '绘制对比色' : '绘制标准色' }}
          </el-button>
        </el-row>
        <div class="m-t-8">走航要素</div>
        <el-row class="m-t-8">
          <!-- <el-divider content-position="left"></el-divider> -->
          <el-button
            type="primary"
            class="el-button-custom"
            size="small"
            @click="handleOpacityClick"
            :loading="missionLoading || loading"
            @click="handleUnderwayClick"
          >
            {{ !isOpacity ? '透明化' : '取消透明化' }}
            {{ underwayVisible ? '隐藏走航路线' : '显示走航路线' }}
          </el-button>
        </el-row>
      </template>
@@ -112,6 +142,11 @@
const gridCellList = ref(undefined);
const fusionData = ref(undefined);
// 走航融合数据
const fusionLoading = ref(false);
const fusionDataList = ref([]);
const selectedfusionData = ref([]);
const gridDataDetailMap = new Map();
const gridVisible = ref(true);
@@ -121,17 +156,31 @@
const isStandardColor = ref(true);
const isOpacity = ref(false);
// 检查走航数据是否和100米网格已融合
function checkUnderwayFusionResult() {
  const time = moment(mission.value.startTime).format('YYYY-MM-DD HH:mm:ss');
  gridApi.fetchGridData(props.groupId, time, 3).then((res) => {
    if (res.data.length > 0) {
      fusionData.value = res.data[0];
    } else {
      fusionData.value = undefined;
    }
  });
function timeFormatter(value) {
  return moment(value).format('YYYY-MM-DD');
}
function fetchFusionData() {
  fusionLoading.value = true;
  gridApi
    .fetchGridData(props.groupId, undefined, 3)
    .then((res) => {
      fusionDataList.value = res.data;
    })
    .finally(() => (fusionLoading.value = false));
}
// 检查走航数据是否和100米网格已融合
// function checkUnderwayFusionResult() {
//   const time = moment(mission.value.startTime).format('YYYY-MM-DD HH:mm:ss');
//   gridApi.fetchGridData(props.groupId, time, 3).then((res) => {
//     if (res.data.length > 0) {
//       fusionData.value = res.data[0];
//     } else {
//       fusionData.value = undefined;
//     }
//   });
// }
function resetButton() {
  gridVisible.value = true;
@@ -146,17 +195,12 @@
  satelliteProxy.gridPrepare(gridInfo);
}
// 绘制网格遥感数据值和网格颜色
function drawGrid(gridData) {
  satelliteProxy.drawGrid({ gridData, opacity: 1, zIndex: 11 });
}
watch(mission, (nV, oV) => {
  if (nV != oV) {
    checkUnderwayFusionResult();
    search(nV);
  }
});
// watch(mission, (nV, oV) => {
//   if (nV != oV) {
//     checkUnderwayFusionResult();
//     search(nV);
//   }
// });
watch(
  () => props.groupId,
@@ -166,6 +210,7 @@
        gridCellList.value = res.data;
        prepareGrid(gridCellList.value);
      });
      fetchFusionData();
    }
  },
  {
@@ -179,26 +224,30 @@
      gridCellList.value = res.data;
      prepareGrid(gridCellList.value);
    });
    fetchFusionData();
  }
});
let selectedGridData;
// 叠加融合
function handleFusionClick() {
  // resetButton();
  const d = fusionData.value;
  if (gridDataDetailMap.has(d.id)) {
    const gridData = gridDataDetailMap.get(d.id);
    selectedGridData = gridData;
    drawGrid(gridData);
  } else {
    gridApi.fetchGridDataDetail(d.id, d.groupId).then((res) => {
      gridDataDetailMap.set(d.id, res.data);
      const gridData = res.data;
      selectedGridData = gridData;
      drawGrid(gridData);
    });
  }
  satelliteProxy.changeVisibility({ showGridViews: false });
  selectedfusionData.value.forEach((i) => {
    const d = fusionDataList.value[i];
    if (gridDataDetailMap.has(d.id)) {
      satelliteProxy.changeVisibility({ tag: d.id, showGridViews: true });
    } else {
      gridApi.fetchGridDataDetail(d.id, d.groupId).then((res) => {
        gridDataDetailMap.set(d.id, res.data);
        const gdd = res.data;
        satelliteProxy.drawTagGrid({
          tag: d.id,
          gridDataDetail: gdd,
          opacity: 1,
          zIndex: 11
        });
      });
    }
  });
}
function handleGridClick() {
@@ -223,11 +272,18 @@
function handleColorClick() {
  isStandardColor.value = !isStandardColor.value;
  satelliteProxy.drawGrid({
    gridData: selectedGridData,
    useCustomColor: !isStandardColor.value,
    opacity: 1,
    zIndex: 11
  selectedfusionData.value.forEach((i) => {
    const d = fusionDataList.value[i];
    if (gridDataDetailMap.has(d.id)) {
      const gdd = gridDataDetailMap.get(d.id);
      satelliteProxy.drawTagGrid({
        tag: d.id,
        gridDataDetail: gdd,
        useCustomColor: !isStandardColor.value,
        opacity: 1,
        zIndex: 11
      });
    }
  });
}
@@ -243,29 +299,48 @@
import mapUtil from '@/utils/map/util';
import { fetchHistoryData } from '@/utils/factor/data';
import { useFetchData } from '@/composables/fetchData';
import { useMissionStore } from '@/stores/mission';
onMounted(() => (isUnmounted.value = false));
onMounted(() => {
  isUnmounted.value = false;
  fetchMission();
});
onUnmounted(() => {
  mapUtil.clearMap();
  isUnmounted.value = true;
});
const { loading, fetchData } = useFetchData(10000);
const missionStore = useMissionStore();
const missionLoading = ref(false);
const isUnmounted = ref(false);
const deviceType = ref(undefined);
const drawMode = ref(0);
// 监测数据
const factorDatas = ref(new FactorDatas());
// const factorDatas = ref(new FactorDatas());
const factorDataMap = new Map();
// pm2.5
const factorType = 6;
function onFetchData(dType, data) {
function fetchMission() {
  missionLoading.value = true;
  missionStore
    .fetchMission()
    // .then((res) => {
    //   if (res.success && res.data.length > 0) {
    //   }
    // })
    .finally(() => (missionLoading.value = false));
}
function onFetchData(_factorDatas, dType, data) {
  if (isUnmounted.value) return;
  // todo 根据设备类型切换地图监测因子展示单选框、折线图复选框、数据表格复选框的因子类型
  deviceType.value = dType;
  factorDatas.value.setData(data, drawMode.value, () => {
    factorDatas.value.refreshHeight(factorType.value);
  _factorDatas.value.setData(data, drawMode.value, () => {
    _factorDatas.value.refreshHeight(factorType.value);
  });
}
@@ -275,7 +350,7 @@
  // deviceCode.value = deviceCode;
  const _startTime = moment(startTime).format('YYYY-MM-DD HH:mm:ss');
  const _endTime = moment(endTime).format('YYYY-MM-DD HH:mm:ss');
  fetchData((page, pageSize) => {
  return fetchData((page, pageSize) => {
    return fetchHistoryData({
      deviceType,
      deviceCode,
@@ -283,15 +358,48 @@
      endTime: _endTime,
      page,
      perPage: pageSize
    }).then((res) => onFetchData(deviceType, res.data));
    });
    // .then((res) => onFetchData(deviceType, res.data));
  });
}
function draw() {
  if (isUnmounted.value) return;
  selectedfusionData.value.forEach((i) => {
    const d = fusionDataList.value[i];
    const mission = missionStore.missionList.find((v) => {
      return v.missionCode == d.mixDataId;
    });
    if (factorDataMap.has(mission.missionCode)) {
      const fd = factorDataMap.get(mission.missionCode);
      drawLine(mission.missionCode, fd);
    } else {
      search(mission).then((res) => {
        const fd = new FactorDatas();
        fd.setData(res.data, drawMode.value, () => {
          fd.refreshHeight(factorType.value);
          factorDataMap.set(mission.missionCode, fd);
          drawLine(mission.missionCode, fd);
        });
      });
    }
  });
}
function drawLine(missionCode, fd) {
  // 刷新图例
  const factor = factorDatas.value.factor[factorType];
  const factor = fd.factor[factorType];
  sector.clearSector();
  factorDatas.value.refreshHeight(factorType);
  mapLine.drawLine(factorDatas.value, factor);
  fd.refreshHeight(factorType);
  mapLine.drawTagLine(missionCode, fd, factor);
}
</script>
<style scoped>
/* ::v-deep .el-divider__text {
  background: #122b54;
  color: white;
} */
</style>