Newer
Older
smartwell_front / src / views / dataStatics / dataStatics.vue
<template>
  <app-container>
    <!--筛选条件-->
    <search-area size="small" @search="search">
      <search-item>
        <el-input v-model.trim="listQuery.wellCode" size="small" placeholder="点位编号" clearable />
      </search-item>
      <search-item>
        <el-select v-model="listQuery.deviceType" size="small" placeholder="监测指标" clearable>
          <el-option
            v-for="item in deviceTypeList"
            :key="item.value"
            :label="item.name"
            :value="item.value"
          />
        </el-select>
      </search-item>
    </search-area>
    <!--结果展示-->
    <div v-show="chartShow" class="chart-container">
      <el-row class="chart-tools">
        <el-col :span="21">
          <span class="chart-tool-button" @click="changeDate('today')">今日</span>
          <span class="chart-tool-button" @click="changeDate('yesterday')">昨日</span>
          <span class="chart-tool-button" @click="changeDate('sevendays')">最近7日</span>
          <span class="chart-tool-button" @click="changeDate('lastmonth')">最近30日</span>
          <el-date-picker
            v-model="timeRange"
            type="datetimerange"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            value-format="yyyy-MM-dd HH:mm:ss"
            size="small"
            @change="fetchData"
          />
        </el-col>
        <!--<el-col :span="3">-->
        <!--<el-select v-model="listQuery.deviceType" size="mini" placeholder="设备类型" clearable @change="fetchData">-->
        <!--<el-option-->
        <!--v-for="item in deviceTypeList"-->
        <!--:key="item.value"-->
        <!--:label="item.name"-->
        <!--:value="item.value"/>-->
        <!--</el-select>-->
        <!--</el-col>-->
      </el-row>
      <div class="chart-body">
        <component :is="cmpName" ref="chart" />
        <!--<liquid-data ref="chart"/>-->
        <!--<ve-line :data="chartData" :settings="chartSettings"/>-->
      </div>
    </div>
    <div v-show="!chartShow" class="introduce">
      <el-row>
        <h3>说明</h3>
        <p>该模块可以查看指定井一段时间范围内的数据(液位、燃气、有害气体、温湿度)曲线图,分析数据变化趋势。</p>
        <p>使用方法:请在上方输入框中输入要查询的完整的点位编号,选择监测指标后点击搜索按钮。默认查询7天数据。</p>
      </el-row>
      <el-row>
        <!--        <el-image-->
        <!--          :src="chartSample"-->
        <!--          style="width: 90%"-->
        <!--          fit="fill"-->
        <!--        />-->
      </el-row>
    </div>
  </app-container>
</template>

<script>
import LiquidData from './components/liquidData'
import GasData from './components/gasData'
import HarmfulData from './components/harmfulData'
import TempData from './components/tempData'
import { getDayTime } from '@/utils/dateutils'
import { getWellOne } from '@/api/well/well'

