Newer
Older
securityFront / src / views / ctrl / overview.vue
<template>
  <div class="main-page">
    <div class="main-header">
      <div class="main-title">
        <img src="@/assets/dashboard_images/icon-title.png">
        <span>{{ title }}</span>
      </div>
    </div>

    <div class="home-icon">
      <a @click="backToIndex">
        <img src="@/assets/global_images/home-logo.png">
      </a>
    </div>
    <div class="exit-icon">
      <a href="#" @click="logout">
        <img src="@/assets/global_images/exit-logo.png">
      </a>
    </div>

    <!-- 左上角设备状态区域 -->
    <div class="dev-status-block">
      <el-row :gutter="20" style="width: 300px">
        <el-col :span="6" class="sub-data-block">
          <div class="statis-block">
            <span class="big-size" v-text="dev.alarm"/>
          </div>
          <div class="sub-title">报警</div>
        </el-col>

        <el-col :span="6" class="sub-data-block">
          <div class="statis-block">
            <span class="big-size" v-text="dev.onLine"/>
          </div>
          <div class="sub-title">开启</div>
        </el-col>

        <el-col :span="6" class="sub-data-block">
          <div class="statis-block">
            <span class="big-size" v-text="dev.closed"/>
          </div>
          <div class="sub-title">关闭</div>
        </el-col>

        <el-col :span="6" class="sub-data-block">
          <div class="statis-block">
            <span class="big-size" v-text="dev.offLine"/>
          </div>
          <div class="sub-title">离线</div>
        </el-col>
      </el-row>
    </div>

    <!-- 左侧当前报警列表区域 -->
    <div v-show="alarmList.length > 0" class="alarm-now-block">
      <div class="map-alarm-div-header">报警列表
        <span class="icon-right" @click="tableShow=!tableShow">
          <i v-if="tableShow" class="el-icon-arrow-up"/>
          <i v-else class="el-icon-arrow-down"/>
        </span>
      </div>
      <transition name="el-collapse-transition">
        <el-scrollbar
          v-show="tableShow"
          :style="{ visibility: tableShow ? 'visible' : 'hidden'}"
          :class="{ moredatascollor: alarmList.length > 6 }"
          :native="false">
          <el-table
            :data="alarmList"
            class="alarm-list-table"
            border
            @row-click="alarmRowClick">
            <el-table-column v-for="column in alarmColumns" :key="column.value" :label="column.text" :width="column.width" :align="column.align" show-overflow-tooltip>
              <template slot-scope="scope">
                {{ scope.row[column.value] }}
              </template>
            </el-table-column>
          </el-table>
        </el-scrollbar>
      </transition>
    </div>

    <!-- 中间平面图区域 -->
    <div class="map-overview">
      <img ref="bgImg" :src="bgImageSrc" height="100%" @load="getBgImageSize">

      <div v-for="item in devList" v-show="round" :id="item.id" :key="item.id" :class="setClass(item)" @click="detailDev(item)" />

    <!--      <div v-for="key in rounds" v-show="round" :key="key" :class="setClass('round', key)" @click="detailDev(key)" />-->

    <!--      <div v-for="key in guns" v-show="gun" :key="key" :class="setClass('gun', key)" />-->

    <!--      <div v-for="key in faces" v-show="face" :key="key" :class="setClass('face', key)" />-->

    <!--      <div v-for="key in cars" v-show="car" :key="key" :class="setClass('car', key)" />-->

    <!--      <div v-for="key in perimeters" v-show="perimeter" :key="key" :class="setClass('perimeter', key)" />-->
    </div>

    <!-- 平面图区域设备类型按钮 -->
    <el-row :gutter="20" class="dev-footer">
      <el-col class="dev-icon" style="margin-left: 10vw;">
        <img src="@/assets/overview_images/icons/icon-all.png">
        <span>全部</span>
      </el-col>

      <el-col class="dev-icon" @click.native="selectDevByType('round')">
        <img src="@/assets/overview_images/icons/icon-camera.png">
        <span>球机</span>
      </el-col>

      <el-col class="dev-icon" @click.native="selectDevByType('gun')">
        <img src="@/assets/overview_images/icons/icon-gate.png">
        <span>枪机</span>
      </el-col>

      <el-col class="dev-icon" @click.native="selectDevByType('face')">
        <img src="@/assets/overview_images/icons/icon-fence.png">
        <span>人脸识别</span>
      </el-col>

      <el-col class="dev-icon" @click.native="selectDevByType('car')">
        <img src="@/assets/overview_images/icons/icon-car.png">
        <span>车牌识别</span>
      </el-col>

      <el-col class="dev-icon" @click.native="selectDevByType('perimeter')">
        <img src="@/assets/overview_images/icons/icon-temperature.png">
        <span>周界</span>
      </el-col>
    </el-row>

    <!-- 右侧平面图索引切换区域 -->
    <div class="map-tab">
      <el-button type="primary" @click="changeMap('tg_main')">园区平面图</el-button>
      <el-button type="primary" @click="changeMap('tg_3_1')">3#一层</el-button>
      <el-button type="primary" @click="changeMap('tg_4_1')">4#一层</el-button>
      <el-button type="primary" @click="changeMap('tg_4_5')">4#五层</el-button>
    </div>

    <!-- 右侧设备详情及操作区域 -->
    <div class="dev-detail-block">
      <el-row :gutter="20">
        <el-col :span="20">设备名称
          <span>{{ dataForm.name }}</span>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="20">设备编号
          <span>{{ dataForm.devcode }}</span>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="20">设备类型
          <span>{{ dataForm.typeName }}</span>
        </el-col>
      </el-row>
      <el-row :gutter="20">
        <el-col :span="20">设备型号
          <span>{{ dataForm.model }}</span>
        </el-col>
      </el-row>
      <el-row :gutter="20">
        <el-col :span="20">在线状态
          <span>{{ dataForm.onlineStatusName }}</span>
        </el-col>
      </el-row>
      <el-row v-show="isFence" :gutter="20">
        <el-col :span="20">是否开启
          <span>{{ dataForm.deviceStatusName }}</span>
        </el-col>
      </el-row>
      <el-row :gutter="20">
        <el-col :span="20">安装日期
          <span>{{ dataForm.installDate }}</span>
        </el-col>
      </el-row>
      <el-row :gutter="20">
        <el-col :span="20">安装位置
          <span>{{ dataForm.position }}</span>
        </el-col>
      </el-row>
      <el-row v-show="isDoor" :gutter="20">
        <el-col :span="12">
          <span>{{ dataForm.inOutName }}</span>
        </el-col>
      </el-row>
    </div>

  </div>
