guoshipeng
2022-11-07 13906d0efa0d3411ee5cd4f01d086a56632ee74d
src/views/car/index.vue
@@ -1,21 +1,21 @@
<template>
  <div class="main_body">
    <el-container
      style="height: 100%"
        style="height: 100%"
    >
      <el-aside
        v-if="this.$store.state.aside"
        width="300px"
        style="background-color: rgb(238, 241, 246);padding-top:10px"
          v-if="this.$store.state.aside"
          width="300px"
          style="background-color: rgb(238, 241, 246);padding-top:10px"
      >
        <span style="font-size:13px;padding-left:10px;font-weight:500;color:rgb(64, 158, 255)">走航车设备</span>
        <el-menu style="margin-top:10px">
          <el-menu-item
            v-for="(item,index) in defaultData"
            :key="index"
            style="display: flex;justify-content: space-between;align-items: center;padding-right: 0;border-bottom:1px solid #eee"
            :index="(index+1 + '-' + index + 1).toString()"
            @click="changeCarData(item)"
              v-for="(item,index) in defaultData"
              :key="index"
              style="display: flex;justify-content: space-between;align-items: center;padding-right: 0;border-bottom:1px solid #eee"
              :index="(index+1 + '-' + index + 1).toString()"
              @click="changeCarData(item)"
          >
            <span>{{ item.name }}</span>
            <i
@@ -23,7 +23,7 @@
                class="iconfont iconfaxianzuobiao"
                @click="deviceDetail(item.mac,null,item,0)"
            />
<!--            @click="deviceDetail('p5dnd7a0245390',null,item,0)"-->
            <!--            @click="deviceDetail('p5dnd7a0245390',null,item,0)"-->
          </el-menu-item>
        </el-menu>
      </el-aside>
@@ -33,64 +33,74 @@
            <el-button size="medium" type="primary" icon="el-icon-setting" @click="dialogFormVisible = true">6参设定</el-button>
          </span>
          <span
            v-for="(item, index) in snesorParams"
            :key="index"
            class="left"
            :class="{ click: changeColor == index }"
            @click="changeCode(index)"
              v-for="(item, index) in snesorParams"
              :key="index"
              class="left"
              :class="{ click: changeColor == index }"
              @click="changeCode(index)"
          >{{ item }}
          </span>
          <span
            v-for="(item,index) in viewOptions"
            :key="index+ '-only'"
            class="right"
            :class="{ click: changeColor1 == index }"
            @click="changeCode1(index)"
              v-for="(item,index) in viewOptions"
              :key="index+ '-only'"
              class="right"
              :class="{ click: changeColor1 == index }"
              @click="changeCode1(index)"
          >{{ item }}
          </span>
          <span v-if="webSocketView" style="float:right;margin: 2px 10px 0 0;">
            <el-button size="medium" type="primary" @click="wsStart()">开启实时</el-button>
          </span>
