From 1f52603ba0dcd62d3ff30e17b2c55101298da5e5 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 21 Apr 2025 13:48:44 +0800
Subject: [PATCH] refactor: 重构单机巢状态
---
src/views/SignMachineNest/MachineLeft/MachineData.vue | 4
src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/MachineTableDetails.vue | 2
src/views/SignMachineNest/MachineRight/MachineMonitor.vue | 22 +-
src/store/modules/home.js | 77 ------------
src/views/SignMachineNest/MachineRight/InspectionRaskList.vue | 5
src/views/SignMachineNest/MachineRight/MachineStatus/MachineStatus.vue | 127 +++++----------------
src/views/SignMachineNest/SignMachineNest.vue | 71 ++---------
7 files changed, 63 insertions(+), 245 deletions(-)
diff --git a/src/store/modules/home.js b/src/store/modules/home.js
index 4012aeb..73aa14f 100644
--- a/src/store/modules/home.js
+++ b/src/store/modules/home.js
@@ -11,38 +11,10 @@
currentAreaPosition:getStore({ name: 'currentAreaPosition' }) || {},
singleUavHome: {},
footActiveIndex: 0,
- singleTotal: {}, // 统计单个机巢数据
- // 项目id
- selectedWorkSpaceId: window.localStorage.getItem('bs_workspace_id'),
// 事件 日 周 月 年
eventTimeType: 'day',
eventTimeParams: 'CURRENT_WEEK',
eventTimeRang: '',
- wsMessage: {},
- deviceState: {
- gatewayInfo: {},
- deviceInfo: {},
- timestamp: '',
- dockInfo: {},
- currentSn: '',
- currentType: -1,
- drone_charge_state_new: {},
- psdk_widget_values: {},
- speakerAudioPlayStartProgress: {},
- },
- osdVisible: {
- // osd 显示设备相关信息
- sn: '',
- callsign: '',
- model: '',
- visible: false,
- gateway_sn: '',
- is_dock: false,
- payloads: null,
- device_domain: '',
- device_sub_type: '',
- device_type: '',
- },
},
actions: {},
mutations: {
@@ -69,55 +41,6 @@
setSingleUavHome: (state, data) => {
state.singleUavHome = data;
},
- setSingleTotal: (state, data) => {
- state.singleTotal = data;
- },
- setSelectedWorkSpaceId: (state, id) => {
- state.selectedWorkSpaceId = id
- window.localStorage.setItem('bs_workspace_id', id)
- },
- setOsdVisibleInfo: (state, info) => {
- console.log('存储',info)
- state.osdVisible = Object.assign({}, info)
- window.localStorage.setItem('bs_osd', JSON.stringify(info))
- },
- setWsMessage: (state, data) => {
- state.wsMessage = data.data.host;
- },
- setDeviceInfo: (state, data) => {
- const info = data.data
- state.deviceState.timestamp = data.timestamp
- state.deviceState.deviceInfo[info.sn] = info.host
- state.deviceState.currentSn = info.sn
- state.deviceState.currentType = EDeviceTypeName.Aircraft
- },
- setGatewayInfo: (state, info) => {
- state.deviceState.gatewayInfo[info.sn] = info.host
- state.deviceState.currentSn = info.sn
- state.deviceState.currentType = EDeviceTypeName.Gateway
- },
- setDockOnfo: (state, info) => {
- if (Object.keys(info.host).length === 0) return
-
- if (!state.deviceState.dockInfo[info.sn]) {
- state.deviceState.dockInfo[info.sn] = {}
- }
- state.deviceState.currentSn = info.sn
- state.deviceState.currentType = EDeviceTypeName.Dock
- const dock = state.deviceState.dockInfo[info.sn]
- if (info.host.mode_code !== undefined) {
- dock.basic_osd = info.host
- state.deviceState.drone_charge_state_new = dock.basic_osd.drone_charge_state
- return
- }
- if (info.host.sdr) {
- dock.link_osd = info.host
- return
- }
- if (info.host.job_number !== undefined) {
- dock.work_osd = info.host
- }
- },
setEventTimeType: (state, [timeType, timeParams]) => {
state.eventTimeType = timeType
state.eventTimeParams = timeParams
diff --git a/src/views/SignMachineNest/MachineLeft/MachineData.vue b/src/views/SignMachineNest/MachineLeft/MachineData.vue
index 0a4db03..09698aa 100644
--- a/src/views/SignMachineNest/MachineLeft/MachineData.vue
+++ b/src/views/SignMachineNest/MachineLeft/MachineData.vue
@@ -27,9 +27,9 @@
const statisticsList = ref([]);
+const singleTotal = inject('singleTotal')
// 添加监听
-watch(
- () => store.state.home.singleTotal,
+watch(singleTotal,
(newValue) => {
if (!newValue) return;
statisticsList.value = [
diff --git a/src/views/SignMachineNest/MachineRight/InspectionRaskList.vue b/src/views/SignMachineNest/MachineRight/InspectionRaskList.vue
index e8d3f91..a04b8a3 100644
--- a/src/views/SignMachineNest/MachineRight/InspectionRaskList.vue
+++ b/src/views/SignMachineNest/MachineRight/InspectionRaskList.vue
@@ -81,8 +81,7 @@
let viewer = null
let { taskDetails, workspace_id, getTaskDetails } = useTaskDetails()
-let { wsInfo, removeWS } = useDroneWS(workspace_id) //ws信息,是一个ref对象
-
+const wsInfo = inject('wsInfo')
const store = useStore()
// 设备任务详情
let currentInfoId = ref('')
@@ -200,7 +199,7 @@
const taskClick = item => {
if (tabIndex.value === 1) {
// 展示当前任务详情
- if (!item?.device_sns.length) return ElMessage.warning('没有device_sns');
+ if (!item?.device_sns?.length) return ElMessage.warning('没有device_sns');
if (item?.device_sns?.length !== 1) {
// todo 后续开发
ElMessage.success('即将跳转到集群调度');
diff --git a/src/views/SignMachineNest/MachineRight/MachineMonitor.vue b/src/views/SignMachineNest/MachineRight/MachineMonitor.vue
index f689391..87a49a7 100644
--- a/src/views/SignMachineNest/MachineRight/MachineMonitor.vue
+++ b/src/views/SignMachineNest/MachineRight/MachineMonitor.vue
@@ -15,13 +15,17 @@
import CommonTitle from '@/components/CommonTitle.vue'
import LiveVideo from '@/components/LiveVideo.vue'
import { liveStart } from '@/api/home/machineNest'
-// import { CURRENT_CONFIG as config } from '@/utils/http/config'
import { useStore } from 'vuex'
const store = useStore()
// 单个机巢信息
const singleUavHome = computed(() => store.state.home.singleUavHome);
-const osdVisible = computed(() => store.state.home.osdVisible);
+const wsInfo = inject('wsInfo')
+let device_osd_info = computed(() => wsInfo.value?.device_osd || {});
+let device_osd_host = computed(() => device_osd_info?.value?.data?.host || {});
+
+const dockSn = inject('dockSn')
+const droneSn = inject('droneSn')
// 直播地址
let airPortUrl = ref('')
// 获取机巢直播地址
@@ -43,17 +47,13 @@
const isTakeOff = ref(false)
// 监听ws消息
-watch(() => store.state.home.deviceState, async (newValue) => {
- console.log(osdVisible.value.sn,'333333')
- const deviceInfo = newValue?.deviceInfo[osdVisible.value.sn]
- if (!deviceInfo) return
-
- const currentIsTakeOff = ![14, 0].includes(deviceInfo?.mode_code)
- console.log(isTakeOff.value, currentIsTakeOff,'8888')
+watch(device_osd_host, async () => {
+ if (!device_osd_host.value.mode_code) return
+ const currentIsTakeOff = ![14, 0].includes(device_osd_host.value?.mode_code)
// 如果还是之前的状态,不切换
if (isTakeOff.value === currentIsTakeOff) return
isTakeOff.value = currentIsTakeOff
- isTakeOff.value ? await getDroneLiveUrl(osdVisible.value.sn, 2) : await getVideoUrl(singleUavHome.value.device_sn, 1)
+ isTakeOff.value ? await getDroneLiveUrl(droneSn.value, 2) : await getVideoUrl(dockSn.value, 1)
},
{
immediate: true,
@@ -62,7 +62,7 @@
)
onMounted(() => {
- getVideoUrl(singleUavHome.value.device_sn, 1)
+ getVideoUrl(dockSn.value, 2)
})
onUnmounted(() => {
airPortUrl.value = ''
diff --git a/src/views/SignMachineNest/MachineRight/MachineStatus/MachineStatus.vue b/src/views/SignMachineNest/MachineRight/MachineStatus/MachineStatus.vue
index ad8534a..79e6ca9 100644
--- a/src/views/SignMachineNest/MachineRight/MachineStatus/MachineStatus.vue
+++ b/src/views/SignMachineNest/MachineRight/MachineStatus/MachineStatus.vue
@@ -7,7 +7,7 @@
<img src="../../../../assets/images/signMachineNest/machineRight/wrj.png" alt="" />
<div class="info-right">
<!-- <div class="name">{{ osdVisible?.callsign || '--' }}</div> -->
- <div class="name">{{ osdVisible?.nickname || '--' }}</div>
+ <div class="name">{{ dockDetails?.nickname || '--' }}</div>
<div class="wz">
<span class="left">当前位置:</span>
<span class="right">{{ detailInfo.longitude }},{{ detailInfo.latitude }}</span>
@@ -96,16 +96,18 @@
import { useStore } from 'vuex'
import MachineTableDetails from '@/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/MachineTableDetails.vue'
-const store = useStore()
// 获取机巢信息
-let osdVisible = ref({}) //computed(() => store.state.home.osdVisible);
-const singleUavHome = computed(() => store.state.home.singleUavHome)
+const wsInfo = inject('wsInfo')
+const dockDetails = inject('dockDetails')
+let device_osd_info = computed(() => wsInfo.value?.device_osd || {});
+let device_osd_host = computed(() => device_osd_info?.value?.data?.host || {});
+let dock_osd_info = computed(() => wsInfo.value?.dock_osd || {});
+let dock_osd_host = computed(() => dock_osd_info.value?.data?.host || {});
// 单个机巢统计数据
-const singleTotal = computed(() => store.state.home.singleTotal)
+const singleTotal = inject('singleTotal')
// 是否展示机机巢状态详情
let isShowDetails = ref(false)
-let str = '--'
let drone_charge_state = ref({
capacity_percent: '--',
state: 0,
@@ -122,55 +124,15 @@
capacity_percent: '--',
})
let quality = ref(['弱', '较弱', '中等', '较强', '强'])
-let deviceInfo = ref({
- gateway: {
- capacity_percent: str,
- transmission_signal_quality: str,
- },
- dock: {},
- device: {
- gear: -1,
- mode_code: EModeCode.Disconnected,
- height: str,
- home_distance: str,
- horizontal_speed: str,
- vertical_speed: str,
- wind_speed: str,
- wind_direction: str,
- elevation: str,
- position_state: {
- gps_number: str,
- is_fixed: 0,
- rtk_number: str,
- },
- battery: {
- capacity_percent: str,
- landing_power: str,
- remain_flight_time: 0,
- return_home_power: str,
- },
- latitude: 0,
- longitude: 0,
- },
-})
-let mode_code = ref('已断开连接')
-
-watch(
- () => store.state.home.osdVisible,
- newValue => {
- osdVisible.value = newValue
- }
-)
// 监听实时信息
-watch(
- () => store.state.home.wsMessage,
+watch(device_osd_host,
newValue => {
- if (newValue.mode_code === 14) return
+ if (!newValue) return
+ if (newValue?.mode_code === 14) return
if (Object.keys(newValue).length === 0) return
detailInfo.value.longitude = newValue?.longitude.toFixed(6) || '--'
detailInfo.value.latitude = newValue?.latitude.toFixed(6) || '--'
- // console.log(window.$viewer)
getLnglatAltitude(Number(detailInfo.value.longitude), Number(detailInfo.value.latitude), window.$viewer).then(
res => {
const height = newValue?.height - res?.height
@@ -191,57 +153,31 @@
},
{ immediate: true, deep: true }
)
+
+// EDeviceTypeName.Dock
// 获取最新机场状态
-watch(
- store.state.home.deviceState,
- newValue => {
- // console.log('newValue', newValue);
- if (newValue.currentType === EDeviceTypeName.Dock && newValue?.dockInfo[newValue.currentSn]) {
- // 机场状态
- mode_code.value = EDockModeText[newValue?.dockInfo[newValue.currentSn]?.basic_osd?.mode_code]
- // this.$emit('updateModeCode', mode_code.value);
- // 舱内状态
- AircraftStatus.value =
- EModeText[
- newValue.deviceInfo[deviceInfo.value.dock.basic_osd?.sub_device?.device_sn ?? osdVisible.sn]?.mode_code
- ]
- // 舱内关机时显示的电量
- let child_sn = newValue?.dockInfo[newValue.currentSn].basic_osd?.sub_device?.device_sn
+watch(wsInfo,
+ () => {
+ if (dock_osd_host.value?.mode_code){
+ AircraftStatus.value = EModeText?.[dock_osd_host.value?.mode_code] || '--'
+ }
// 飞机在线时取飞机中的电量
- if (newValue.deviceInfo[child_sn]) {
+ if (device_osd_host.value?.battery) {
drone_charge_state.value = {
- capacity_percent: newValue.deviceInfo[child_sn].battery.capacity_percent,
- state: newValue.deviceInfo[child_sn].battery.landing_power,
- }
- } else {
- // 遥控器这里拿不到值data.drone_charge_state_new == undefined 会一直报错
- if (newValue.drone_charge_state_new) {
- drone_charge_state.value = newValue.drone_charge_state_new
+ capacity_percent: device_osd_host.value.battery.capacity_percent,
+ state: device_osd_host.value.battery.landing_power,
}
}
- if (osdVisible.value.visible && osdVisible.value.is_dock && osdVisible.value.gateway_sn !== '') {
- deviceInfo.value.dock = newValue.dockInfo[osdVisible.value.gateway_sn]
- deviceInfo.value.device =
- newValue.deviceInfo[deviceInfo.value.dock.basic_osd?.sub_device?.device_sn ?? osdVisible.value.sn]
- // 设备关机即不显示信息
- // 兼容遥控器 关闭无人机 mode_code返回的是14 不是undefined
- if (
- newValue.deviceInfo[deviceInfo.value.dock.basic_osd?.sub_device?.device_sn ?? osdVisible.value.sn]
- ?.mode_code === undefined ||
- newValue.deviceInfo[deviceInfo.value.dock.basic_osd?.sub_device?.device_sn ?? osdVisible.value.sn]
- ?.mode_code == 14
- ) {
- detailInfo.value = {
- longitude: '--',
- latitude: '--',
- home_distance: '--',
- quality: '--',
- horizontal_speed: '--',
- remain_flight_time: '--',
- height: '--',
- capacity_percent: '--',
- }
- }
+ if (device_osd_host.value?.mode_code === undefined || device_osd_host.value?.mode_code === 14) {
+ detailInfo.value = {
+ longitude: '--',
+ latitude: '--',
+ home_distance: '--',
+ quality: '--',
+ horizontal_speed: '--',
+ remain_flight_time: '--',
+ height: '--',
+ capacity_percent: '--',
}
}
},
@@ -343,7 +279,6 @@
.close {
width: 60px;
height: 20px;
- line-height: 20px;
background: rgba(255, 178, 106, 0.2);
border-radius: 4px 4px 4px 4px;
border: 1px solid #ffb26a;
diff --git a/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/MachineTableDetails.vue b/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/MachineTableDetails.vue
index e44d230..884c8bc 100644
--- a/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/MachineTableDetails.vue
+++ b/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/MachineTableDetails.vue
@@ -57,7 +57,7 @@
{ name: '机巢状态', value: '', field: 'status' },
])
const store = useStore()
-const singleTotal = computed(() => store.state.home.singleTotal)
+const singleTotal = inject('singleTotal')
watch(singleTotal, val => {
if (val?.device_info) {
infoList.value.forEach(item => {
diff --git a/src/views/SignMachineNest/SignMachineNest.vue b/src/views/SignMachineNest/SignMachineNest.vue
index 3e2828f..2155498 100644
--- a/src/views/SignMachineNest/SignMachineNest.vue
+++ b/src/views/SignMachineNest/SignMachineNest.vue
@@ -6,14 +6,11 @@
<script setup>
import MachineLeft from '@/views/SignMachineNest/MachineLeft/MachineLeft.vue'
import MachineRight from '@/views/SignMachineNest/MachineRight/MachineRight.vue'
-import { useConnectWebSocket } from '@/utils/websocket/connect-websocket'
-import { getWebsocketUrl } from '@/websocket/util/config'
-import { EBizCode } from '@/utils/staticData/enums.js'
-import { EModeCode } from '@/utils/staticData/device.js'
import { useStore } from 'vuex'
import { getDeviceDetail, getFlightStatistics, getEventList } from '@/api/home/machineNest'
import { useSingleDroneMap } from '@/hooks/useSingleDroneMap/useSingleDroneMap'
+import { useDroneWS } from '@/hooks/useDroneWS'
const store = useStore()
let connectWs = ref(null)
@@ -23,34 +20,6 @@
let osdVisible = ref({})
let workspaceId = ref('')
-// 进入单个机巢开始连接ws
-const createWsConntect = () => {
- let webSorketUrl = getWebsocketUrl() + '&workspace-id=' + workspaceId.value
- // 监听ws 消息
- connectWs.value = useConnectWebSocket(messageHandler, webSorketUrl)
-}
-
-const messageHandler = result => {
- let payload = JSON.parse(result) // 为了兼容聊天消息
- if (!payload) return
- switch (payload.biz_code) {
- case EBizCode.GatewayOsd: {
- store.commit('setGatewayInfo', payload.data)
- break
- }
- case EBizCode.DeviceOsd: {
- store.commit('setDeviceInfo', payload)
- store.commit('setWsMessage', payload)
- break
- }
- case EBizCode.DockOsd: {
- store.commit('setDockOnfo', payload.data)
- break
- }
- default:
- break
- }
-}
// 单机巢初始化及事件撒点
const { init, initEventLayer, initDroneEntity } = useSingleDroneMap({
@@ -60,46 +29,38 @@
},
})
+let workspace_id = ref('')
+let { wsInfo } = useDroneWS(workspace_id) //ws信息,是一个ref对象
+
+const dockSn = computed(() => singleUavHome.value.device_sn) //机巢sn
+const droneSn = computed(() => wsInfo.value?.device_osd?.data?.sn) //无人机sn
+provide('dockSn', dockSn)
+provide('droneSn', droneSn)
+provide('wsInfo',wsInfo)
// 获取单个机巢信息
+const dockDetails= ref('')
+provide('dockDetails', dockDetails)
const getSingleDetails = () => {
getDeviceDetail(singleUavHome.value.device_sn).then(res => {
- if (res.data.code !== 0) return
const result = res.data.data
-
+ dockDetails.value = result
+ workspace_id.value = result.workspace_id
initDroneEntity({
lng: result.longitude,
lat: result.latitude,
status: result.status,
})
-
- const child = result.children
- // 对应store 里面数据结构
- osdVisible.value.nickname = result.nickname || '--'
- osdVisible.value.sn = child?.device_sn || ''
- osdVisible.value.callsign = child?.nickname || '--'
- osdVisible.value.model = EModeCode.Disconnected || ''
- osdVisible.value.visible = true
- osdVisible.value.gateway_sn = result?.device_sn || ''
- osdVisible.value.is_dock = true
- osdVisible.value.gateway_callsign = result?.callsign || '--'
- osdVisible.value.payloads = child?.payloads_list || []
- osdVisible.value.device_domain = child.domain || 0
- osdVisible.value.device_sub_type = child.sub_type || 1
- osdVisible.value.device_type = child.type || 0
- // osdVisible.value.latest_wayline_job = result?.latest_wayline_job || {}
- store.commit('setOsdVisibleInfo', osdVisible.value)
- store.commit('setSelectedWorkSpaceId', result.workspace_id)
workspaceId.value = result.workspace_id
- createWsConntect()
})
}
-
+const singleTotal = ref({})
+provide('singleTotal', singleTotal)
// 获取机巢统计数据 提供给左右侧组件使用
const getMachineData = () => {
getFlightStatistics(singleUavHome.value.device_sn).then(res => {
if (res.data.code !== 0) return
const result = res.data.data
- store.commit('setSingleTotal', result)
+ singleTotal.value = result
})
}
--
Gitblit v1.9.3