</template>

<script>
import { getProject } from '@/utils/baseConfig'
import { overviewDeviceList, overviewDeviceStatus, getDetailDevice } from '@/api/device'
import { alarmListOverview } from '@/api/alarm'
import DeviceDetail from '@/views/deviceManage/deviceDetail'
import tg_main from '../../assets/overview_images/tg/mapOverviewTg.jpg'
import tg_3_1 from '../../assets/overview_images/tg/mapOverviewTg-3-1.jpg'
import tg_4_1 from '../../assets/overview_images/tg/mapOverviewTg-4-1.jpg'
import tg_4_5 from '../../assets/overview_images/tg/mapOverviewTg-4-5.jpg'
export default {
  name: 'CtrlOverview',
  components: { DeviceDetail },
  data() {
    return {
      title: getProject().title,
      bgImageSrc: tg_main,
      devListParams: {
        picture: '1'
      },
      dev: {
        alarm: 0,
        onLine: 0,
        closed: 0,
        offLine: 0
      },
      imgSizeOriginal: {
        width: 2245,
        height: 1586
      }, // 图片原尺寸
      imgSize: {
        width: 2245,
        height: 1586
      },
      winSize: {
        width: 1440,
        height: 789
      }, // 屏幕窗口尺寸
      round: true,
      gun: true,
      face: true,
      car: true,
      perimeter: true,
      alarmList: [],
      alarmColumns: [
        {
          text: '设备编号',
          value: 'devcode',
          align: 'center'
        },
        {
          text: '报警内容',
          value: 'alarmContent',
          align: 'center'
        },
        {
          text: '报警时间',
          value: 'alarmTime',
          align: 'center'
        }
      ], // 显示列
      tableShow: true, // 是否显示告警列表
      devList: [],
      dataForm: {
        id: '', // id
        name: '', // 设备名
        devcode: '', // 设备编号
        typeName: '', // 设备类型
        model: '', // 设备型号
        onlineStatusName: '', // 在线状态
        deviceStatusName: '', // 设备状态
        position: '', // 安装位置
        installDate: '', // 安装日期
        inOutName: '' // 进出营
      }, // 表单
      isFence: false,
      isDoor: false
    }
  },
  activated() {
    this.fetchData()
    this.fetchDeviceData()
    this.fetchAlarmNowData()
  },
  mounted() {
    // this.getBgImageSize()
    // this.reDrawDevs()

    const that = this
    window.onresize = function() {
      that.getBgImageSize()
    }
  },
  methods: {
    getBgImageSize() {
      // 获取图片尺寸
      this.imgSize = {
        width: this.$refs['bgImg'].width,
        height: this.$refs['bgImg'].height
      }
      // 获取窗体尺寸
      this.winSize = {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight
      }

      this.reDrawDevs()
    },
    reDrawDevs() {
      // this.getBgImageSize()

      const halfLeft = (this.winSize.width - this.imgSize.width) / 2

      // 调整球机的设备位置
      const that = this
      this.devList.forEach(function(item) {
        const point = document.getElementById(item.id)

        if (item.x !== '' && item.y !== '') {
          point.style.position = 'absolute'
          point.style.top = item.y * that.imgSize.height / that.imgSizeOriginal.height + 'px'
          point.style.left = (item.x * that.imgSize.width / that.imgSizeOriginal.width + halfLeft) + 'px'
        } else {
          point.style.display = 'none'
        }
      })
    },
    // 获取设备状态
    fetchData() {
      overviewDeviceStatus().then(response => {
        if (response.code === 200) {
          this.dev.alarm = response.data.alarm.length
          this.dev.onLine = response.data.onLine.length
          this.dev.closed = response.data.closed.length
          this.dev.offLine = response.data.offLine.length
        }
      })
    },
    fetchDeviceData() {
      overviewDeviceList(this.devListParams).then(response => {
        if (response.code === 200) {
          this.devList = response.data
        }
      })
    },
    fetchAlarmNowData() {
      alarmListOverview().then(response => {
        if (response.code === 200) {
          this.alarmList = response.data
        } else {
          this.$message.error(response.message)
        }
      })
    },
    logout() {
      this.$store.dispatch('LogOut').then(() => {
        location.reload() // 为了重新实例化vue-router对象 避免bug
      })
    },
    backToIndex() {
      this.$router.push('/ctrl')
    },
    selectDevByType(type) {
      switch (type) {
        case 'round':
          this.round = !this.round
          break
        case 'gun':
          this.gun = !this.gun
          break
        case 'face':
          this.face = !this.face
          break
        case 'car':
          this.car = !this.car
          break
        case 'perimeter':
          this.perimeter = !this.perimeter
          break
      }
    },
    setClass(key) {
      const classObj = {}
      classObj['point'] = true
      return classObj
      // switch (type) {
      //   case 'round':
      //     classObj['point-flicker-r'] = true
      //     return classObj
      //
      //   case 'gun':
      //     classObj['point-flicker-g'] = true
      //     return classObj
      //
      //   case 'face':
      //     classObj['point-flicker-f'] = true
      //     classObj['point-cam-' + key + '-loc'] = true
      //     return classObj
      //
      //   case 'car':
      //     classObj['point-flicker-c'] = true
      //     classObj['point-cam-' + key + '-loc'] = true
      //     return classObj
      //
      //   case 'perimeter':
      //     classObj['point-flicker-p'] = true
      //     classObj['point-cam-' + key + '-loc'] = true
      //     return classObj
      // }
    },
    changeMap(index) {
      this.bgImageSrc = tg_main
      this.imgSizeOriginal = { width: 2245, height: 1586 }

      if (index === 'tg_3_1') {
        this.bgImageSrc = tg_3_1
      } else if (index === 'tg_4_1') {
        this.bgImageSrc = tg_4_1
        this.imgSizeOriginal = { width: 2218, height: 2169 }
      } else if (index === 'tg_4_5') {
        this.bgImageSrc = tg_4_5
      }
    },
    detailDev(dev) {
      getDetailDevice(dev.id).then(response => {
        if (response.code === 200) {
          this.dataForm = {
            id: dev.id,
            name: dev.name,
            devcode: dev.devcode,
            typeName: response.data.typeName,
            model: dev.model,
            onlineStatusName: response.data.onlineStatusName,
            position: dev.position,
            installDate: dev.installDate,
            inOutName: response.data.inOutName,
            deviceStatusName: response.data.deviceStatusName
          }

          // 电子围栏设备有开启字段
          if (dev.typeName.indexOf('电子围栏') >= 0) {
            this.isFence = true
          }

          // 营门设备有进出营门的标志位
          if (dev.areaId === '1') {
            this.isDoor = true
          }
        } else {
          this.$message.error(response.message)
        }
      })
    },
    alarmRowClick(dev, column, event) {

    }
  }
}
</script>

