阶段性代码提交

This commit is contained in:
WORK\64751 2025-08-26 18:59:21 +08:00
parent 4b3804fce8
commit a1770d8544
11 changed files with 423 additions and 81 deletions

2
components.d.ts vendored
View File

@ -16,9 +16,11 @@ declare module 'vue' {
APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
AProgress: typeof import('ant-design-vue/es')['Progress']
ARadio: typeof import('ant-design-vue/es')['Radio']
ARadioButton: typeof import('ant-design-vue/es')['RadioButton']
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
ARow: typeof import('ant-design-vue/es')['Row']
ASpin: typeof import('ant-design-vue/es')['Spin']
ASwitch: typeof import('ant-design-vue/es')['Switch']
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
ElButton: typeof import('element-plus/es')['ElButton']
ElCol: typeof import('element-plus/es')['ElCol']

View File

@ -83,3 +83,11 @@ export async function getAirWayPointsToJson(url) {
return mapPointList
}
}
//获取天气
export function getweatherApi(params) {
return request({
url: `/api/airportLog/getCallback`,
method: 'get',
params: params,
})
}

21
src/apis/droneCommand.js Normal file
View File

@ -0,0 +1,21 @@
//无人机指令
import request from '@/utils/request'
import axios from 'axios'
//检查无人机状态
export function checkAirportRunStatusApi(params) {
return request({
url: `/api/airport/queryAirportRunStatus`,
method: 'get',
params: params,
})
}
//指令操作
export function droneCommandExecuteApi(data) {
return request({
url: `/api/command/droneCommandExecute`,
method: 'post',
data,
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -41,7 +41,7 @@ if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
id_token:
'eyJraWQiOiI3M2I5NTI0Ni02NjI2LTQ3N2YtYWFmYS1kMDJiODFhNjFkZmYiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjc2FkbWluIiwiYXVkIjoidHVvaGVuZy1haXJwb3J0LWFkbWluIiwicm9sZSI6WyJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tbXAiLCJ0dW9oZW5nLXBpbG90LW1wIiwidHVvaGVuZy13YXRlcndheS1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLW1wIiwidHVvaGVuZy1haXJwb3J0U2NyZWVuLWFkbWluIiwidHVvaGVuZy1kbXAtbXAiLCJ0dW9oZW5nLWZseXBvcnRhbC1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLWFkbWluIiwidHVvaGVuZy1oaHotYWRtaW4iLCJ0dW9oZW5nLWhoei1tcCIsInR1b2hlbmctZnJlZXdheS1hZG1pbiIsInR1b2hlbmctd2VwdHNwLW1wIiwidHVvaGVuZy1waWxvdC1hZG1pbiIsInR1b2hlbmctc3BhY2V0aW1lLWFkbWluIiwidHVvaGVuZy1hbGVydC1tcCIsInR1b2hlbmctYnVzaW5lc3MtYWRtaW4iLCJ0dW9oZW5nLWJ1c2luZXNzLW1wIiwidHVvaGVuZy13ZXB0c3AtYWRtaW4iLCJ0dW9oZW5nLWFpcm1vbml0b3ItbXAiLCJ0dW9oZW5nLWFpcnBvcnQtbXAiLCJ0dW9oZW5nLWFpcm1vbml0b3ItYWRtaW4iLCJ0dW9oZW5nLWFsZXJ0LWFkbWluIiwidHVvaGVuZy1haXJwb3J0LWFkbWluIiwidHVvaGVuZy13YXRlcndheS1tcCIsInR1b2hlbmctZnJlZXdheS1tcCIsInR1b2hlbmctZG1wLWFkbWluIiwidHVvaGVuZy1zcGFjZXRpbWUtbXAiXSwiYXpwIjoidHVvaGVuZy1haXJwb3J0LWFkbWluIiwiaXNzIjoiaHR0cHM6XC9cL2xvZ2luLXRlc3QudC1hYXJvbi5jb20iLCJleHAiOjE3NTUwNzA3MjMsImlhdCI6MTc1NTA2ODkyM30.deCJZsyu2dgLrbl-rnnoYTBhZD59zUJoLzFkadL7m_RJ_jWlvQvLXjQn2h0tuba0HRN7ZT2COVmNxTgLLATbdJU2SQ-_wVt30XwyX1hauDV1DALzdk5UiRelP2lIJlPWZKhpqMX52gYsGZXyliErbORBLMc_920vTZDHKeuiriuODXlT7__5MnKFTCGXDegZRPALY7kLwpQfL4DSn3ILeSGMIqU7dPx3kM4CV1iIJs2f2jEZT4HOzXy51o_GjCW7enY2qWERRfvsLIX8a8DPg0YvN-j3AHoUoKWYX_1ZCmD3eGHhqQbEvZsLJV2J6MlwF6eZOkz08M-mdkyU2_Trpg',
access_token:
'eyJraWQiOiI3M2I5NTI0Ni02NjI2LTQ3N2YtYWFmYS1kMDJiODFhNjFkZmYiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjc2FkbWluIiwiaXNBYmxlIjoxLCJpc3MiOiJodHRwczpcL1wvbG9naW4tdGVzdC50LWFhcm9uLmNvbSIsImF1ZCI6InR1b2hlbmctYWlycG9ydC1hZG1pbiIsIm5iZiI6MTc1NjA4MjkxNiwib1VzZXJJZCI6NTQzLCJzY29wZSI6WyJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tbXAiLCJ0dW9oZW5nLXBpbG90LW1wIiwidHVvaGVuZy13YXRlcndheS1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLW1wIiwidHVvaGVuZy1haXJwb3J0U2NyZWVuLWFkbWluIiwidHVvaGVuZy1kbXAtbXAiLCJ0dW9oZW5nLWZseXBvcnRhbC1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLWFkbWluIiwidHVvaGVuZy1oaHotYWRtaW4iLCJ0dW9oZW5nLWhoei1tcCIsInR1b2hlbmctZnJlZXdheS1hZG1pbiIsInR1b2hlbmctd2VwdHNwLW1wIiwidHVvaGVuZy1waWxvdC1hZG1pbiIsInR1b2hlbmctc3BhY2V0aW1lLWFkbWluIiwidHVvaGVuZy1hbGVydC1tcCIsInR1b2hlbmctYnVzaW5lc3MtYWRtaW4iLCJ0dW9oZW5nLWJ1c2luZXNzLW1wIiwidHVvaGVuZy13ZXB0c3AtYWRtaW4iLCJ0dW9oZW5nLWFpcm1vbml0b3ItbXAiLCJ0dW9oZW5nLWFpcnBvcnQtbXAiLCJ0dW9oZW5nLWFpcm1vbml0b3ItYWRtaW4iLCJ0dW9oZW5nLWFsZXJ0LWFkbWluIiwidHVvaGVuZy1haXJwb3J0LWFkbWluIiwidHVvaGVuZy13YXRlcndheS1tcCIsInR1b2hlbmctZnJlZXdheS1tcCIsInR1b2hlbmctZG1wLWFkbWluIiwidHVvaGVuZy1zcGFjZXRpbWUtbXAiXSwiY2xpZW50Um9sZUxpc3QiOiJbe1wiY2xpZW50SWRcIjpcInR1b2hlbmctZmx5cG9ydGFsLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1idXNpbmVzcy1tcFwiLFwicm9sZUlkXCI6MTE0NX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYnVzaW5lc3MtYWRtaW5cIixcInJvbGVJZFwiOjExNDV9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXNwYWNldGltZS1hZG1pblwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctc3BhY2V0aW1lLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1oaHotYWRtaW5cIixcInJvbGVJZFwiOjEwMDN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWhoei1tcFwiLFwicm9sZUlkXCI6MTAwM30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctd2F0ZXJ3YXktYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXdhdGVyd2F5LW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1kbXAtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWRtcC1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWlycG9ydC1hZG1pblwiLFwicm9sZUlkXCI6NjYzfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJwb3J0LW1wXCIsXCJyb2xlSWRcIjo2NjN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFsZXJ0LWFkbWluXCIsXCJyb2xlSWRcIjoyN30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWxlcnQtbXBcIixcInJvbGVJZFwiOjI3fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtYWRtaW5cIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtbXBcIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy10ZWxlY29tdW1hbGUtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXRlbGVjb211bWFsZS1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctcGlsb3QtbXBcIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXBpbG90LWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1mcmVld2F5LW1wXCIsXCJyb2xlSWRcIjo1OH0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctZnJlZXdheS1hZG1pblwiLFwicm9sZUlkXCI6NTh9XSIsImV4cCI6MTc1NjE2OTMxNiwiaXNFeHBpcmUiOjEsImlhdCI6MTc1NjA4MjkxNiwidXNlcm5hbWUiOiJjc2FkbWluIn0.cU4vIbNjPppa9Mvyhc5uFXcVHum8xjf-B3HTjHuI8M_smFlUsOj8WFoLkxrB0GZmX_8fspxlcXoQaQ0ukFk1jF1Eyn1upL5mKVi8y_PCZPKJzXGU-67U2pA3MMWrztGQEmmDn_zi33Qi8BiG4cqB9nfqj4cqes50Nrq_LNPCgLjAcnfnYnZss9--3-SQqD15rLT7juVj9GfBhIphtVtAXoaftsQiccEW8NXTUH49Knpw8YlhTWN4Ibi92sQ353EcCVAqZ1iDuqlX4WcT4IRRzz5y248Bbp6R-lbJm92NjhAeQepb67io7muSAOrpTDZ2cfgd0bUCwooCD-QixNxWNw',
'eyJraWQiOiI3M2I5NTI0Ni02NjI2LTQ3N2YtYWFmYS1kMDJiODFhNjFkZmYiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjc2FkbWluIiwiaXNBYmxlIjoxLCJpc3MiOiJodHRwczpcL1wvbG9naW4tdGVzdC50LWFhcm9uLmNvbSIsImF1ZCI6InR1b2hlbmctYWlycG9ydC1hZG1pbiIsIm5iZiI6MTc1NjE5MjU5Mywib1VzZXJJZCI6NTQzLCJzY29wZSI6WyJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tbXAiLCJ0dW9oZW5nLXBpbG90LW1wIiwidHVvaGVuZy13YXRlcndheS1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLW1wIiwidHVvaGVuZy1haXJwb3J0U2NyZWVuLWFkbWluIiwidHVvaGVuZy1kbXAtbXAiLCJ0dW9oZW5nLWZseXBvcnRhbC1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLWFkbWluIiwidHVvaGVuZy1oaHotYWRtaW4iLCJ0dW9oZW5nLWhoei1tcCIsInR1b2hlbmctZnJlZXdheS1hZG1pbiIsInR1b2hlbmctd2VwdHNwLW1wIiwidHVvaGVuZy1waWxvdC1hZG1pbiIsInR1b2hlbmctc3BhY2V0aW1lLWFkbWluIiwidHVvaGVuZy1hbGVydC1tcCIsInR1b2hlbmctYnVzaW5lc3MtYWRtaW4iLCJ0dW9oZW5nLWJ1c2luZXNzLW1wIiwidHVvaGVuZy13ZXB0c3AtYWRtaW4iLCJ0dW9oZW5nLWFpcm1vbml0b3ItbXAiLCJ0dW9oZW5nLWFpcnBvcnQtbXAiLCJ0dW9oZW5nLWFpcm1vbml0b3ItYWRtaW4iLCJ0dW9oZW5nLWFsZXJ0LWFkbWluIiwidHVvaGVuZy1haXJwb3J0LWFkbWluIiwidHVvaGVuZy13YXRlcndheS1tcCIsInR1b2hlbmctZnJlZXdheS1tcCIsInR1b2hlbmctZG1wLWFkbWluIiwidHVvaGVuZy1zcGFjZXRpbWUtbXAiXSwiY2xpZW50Um9sZUxpc3QiOiJbe1wiY2xpZW50SWRcIjpcInR1b2hlbmctZmx5cG9ydGFsLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1idXNpbmVzcy1tcFwiLFwicm9sZUlkXCI6MTE0NX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYnVzaW5lc3MtYWRtaW5cIixcInJvbGVJZFwiOjExNDV9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXNwYWNldGltZS1hZG1pblwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctc3BhY2V0aW1lLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1oaHotYWRtaW5cIixcInJvbGVJZFwiOjEwMDN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWhoei1tcFwiLFwicm9sZUlkXCI6MTAwM30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctd2F0ZXJ3YXktYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXdhdGVyd2F5LW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1kbXAtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWRtcC1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWlycG9ydC1hZG1pblwiLFwicm9sZUlkXCI6NjYzfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJwb3J0LW1wXCIsXCJyb2xlSWRcIjo2NjN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFsZXJ0LWFkbWluXCIsXCJyb2xlSWRcIjoyN30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWxlcnQtbXBcIixcInJvbGVJZFwiOjI3fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtYWRtaW5cIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtbXBcIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy10ZWxlY29tdW1hbGUtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXRlbGVjb211bWFsZS1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctcGlsb3QtbXBcIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXBpbG90LWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1mcmVld2F5LW1wXCIsXCJyb2xlSWRcIjo1OH0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctZnJlZXdheS1hZG1pblwiLFwicm9sZUlkXCI6NTh9XSIsImV4cCI6MTc1NjI3ODk5MywiaXNFeHBpcmUiOjEsImlhdCI6MTc1NjE5MjU5MywidXNlcm5hbWUiOiJjc2FkbWluIn0.gsi2ikNb2s-X4mpePoQfrSv-Z7j-fyXdVCR00EbvJDIhzy3cXbWF59blPF5KX3h2hFtbLeb37UxeTOvXIYSx0cuRAPGoe5IIznTmy8yWkRLrEH4LKLdBYqRDKLerTOFLfrQ3C5I87ziFNGwlaGWlFSokf4rFbcaBX9pSTu9OECJUSd1sb-bfliaN9XbxXnEfjdBpbjD_PF-r6utqveyzgOR5r8rgguCz0BZ6aUYLDhpUa7elAh6GR9i0l5sdYIiGjhN4JJ1362C8V8EZDoiWFO8SgPqjznNceUwZ8Kkd-7hDjnBfHaX0mONai78vihN2-pm1C5bKFmJ8da35iarilA',
refresh_token:
'HNyAXnoDhR2kgjXUSVwqMldvgzazvaY3tVlCodSiDon7fA7P8Ci3BMsnk31cjeSKwcbsPzUaMdCdBilBhSqQ1dZLk-Md-ERqh5mbbeu7rJDWX4MexO0eKtRBwz-mbnbR',
token_type: 'Bearer',

View File

@ -106,7 +106,7 @@ onUnmounted(() => {
<span v-if="processStatus == 'success' && precent == 100" class="success_text">SUCCESS</span>
<span v-if="processStatus == 'error'" class="fail_text">FAILED</span>
<a-spin :indicator="indicator" v-if="processStatus == null" />
<a-spin :indicator="indicator" v-if="precent != 100" />
</div>
<a-progress :percent="precent" :show-info="false" trailColor="#ffffff" />

View File

@ -14,14 +14,23 @@ import {
import { useAirPortSocketStore } from '@/stores/airportSocket.js'
const ScreenComp = defineAsyncComponent(() => import('@/views/carbin/toolComp/screen.vue'))
const emits = defineEmits(['switchView'])
const props = defineProps({
big_area_showType: String,
})
const emits = defineEmits(['switchView', 'switchScreenVideo'])
const airPortSocketStore = useAirPortSocketStore()
let size1Img = ref(new URL(`@/assets/icons/size1active.png`, import.meta.url).href)
let size2Img = ref(new URL(`@/assets/icons/size2.png`, import.meta.url).href)
let viewMode = ref(1) //1-1/4 2-
let littleViewMode = ref(1) //1- 2- 3-
let littleViewModeName = ref('舱外画面')
let littleViewMode = ref(2) //1- 2- 3-
let littleViewModeName = ref('舱内画面')
//
let planeAlt = 0
//
let isModifedSmallScreen = ref(false)
let planeStateList = reactive({
vspeed: {
id: 1,
@ -76,6 +85,7 @@ let planeStateList = reactive({
value: '-',
content: '无人机<br>偏航角',
touch: false,
unit: '°',
},
camerapitch: {
id: 7,
@ -84,6 +94,7 @@ let planeStateList = reactive({
value: '-',
content: '云台<br>俯仰角',
touch: false,
unit: '°',
},
camerayaw: {
id: 8,
@ -92,6 +103,7 @@ let planeStateList = reactive({
value: '-',
content: '云台<br>偏航角',
touch: false,
unit: '°',
},
})
let selectedAirPort = ref(1)
@ -117,35 +129,75 @@ const switchPlaneVideo = (viewtype) => {
switch (viewtype) {
case 1:
littleViewModeName.value = '舱外画面'
small_area_showType.value = 'video_out'
break
case 2:
littleViewModeName.value = '舱内画面'
small_area_showType.value = 'video_in'
break
case 3:
littleViewModeName.value = '无人机画面'
small_area_showType.value = 'video_plane'
break
default:
break
}
}
///
const switch_screen_fn = () => {
let current_small_area_showType = toRaw(small_area_showType.value)
if (props.big_area_showType == 'video_out') {
littleViewModeName.value = '舱外画面'
littleViewMode.value = 1
} else if (props.big_area_showType == 'video_in') {
littleViewModeName.value = '舱内画面'
littleViewMode.value = 2
} else if (props.big_area_showType == 'video_plane') {
littleViewModeName.value = '无人机画面'
littleViewMode.value = 3
}
small_area_showType.value = props.big_area_showType
emits('switchScreenVideo', current_small_area_showType)
// if(small_area_showType.value=='')
}
//socket
const setCurrentData = (data) => {
// console.log(data)
// console.log(data.alt)
if (data.alt > 0 && !isModifedSmallScreen) {
//
littleViewMode.value = 1
littleViewModeName.value = '舱外画面'
small_area_showType.value = 'video_in'
//
isModifedSmallScreen.value = true
}
//
// planeAlt = data.alt ? data.alt : 0
//
planeStateList.vspeed.value = data.vspeed
planeStateList.vspeed.value = Number(data.vspeed) ? Number(data.vspeed).toFixed(1) : '-'
//
planeStateList.hspeed.value = data.hspeed
planeStateList.hspeed.value = Number(data.hspeed) ? Number(data.hspeed).toFixed(1) : '-'
//
planeStateList.distToHome.value = data.distToHome
planeStateList.distToHome.value = Number(data.distToHome)
? Number(data.distToHome).toFixed(1)
: '-'
//
planeStateList.altitude.value = data.altitude
planeStateList.altitude.value = Number(data.altitude) ? Number(data.altitude).toFixed(1) : '-'
//
planeStateList.pitch.value = data.pitch
planeStateList.pitch.value = Number(data.pitch) ? Number(data.pitch).toFixed(1) : '-'
//
planeStateList.yaw.value = data.yaw
planeStateList.yaw.value = Number(data.yaw) ? Number(data.yaw).toFixed(1) : '-'
//
planeStateList.camerapitch.value = data.camerapitch
planeStateList.camerapitch.value = Number(data.camerapitch)
? Number(data.camerapitch).toFixed(1)
: '-'
//
planeStateList.camerayaw.value = data.camerayaw
planeStateList.camerayaw.value = Number(data.camerayaw) ? Number(data.camerayaw).toFixed(1) : '-'
}
//
@ -240,6 +292,7 @@ airPortSocketStore.$subscribe((mutate, state) => {
</div>
<div
class="w-[26px] h-[24px] bg-[rgba(25,27,36,0.59)] border border-[#191B24] rounded-sm text-center"
@click="switch_screen_fn"
>
<span
class="iconfont icon-qiehuan text-[#ffffff] cursor-pointer"
@ -285,9 +338,9 @@ airPortSocketStore.$subscribe((mutate, state) => {
v-html="item.content"
></span>
<span class="absolute bottom-0.5 left-0 right-0 m-auto text-[#ffffff]">{{
item.value
}}</span>
<span class="absolute bottom-0.5 left-0 right-0 m-auto text-[#ffffff]"
>{{ item.value }}<span v-if="item.value != '-'">{{ item.unit }}</span></span
>
</div>
</a-col>
</a-row>

View File

@ -1,5 +1,6 @@
<script setup>
import { ref, defineAsyncComponent, onMounted, watch, toRaw, defineProps, reactive } from 'vue'
import { message } from 'ant-design-vue'
import { useAirPortSocketStore } from '@/stores/airportSocket.js'
//-
const ScreenComp = defineAsyncComponent(() => import('@/views/carbin/toolComp/screen.vue'))
@ -24,7 +25,13 @@ const rightSwitchVideo = defineAsyncComponent(
//
const planeControl = defineAsyncComponent(() => import('@/views/carbin/toolComp/planeControl.vue'))
//
import { queryAirportApi, queryAirLineApi, getAirWayPointsToJson } from '@/apis/common'
import {
queryAirportApi,
queryAirLineApi,
getAirWayPointsToJson,
getweatherApi,
} from '@/apis/common'
import { checkAirportRunStatusApi, droneCommandExecuteApi } from '@/apis/droneCommand.js'
let leftPlaneWidth = ref('25%')
let rightPlaneWidth = ref('75%')
@ -43,6 +50,12 @@ const airPortSocketStore = useAirPortSocketStore()
let isUsedSocket = ref(false)
//
let statelliteCount = ref(0)
let taskStatus = ref('continue')
//
let command5 = ref(false)
//timeout
let weatherTimeOut = null
//
let currentAirPortInfo = ref(null)
@ -79,6 +92,11 @@ const switchViewFn = (viewPrecent) => {
}
sendGisMessage(params)
}
//
const bottom_switchScreenVideo = (smallVideoType) => {
big_area_showType.value = smallVideoType
}
//线
const queryAirLine_AirPort = async () => {
let params = {
@ -148,6 +166,7 @@ const queryAirPort = async () => {
if (res.code == 0) {
currentAirPortInfo.value = res.data[0]
airPortSocketStore.ceurrentAirPortData = currentAirPortInfo.value
// console.log(currentAirPortInfo.value)
// currentAirPortInfo.value.status = 2
@ -162,12 +181,26 @@ const queryAirPort = async () => {
resetScreen()
}
console.log('现在的状态是:', currentAirPortStatus.value, statusList[currentAirPortStatus.value])
}
//
setTimeout(() => {
queryAirPort()
}, 6000)
}
//
// const getweatherFn = async () => {
// let params = {
// topic: `/v1/${edgeId}/data/WTH`,
// }
// let res = await getweatherApi(params)
// if (res.code == 0) {
// }
// weatherTimeOut = setTimeout(() => {
// getweatherFn()
// }, 30000)
// }
//socket线
const socketFn = (workParams) => {
//线,使type:moduleworkerimportjs
@ -176,6 +209,15 @@ const socketFn = (workParams) => {
worker.onmessage = function (event) {
//线Worker
let data = JSON.parse(event.data)
//
if (currentAirPortStatus.value == 2) {
if (data.alt > 0) {
//gis
sendPosToPlane(data)
}
}
currentAirPortSocket.value = data
//pinia
airPortSocketStore.currentAirPort = data
@ -187,76 +229,60 @@ const socketFn = (workParams) => {
//iframe map
const iframeLoaded = (iframeContent) => {
setTimeout(() => {
map_iframeContent = iframeContent
let data = JSON.stringify(iframeData)
console.log(iframeContent)
iframeContent.postMessage(data, '*')
}, 0)
//
// setTimeout(() => {
// sendPosToPlane()
// }, 2000)
}
//
const sendPosToPlane = () => {
const sendPosToPlane = (socketData) => {
if (currentAirPortStatus.value != 2) {
return
}
// console.log('..................................')
let pathArr = iframeData.flyPath
let len = pathArr.length
let startCount = 0
// console.log(pathArr)
//lngLat
//alt
function sendPosFn() {
if (startCount >= len) {
startCount = 0
}
// console.log(':', startCount)
let t = {
currentPos: 1, //
currentPos_lon: pathArr[startCount].lngLat[0],
currentPos_lat: pathArr[startCount].lngLat[1],
currentPos_height: pathArr[startCount].alt,
}
let data = JSON.stringify(t)
// console.log(data)
map_iframeContent.postMessage(data, '*')
startCount++
setTimeout(() => {
sendPosFn()
}, 2000)
// let pathArr = iframeData.flyPath
let virturalDrive_iframe = document.getElementById('virturalDrive_iframe_full')
if (!virturalDrive_iframe) {
return
}
let contentWindow = document.getElementById('virturalDrive_iframe_full').contentWindow
let t = {
currentPos: 1, //
currentPos_lon: socketData.lon,
currentPos_lat: socketData.lat,
currentPos_height: socketData.alt,
}
let data = JSON.stringify(t)
// console.log(data)
if (contentWindow) {
contentWindow.postMessage(data, '*')
}
sendPosFn()
}
//gis
const sendGisMessage = (params) => {
let contentWindow = document.getElementById('virturalDrive_iframe_full').contentWindow
let data = JSON.stringify(params)
console.log(data)
map_iframeContent.postMessage(data, '*')
// console.log(data)
contentWindow.postMessage(data, '*')
}
//screen
const resetScreen = () => {
if (currentAirPortStatus.value == 3 || currentAirPortStatus.value == 2) {
//
if (currentAirPortStatus.value == 1) {
//
big_area_showType.value = 'map'
leftPlaneWidth.value = '25%'
rightPlaneWidth.value = '75%'
} else if (currentAirPortStatus.value == 3) {
//
big_area_showType.value = 'video_out'
} else if (currentAirPortStatus.value == 2) {
//
if (currentAirPortStatus.value == 2) {
rightPlaneHeight.value = 'calc(100% - 150px)'
rightPlaneBottom.value = '150px'
left_flying_area_showType.value = 'map'
//
big_area_showType.value = 'video_out'
}
left_flying_area_showType.value = 'map'
//
big_area_showType.value = 'video_plane'
}
}
//
@ -298,6 +324,72 @@ const switchScreenFn = (type, title) => {
switchType = type
}
//
const droneCommandExecute = async (zhilin) => {
//
let checkParams = {
droneId: currentAirPortInfo.value.did,
}
let checkRes = await checkAirportRunStatusApi(checkParams)
if (checkRes.code != 0) {
return
}
let msg = ''
switch (zhilin) {
case '01':
msg = '暂停飞行任务'
break
case '03':
msg = '终止飞行任务'
break
case '04':
msg = '继续飞行任务'
break
case '5':
msg = '机场急停'
default:
break
}
let params = {}
if (zhilin == '5') {
params = {
command: zhilin,
edgeId: currentAirPortInfo.value.code,
sensor: 'DroneStop',
msg,
}
} else {
params = {
airportCode: currentAirPortInfo.value.code,
airportId: currentAirPortInfo.value.id,
airportType: currentAirPortInfo.value.airport_type,
droneId: currentAirPortInfo.value.did,
msg,
order: {
zhilin,
taskId: currentAirPortInfo.value.task[0].taskId,
},
}
}
let res = await droneCommandExecuteApi(params)
if (res.code == 0) {
if (zhilin == '01') {
//
command5.value = true
} else if (zhilin == '04') {
//
command5.value = false
}
message.success('任务下发成功')
} else {
message.error(res.msg)
}
}
onMounted(() => {
//线 &
queryAirLine_AirPort()
@ -343,7 +435,7 @@ onMounted(() => {
<leftPlaneCheck v-if="currentAirPortStatus == 3" :row="currentAirPortInfo" />
<!-- 飞行中 地图 -->
<div id="left_flying_map" class="leftPlane-area w-full">
<div id="left_flying_map" class="leftPlane-area w-full" v-if="currentAirPortStatus == 2">
<ScreenComp :showType="left_flying_area_showType" @iframeLoaded="iframeLoaded" />
</div>
</div>
@ -356,10 +448,34 @@ onMounted(() => {
@switchVideo="switchRightVideoFn"
/>
<div class="fullScreen w-full absolute right-0">
<!-- <div class="w-full h-10 absolute right-0 bottom-[20px]">
<planeControl class="absolute left-0 right-0 top-0 bottom-0 m-auto" />
</div> -->
<!-- 任务暂停继续 -->
<a-radio-group
v-if="currentAirPortStatus == 2 && command5"
v-model:value="taskStatus"
button-style="solid"
class="taskBtns absolute left-3 top-5 z-10"
size="small"
>
<a-radio-button value="stop" disabled>任务已暂停</a-radio-button>
<a-radio-button value="continue" @click="droneCommandExecute('04')">继续</a-radio-button>
</a-radio-group>
<div
:class="
currentAirPortStatus == 2
? 'fullScreen w-full absolute right-0 lg:h-c150 xk:h-c150 x1k:h-c212 x2k:h-c282'
: 'fullScreen w-full absolute right-0 h-full'
"
>
<div
class="w-full h-10 absolute right-0 bottom-[20px] z-20"
v-if="currentAirPortStatus == 2"
>
<planeControl
class="absolute left-0 right-0 top-0 bottom-0 m-auto"
@droneCommandExecute="droneCommandExecute"
/>
</div>
<div id="big_area" class="relative w-full h-full overflow-hidden">
<ScreenComp :showType="big_area_showType" @iframeLoaded="iframeLoaded" />
</div>
@ -371,14 +487,26 @@ onMounted(() => {
v-if="currentAirPortStatus == 2"
class="bottomPlane w-full lg:h-[150px] xk:h-[150px] x1k:h-[212px] x2k:h-[282px] bg-[#0B2038] absolute bottom-0 left-0 z-[3]"
>
<bottomPlaneFlying v-if="currentAirPortStatus == 2" @switchView="switchViewFn" />
<bottomPlaneFlying
v-if="currentAirPortStatus == 2"
:big_area_showType="big_area_showType"
@switchView="switchViewFn"
@switchScreenVideo="bottom_switchScreenVideo"
/>
</div>
</div>
</div>
</template>
<style lang="scss">
#big_area {
.taskBtns {
.ant-radio-button-disabled {
background: #555a63 !important;
}
.ant-radio-button-wrapper-disabled {
color: #d5f1ff !important;
border-color: #555a63 !important;
}
}
</style>
<style lang="scss" scoped>
@ -392,7 +520,10 @@ onMounted(() => {
height: 100%;
}
:deep(.vjs-control-bar) {
display: none !important;
// display: none !important;
}
:deep(.live-player-stretch-btn) {
// display: none !important;
}
.rem-header {
@ -412,10 +543,10 @@ onMounted(() => {
width: var(--rightPlaneWidth);
}
.fullScreen {
--rightPlaneHeight: v-bind(rightPlaneHeight);
--rightPlaneBottom: v-bind(rightPlaneBottom);
height: var(--rightPlaneHeight);
bottom: var(--rightPlaneBottom);
// --rightPlaneHeight: v-bind(rightPlaneHeight);
// --rightPlaneBottom: v-bind(rightPlaneBottom);
// height: var(--rightPlaneHeight);
// bottom: var(--rightPlaneBottom);
background: #ffffff;
}
#virturalDrive_iframe_full {

View File

@ -1,12 +1,136 @@
<script setup>
//
import { ref, defineAsyncComponent, onMounted, watch, toRaw, defineProps, reactive } from 'vue'
import { useAirPortSocketStore } from '@/stores/airportSocket.js'
const airPortSocketStore = useAirPortSocketStore()
const emits = defineEmits(['droneCommandExecute'])
let items = reactive({
battery: {
label: '电池循环次数',
value: '-',
},
version: {
label: '无人机版本',
value: '-',
},
temperature: {
label: '电池温度',
value: '-',
},
})
//
let precent = ref('-')
//
let lastTime = ref('-')
const setCurrentData = (data) => {
// console.log(data)
//
items.battery.value = data ? data.batLoopTimes : '-'
//
items.version.value = '-'
//
items.temperature.value = '30℃'
precent.value = data ? Number(data.battery) * 100 : '-'
lastTime.value = data ? data.allflytime : '-'
}
const droneCommand = async (type) => {
if (type == 'back') {
//
emits('droneCommandExecute', '03')
} else if (type == 'DroneStop') {
//
emits('droneCommandExecute', '01')
}
}
//pinia
airPortSocketStore.$subscribe((mutate, state) => {
//socket
setCurrentData(state.currentAirPort)
})
onMounted(() => {})
</script>
<template>
<div class="w-[506px] flex flex-row items-center">
<div class="w-[136px] h-[46px] bg-[#ff0000]"></div>
<div class="w-[136px] h-[46px] cursor-pointer relative" @click="droneCommand('back')">
<img src="@/assets/icons/leftplane.png" alt="" />
<div class="absolute left-1/3 top-2 text-[#ffffff] text-base flex flex-row items-center">
<span class="iconfont icon-fanhang text-[#ffffff] text-2xl"></span>
<span class="ml-1">返航</span>
</div>
</div>
<div class="w-[210px] h-[46px] bg-[#8a1515] mx-3"></div>
<a-tooltip
overlayClassName="blackToolTip"
placement="top"
:getPopupContainer="(triggerNode) => triggerNode.parentElement"
>
<template #title>
<!-- <a-menu v-model:selectedKeys="current" :items="items" @select="selectFn"> </a-menu> -->
<div class="flex flex-col divide-y divide-slate-700">
<div
v-for="(item, index) in items"
:key="index"
class="w-[200px] py-[20px] bg-[#00000040] flex flex-row justify-between"
>
<span>{{ item.label }}</span
><span>{{ item.value }}</span>
</div>
</div>
</template>
<div class="middlePlane w-[210px] h-[46px] mx-3 flex flex-row items-center justify-around">
<div
class="w-[23px] h-[23px] bg-[#ffffff50] rounded-[6px] flex-row items-center justify-center text-center"
>
<span class="iconfont icon-xudianchi text-[#ffffff] text-base"></span>
</div>
<span class="text-sm text-[#B4D5FF]">电池电量</span>
<div class="lastTime text-sm font-bold">{{ precent }}%/{{ lastTime }}min</div>
<span class="iconfont icon-xiashuangjiantou text-[#ffffff50]"></span>
</div>
</a-tooltip>
<!-- <div class="middlePlane w-[210px] h-[46px] mx-3 flex flex-row items-center justify-around">
<div
class="w-[23px] h-[23px] bg-[#ffffff50] rounded-[6px] flex-row items-center justify-center text-center"
>
<span class="iconfont icon-xudianchi text-[#ffffff] text-base"></span>
</div>
<span class="text-sm text-[#B4D5FF]">电池电量</span>
<div class="lastTime text-sm font-bold">{{ precent }}%/{{ lastTime }}min</div>
<span class="iconfont icon-xiashuangjiantou text-[#ffffff50]"></span>
</div> -->
<div class="w-[136px] h-[46px] bg-[#8a1515]"></div>
<div class="w-[136px] h-[46px] cursor-pointer relative" @click="droneCommand('DroneStop')">
<img src="@/assets/icons/rightplane.png" alt="" />
<div class="absolute right-1/3 top-2 text-[#ffffff] text-base flex flex-row items-center">
<span class="iconfont icon-zanting text-[#ffffff] text-2xl"></span>
<span class="ml-1">急停</span>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.middlePlane {
background: linear-gradient(270deg, #006ffe, #3ca4fb);
border-radius: 2px;
border: 2px solid #75a9d6;
}
.lastTime {
background: linear-gradient(
0deg,
rgba(79, 255, 208, 0.44) 0%,
rgba(20, 255, 50, 0.44) 98.779296875%
);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>

View File

@ -17,6 +17,9 @@ export default {
//自定义高度
height: {
200: '200px',
c150: 'calc(100% - 150px)',
c212: 'calc(100% - 212px)',
c282: 'calc(100% - 282px)',
},
},
},