Browse Source

fix(command): send workflow.one_key_landing for one-key return

The dock button labelled 一键降落 sent workflow.one_key_land, which the
dock does not handle, so it fell through to a generic workflow instead of
returning home. Rename it to 一键返航 and resolve the shared label by
record kind: dock -> workflow.one_key_landing, drone -> drone.return.
main
xiaosi 1 month ago
parent
commit
74a5a013e8
  1. 4
      src/components/MonitorDetailPanel.vue
  2. 12
      src/stores/modules/devicesStore.js
  3. 2
      src/views/DeviceDetailView/DeviceDetailView.vue
  4. 2
      src/views/MonitorView/MonitorView.vue
  5. 2
      src/views/OperationLogsView/OperationLogsView.vue

4
src/components/MonitorDetailPanel.vue

@ -136,9 +136,9 @@
<svg><use href="#i-plane" /></svg>
<span><strong>一键起飞</strong><small>{{ actions.statusText('一键起飞') }}</small></span>
</button>
<button class="workflow-action landing" @click="emitCommand('一键降落', '无人机将返回机巢并自动降落。')">
<button class="workflow-action landing" @click="emitCommand('一键返航', '无人机将返回机巢并自动降落。')">
<svg><use href="#i-home" /></svg>
<span><strong>一键降落</strong><small>{{ actions.statusText('一键降落') }}</small></span>
<span><strong>一键返航</strong><small>{{ actions.statusText('一键返航') }}</small></span>
</button>
</div>
<div class="stage-actions">

12
src/stores/modules/devicesStore.js

@ -90,7 +90,6 @@ function coordinate(value, min, max) {
// 指令标题 → 后端指令 type
const COMMANDS = {
'一键起飞': 'workflow.one_key_takeoff',
'一键降落': 'workflow.one_key_land',
'起飞准备': 'dock.prepare_takeoff',
'起飞准备完成': 'dock.complete_takeoff',
'降落准备': 'dock.prepare_landing',
@ -116,6 +115,12 @@ const COMMANDS = {
'取消任务': 'drone.mission_cancel'
}
// 同名指令在机巢/无人机上语义不同:机巢「一键返航」走 workflow 编排(返航+降落),
// 无人机「一键返航」是 drone.return 直达指令
const DOCK_COMMANDS = {
'一键返航': 'workflow.one_key_landing'
}
// 经纬度 → 地图百分比坐标(按设备经纬范围动态投影,北向上)
function project(lon, lat, bounds) {
const lonSpan = bounds.maxLon - bounds.minLon || 1
@ -158,12 +163,13 @@ export const useDeviceStore = defineStore('devices', () => {
return docks.value.find((d) => d.id === key) || drones.value.find((d) => d.id === key) || null
}
function commandType(title) {
function commandType(title, kind = '') {
if (kind === 'dock' && DOCK_COMMANDS[title]) return DOCK_COMMANDS[title]
return COMMANDS[title] || ''
}
async function sendCommand(rec, title, params = {}) {
const type = COMMANDS[title]
const type = commandType(title, rec.kind)
if (!type) throw new Error('未知指令')
if (rec.kind === 'dock') {
return request.post(urls.DOCK_COMMAND(rec.id), { type, params })

2
src/views/DeviceDetailView/DeviceDetailView.vue

@ -603,7 +603,7 @@ const COMMAND_NAMES = {
'drone.mission_cancel': '取消任务',
'workflow.start_task': '执行任务',
'workflow.one_key_takeoff': '一键起飞',
'workflow.one_key_land': '一键降落',
'workflow.one_key_landing': '一键返航',
'video.start_stream': '开始直播',
'video.stop_stream': '停止直播'
}

2
src/views/MonitorView/MonitorView.vue

@ -213,7 +213,7 @@ let suppressMapClick = false
const dockExtraCommands = [
{ title: '一键起飞', desc: '无人机将从机巢起飞并进入待命状态。', icon: '#i-plane', hint: '下发指令' },
{ title: '一键降落', desc: '无人机将返回机巢并自动降落。', icon: '#i-home', hint: '下发指令' },
{ title: '一键返航', desc: '无人机将返回机巢并自动降落。', icon: '#i-home', hint: '下发指令' },
{ title: '起飞准备', desc: '将执行开舱并解除归中。', icon: '#i-plane', hint: '下发指令' },
{ title: '降落准备', desc: '将开舱并等待无人机返航。', icon: '#i-home', hint: '下发指令' },
{ title: '打开舱门', desc: '将打开机巢舱门。', icon: '#i-door', hint: '下发指令' },

2
src/views/OperationLogsView/OperationLogsView.vue

@ -109,7 +109,7 @@ const COMMAND_NAMES = {
'drone.mission_cancel': '取消任务',
'workflow.start_task': '执行任务',
'workflow.one_key_takeoff': '一键起飞',
'workflow.one_key_land': '一键降落',
'workflow.one_key_landing': '一键返航',
'video.start_stream': '开始直播',
'video.stop_stream': '停止直播'
}

Loading…
Cancel
Save