<style lang="scss" scoped>

  .main-page {
    background-size: cover;
    background-color: #023d83;
    height: 100vh;
  }

  .main-header {
    width: 100vw;
  }
  .main-title {
    height: 74px;
    text-align: center;
    padding-top: 21px;
    background: url("../../assets/overview_images/title-background-1920.png");
  }

  .main-title img {
    display: inline-block;
    margin-right: 15px;
    width: 52px;
    height: 32px;
    vertical-align: text-bottom;
  }

  .home-icon {
    width: 26px;
    height: 26px;
    position: fixed;
    left: 20px;
    top: 12px;
  }
  .exit-icon {
    width: 26px;
    height: 26px;
    position: fixed;
    right: 20px;
    top: 12px;
  }
  .home-icon img, .exit-icon img {
    width: 26px;
    height: 26px;
  }

  .main-title span {
    color: #FFFFFF;
    font-size: 32px;
    font-weight: bold;
    font-family: 'Microsoft YaHei';
  }

  .map-overview {
    margin-top: 30px;
    height: calc(90vh - 140px);
    text-align: center;
    position: relative;
  }

  .dev-status-block {
    position: absolute;
    top: 100px;
    left: 20px;
    color: #ffffff;
  }

  .alarm-now-block {
    position: absolute;
    z-index: 500;
    background-color: rgba(255, 234, 241,0.8);
    top: 150px;
    left: 20px;
    width: 280px;
    .map-alarm-div-header {
      line-height: 40px;
      width: 504px;
      padding-left: 10px;
      .icon-right {
        position: absolute;
        right: 15px;
      }
      .icon-right:hover {
        color: #409EFF;
        cursor: pointer;
      }
    }
    .el-scrollbar {
      /*height: 200px;*/
      width: 100%;
    }
    .moredatascollor {
      height: 200px;
    }
    .el-scrollbar__wrap {
      overflow-y: auto;
      overflow-x: hidden;
      margin-bottom: 0px !important;
    }
    .el-table {
      font-size: 12px;
    }
    .el-table th {
      /*background-color: rgba(255, 229, 230, 0.8);*/
      padding: 7px 0px;
    }
    .el-table td {
      /*background-color: rgba(255, 234, 241, 0.8);*/
      padding: 5px 0px;
      /*line-height: 1;*/
    }
    .el-table td:hover {
      /*background-color: rgba(255, 234, 241, 0.8);*/
    }
    .transition-box {
      margin-bottom: 10px;
      width: 200px;
      height: 100px;
      border-radius: 4px;
      background-color: #409EFF;
      text-align: center;
      color: #fff;
      padding: 40px 20px;
      box-sizing: border-box;
      margin-right: 20px;
    }
  }

  .map-tab {
    position: absolute;
    right: 30px;
    top: 100px;
    width: 100px;
    button {
      margin: 5px 0px;
    }
  }

  .dev-detail-block {
    position: absolute;
    right: 30px;
    top: 400px;
    width: 300px;
    color: #00FFFF;
    font-size: 12px;
    font-family: "Microsoft YaHei";
  }

  .dev-footer {
    position: fixed;
    bottom: 50px;
  }

  .dev-icon {
    width: calc(10vw - 5px);
    vertical-align: middle;
    border: 1px solid #00ffff;
    padding: 10px 5px !important;
    margin-left: 5px;
    cursor: pointer;
  }
  .dev-icon img {
    height: 40px;
    vertical-align:middle;
  }
  .dev-icon span {
    font-size: 14px;
    color: #00D2FF;
    line-height: 40px;
    height: 40px;
    vertical-align:middle;
    float: right;
  }

  @media(max-width: 1440px) {
    .main-title {
      height: 56px;
      padding-top: 15px;
      background: url("../../assets/overview_images/title-background-1440.png");
    }
    .main-title span {
      font-size: 24px;
    }
    .main-title img {
      margin-right: 15px;
      width: 32px;
      height: 32px;
    }

    .home-icon {
      left: 18px;
      width: 18px;
      height: 18px;
    }
    .exit-icon {
      right: 18px;
      width: 18px;
      height: 18px;
    }

    .home-icon img, .exit-icon img {
      width: 18px;
      height: 18px;
    }

    .dev-icon span {
      font-size: 12px;
    }
  }

  @media(max-width: 1366px) {
    .main-title {
      height: 53px;
      padding-top: 11px;
      background: url("../../assets/overview_images/title-background-1366.png");
    }
    .main-title span {
      font-size: 24px;
    }
    .main-title img {
      margin-right: 15px;
      width: 32px;
      height: 32px;
    }

    .home-icon {
      left: 16px;
      width: 16px;
      height: 16px;
    }
    .exit-icon {
      right: 16px;
      width: 16px;
      height: 16px;
    }

    .home-icon img, .exit-icon img {
      width: 15px;
      height: 15px;
    }

    .dev-icon span {
      font-size: 12px;
    }
  }

