zhanghua
2022-12-13 bbf5d4d6e7d9ea192f33211f9038e3302f071c03
src/views/intelligentPatrol/trendAnalysis/index.vue
@@ -7,10 +7,14 @@
        <span class="trend-title">趋势分析</span>
        <el-form ref="form" :model="search" label-width="6vw">
          <el-form-item label="类型查询">
            <el-input v-model="search.type" placeholder="内容信息"></el-input>
            <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 label="时间范围">
            <el-input v-model="search.timeRange" suffix-icon="el-icon-date" placeholder="选择时间范围"></el-input>
          <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>
@@ -18,70 +22,107 @@
      <div class="trend-data-show">
        <!-- 点位切换 -->
        <div class="trend-data-header">
          <el-button type="text">高发点位</el-button>
          <el-button type="text">首次违规点位</el-button>
          <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="high-point">
            <div class="point-item" v-for="item in highList" :key="item.id">
              <span>{{ item.pointName }}</span>
              <span>{{ item.count }}</span>
            </div>
          <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>
    <div class="trend-footer" v-if="timeRangeFlag">
      <!-- 选择时间范围 -->
      <div class="time-area">
        <el-date-picker v-model="search.timeRange" type="datetimerange" range-separator="至" start-placeholder="开始日期"
          end-placeholder="结束日期">
        </el-date-picker>
    <div class="trend-main">
      <div class="trend-main-echarts" id="echarts">
      </div>
    </div>
  </div>
</template>
<script>
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: '',
        timeRange: ''
        type: null,
        timeRange: null
      },
      timeRangeFlag: false,
      highList: [
        {
          id: 1,
          pointName: '后庆路200号-球',
          count: '100次',
        },
        {
          id: 2,
          pointName: '后庆路200号-球',
          count: '100次',
        },
        {
          id: 3,
          pointName: '后庆路200号-球',
          count: '100次',
        },
        {
          id: 4,
          pointName: '后庆路200号-球',
          count: '100次',
        },
        {
          id: 5,
          pointName: '后庆路200号-球',
          count: '100次',
        },
      ]
      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>
@@ -91,15 +132,18 @@
  padding: 10vh 10vw;
  color: #4b9bb7;
  display: flex;
  .trend-side {
    width: 20vw;
    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;
      }
@@ -114,31 +158,40 @@
    .trend-data-show {
      width: 100%;
      line-height: 40px;
      .trend-data-header{
      .trend-data-header {
        display: flex;
        .el-button{
        .el-button {
          flex: 1;
          border: 2px solid #09152f;
        }
        .el-button+.el-button{
        .el-button+.el-button {
          margin: 0;
        }
      }
      .trend-data-main {
        .high-point {
          .point-item {
            display: flex;
            padding: 0 2vw;
            justify-content: space-between;
          }
        .point-item {
          display: flex;
          padding: 0 2vw;
          justify-content: space-between;
        }
      }
    }
  }
  .trend-main{
  .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;