Newer
Older
KaiFengPC / src / views / sponeScreen / waterFlood / rainFX / ReportDayDetail.vue
@zhangdeliang zhangdeliang 13 days ago 11 KB update
<template>
  <!-- 降雨报告单详情 -->
  <!-- <el-button plain type="warning" @click="downloadPdf" style="margin: 10px 0px" :disabled="showLoading">下载</el-button> -->
  <div class="publicContainer reportDetail" v-loading="showLoading" :element-loading-text="loadingText" id="rainReport">
    <h1>开封市海绵城市雨情分析报告</h1>
    <h4>报告时间:{{ rePortTime }}</h4>
    <!-- 雨量站数据 -->
    <div v-for="item in raindata">
      <p class="title">【{{ item.stName }}】</p>
      <p class="content">
        降雨时间段:<span>{{ item.rainStartTime }}</span> 开始至<span>{{ item.rainEndTime }}</span> 结束,总历时
        <span> {{ item.rainTodate }}; </span>
      </p>
      <p class="content">
        日累计降雨量:<span>{{ item.rainTotol }} mm;</span>
      </p>
      <p class="content flex flex-r flex-justcontent-start">
        降雨等级:<span><dict-tag :options="props.rainfallIntensity" :value="item.rainLevel" /></span>;
      </p>
      <p class="content">
        最大小时降雨量:<span>{{ item.maxRainData }}mm/h</span> <span>({{ item.maxRainTimeStart }}-{{ item.maxRainTimeEnd }})</span>;
      </p>
      <div :id="`rain_chart_${item.stCode}`" class="chartOneBG rainChart"></div>
    </div>
    <!-- 所有雨量站数据 -->
    <p class="title">【降雨时空分布】</p>
    <div id="rain_chart" class="chartOneBG"></div>
  </div>
</template>

<script setup stName="降雨报告单详情">
import bus from '@/bus';
import { ElMessage } from 'element-plus';
import * as echarts from 'echarts';
import { pageToPDF } from '@/utils/exportPdf.js'; //导出下载PDF
import { querySationdateByDay, queryRainStationCharts } from '@/api/zongHeDD.js';