<!--           <el-date-picker
            v-if="historyView"
            v-model="dateValue"
            value-format="yyyy-MM-dd"
            style="float:right;margin-right: 10px;line-height: 40px;"
            align="right"
            type="date"
            placeholder="选择日期"
            :picker-options="pickerOptions"
            @change="dateChange"
          />-->
          <!--           <el-date-picker
                      v-if="historyView"
                      v-model="dateValue"
                      value-format="yyyy-MM-dd"
                      style="float:right;margin-right: 10px;line-height: 40px;"
                      align="right"
                      type="date"
                      placeholder="选择日期"
                      :picker-options="pickerOptions"
                      @change="dateChange"
                    />-->
          <!-- 选择时间段 -->
          <el-time-picker
              :disabled="isDisTime"
              style="float:right;width: 210px"
              is-range
              v-model="timeValue"
              @blur="blurChange"
              range-separator="至"
              start-placeholder="开始时间"
              end-placeholder="结束时间"
              placeholder="选择时间范围">
          </el-time-picker>
          <!--          <el-time-picker-->
          <!--              :disabled="isDisTime"-->
          <!--              style="float:right;width: 210px"-->
          <!--              is-range-->
          <!--              v-model="timeValue"-->
          <!--              @blur="blurChange"-->
          <!--              range-separator="至"-->
          <!--              start-placeholder="开始时间"-->
          <!--              end-placeholder="结束时间"-->
          <!--              placeholder="选择时间范围">-->
          <!--          </el-time-picker>-->
          <!-- 历史日期选择下拉框 -->
          <el-select v-if="historyView" v-model="dateValue" placeholder="选择日期" style="float:right;line-height:40px;margin-right:10px;width:140px" @change="dateChange">
            <el-option
              v-for="item in isDataList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
              @click.native="dataChangeClick"
            />
          </el-select>
          <!--          <el-select v-if="historyView" v-model="dateValue" placeholder="选择日期" style="float:right;line-height:40px;margin-right:10px;width:140px" @change="dateChange">-->
          <!--            <el-option-->
          <!--              v-for="item in isDataList"-->
          <!--              :key="item.value"-->
          <!--              :label="item.label"-->
          <!--              :value="item.value"-->
          <!--              @click.native="dataChangeClick"-->
          <!--            />-->
          <!--          </el-select>-->
          <el-date-picker
              style="float:right;margin-right:10px;"
              @change="dateChange"
              v-model="dateValue"
              type="datetimerange"
              :picker-options="threeOptions"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期">
          </el-date-picker>
          <!-- 历史/实时切换下拉框 -->
          <el-select v-model="dataTypeValue" placeholder="数据类型" style="float:right;line-height:40px;margin-right:10px;width:103px">
            <el-option
              v-for="item in dataTypeList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
                v-for="item in dataTypeList"
                :key="item.value"
                :label="item.label"
                :value="item.value"
            />
          </el-select>
        </div>
@@ -122,17 +132,17 @@
      <!-- <el-descriptions title="设备标准值"  border>
      </el-descriptions> -->
      <div
        style="font-size: 16px;font-weight: 700;margin:10px 0 20px 0;font-size: 16px;
          style="font-size: 16px;font-weight: 700;margin:10px 0 20px 0;font-size: 16px;
    font-weight: 700;color: #303133;"
      >设备标准值</div>
      <el-table :data="sensorTableData" border>
        <el-table-column
          prop="sensorName"
          label="名称"
            prop="sensorName"
            label="名称"
        />
        <el-table-column
          prop="unit"
          label="单位"
            prop="unit"
            label="单位"
        />
        <el-table-column label="一级">
          <template slot-scope="scope">
@@ -176,6 +186,7 @@
<script>
import $ from 'jquery'
import '@/assets/icon/iconfont.css'
import requestObj from '@/utils/request'
var GPS = {
  PI: 3.14159265358979324,
  x_pi: 3.14159265358979324 * 3000.0 / 180.0,
@@ -323,7 +334,7 @@
        '平铺',
        '立体'
      ],
      dateValue: null,
      dateValue: [],
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() > Date.now()
@@ -348,6 +359,25 @@
            picker.$emit('pick', date)
          }
        }]
      },
      timeOne: '',
      threeOptions: {
        onPick: ({ maxDate, minDate }) => {
          // 最大时间 最小时间
          this.timeOne = minDate.getTime() // 当选一个日期时 就是最小日期
          // 如何你选择了两个日期了,就把那个变量置空
          if (maxDate) this.timeOne = ''
        },
        disabledDate: time => {
          if (this.timeOne) {
            const WEEK = 3 * 24 * 3600 * 1000 - 1 // 这里乘以3再减去1相当于 限制3天以内
            const minTime = this.timeOne// 三天之前
            const maxTime = this.timeOne + WEEK // 三天之后
            return time.getTime() < minTime || time.getTime() > maxTime || time.getTime() > new Date()
          } else {
            return time.getTime() > new Date()
          }
        }
      },
      sensorDate: null,
      noneData: false,
@@ -404,18 +434,25 @@
  watch: {
    dataTypeValue(n, o) {
      if (this.dataTypeValue === 'webSocket') {
        this.dateValue = null
        this.dateValue = []
        this.historyView = false
        this.webSocketView = true
      } else {
        this.dateValue = null
        this.dateValue = []
        this.historyView = true
        this.webSocketView = false
      }
    },
    dateValue(n, o) {
      if (n === null) {
        this.dateValue = []
      }
    },
    viewKey(n, o) {
      // console.log(n)
    }
    },
    deep: true,
    immediate: true
    // timeValue: {
    //   handler(newVal, oldVal) {
    //     this.sensorTime = this.newTime()