export default {
  name: 'DataStatics',
  components: { LiquidData, GasData, HarmfulData, TempData },
  data() {
    return {
      listQuery: {
        wellCode: '',
        deviceType: '',
        beginTime: '',
        endTime: ''
      },
      timeRange: [],
      deviceTypeList: [],
      chartShow: false, // 图表框是否显示
      cmpName: '',
      chartSample: require('../../assets/global_images/chartSample.png')// 左边图片
    }
  },
  mounted() {
    this.fetchDeviceType()
  },
  methods: {
    search() {
      // 验证点位编号不能为空
      if (this.listQuery.wellCode === '') {
        this.$message.error('点位编号不能为空')
        return
      }
      // 验证设备类型
      if (this.listQuery.deviceType === '') {
        this.$message.error('监测指标必选')
        return
      }
      this.fetchData()
    },
    // 获取设备类型下拉列表
    fetchDeviceType() {
      const deviceTypes = this.$store.getters.deviceTypes
      for (const device of deviceTypes) {
        if (device === '2') {
          this.deviceTypeList.push({
            name: '液位',
            value: 'liquid'
          })
        } else if (device === '3') {
          this.deviceTypeList.push({
            name: '有害气体',
            value: 'harmful'
          })
        } else if (device === '4') {
          this.deviceTypeList.push({
            name: '燃气',
            value: 'gas'
          })
        } else if (device === '5') {
          this.deviceTypeList.push({
            name: '温湿度',
            value: 'temp'
          })
        }
      }
    },
    fetchData() {
      // 首先判断闸点位编号是否存在
      const params = {
        wellCode: this.listQuery.wellCode
      }
      const that = this
      getWellOne(params).then(response => {
        if (response.data.hasWell) {
          const defaultBeginTime = getDayTime(new Date().getTime() - 24 * 7 * 60 * 60 * 1000).Format('yyyy-MM-dd hh:mm:ss')
          const defaultEndTime = new Date().Format('yyyy-MM-dd hh:mm:ss')
          if (this.timeRange.length === 0) {
            this.timeRange = [defaultBeginTime, defaultEndTime]
          }
          that.listQuery.beginTime = this.timeRange[0]
          that.listQuery.endTime = this.timeRange[1]
          if (that.checkDate(that.listQuery.beginTime, that.listQuery.endTime, 366)) { // 检查查询范围是否允许
            if (that.listQuery.deviceType === 'liquid') {
              that.cmpName = 'liquid-data'
            } else if (that.listQuery.deviceType === 'gas') {
              that.cmpName = 'gas-data'
            } else if (that.listQuery.deviceType === 'harmful') {
              that.cmpName = 'harmful-data'
            } else if (that.listQuery.deviceType === 'temp') {
              that.cmpName = 'temp-data'
            }
            that.chartShow = true
            setTimeout(() => {
              that.$refs.chart.fetchData(that.listQuery)
            }, 100)
          } else {
            that.$message.warning('查询跨度不能超过一年')
          }
        } else {
          that.$message.warning('井不存在,请确认点位编号无误')
          that.chartShow = false
        }
      })
    },
    // 检查两个日期的差是不是在某个范围内,是则返回true,否则返回false
    checkDate(date1, date2, maxDays) {
      const sdate = new Date(date1)
      const now = new Date(date2)
      const days = now.getTime() - sdate.getTime()
      const day = Math.floor(days / (1000 * 60 * 60 * 24) * 100) / 100
      if (day > maxDays) {
        return false
      } else {
        return true
      }
    },
    changeDate(date) {
      let beginTime, endTime
      if (date === 'today') {
        beginTime = getDayTime(new Date().getTime())
        endTime = new Date()
        this.timeRange = [beginTime, endTime]
      } else if (date === 'yesterday') {
        beginTime = getDayTime(new Date().getTime() - 24 * 60 * 60 * 1000)
        endTime = getDayTime(new Date().getTime())
      } else if (date === 'sevendays') {
        beginTime = getDayTime(new Date().getTime() - 24 * 7 * 60 * 60 * 1000)
        endTime = new Date()
      } else if (date === 'lastmonth') {
        beginTime = getDayTime(new Date().getTime() - 24 * 30 * 60 * 60 * 1000)
        endTime = new Date()
      }
      this.timeRange = [beginTime.Format('yyyy-MM-dd hh:mm:ss'), endTime.Format('yyyy-MM-dd hh:mm:ss')]
      this.fetchData()
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .app-container{
    padding: 15px 10px 10px 10px;
    .chart-container{
      padding:0px;
      border: 1px solid #d3dce6;
      .chart-tools{
        background-color: #f2f2f2;
        line-height: 35px;
        padding-left: 10px;
        padding-right: 5px;
        .chart-tool-button{
          padding: 5px;
          line-height: 16px;
          margin-top:5px;
          font-size:13px;
        }
        .chart-tool-button:hover{
          background-color: #8cc5ff;
          cursor: pointer;
          color:white
        }
        .chart-tool-button:active{
          background-color: #8cc5ff;
          color:white
        }
        .editor--datetimerange.el-input__inner{
          width: 300px;
        }
      }
      .chart-title{
        margin: auto;
        text-align: center;
        margin-top: 15px;
      }
      .chart-body{
        padding:15px;
        height:80%
      }
    }
    .introduce{
      color:dimgrey;
      margin: 0px 20px;
      .el-image{
        margin: 30px 10px;
      }
    }
  }
</style>