Newer
Older
safe_production_front / src / views / ycjg / ssjk / index-isc.vue
wangxitong on 16 Aug 5 KB first commit
<script lang="ts" setup name="ResourceList">
import type { Ref } from 'vue'
import { getCurrentInstance, nextTick, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { videoTree } from '@/api/ycjg/aqbb'
import { log } from '@/utils/log'
import dayjs from 'dayjs'
import { getPreviewUrl } from '@/utils/hik'
const router = useRouter()

const treeRef = ref(null)
const filterText = ref('')
const data = ref([])
const defaultProps = ref({
  children: 'children',
  label: 'name',
  isDisabled: 'disabled',
})

const { proxy } = getCurrentInstance() as any
const width = ref(0)
const height = ref(0)
const loading = ref(false)
const src = ref(['', '', '', ''])
const player = ref(null)

const resize = () => {
  const divPlugin = document.getElementById('home')
  width.value = divPlugin!.clientWidth - 40
  height.value = divPlugin!.clientHeight - 0
  if (player.value !== null) {
    player.value!.JS_Resize()
  }
}

let videoClickCount = 0

function createPlayer() {
  player.value = new window.JSPlugin({
    szId: 'player',
    szBasePath: './',
    iMaxSplit: 4,
    iCurrentSplit: 2,
    openDebug: true,
    bSupporDoubleClickFull: false,
    iWidth: width.value,
    iHeight: height.value,
    oStyle: {
      borderSelect: '#FFCC00',
    },
  })

  // 事件回调绑定
  player.value.JS_SetWindowControlCallback({
    windowEventSelect: function (iWndIndex: any) { // 插件选中窗口回调
      console.log('windowSelect callback: ', iWndIndex)
      const now = new Date().getTime()
      if (now - videoClickCount < 300) { // 双击事件的判断,300毫秒内重复点击
        page(iWndIndex)
      }
      videoClickCount = now
    },
    pluginErrorHandler: function (iWndIndex, iErrorCode, oError) {  //插件错误回调
      console.log('pluginError callback: ', iWndIndex, iErrorCode, oError);
    },
    windowEventOver: function (iWndIndex) {  //鼠标移过回调
      //console.log(iWndIndex);
    },
    windowEventOut: function (iWndIndex) {  //鼠标移出回调
      //console.log(iWndIndex);
    },
    windowEventUp: function (iWndIndex) {  //鼠标mouseup事件回调
      //console.log(iWndIndex);
    },
    windowFullCcreenChange: function (bFull) {  //全屏切换回调
      console.log('fullScreen callback: ', bFull);
    },
    firstFrameDisplay: function (iWndIndex, iWidth, iHeight) {  //首帧显示回调
      console.log('firstFrame loaded callback: ', iWndIndex, iWidth, iHeight);
    },
    performanceLack: function () {  //性能不足回调
      console.log('performanceLack callback: ');
    },
  })
}

function filterNode(value: any, data: { name: string | any[] }) {
  if (value === '' || value === null) {
    return true
  }
  return data.name.includes(value)
}

let treeClickCount = 0
let currentIndex = 0
const currentCameras = [{}, {}, {}, {}]

async function handleNodeClick(data: any, node: any, self: any) {
  const now = new Date().getTime()
  if (now - treeClickCount < 300) { // 双击事件的判断,300毫秒内重复点击
    console.log('Double click on:', data)
    if (data.device === '') { // 点击父亲
      return
    }
    const playUrl = await getPreviewUrl(data.device.cameraIndexCode)
    for (let i = 0; i < currentIndex; i++) { // 前面有
      if (src.value[i] === playUrl) {
        return
      }
    }
    // 这里处理双击事件
    if (currentIndex === 4) {
      currentIndex = 0
    }
    console.log(playUrl)
    log('实时监控预览', `${data.name}-${dayjs().format('YYYY-MM-DD HH:mm:ss')}`)
    player.value!.JS_Play(playUrl, { playURL: playUrl, mode: 0 }, currentIndex).then(
      () => { console.log('realplay success') },
      (e: any) => { console.error(e) },
    )
    src.value[currentIndex] = playUrl
    currentCameras[currentIndex] = data
    currentIndex++
  }
  treeClickCount = now
}

function page(index: any) {
  if (src.value[index] !== '') {
    router.push({
      path: '/ssjk/control',
      query: {
        id: currentCameras[index].id,
      },
    })
  }
}

const unwatch = watch(filterText, (newVal) => {
  treeRef.value.filter(newVal)
})

onBeforeUnmount(() => {
  unwatch()
  window.removeEventListener('resize', resize)
})

onMounted(() => {
  videoTree().then((response) => {
    if (response.code === 200) {
      data.value = response.data
    }
  })
  setTimeout(() => {
    window.addEventListener('resize', resize)
    resize()
    createPlayer()
  }, 1000)
})
</script>

<template>
  <app-container style="height: calc(100vh - 110px)">
    <div style="display: flex;height: 100%">
      <el-card class="left">
        <el-input
          placeholder="设备名称过滤"
          v-model="filterText">
        </el-input>
        <el-tree
          ref="treeRef"
          class="filter-tree"
          style="width: 100%;height: 100%"
          :data="data"
          :filter-node-method="filterNode"
          node-key="id"
          :default-expand-all="true"
          :props="defaultProps"
          @node-click="handleNodeClick"/>
      </el-card>
      <div id="home" class="right">
        <div id="player" :style="`width:${width}px;height:${height}px;`" style="margin: 0 10px"></div>
      </div>
    </div>
  </app-container>
</template>

<style lang="scss" scoped>
.left {
  width: 300px;
  height: 100%;
  padding: 10px;
  overflow-y: scroll;

}
.right {
  flex: 1;
  margin-left: 10px;
}
.video-container {
  display: flex;
  flex: 1;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  margin-bottom: 5px;
}
video {
  position: relative;
  object-fit: fill;
  overflow: hidden;
  background: #000;
}
</style>