@@ -451,11 +488,31 @@
    this.newTime(this.timeValue)
    this.newDate()
    this.getCarData()
    this.$watch('carMac', () => {
      this.getMacDate()
    })
    // this.$watch('carMac', () => {
    //   this.getMacDate()
    // })
  },
  methods: {
    // 时间处理函数
    newTime2(timeArr) {
      var arr = []
      timeArr.map(v => {
        var date = new Date(v)
        var y = date.getFullYear()
        var m = date.getMonth() + 1
        m = m < 10 ? '0' + m : m
        var d = date.getDate()
        d = d < 10 ? '0' + d : d
        var h = date.getHours()
        h = h < 10 ? '0' + h : h
        var minute = date.getMinutes()
        minute = minute < 10 ? '0' + minute : minute
        var s = date.getSeconds()
        s = s < 10 ? '0' + s : s
        arr.push(y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + s)
      })
      return arr
    },
    // 跳转设备详情页
    deviceDetail(mac, item, items, indexs) {
      // console.log('这是传输过去的值')
@@ -499,14 +556,12 @@
      this.$request({
        url: '/cruiser/selectCruisers',
        method: 'get'
      }).then(res => {
        this.defaultData = res.data
        this.carMac = res.data[0].mac
      }).catch(err => {
        console.log(err)
      })
        .then(res => {
          this.defaultData = res.data
          this.carMac = res.data[0].mac
        })
        .catch(err => {
          console.log(err)
        })
    },
    // 通过mac请求设备有数据的日期
    getMacDate() {
@@ -517,21 +572,19 @@
        params: {
          mac: this.carMac
        }
      }).then(res => {
        for (let i = 0; i < res.data.length; i++) {
          // this.isDataList[i].value = res.data.data[i]
          // this.isDataList[i].label = res.data.data[i]
          // this.isDataList[i] = { value: res.data.data[i], label: res.data.data[i] }
          this.isDataList.push({
            value: res.data[i],
            label: res.data[i]
          })
        }
      }).catch(err => {
        console.log(err)
      })
        .then(res => {
          for (let i = 0; i < res.data.length; i++) {
            // this.isDataList[i].value = res.data.data[i]
            // this.isDataList[i].label = res.data.data[i]
            // this.isDataList[i] = { value: res.data.data[i], label: res.data.data[i] }
            this.isDataList.push({
              value: res.data[i],
              label: res.data[i]
            })
          }
        })
        .catch(err => {
          console.log(err)
        })
    },
    // 进行经纬度转换为距离的计算
    Rad(d) {
@@ -544,7 +597,7 @@
      var a = radLat1 - radLat2
      var b = this.Rad(lng1) - this.Rad(lng2)
      var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
        Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)))
          Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)))
      s = s * 6378.137 // EARTH_RADIUS;
      s = Math.round(s * 10000) / 10000 // 输出为公里
      // s=s.toFixed(4);
