zhanghua
2022-12-13 bbf5d4d6e7d9ea192f33211f9038e3302f071c03
src/views/intelligentPatrol/trendAnalysis/index.vue
@@ -1,13 +1,201 @@
<template>
  <div>趋势分析</div>
  <div class="trend-analysis">
    <!-- 侧边栏 -->
    <div class="trend-side">
      <!-- 输入区域 -->
      <div class="trend-input-area">
        <span class="trend-title">趋势分析</span>
        <el-form ref="form" :model="search" label-width="6vw">
          <el-form-item label="类型查询">
            <el-select v-model="search.type" @change="searchList" placeholder="内容信息">
              <el-option v-for="option in categoryOptions" :key="option.value" :value="option.value" :label="option.label" ></el-option>
            </el-select>
          </el-form-item>
          <el-form-item class="time-area" label="时间范围">
            <el-date-picker @change="searchList" start-placeholder="开始时间" end-placeholder="结束时间" v-model="search.timeRange"
                            type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss">
            </el-date-picker>
          </el-form-item>
        </el-form>
      </div>
      <!-- 数据展示 -->
      <div class="trend-data-show">
        <!-- 点位切换 -->
        <div class="trend-data-header">
          <el-button type="text" @click="tabChange(1)">高发点位</el-button>
          <el-button type="text" @click="tabChange(2)">首次违规点位</el-button>
        </div>
        <!-- 对应数据 -->
        <div class="trend-data-main">
          <div class="point-item" v-for="item in trendAnalysisList" :key="item.id" @click="pointClick(item)">
            <span>{{ item.name }}</span>
            <span>{{ item.count }}</span>
          </div>
        </div>
      </div>
    </div>
    <div class="trend-main">
      <div class="trend-main-echarts" id="echarts">
      </div>
    </div>
  </div>
</template>
<script>
export default {
import * as echarts from 'echarts'
import basecase from "@/api/operate/basecase";
import { CATEGOTY } from "@/utils/helper";
export default {
  created() {
    this.searchList()
  },
  mounted() {
    this.renderEchart();
  },
  computed: {
    categoryOptions() {
      return CATEGOTY;
    }
  },
  data() {
    return {
      search: {
        type: null,
        timeRange: null
      },
      timeRangeFlag: false,
      trendAnalysisList: [],
      highFlag: true,
      echarts: null,
      pointName: null
    }
  },
  methods: {
    renderEchart(dataList) {
      if (!this.echarts) {
        this.echarts = echarts.init(document.getElementById('echarts'));
      }
      // 绘制图表
      this.echarts.setOption({
        xAxis: {
          name: '日/周',
        },
        yAxis: {
          name: '报警量(次)',
        },
        series: [
          {
            data: dataList,
            type: 'line',
            smooth: true
          }
        ]
      });
    },
    async searchList() {
      const [startTime, endTime] = this.search.timeRange ?? [null, null];
      const trendAnalysisParam = {
        startTime,
        endTime,
        type: this.search.type
      }
      this.trendAnalysisList = this.highFlag ? await basecase.getTrendAnalysisData(trendAnalysisParam)
          : await basecase.getFirstTrendAnalysisData(trendAnalysisParam);
    },
    tabChange(params) {
      this.highFlag = params === 1;
      this.searchList();
    },
    pointClick(data) {
      this.pointName = data.name;
      basecase.getPointTrendAnalysisData({ id: data.id })
          .then(res => {
            const countList = res.map(item => +item.count);
            this.renderEchart(countList);
          })
          .catch(err => this.$message.error(err))
    }
  },
}
</script>
<style>
<style lang="scss" scoped>
.trend-analysis {
  height: 100%;
  padding: 10vh 10vw;
  color: #4b9bb7;
  display: flex;
  .trend-side {
    width: 30vw;
    text-align: left;
    height: 100%;
    border: 1px solid #09152f;
    .trend-input-area {
      display: flex;
      flex-direction: column;
      padding: 0 2vw;
      &>span {
        line-height: 40px;
      }
      ::v-deep .el-form {
        .el-form-item__label {
          color: #4b9bb7;
        }
      }
    }
    .trend-data-show {
      width: 100%;
      line-height: 40px;
      .trend-data-header {
        display: flex;
        .el-button {
          flex: 1;
          border: 2px solid #09152f;
        }
        .el-button+.el-button {
          margin: 0;
        }
      }
      .trend-data-main {
        .point-item {
          display: flex;
          padding: 0 2vw;
          justify-content: space-between;
        }
      }
    }
  }
  .trend-main {
    flex: 1;
    border: 1px solid #09152f;
    .trend-main-echarts {
      width: 500px;
      height: 400px;
    }
  }
  .trend-footer {
    ::v-deep .el-range-input {
      background-color: #09152f;
    }
  }
}
</style>