</style>

<style lang="scss" scoped>
  @import "../../assets/overview_scss/dev-tg-ov.scss";
  .point {
    width: 16px;
    height: 16px;
    /*background-color: lime;*/
    /*border-radius: 50%;*/
    /*z-index:9999;*/
    position: relative;
    display: inline-block;
    cursor: pointer;
    background: url("../../assets/overview_images/icons/icon-camera.png");
    background-size: contain;
  }

  /* 设置动画前颜色 */
  .point-flicker:after {
    background-color: chartreuse;
  }

  /* 设置动画后颜色 */
  .point-flicker:before {
    background-color: rgba(0, 168, 253, 0.2);
  }

  /* 设置动画 */
  .point-flicker:before,
  .point-flicker:after {
    content: '';
    width: 16px;
    height: 16px;
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -8px;
    margin-top: -8px;
    border-radius: 50%;
    /* CSS3 animation 属性 网址 */
    /* https://www.w3school.com.cn/cssref/pr_animation.asp */
    animation: warn 1.5s ease-out 0s infinite;
  }

  /* 周界部分摄像头的颜色 */
  .point-perimeter {
    @extend .point;
    background-color: #48dbfb;
  }
  .point-flicker-p:after {
    @extend .point-flicker:after;
    background-color: #48dbfb;
  }

  /* 车牌识别部分摄像头的颜色 */
  .point-car {
    @extend .point;
    background-color: #dff9fb;
  }
  .point-flicker-c:after {
    @extend .point-flicker:after;
    background-color: #dff9fb;
  }

  /* 球机部分摄像头的颜色 */
  .point-round {
    @extend .point;
    background-color: #00a8ff;
  }
  .point-flicker-r:after {
    @extend .point-flicker:after;
    background-color: #00a8ff;
  }

  /* 普通枪机部分摄像头的颜色 */
  .point-gun {
    @extend .point;
    background-color: #5352ed;
  }
  .point-flicker-g:after {
    @extend .point-flicker:after;
    background-color: #5352ed;
  }

  /* 人脸识别部分摄像头的颜色 */
  .point-face {
    @extend .point;
  }
  .point-flicker-f:after {
    @extend .point-flicker:after;
  }

  /* @keyframes 规则用于创建动画。在 @keyframes 中规定某项 CSS 样式,就能创建由当前样式逐渐改为新样式的动画效果。 */
  @keyframes warn {
    0% {
      transform: scale(0.5);
      opacity: 1;
    }

    30% {
      opacity: 1;
    }

    100% {
      transform: scale(1.4);
      opacity: 0;
    }
  }

  @media(max-width: 1440px) {
    .point-cam-loc-1440 {
      position: absolute;
    }

    /********  球机位置  ********/
    .point-cam-r1-loc {
      @extend .point-cam-loc-1440;
      top: $round-camera1-top-1440;
      left: $round-camera1-left-1440;
    }
    .point-cam-r2-loc {
      @extend .point-cam-loc-1440;
      top: $round-camera2-top-1440;
      left: $round-camera2-left-1440;
    }
    .point-cam-r3-loc {
      @extend .point-cam-loc-1440;
      top: $round-camera3-top-1440;
      left: $round-camera3-left-1440;
    }

    /********  枪机位置  ********/
    .point-cam-g1-loc {
      @extend .point-cam-loc-1440;
      top: $gun-camera1-top;
      left: $gun-camera1-left;
    }
    .point-cam-g2-loc {
      @extend .point-cam-loc-1440;
      top: $gun-camera2-top;
      left: $gun-camera2-left;
    }
    .point-cam-g3-loc {
      @extend .point-cam-loc-1440;
      top: $gun-camera3-top;
      left: $gun-camera3-left;
    }
    .point-cam-g4-loc {
      @extend .point-cam-loc-1440;
      top: $gun-camera4-top;
      left: $gun-camera4-left;
    }
    .point-cam-g5-loc {
      @extend .point-cam-loc-1440;
      top: $gun-camera5-top;
      left: $gun-camera5-left;
    }
    .point-cam-g6-loc {
      @extend .point-cam-loc-1440;
      top: $gun-camera6-top;
      left: $gun-camera6-left;
    }

    /********  人脸识别位置  ********/
    .point-cam-f1-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera1-top;
      left: $face-camera1-left;
    }
    .point-cam-f2-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera2-top;
      left: $face-camera2-left;
    }
    .point-cam-f3-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera3-top;
      left: $face-camera3-left;
    }
    .point-cam-f4-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera4-top;
      left: $face-camera4-left;
    }
    .point-cam-f5-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera5-top;
      left: $face-camera5-left;
    }
    .point-cam-f6-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera6-top;
      left: $face-camera6-left;
    }
    .point-cam-f7-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera7-top;
      left: $face-camera7-left;
    }
    .point-cam-f8-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera8-top;
      left: $face-camera8-left;
    }
    .point-cam-f9-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera9-top;
      left: $face-camera9-left;
    }
    .point-cam-f10-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera10-top;
      left: $face-camera10-left;
    }
    .point-cam-f11-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera11-top;
      left: $face-camera11-left;
    }
    .point-cam-f12-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera12-top;
      left: $face-camera12-left;
    }
    .point-cam-f13-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera13-top;
      left: $face-camera13-left;
    }
    .point-cam-f14-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera14-top;
      left: $face-camera14-left;
    }
    .point-cam-f15-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera15-top;
      left: $face-camera15-left;
    }
    .point-cam-f16-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera16-top;
      left: $face-camera16-left;
    }
    .point-cam-f17-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera17-top;
      left: $face-camera17-left;
    }
    .point-cam-f18-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera18-top;
      left: $face-camera18-left;
    }
    .point-cam-f19-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera19-top;
      left: $face-camera19-left;
    }
    .point-cam-f20-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera20-top;
      left: $face-camera20-left;
    }
    .point-cam-f21-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera21-top;
      left: $face-camera21-left;
    }
    .point-cam-f22-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera22-top;
      left: $face-camera22-left;
    }
    .point-cam-f23-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera23-top;
      left: $face-camera23-left;
    }
    .point-cam-f24-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera24-top;
      left: $face-camera24-left;
    }
    .point-cam-f25-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera25-top;
      left: $face-camera25-left;
    }
    .point-cam-f26-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera26-top;
      left: $face-camera26-left;
    }
    .point-cam-f27-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera27-top;
      left: $face-camera27-left;
    }
    .point-cam-f28-loc {
      @extend .point-cam-loc-1440;
      top: $face-camera28-top;
      left: $face-camera28-left;
    }

    /********  车牌识别位置  ********/
    .point-cam-c1-loc {
      @extend .point-cam-loc-1440;
      top: $car-camera1-top;
      left: $car-camera1-left;
    }
    .point-cam-c2-loc {
      @extend .point-cam-loc-1440;
      top: $car-camera2-top;
      left: $car-camera2-left;
    }
    .point-cam-c3-loc {
      @extend .point-cam-loc-1440;
      top: $car-camera3-top;
      left: $car-camera3-left;
    }
    .point-cam-c4-loc {
      @extend .point-cam-loc-1440;
      top: $car-camera4-top;
      left: $car-camera4-left;
    }

    /********  周界位置  ********/
    .point-cam-p1-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera1-top;
      left: $perimeter-camera1-left;
    }
    .point-cam-p2-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera2-top;
      left: $perimeter-camera2-left;
    }
    .point-cam-p3-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera3-top;
      left: $perimeter-camera3-left;
    }
    .point-cam-p4-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera4-top;
      left: $perimeter-camera4-left;
    }
    .point-cam-p5-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera5-top;
      left: $perimeter-camera5-left;
    }
    .point-cam-p6-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera6-top;
      left: $perimeter-camera6-left;
    }
    .point-cam-p7-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera7-top;
      left: $perimeter-camera7-left;
    }
    .point-cam-p8-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera8-top;
      left: $perimeter-camera8-left;
    }
    .point-cam-p9-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera9-top;
      left: $perimeter-camera9-left;
    }
    .point-cam-p10-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera10-top;
      left: $perimeter-camera10-left;
    }
    .point-cam-p11-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera11-top;
      left: $perimeter-camera11-left;
    }
    .point-cam-p12-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera12-top;
      left: $perimeter-camera12-left;
    }
    .point-cam-p13-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera13-top;
      left: $perimeter-camera13-left;
    }
    .point-cam-p14-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera14-top;
      left: $perimeter-camera14-left;
    }
    .point-cam-p15-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera15-top;
      left: $perimeter-camera15-left;
    }
    .point-cam-p16-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera16-top;
      left: $perimeter-camera16-left;
    }
    .point-cam-p17-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera17-top;
      left: $perimeter-camera17-left;
    }
    .point-cam-p18-loc {
      @extend .point-cam-loc-1440;
      top: $perimeter-camera18-top;
      left: $perimeter-camera18-left;
    }
  }

  @media(max-width: 1366px) {
    .point-cam-loc-1366 {
      position: absolute;
    }

    /********  球机位置  ********/
    .point-cam-r1-loc {
      @extend .point-cam-loc-1366;
      top: $round-camera1-top-1366;
      left: $round-camera1-left-1366;
    }
    .point-cam-r2-loc {
      @extend .point-cam-loc-1366;
      top: $round-camera2-top-1366;
      left: $round-camera2-left-1366;
    }
    .point-cam-r3-loc {
      @extend .point-cam-loc-1366;
      top: $round-camera3-top-1366;
      left: $round-camera3-left-1366;
    }
  }
</style>