@@ -572,21 +625,10 @@
    },
    // 数据类型
    dateChange(e) {
      this.sensorDate = e;
      // if (this.view) {
      //   this.view.removeAllLayers()
      //   this.map.clearOverlays()
      //   // console.log('清除图层')
      // }
      // this.dataType = 'history'
      // // this.map = null
      // this.getStart()
    },
    // 日期选择点击事件
    dataChangeClick(e) {
      if (!this.isDisTime) {
        // 更改时间格式
        this.newTime(this.timeValue)
      if (e === null) {
        this.sensorDate = []
      } else {
        this.sensorDate = this.newTime2(e)
        if (this.view) {
          this.view.removeAllLayers()
          this.map.clearOverlays()
@@ -596,8 +638,25 @@
        // this.map = null
        this.getStart()
      }
      this.isDisTime = false
    },
    // 日期选择点击事件
    // dataChangeClick(e) {
    //   if (!this.isDisTime) {
    //     // 更改时间格式
    //     if (this.dateValue.length <= 1) {
    //       this.newTime(this.timeValue)
    //     }
    //     if (this.view) {
    //       this.view.removeAllLayers()
    //       this.map.clearOverlays()
    //       // console.log('清除图层')
    //     }
    //     this.dataType = 'history'
    //     // this.map = null
    //     this.getStart()
    //   }
    //   this.isDisTime = false
    // },
    // 时间选框失去焦点
    blurChange() {
      // 更改时间格式
@@ -625,6 +684,7 @@
      }
      that.dataType = 'webSocket'
      // 拼写URL
      // const baseUrl = `${requestObj.baseUrl}`
      var socketUrl = 'cruiserWebsocket/' + this.carMac
      // 替换http为WS
      socketUrl = socketUrl.replace('https', 'ws').replace('http', 'ws')
@@ -642,7 +702,7 @@
        var lon = parseFloat(JSON.parse(msg.data).flylon)
        if (that.msgTemp.length < 2) {
          that.msgTemp.push({ lat: lat, lon: lon })
        }
        }
        var distance = that.GetDistance(that.msgTemp[0].lat, that.msgTemp[0].lon, that.msgTemp[1].lat, that.msgTemp[1].lon)
        if (distance >= 0.05) {
          that.msgTemp.shift()
@@ -652,7 +712,6 @@
          that.msgTemp.pop()
        }
      }
    },
    // 走航车轨迹数据
    getStart() {
@@ -664,18 +723,16 @@
        this.view.removeAllLayers()
        this.map.clearOverlays()
      }
      var time1 = this.sensorDate + ' ' + this.sensorTime[0]
      var time2 = this.sensorDate + ' ' + this.sensorTime[1]
      this.$request({
        url: '/cruiser/cruiserTrajectory',
        method: 'get',
        params: {
          mac: this.carMac,
          time1,
          time2
          time1: this.sensorDate[0],
          time2: this.sensorDate[1]
        }
      }).then(res => {
        console.log(res);
        if (!res.data.length) {
          this.noneData = true
          this.loading = false
@@ -705,7 +762,6 @@
      this.loading = false
      if (this.responseJSON.length > 0) {
        this.noneData = false
        console.log(that.carMac, 'mac')
        $.each(this.responseJSON, (item, value) => {
          if (typeof (value.flylon) === 'undefined') {
            showNoPoints()
@@ -727,7 +783,7 @@
            point.a21005 = parseFloat(value.a21005).toFixed(3)
            point.a05024 = parseInt(value.a05024)
            point.a99054 = parseFloat(value.a99054).toFixed(3)
            if (value.dustld - 0 !== 0 && value.dustld - 0 < 100 && that.carMac === 'p5dnd7a0243622') {
            if (value.dustld - 0 !== 0 && value.dustld - 0 < 100 && (that.carMac === 'p5dnd7a0243622' || that.carMac === 'p5dnd7a0243625')) {
              point.dustld = 100
            } else {
              point.dustld = value.dustld - 0
@@ -765,7 +821,7 @@
        that.mapZoom = that.viewport.zoom
        that.centerPoint = that.viewport.center
        if (that.firstPlayFlag) {
              that.map.centerAndZoom(that.centerPoint, that.mapZoom)
          that.map.centerAndZoom(that.centerPoint, that.mapZoom)
          that.view = new mapvgl.View({
            map: that.map
          })
@@ -784,14 +840,14 @@
        var levels = getGrading(sensor, type, carMac)
        $.each(levels, function(index, value) {
          var color = value.color
          var data = value.data
          var data = value.data
          if (data.length > 0) {
            // 创建MapVGL图层管理器,需要使用插件mapvgl
            that.shapeLayer = new mapvgl.ShapeLayer({
              color: color, // 柱状图颜色
              enablePicked: true, // 是否可以拾取
              selectedIndex: -1, // 选中项
              selectedColor: '#ee1111', // 选中项颜色
              selectedColor: '#ee1111', // 选中项颜色
              autoSelect: true, // 根据鼠标位置来自动设置选中项
              riseTime: 1800 // 楼块初始化升起时间
            })
@@ -813,7 +869,7 @@
          var sw = getPoint(225, point.lng, point.lat, that.distance)
          var ne = getPoint(45, point.lng, point.lat, that.distance)
          var data = point[sensor]
          // 根据因子浓度变换方块颜色
          // 根据因子浓度变换方块颜色
          color = getColorAndLevel(sensor, data).color
          var polygon = new BMapGL.Polygon([
            new BMapGL.Point(sw.lng, sw.lat), // 左下角
@@ -857,7 +913,7 @@
        })
        var lineLayer = new mapvgl.LineLayer({
          color: 'red',
          width: 3,
          width: 3,
          animation: true,
          duration: 10, // 循环时间2s
          trailLength: 0.1, // 拖尾长度占间隔的0.4
@@ -1236,10 +1292,10 @@
      // point上添加label文本
      function setLabelStyle(content, point) {
        var label = new BMapGL.Label("<span class='my-maptip'>" + content + '<br /><span>', // 为lable填写内容
          {
            offset: new BMapGL.Size(-8, -10), // label的偏移量,为了让label的中心显示在点上
            position: point
          }
            {
              offset: new BMapGL.Size(-8, -10), // label的偏移量,为了让label的中心显示在点上
              position: point
            }
        )// label的位置
        var offsetSize = new BMapGL.Size(0, 0)
@@ -1354,96 +1410,96 @@
body,
html,
#map_container {
    width: 100%;
    height: 100%;
    overflow: hidden;
    margin: 0;
    z-index: 0;
    font-size: 14px;
    font-family: "微软雅黑";
  width: 100%;
  height: 100%;
  overflow: hidden;
  margin: 0;
  z-index: 0;
  font-size: 14px;
  font-family: "微软雅黑";
}
.main_body {
    border: 0;
    margin: 0;
    width: 100%;
    height: 100%;
    position: relative;
  border: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  position: relative;
}
#cpm {
    width: 300px;
    height: 100px;
    position: absolute;
    background-color: #ffffff;
    display: none;
    left: 50%;
    top: 50%;
    margin-left: -150px;
    margin-top: -50px;
    z-index: 11;
    color: #000000;
    border: 2px solid #FF7F50;
    font-size: 28px;
    line-height: 100px;
    text-align: center;
  width: 300px;
  height: 100px;
  position: absolute;
  background-color: #ffffff;
  display: none;
  left: 50%;
  top: 50%;
  margin-left: -150px;
  margin-top: -50px;
  z-index: 11;
  color: #000000;
  border: 2px solid #FF7F50;
  font-size: 28px;
  line-height: 100px;
  text-align: center;
}
.BMap_pop > img {
    top: 42px !important;
    margin-left: -10px;
  top: 42px !important;
  margin-left: -10px;
}
.BMap_pop div:nth-child(1) div {
    display: none;
  display: none;
}
.BMap_pop div:nth-child(3) {
    display: none;
  display: none;
}
.BMap_pop div:nth-child(5) {
    display: none;
  display: none;
}
.BMap_pop div:nth-child(7) {
    display: none;
  display: none;
}
.BMap_pop div:nth-child(9) {
    top: 35px !important;
    border-radius: 5px;
  top: 35px !important;
  border-radius: 5px;
}
#selectSenor {
    position: absolute;
    z-index: 1;
    left: 30px;
    top: 20px;
    font-size: 20px;
    background: lightgrey;
  position: absolute;
  z-index: 1;
  left: 30px;
  top: 20px;
  font-size: 20px;
  background: lightgrey;
}
#type {
    position: absolute;
    z-index: 1;
    left: 30px;
    top: 50px;
    font-size: 20px;
    background: lightgrey;
  position: absolute;
  z-index: 1;
  left: 30px;
  top: 50px;
  font-size: 20px;
  background: lightgrey;
}
button {
    font-size: 15px;
  font-size: 15px;
}
.sensorLevel {
    position: absolute;
    z-index: 1;
    bottom: 50px;
    left: 10px;
    width: 100px;
    height: 200px;
  position: absolute;
  z-index: 1;
  bottom: 50px;
  left: 10px;
  width: 100px;
  height: 200px;
}
.carTop {
  position: absolute;
@@ -1473,9 +1529,9 @@
  border-right: 1px solid #aaa;
}
.carTop{
    &>.left:nth-child(1){
      border-radius: 5px 0 0 5px;
    }
  &>.left:nth-child(1){
    border-radius: 5px 0 0 5px;
  }
}
.carTop {
  .left{