const props = defineProps({
  params: {
    type: Object,
    default: {},
  },
  rainfallIntensity: {
    type: Array,
    default: [],
  },
});
const { proxy } = getCurrentInstance();
const search = ref({
  time: '',
});
const loadingText = ref('正在加载中...');
//降雨等级
const levelData = ref([
  {
    type: '小雨',
    '24Rail': '小于10.0',
    '12Rail': '小于5.0',
  },
  {
    type: '中雨',
    '24Rail': '10.0~24.9',
    '12Rail': '5.0~14.9',
  },
  {
    type: '大雨',
    '24Rail': '25.0~49.9',
    '12Rail': '25.0~49.9',
  },
  {
    type: '暴雨',
    '24Rail': '50.0~99.9',
    '12Rail': '30.0~69.9',
  },
  {
    type: '大暴雨',
    '24Rail': '100.0~249.0',
    '12Rail': '70.0~139.0',
  },
  {
    type: '特大暴雨',
    '24Rail': '250.0以上',
    '12Rail': '140.0以上',
  },
]);
const revelLabel = {
  1: '小雨',
  2: '中雨',
  3: '大雨',
  4: '暴雨',
  5: '大暴雨',
  6: '特大暴雨',
};
//雨量站数据
const raindatalist = ref([]);
//管网数据
const pipelinedatalist = ref([]);
//易涝点数据
const loggingdatalist = ref([]);
//项目数据
const projectdatalist = ref([]);
const showLoading = ref(false);
const detailData = ref({
  startTime: '',
  endTime: '',
  accumulate: '',
});
const rePortTime = ref('');
//单个雨量站数据
const raindata = ref([]);
//所有雨量站数据
const siteData = ref([]);
//雨量站--降雨量
const initEchartsRain = async datas => {
  for (var i = 0; i < datas.length; i++) {
    var chart2 = echarts.init(document.getElementById(`rain_chart_${datas[i]['stCode']}`));
    let xData = datas[i].rainTimeX.map(item => proxy.moment(item).format('HH:mm'));
    let yData = datas[i].rainY;
    var rainMaxNum = Math.max(...yData);
    var rainMinNum = Math.min(...yData);
    let option4 = {
      color: '#6881CD',
      // 显示暂无数据
      graphic: {
        type: 'text', // 类型:文本
        left: 'center',
        top: 'middle',
        silent: true, // 不响应事件
        invisible: true, // 有数据就隐藏
        style: {
          fill: '#c6c6c6',
          fontWeight: 'bold',
          text: '暂无数据',
          fontFamily: 'Microsoft YaHei',
          fontSize: '18px',
        },
      },
      tooltip: {
        trigger: 'axis',
        show: true,
      },
      title: {
        left: 'center',
        text: '',
        textStyle: {
          color: '#333', //字体颜色
          fontSize: 16, //字体大小
        },
      },
      grid: {
        left: '3%',
        right: '3%',
        top: '15%',
        bottom: '3%',
        containLabel: true,
      },
      legend: {
        top: '8%',
        orient: 'horizontal', //horizontal
        left: 'center', //left ,center
        textStyle: {
          color: '#333',
        },
        data: [],
      },
      xAxis: {
        type: 'category',
        data: xData,
        axisLabel: {
          color: '#333',
          rotate: 90,
        },
        axisLine: {
          lineStyle: {
            color: '#066592',
          },
        },
      },
      yAxis: [
        {
          name: '降雨量(mm)',
          type: 'value',
          nameLocation: 'end', // 坐标轴名称显示位置
          nameGap: 10, // 坐标轴名称与轴线之间的距离
          nameTextStyle: {
            color: '#333', //字体颜色
            fontSize: 12, //字体大小
            align: 'left', // 文字水平对齐方式,默认自动('left','center','right')
            padding: [0, 0, 0, 0],
          },
          axisLabel: {
            color: '#333',
          },
          splitLine: {
            lineStyle: {
              type: 'dashed',
              color: '#066592',
            },
          },
          min: (Number(rainMinNum) * 0.8).toFixed(1),
          max: (Number(rainMaxNum) * 1.5).toFixed(1),
        },
      ],
      series: [{ name: '降雨量', type: 'bar', barWidth: 2, data: yData }],
    };
    if (xData.length > 0) {
      option4.graphic.invisible = true;
    } else {
      option4.graphic.invisible = false;
    }
    chart2.clear();
    chart2.setOption(option4);
  }
};
//所有雨量站数据
const initEchartsSiteRain = async (timeData, rainList) => {
  var chart2 = echarts.init(document.getElementById(`rain_chart`));
  let xData = timeData;
  let yData = rainList;
  var rainMaxNum = Math.max(...yData);
  var rainMinNum = Math.min(...yData);
  let option4 = {
    color: '#6881CD',
    // 显示暂无数据
    graphic: {
      type: 'text', // 类型:文本
      left: 'center',
      top: 'middle',
      silent: true, // 不响应事件
      invisible: true, // 有数据就隐藏
      style: {
        fill: '#c6c6c6',
        fontWeight: 'bold',
        text: '暂无数据',
        fontFamily: 'Microsoft YaHei',
        fontSize: '18px',
      },
    },
    tooltip: {
      trigger: 'axis',
      show: true,
      formatter: function (params) {
        // params 是一个数组,数组中包含了多个要显示的数据的信息
        var result = '<div style="font-size:14px">' + search.value.time + '日' + params[0].axisValueLabel + '</div><div>';
        for (var i = 0, l = params.length; i < l; i++) {
          debugger;
          let data = siteData.value.filter(item => item.stName == params[i].axisValueLabel);
          result += `<div style="padding:6px 0"><span style="display:inline-block;margin-right:5px;border-radius:10px;width:8px;height:8px;background-color:#6881CD"></span>
                        ${params[i].seriesName} : ${params[i].value}mm</div>
                        <span style="display:inline-block;margin-right:5px;border-radius:10px;width:8px;height:8px;background-color:#6881CD"></span>
                        级别 :<span style="display:inline-block;margin-right:5px;border-radius:3px;width:35px;height:20px;text-align:center;">${
                          revelLabel[data[0].rainLevle]
                        }</span> <br/>
                        `;
        }
        return result + '</div>';
      },
    },
    title: {
      left: 'center',
      text: '',
      textStyle: {
        color: '#333', //字体颜色
        fontSize: 16, //字体大小
      },
    },
    grid: {
      left: '3%',
      right: '3%',
      top: '15%',
      bottom: '3%',
      containLabel: true,
    },
    legend: {
      top: '8%',
      orient: 'horizontal', //horizontal
      left: 'center', //left ,center
      textStyle: {
        color: '#333',
      },
      data: [],
    },
    xAxis: {
      type: 'category',
      data: xData,
      axisLabel: {
        color: '#333',
        rotate: 0,
      },
      axisLine: {
        lineStyle: {
          color: '#066592',
        },
      },
    },
    yAxis: [
      {
        name: '降雨量(mm)',
        type: 'value',
        nameLocation: 'end', // 坐标轴名称显示位置
        nameGap: 10, // 坐标轴名称与轴线之间的距离
        nameTextStyle: {
          color: '#333', //字体颜色
          fontSize: 12, //字体大小
          align: 'left', // 文字水平对齐方式,默认自动('left','center','right')
          padding: [0, 0, 0, 0],
        },
        axisLabel: {
          color: '#333',
        },
        splitLine: {
          lineStyle: {
            type: 'dashed',
            color: '#066592',
          },
        },
        min: (Number(rainMinNum) * 0.8).toFixed(1),
        max: (Number(rainMaxNum) * 1.5).toFixed(1),
      },
    ],
    series: [{ name: '降雨量', type: 'bar', barWidth: 20, data: yData }],
  };
  if (xData.length > 0) {
    option4.graphic.invisible = true;
  } else {
    option4.graphic.invisible = false;
  }
  chart2.clear();
  chart2.setOption(option4);
};

