| applications/drone-command/src/axios.js | ●●●●● patch | view | raw | blame | history | |
| applications/drone-command/src/views/basicManage/deviceStock/deviceStock.vue | ●●●●● patch | view | raw | blame | history | |
| applications/drone-command/src/views/recordManage/alarmRecords/alarmRecords.vue | ●●●●● patch | view | raw | blame | history | |
| applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue | ●●●●● patch | view | raw | blame | history | |
| applications/drone-command/src/views/recordManage/historyTracks/flyTrajectory.js | ●●●●● patch | view | raw | blame | history | |
| applications/drone-command/src/views/recordManage/historyTracks/fwDroneFlightRecord.js | ●●●●● patch | view | raw | blame | history | |
| applications/drone-command/src/views/recordManage/historyTracks/historyTracks.vue | ●●●●● patch | view | raw | blame | history |
applications/drone-command/src/axios.js
@@ -50,24 +50,6 @@ `${website.clientId}:${website.clientSecret}` )}`; } // 后端的要求 if (router.currentRoute.value.path === '/job/jobstatistics'){ const userAreaCode = store?.state?.user?.userInfo?.detail?.areaCode const paramsKey = config.method === 'get' ? 'params' : 'data'; const codeKey = config.method === 'get' ? 'areaCode' : 'area_code'; const paramCode = config?.params?.areaCode || config?.data?.area_code try { if (paramCode){ if (paramCode === userAreaCode) { config[paramsKey][codeKey] = config.method === 'get' ? '' : undefined; } else { if (!Array.isArray(config[paramsKey])){ config[paramsKey] = {...config[paramsKey],[codeKey]: paramCode} } } } }catch (e) {} } //headers判断请求是否携带token const meta = config.meta || {}; applications/drone-command/src/views/basicManage/deviceStock/deviceStock.vue
@@ -4,7 +4,7 @@ <el-row :gutter="16"> <el-col :span="4"> <el-form-item label="名称" prop="deviceName"> <el-input v-model="searchParams.deviceName" placeholder="请输入" clearable @change="handleSearch" /> <el-input v-model="searchParams.deviceName" placeholder="请输入" clearable @clear="handleSearch" /> </el-form-item> </el-col> <el-col :span="4"> @@ -33,7 +33,7 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="时间" > <el-form-item label="时间"> <el-date-picker popper-class="ztzf-date-picker-popper" class="ztzf-date-picker" @@ -134,7 +134,7 @@ const range = dateRangeFormat(dateRange.value) loading.value = true try { const params = { ...searchParams.value, start_time: range[0], end_time: range[1] } const params = { ...searchParams.value, startTime: range[0], endTime: range[1] } const res = await fwDevicePageApi(params) list.value = res?.data?.data?.records ?? [] total.value = res?.data?.data?.total ?? 0 applications/drone-command/src/views/recordManage/alarmRecords/alarmRecords.vue
@@ -8,13 +8,13 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="区域" prop="areaCode"> <el-input v-model="searchParams.areaCode" placeholder="请输入" clearable @clear="getList" /> <el-form-item label="区域" prop="areaName"> <el-input v-model="searchParams.areaName" placeholder="请输入" clearable @clear="getList" /> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="设备类型" prop="droneType"> <el-select v-model="searchParams.droneType" placeholder="请选择" clearable @clear="getList"> <el-select v-model="searchParams.droneType" placeholder="请选择" clearable @change="getList"> <el-option v-for="item in dictObj.deviceType" :key="item.dictKey" @@ -56,7 +56,7 @@ <el-table-column prop="droneName" label="无人机名称" /> <el-table-column prop="droneSerialNo" label="无人机序列号" /> <el-table-column prop="alarmTime" label="告警时间" /> <el-table-column prop="areaCode" label="区域" /> <el-table-column prop="areaName" label="区域" /> <el-table-column prop="triggerReason" label="触发原因" /> <el-table-column prop="deviceName" label="侦测反制设备" /> <el-table-column prop="droneType" label="设备类型"> @@ -70,11 +70,6 @@ {{ getDeviceStatus(row) }} </template> </el-table-column> <!-- <el-table-column label="操作">--> <!-- <template v-slot="{ row }">--> <!-- <el-link @click="handleView(row)" type="primary">查看</el-link>--> <!-- </template>--> <!-- </el-table-column>--> </el-table> <div> @@ -99,7 +94,7 @@ const initSearchParams = () => ({ droneName: '', // 无人机名称 areaCode: '', // 区域 areaName: '', // 区域 droneType: '', // 设备类型 current: 1, // 当前页 size: 10, // 每页大小 @@ -128,7 +123,7 @@ const range = dateRangeFormat(dateRange.value) loading.value = true try { const params = { ...searchParams.value, start_time: range[0], end_time: range[1] } const params = { ...searchParams.value, startTime: range[0], endTime: range[1] } const res = await fwDroneAlarmRecordPageApi(params) list.value = res?.data?.data?.records ?? [] total.value = res?.data?.data?.total ?? 0 applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue
New file @@ -0,0 +1,83 @@ <template> <el-dialog v-model="visible" :title="dialogTitle" @closed="handleClosed" destroy-on-close> <div> <div>无人机名称:{{ formData.droneName }}</div> <div>序列号: {{ formData.serialNo }}</div> <div>告警时间: {{ formData.alarmTime }}</div> <div>触发原因: {{ formData.triggerType }}</div> <div>停留时长: {{ formData.stayDuration }}</div> </div> <el-table :data="list"> <el-table-column type="index" width="60" label="序号" /> <el-table-column prop="areaCode" label="areaCode" /> <el-table-column prop="createTime" label="createTime" /> <el-table-column prop="latitude" label="latitude" /> <el-table-column prop="longitude" label="longitude" /> </el-table> <template #footer> <el-button @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button> </template> </el-dialog> </template> <script setup> import { computed, ref } from 'vue' import { fwDroneFlightRecordDetailApi } from '@/views/recordManage/historyTracks/fwDroneFlightRecord' import { fwDroneFlightRecordDetailPageApi } from '@/views/recordManage/historyTracks/flyTrajectory' const initForm = () => ({ droneName: '', serialNo: '', alarmTime: '', triggerType: '', stayDuration: '', }) let list = ref([]) const emit = defineEmits(['success']) const formData = ref(initForm()) // 表单数据 const visible = ref(false) // 弹框显隐 const dialogMode = ref('add') // 弹框模式 const dialogReadonly = computed(() => dialogMode.value === 'view') const dialogTitle = computed(() => { if (dialogMode.value === 'edit') { return '编辑' } else if (dialogMode.value === 'view') { return '查看' } else { return '新增' } }) // 关闭弹框 function handleCancel() { visible.value = false } // 加载详情 async function loadDetail() { if (!formData.value.id) return const res = await fwDroneFlightRecordDetailApi({ id: formData.value.id }) const res1 = await fwDroneFlightRecordDetailPageApi({ flightRecordId: formData.value.id }) list.value = res1.data.data.records ?? [] formData.value = res?.data?.data ?? {} } // 关闭后重置 function handleClosed() { formData.value = initForm() } // 打开弹框 async function open({ mode, row } = {}) { dialogMode.value = mode || 'add' formData.value = row visible.value = true if (dialogMode.value === 'add') { formData.value = initForm() } else { await loadDetail() } } defineExpose({ open }) </script> applications/drone-command/src/views/recordManage/historyTracks/flyTrajectory.js
New file @@ -0,0 +1,47 @@ import request from '@/axios' // 详情 export const fwDroneFlightRecordDetailApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecordDetail/detail`, method: 'get', params, }) } // 分页 export const fwDroneFlightRecordDetailPageApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecordDetail/page`, method: 'get', params, }) } // 新增或修改 export const fwDroneFlightRecordDetailSubmitApi = data => { return request({ url: `/drone-fw/record/fwDroneFlightRecordDetail/submit`, method: 'post', data, }) } // 逻辑删除 export const fwDroneFlightRecordDetailRemoveApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecordDetail/remove`, method: 'post', params, }) } // 导出数据 export const exportFwDroneFlightRecordDetailApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecordDetail/export-fwDroneFlightRecordDetail`, method: 'get', params, responseType: 'blob', }) } applications/drone-command/src/views/recordManage/historyTracks/fwDroneFlightRecord.js
New file @@ -0,0 +1,47 @@ import request from '@/axios' // 查list export const fwDroneFlightRecordPageApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecord/page`, method: 'get', params, }) } // 增加或更新 export const fwDroneFlightRecordSubmitApi = data => { return request({ url: `/drone-fw/record/fwDroneFlightRecord/submit`, method: 'post', data, }) } // 删除 export const fwDroneFlightRecordRemoveApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecord/remove`, method: 'post', params, }) } // 详情 export const fwDroneFlightRecordDetailApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecord/detail`, method: 'get', params, }) } // 导出 export const exportFwDroneFlightRecordApi = params => { return request({ url: `/drone-fw/record/fwDroneFlightRecord/export-fwDroneFlightRecord`, method: 'get', params, responseType: 'blob', }) } applications/drone-command/src/views/recordManage/historyTracks/historyTracks.vue
@@ -1,19 +1,153 @@ <!-- * @Author : yuan * @Date : 2026-01-06 16:38:25 * @LastEditors : yuan * @LastEditTime : 2026-01-07 11:04:23 * @FilePath : \applications\drone-command\src\views\recordManage\historyTracks.vue * @Description : * Copyright 2026 OBKoro1, All Rights Reserved. * 2026-01-06 16:38:25 --> <template> <basic-container> 历史轨迹 </basic-container> <basic-container> <el-form ref="queryParamsRef" :model="searchParams"> <el-row :gutter="16"> <el-col :span="4"> <el-form-item label="无人机名称" prop="droneName"> <el-input v-model="searchParams.droneName" placeholder="请输入" clearable @clear="getList" /> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="区域" prop="areaName"> <el-input v-model="searchParams.areaName" placeholder="请输入" clearable @clear="getList" /> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="告警时间"> <el-date-picker popper-class="ztzf-date-picker-popper" class="ztzf-date-picker" v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD HH:mm:ss" @change="handleSearch" /> </el-form-item> </el-col> <el-col :span="4"> <el-form-item> <el-button @click="resetForm">重置</el-button> <el-button type="primary" @click="handleSearch">查询</el-button> </el-form-item> </el-col> </el-row> </el-form> <div> <el-button type="primary" @click="exportFile" :loading="exportLoading">导出</el-button> </div> <el-table v-loading="loading" :data="list"> <el-table-column type="index" width="60" label="序号" /> <el-table-column prop="droneName" label="无人机名称" /> <el-table-column prop="serialNo" label="序列号" /> <el-table-column prop="alarmTime" label="告警时间" /> <el-table-column prop="areaName" label="区域" /> <el-table-column prop="triggerType" label="触发原因" /> <el-table-column label="停留时长"> <template v-slot="{ row }"> {{ formatStayDuration(row.stayDuration) }} </template> </el-table-column> <el-table-column label="操作"> <template v-slot="{ row }"> <el-link @click="handleView(row)" type="primary">历史轨迹</el-link> </template> </el-table-column> </el-table> <div> <el-pagination v-model:current-page="searchParams.current" v-model:page-size="searchParams.size" :total="total" @change="getList" /> </div> <TrajectoryDiaLog ref="dialogRef" /> </basic-container> </template> <script setup> import { onMounted, ref } from 'vue' import { exportFwDroneFlightRecordApi, fwDroneFlightRecordPageApi } from './fwDroneFlightRecord' import { blobDownload, dateRangeFormat } from '@ztzf/utils' import FormDiaLog from '@/views/basicManage/deviceStock/FormDiaLog.vue' import TrajectoryDiaLog from '@/views/recordManage/historyTracks/TrajectoryDiaLog.vue' const initSearchParams = () => ({ droneName: '', // 无人机名称 areaName: '', // 区域 current: 1, // 当前页 size: 10, // 每页大小 }) const searchParams = ref(initSearchParams()) // 查询参数 const total = ref(0) // 总条数 const loading = ref(false) // 列表加载中 const list = ref([]) // 列表数据 const queryParamsRef = ref(null) // 查询表单实例 const dateRange = ref([]) const exportLoading = ref(false) const dialogRef = ref(null) // 弹框实例 // 获取列表 async function getList() { const range = dateRangeFormat(dateRange.value) loading.value = true try { const params = { ...searchParams.value, startTime: range?.[0], endTime: range?.[1] } const res = await fwDroneFlightRecordPageApi(params) list.value = res?.data?.data?.records ?? [] total.value = res?.data?.data?.total ?? 0 } finally { loading.value = false } } // 查询 function handleSearch() { searchParams.value.current = 1 getList() } // 重置查询 function resetForm() { dateRange.value = [] queryParamsRef.value?.resetFields() searchParams.value.current = 1 getList() } function formatStayDuration(value) { if (!value) return '-' if (typeof value === 'string') return value const hour = String(value.hour ?? 0).padStart(2, '0') const minute = String(value.minute ?? 0).padStart(2, '0') const second = String(value.second ?? 0).padStart(2, '0') return `${hour}:${minute}:${second}` } function exportFile() { const range = dateRangeFormat(dateRange.value) exportLoading.value = true exportFwDroneFlightRecordApi({ ...searchParams.value, start_time: range[0], end_time: range[1] }) .then(res => { blobDownload(res) }) .finally(() => { exportLoading.value = false }) } function handleView(row) { dialogRef.value?.open({ mode: 'view', row: { ...row } }) } onMounted(() => { getList() }) </script> <style scoped lang="scss"> </style> <style scoped lang="scss"></style>