罗广辉
2025-10-23 96046c5830c65a3f628bc1d49e98447960dd9d65
feat: 喊话90%
1 files modified
105 ■■■■ changed files
src/subPackages/droneConsole/index.vue 105 ●●●● patch | view | raw | blame | history
src/subPackages/droneConsole/index.vue
@@ -1,5 +1,6 @@
<template>
  <WebViewPlus :src="`${viewUrl}`" @webMessage="onPostMessage"/>
  <up-toast ref="uNotifyRef"></up-toast>
</template>
<script setup>
import {onHide, onLoad, onShow} from "@dcloudio/uni-app";
@@ -7,19 +8,21 @@
import {getWebViewUrl} from "@/utils/index.js";
import Recorder from "js-audio-recorder";
import dayjs from "dayjs";
import {startVoice, uploadSpeak} from "@/api/drone.js";
import {showToast} from "@dcloudio/uni-h5";
import {useUserStore} from "@/store/index.js";
const wayLineJodInfoId = ref(null)
const startState = ref('0')
let recorder
const soundVideoName = ref('') // 喊话名称
soundVideoName.value = `${dayjs().format('YYYYMMDDHHmmss')}实时喊话`
const droneHornState = ref('0')
const uNotifyRef = ref(null)
const viewUrl = computed(()=>{
const viewUrl = computed(() => {
  return getWebViewUrl('/DroneConsole', {
    wayLineJodInfoId: wayLineJodInfoId.value,
    startState: startState.value
    startState: startState.value,
    droneHornState: droneHornState.value
  })
})
@@ -33,50 +36,102 @@
    })
    nextTick(() => {
      recorder.start().then(() => {
        recorder.onprocess = duration => {}
        recorder.onprocess = duration => {
        }
      })
    })
  }else if (data.type === 'stopRecord') {
  } else if (data.type === 'stopRecord') {
    startState.value = '2'
    recorder.stop()
  }else if(data.type === 'trialListening'){
  } else if (data.type === 'trialListening') {
    recorder.play()
  }else if (data.type === 'resetRecording'){
  } else if (data.type === 'resetRecording') {
    startState.value = '0'
    recorder?.destroy().then(() => {
      recorder = null // 释放资源
    })
  }else if(data.type === 'pushToDrone'){
  } else if (data.type === 'pushToDrone') {
    pushToDrone(data)
  }else if(data.type === 'saveSound'){
  } else if (data.type === 'saveSound') {
    saveSound(data)
  }
}
function uploadUtil(options) {
  const {formData, file, url} = options
  return new Promise((resolve, reject) => {
    let accessToken = useUserStore()?.$state?.userInfo?.access_token;
    const file = new File([recorder.getWAVBlob()], '.wav')
    uni.uploadFile({
      url: `https://wrj.shuixiongit.com/api${url}`,
      name: 'file',
      header: {'Blade-Auth': 'bearer ' + accessToken},
      file,
      formData,
      success: (res) => {
        const resData = JSON.parse(res.data)
        if (resData.code === 200){
          resolve(res)
        }else{
          showToast(resData.message)
          reject(res)
        }
      },
      fail: (err) => {
        reject(err)
      }
    });
  })
}
function showToast(message) {
  uNotifyRef.value.show({
    type: 'default',
    message,
    // top: 10,
    // color: '#fff',
    // bgColor: '#000',
    // message,
    // duration: 1000 * 3,
    // fontSize: 20,
    // safeAreaInsetTop: true
  });
}
// 保存喊话至广播列表内
function saveSound(data) {
  const wavFile = new File([recorder.getWAVBlob()], '.wav')
  let formData = new FormData()
  formData.append('file', wavFile)
  formData.append('fileName', data.soundName)
  formData.append('sn', data.dockSn)
  uploadSpeak(formData).then(res => {
  const file = new File([recorder.getWAVBlob()], '.wav')
  uploadUtil({
    file,
    formData: {
      fileName: data.soundName,
      sn: data.dockSn
    },
    url: '/drone-device-core/speak/api/v1/uploadSpeak'
  }).then(res => {
    showToast('保存成功')
  })
}
// 无人机开始喊话
function pushToDrone(data) {
  let formData = new FormData()
  const wavBlob = recorder.getWAVBlob()
  const wavform = new File([wavBlob], new Date().getTime() + '.wav')
  formData.append('file', wavform)
  formData.append('sn', data.dockSn)
  formData.append('psdk_index', 2)
  formData.append('name', data.soundName)
  formData.append('volumn', 100)
  startVoice(formData).then(res => {
    showToast('喊话成功')
  const file = new File([wavBlob], new Date().getTime() + '.wav')
  uploadUtil({
    file,
    formData: {
      name: data.soundName,
      sn: data.dockSn,
      psdk_index: 2,
      volumn: 100,
    },
    url: '/drone-device-core/speak/api/v1/startVoice'
  }).then(res => {
    droneHornState.value = '1'
    showToast('播放成功')
  }).catch(() => {
    droneHornState.value = '0'
  })
}