Newer
Older
carbon-metering-front / src / components / map-bak / trendChart.vue
liyaguang on 8 Aug 2023 3 KB feat(*): 去除地图默认标记点
<!--
  Description: 节点监测趋势echarts
  Author: 李亚光
  Date: 2023-06-05
 -->
<script lang="ts" setup name="TrendChart">
import { getDeviceDetailAnalysis } from '@/api/api/index'
const props = defineProps({
  height: {
    type: Number,
    default: 400,
  },
  width: {
    type: Number,
    default: 400,
  },
  deviceId: {
    type: Number || String,
    require: true,
  },
  deviceType: {
    type: Number || String,
    require: true,
  },
})
const loading = ref(true)
const range = ref('')
const flag = ref(true)
// defineExpose({ range })
const yAxisData = ref([])
const xAxisData = ref([])
const selected = ref({})
// 获取设备监测分析
const fetchDeviceAnalysis = () => {
  loading.value = true
  xAxisData.value = []
  yAxisData.value = []
  getDeviceDetailAnalysis({
    deviceId: props?.deviceId,
    type: range.value,
  }).then((res) => {
    const data = res.data
    // 整理节点监测趋势数据-用电
    if (data.monitorTrends?.rp.length && Number(props.deviceType) === 1) {
      xAxisData.value = data.monitorTrends?.rp?.map((item: any) => item.time)
      yAxisData.value = [
        {
          name: '有功功率(MW)',
          data: data.monitorTrends?.rp?.map((item: any) => Number(item.value)),
        },
        {
          name: '无功功率(MVAr)',
          data: data.monitorTrends?.ap?.map((item: any) => Number(item.value)),
        },
      ]
    }
    // 整理节点监测趋势数据-用热/用气
    if (data.monitorTrends?.val.length && Number(props.deviceType) !== 1) {
      xAxisData.value = data.monitorTrends?.val?.map((item: any) => item.time)
      yAxisData.value = [
        {
          name: '监测值',
          data: data.monitorTrends?.val?.map((item: any) => Number(item.value)),
        },
      ]
    }
    loading.value = false
  }).catch(() => {
    xAxisData.value = []
    loading.value = false
  })
}
// 监听 监测趋势时间段 变化 重新获取数据
watch(() => props.deviceId, (newVal) => {
  if (newVal) {
    range.value = 'day'
    fetchDeviceAnalysis()
  }
  if (Number(props.deviceType) === 1) {
    selected.value = {
      '有功功率(MW)': true,
      '无功功率(MVAr)': false,
    }
  }
  else {
    selected.value = {}
  }
},
{
  deep: true,
  // immediate: true,
})
watch(() => range.value, (newVal) => {
  if (newVal) {
    fetchDeviceAnalysis()
  }
},
{
  deep: true,
  // immediate: true,
})

const expand = ref(true)
const expandChart = () => {
  expand.value = !expand.value
  if (!expand.value) {
    range.value = ''
    xAxisData.value = []
    yAxisData.value = []
    setTimeout(() => {
      range.value = 'day'
    })
  }
}
defineExpose({ range, expand, fetchDeviceAnalysis })
</script>

<template>
  <div style="padding: 10px;">
    <div class="chart-title" @click="expandChart">
      节点监测趋势
      <div class="btn">
        <el-icon v-if="expand">
          <arrow-right-bold />
        </el-icon>
        <el-icon v-else>
          <arrow-down-bold />
        </el-icon>
      </div>
    </div>
    <div v-if="!expand">
      <el-radio-group v-model="range">
        <el-radio label="day">
          日
        </el-radio>
        <el-radio label="month">
          月
        </el-radio>
        <el-radio label="year">
          年
        </el-radio>
      </el-radio-group>
      <line-chart
        v-loading="loading" :height="`${props.height}px`" :width="`${props.width}px`" :data="yAxisData"
        :x-axis-data="xAxisData" :selected="selected"
      />
    </div>
  </div>
</template>

<style lang="scss" scoped>
.chart-title {
  background-color: #ccc;
  position: relative;

  .btn {
    position: absolute;
    right: 5px;
    top: 50%;
    transform: translateY(-50%);
  }
}
</style>