Newer
Older
KaiFengPC / src / views / spongePerformance / waterlogging / waterloggedArea / jctable.vue
@zhangdeliang zhangdeliang on 23 May 6 KB 初始化项目
<template>
  <!-- 监测法 -->
  <div class="water-analysis-page">
    <el-table
      :key="isFlag"
      :data="tableData"
      max-height="500"
      v-loading="tableLoading"
      @row-click="clickModal"
      highlight-current-row
      ref="tableModal"
    >
      <el-table-column type="index" width="55" label="序号" />
      <el-table-column :label="i.value" :prop="i.key" show-overflow-tooltip v-for="i in cloums">
        <template #default="{ row }" v-if="i.key == 'isStandard'">
          <el-tag round :type="row.isStandard === '' ? 'warning' : row.isStandard === '1' ? 'success' : 'error'">
            {{ row.isStandard === '' ? '未填报' : row.isStandard === '1' ? '达标' : '未达标' }}
          </el-tag>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script setup>
import { waterLoggingCleanMonitor } from '@/api/spongePerformance/prevention';
const { proxy } = getCurrentInstance();
import { waterloggingPointList } from '@/api/sponeScreen/syntherticData.js';
import bus from '@/utils/mitt';
let isFlag = ref(1);
const cloums = ref([
  { value: '考核年份', key: 'year' },
  { value: '消除个数', key: 'noFloodWaterLoggingPointNum' },
  { value: '总数', key: 'waterLoggingPointNum' },
  { value: '消除比例%', key: 'noFloodPercent' },
  { value: '目标%', key: 'targetPercent' },
  { value: '达标情况', key: 'isStandard' },
]);
const { params } = defineProps(['params']);
const emits = defineEmits();
const tableModal = ref(null);
const floodPointList = ref([]);
const waterLoggingData = ref([]);
const waterLoggingDataByType = ref([]);

//动态组件
let dataForm = reactive({
  tableData: '',
  tableDateTwo: '',
  tableLoading: true,
});
let { date, tableData, tableDateTwo, tableLoading } = toRefs(dataForm);
//获取列表数据
//搜索
const search = p => {
  dynamic_page_data_typeM(p);
  isFlag.value++;
};
defineExpose({ search });

//删除
const dynamic_page_data_typeM = async id => {
  let { data } = await waterLoggingCleanMonitor(id);
  tableData.value = data;
  tableModal.value.setCurrentRow(tableData.value[0], true); //表格默认第一个高亮选中
  tableLoading.value = false;
  addWaterLoggingByType(tableData.value[0].floodPointList);
};
//地图添加消除与未消除内涝点
const addWaterLoggingByType = data => {
  let success_zishuiDate = [];
  let error_zishuiDate = [];
  if (data.length) {
    data.map(item => {
      item.color = '#d9001b';
      item.isClear = false;
    });
    error_zishuiDate = data;
    waterLoggingData.value.forEach(element => {
      data.forEach(item => {
        if (item.name != element.name) {
          success_zishuiDate.push(element);
        }
      });
    });
    waterLoggingDataByType.value = success_zishuiDate.concat(error_zishuiDate);
  } else waterLoggingDataByType.value = waterLoggingData.value;
  let waterLogjson = getWaterloggingGeojson(waterLoggingDataByType.value);
  if (!newfiberMapbox.map.getLayer('waterLoging')) {
    addWaterloggingLayer(waterLogjson, 'waterLoging');
  } else {
    newfiberMapbox.map.getSource('waterLoging').setData(waterLogjson);
  }
  addwaterlogingPopup(waterLogjson);
};
// 监测法表格点击
function clickModal(row) {
  floodPointList.value = row.floodPointList;
  // gis渲染点位
  addWaterLoggingByType(floodPointList.value);
}
//获取25个内涝点
const getWaterlogging = async () => {
  let res = await waterloggingPointList();
  if (res && res.code == 200) {
    waterLoggingData.value = res.data;
    waterLoggingData.value.forEach(element => {
      element.color = '#70b603';
      element.isClear = true;
    });
  }
};
//内涝点geojson
const getWaterloggingGeojson = data => {
  let features = [];
  data.forEach(element => {
    let feature = {
      type: 'Feature',
      geometry: {
        type: 'Point',
        coordinates: [Number(element.longitude), Number(element.latitude)],
      },
      properties: element,
    };
    features.push(feature);
  });
  return {
    type: 'FeatureCollection',
    features: features,
  };
};
//地图渲染内涝点
const addWaterloggingLayer = (geojson, layerName) => {
  !!!newfiberMapbox.map.getSource(layerName) && newfiberMapbox.map.addSource(layerName, { type: 'geojson', data: geojson });
  !!!newfiberMapbox.map.getLayer(layerName) &&
    newfiberMapbox.map.addLayer({
      id: layerName,
      type: 'circle',
      source: layerName,
      paint: {
        'circle-color': ['get', 'color'],
        'circle-radius': 7,
      },
    });
};
//添加弹窗
const addwaterlogingPopup = geojson => {
  newfiberMapbox.popupService.popups.forEach(popup => {
    nextTick(() => {
      newfiberMapbox.removePopup(popup);
    });
  });
  geojson.features.forEach(feature => {
    let popupClass;
    let htmlText;
    !!feature.properties.isClear ? (popupClass = 'successPopup') : (popupClass = 'errorPopup');
    !!feature.properties.isClear
      ? (htmlText = `
          <div class=${popupClass}><div class='title'>${feature.properties.name}</div>
          <div class='part'>积水最大时长:${feature.properties.yearMaxHour}h</div>
          <div class='part'>最大积水深度:${feature.properties.yearMaxDepth}m</div>
          </div>`)
      : (htmlText = `
          <div class=${popupClass}><div class='title'>${feature.properties.name}</div>
          <div class='part'>积水最大时长:${feature.properties.yearMaxHour}h</div>
          <div class='part'>最大积水深度:${feature.properties.yearMaxDepth}m</div>
          </div>`);
    return newfiberMapbox.addPopup(
      new mapboxL7.Popup({
        title: '',
        html: htmlText,
        lngLat: {
          lng: feature.geometry.coordinates[0],
          lat: feature.geometry.coordinates[1],
        },
        anchor: 'center',
        offsets: [0, 60],
        autoClose: false,
      })
    );
  });
};
onMounted(() => {
  dynamic_page_data_typeM(params);
  getWaterlogging();
  newfiberMapbox.map.off('click');
  newfiberMapbox.map.on('click', e => {
    let clickfeature = newfiberMapbox.map
      .queryRenderedFeatures([
        [e.point.x - 10 / 2, e.point.y - 10 / 2],
        [e.point.x + 10 / 2, e.point.y + 10 / 2],
      ])
      .filter(i => i.layer.id == 'waterLoging');
    // console.log('clickfeature', '点击事件', clickfeature[0].properties.isFlood);
    bus.emit('waterLoginclickfeature', clickfeature[0].properties);
  });
});
onBeforeUnmount(() => {
  // console.log('newfiberMapbox', newfiberMapbox);
  if (!!!newfiberMapbox) return;
  !!newfiberMapbox.map.getLayer('waterLoging') && newfiberMapbox.map.removeLayer('waterLoging');
  !!newfiberMapbox.map.getSource('waterLoging') && newfiberMapbox.map.removeSource('waterLoging');
  newfiberMapbox.popupService.popups.forEach(popup => {
    nextTick(() => {
      newfiberMapbox.removePopup(popup);
    });
  });
});
</script>
<style lang="scss" scoped></style>