You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
6.2 KiB
257 lines
6.2 KiB
<template>
|
|
<div>
|
|
<el-dialog
|
|
:title="title"
|
|
:visible.sync="dialogVisible"
|
|
width="500px"
|
|
:append-to-body="true"
|
|
:modal-append-to-body="true"
|
|
:close-on-click-modal="false"
|
|
:close-on-press-escape="true"
|
|
:destroy-on-close="true"
|
|
:before-close="handleCancel"
|
|
custom-class="locate-dialog"
|
|
:style="{ marginTop: '15vh' }"
|
|
>
|
|
<el-form ref="form" :model="formData" label-width="80px">
|
|
<el-form-item label="方案:">
|
|
<el-select
|
|
v-model="formData.scenarioId"
|
|
placeholder="请选择方案"
|
|
clearable
|
|
style="width: 100%"
|
|
@change="handleScenarioChange"
|
|
>
|
|
<el-option
|
|
v-for="item in scenarioList"
|
|
:key="item.id"
|
|
:label="item.name"
|
|
:value="item.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="航线:">
|
|
<el-select
|
|
v-model="formData.routeId"
|
|
placeholder="请选择航线"
|
|
clearable
|
|
style="width: 100%"
|
|
:disabled="!formData.scenarioId"
|
|
@change="handleRouteChange"
|
|
>
|
|
<el-option
|
|
v-for="item in routeList"
|
|
:key="item.id"
|
|
:label="item.callSign"
|
|
:value="item.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="航点:">
|
|
<el-select
|
|
v-model="formData.waypointId"
|
|
placeholder="请选择航点"
|
|
clearable
|
|
style="width: 100%"
|
|
:disabled="!formData.routeId"
|
|
@change="handleWaypointChange"
|
|
>
|
|
<el-option
|
|
v-for="item in waypointList"
|
|
:key="item.id"
|
|
:label="`${item.name} (${item.lng}, ${item.lat})`"
|
|
:value="item.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="经度:">
|
|
<el-input
|
|
v-model="formData.lng"
|
|
type="number"
|
|
placeholder="例如 116.40"
|
|
step="0.000001"
|
|
clearable
|
|
/>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="纬度:">
|
|
<el-input
|
|
v-model="formData.lat"
|
|
type="number"
|
|
placeholder="例如 39.90"
|
|
step="0.000001"
|
|
clearable
|
|
/>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button @click="handleCancel">取消</el-button>
|
|
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { listScenario } from '@/api/system/scenario'
|
|
import { listRoutes } from '@/api/system/routes'
|
|
import { listWaypoints } from '@/api/system/waypoints'
|
|
|
|
export default {
|
|
name: 'LocateDialog',
|
|
props: {
|
|
title: {
|
|
type: String,
|
|
default: '定位'
|
|
},
|
|
visible: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
dialogVisible: false,
|
|
formData: {
|
|
scenarioId: null,
|
|
routeId: null,
|
|
waypointId: null,
|
|
lng: '116.3974',
|
|
lat: '39.9093'
|
|
},
|
|
scenarioList: [],
|
|
routeList: [],
|
|
waypointList: []
|
|
}
|
|
},
|
|
watch: {
|
|
visible: {
|
|
handler(newVal) {
|
|
this.dialogVisible = newVal
|
|
},
|
|
immediate: true
|
|
},
|
|
dialogVisible(newVal) {
|
|
if (newVal) {
|
|
this.resetForm()
|
|
this.loadScenarios()
|
|
}
|
|
this.$emit('update:visible', newVal)
|
|
}
|
|
},
|
|
methods: {
|
|
resetForm() {
|
|
this.formData = {
|
|
scenarioId: null,
|
|
routeId: null,
|
|
waypointId: null,
|
|
lng: '116.3974',
|
|
lat: '39.9093'
|
|
}
|
|
this.routeList = []
|
|
this.waypointList = []
|
|
},
|
|
|
|
async loadScenarios() {
|
|
try {
|
|
const res = await listScenario({})
|
|
this.scenarioList = res.rows || []
|
|
} catch (error) {
|
|
console.error('加载方案列表失败:', error)
|
|
this.$message.error('加载方案列表失败')
|
|
}
|
|
},
|
|
|
|
async handleScenarioChange(value) {
|
|
this.formData.routeId = null
|
|
this.formData.waypointId = null
|
|
this.routeList = []
|
|
this.waypointList = []
|
|
|
|
if (value) {
|
|
try {
|
|
const res = await listRoutes({ scenarioId: value })
|
|
this.routeList = res.rows || []
|
|
} catch (error) {
|
|
console.error('加载航线列表失败:', error)
|
|
this.$message.error('加载航线列表失败')
|
|
}
|
|
}
|
|
},
|
|
|
|
async handleRouteChange(value) {
|
|
this.formData.waypointId = null
|
|
this.waypointList = []
|
|
|
|
if (value) {
|
|
try {
|
|
const res = await listWaypoints({ routeId: value })
|
|
this.waypointList = res.rows || []
|
|
} catch (error) {
|
|
console.error('加载航点列表失败:', error)
|
|
this.$message.error('加载航点列表失败')
|
|
}
|
|
}
|
|
},
|
|
|
|
handleWaypointChange(value) {
|
|
if (value) {
|
|
const waypoint = this.waypointList.find(w => w.id === value)
|
|
if (waypoint) {
|
|
this.formData.lng = waypoint.lng
|
|
this.formData.lat = waypoint.lat
|
|
}
|
|
}
|
|
},
|
|
|
|
handleCancel() {
|
|
this.$emit('update:visible', false)
|
|
this.$emit('cancel')
|
|
},
|
|
|
|
handleConfirm() {
|
|
const { lng, lat } = this.formData
|
|
|
|
if (!lng || !lat || isNaN(parseFloat(lng)) || isNaN(parseFloat(lat))) {
|
|
this.$message.error('请输入有效的经度和纬度!')
|
|
return
|
|
}
|
|
|
|
if (lng < -180 || lng > 180 || lat < -90 || lat > 90) {
|
|
this.$message.error('经纬度超出有效范围!')
|
|
return
|
|
}
|
|
|
|
this.$emit('confirm', {
|
|
lng: parseFloat(lng),
|
|
lat: parseFloat(lat)
|
|
})
|
|
this.$emit('update:visible', false)
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.dialog-footer {
|
|
text-align: right;
|
|
}
|
|
|
|
.locate-dialog {
|
|
z-index: 99999 !important;
|
|
}
|
|
|
|
.locate-dialog >>> .el-dialog {
|
|
margin-top: 15vh !important;
|
|
position: fixed !important;
|
|
top: 15vh !important;
|
|
}
|
|
|
|
.locate-dialog >>> .el-dialog__body {
|
|
padding: 20px;
|
|
}
|
|
</style>
|