//获取数据
const getDetailData = params => {
  showLoading.value = true;
  let timeObj = {
    ...params,
  };
  rePortTime.value = params.dateTime;
  querySationdateByDay(timeObj).then(res => {
    showLoading.value = false;
    raindata.value = res.data;
    setTimeout(() => {
      initEchartsRain(raindata.value);
    }, 1000);
  });
};

//获取所有雨量站的降雨总和对比柱状图
const getRainStationCharts = params => {
  let data = {
    dateTime: proxy.moment(params.dateTime).format('YYYY-MM-DD'),
  };
  queryRainStationCharts(data).then(res => {
    siteData.value = res.data;
    let timeData = res.data && res.data.map(item => item.stName);
    let rainList = res.data && res.data.map(item => item.raintotol);
    if (timeData.length) {
      setTimeout(() => {
        initEchartsSiteRain(timeData, rainList);
      }, 1000);
    }
  });
};

// 下载降雨报告单
function downloadPdf() {
  showLoading.value = true;
  loadingText.value = '正在下载中...';
  const lableList = document.getElementsByClassName('pdf-details');
  pageToPDF(`${proxy.moment(rePortTime.value).format('YYYY年MM月DD日')}降雨结论报告`, document.querySelector('#rainReport'), lableList)
    .then(flag => {
      if (flag == 1) {
        showLoading.value = false;
        loadingText.value = '正在加载中...';
        ElMessage({ message: '下载成功', type: 'success', duration: 5 * 1000 });
      }
    })
    .catch(() => {
      showLoading.value = false;
      ElMessage({ message: '下载失败', type: 'error', duration: 5 * 1000 });
    });
}

onMounted(() => {
  getDetailData(props.params);
  getRainStationCharts(props.params);
  bus.on('searchRainFX', params => {
    getDetailData(params);
    getRainStationCharts(params);
  });
  bus.on('downLoadRainFX', () => {
    downloadPdf();
  });
});
onBeforeUnmount(() => {
  bus.off('searchRainFX');
  bus.off('downLoadRainFX');
});
</script>
<style lang="scss" scoped>
@import '@/assets/styles/variables.module.scss';
@import '@/assets/styles/rainReportDetail.scss';
</style>