|
|
@ -8,6 +8,7 @@ |
|
|
:showTrajectories="true" |
|
|
:showTrajectories="true" |
|
|
:markers="filterMarkers" |
|
|
:markers="filterMarkers" |
|
|
:fences="fences" |
|
|
:fences="fences" |
|
|
|
|
|
@time-range-change="timeRangeChange" |
|
|
/> |
|
|
/> |
|
|
<TopPanel |
|
|
<TopPanel |
|
|
v-model="search" |
|
|
v-model="search" |
|
|
@ -18,32 +19,44 @@ |
|
|
<div class="markerList"> |
|
|
<div class="markerList"> |
|
|
<el-scrollbar height="100%"> |
|
|
<el-scrollbar height="100%"> |
|
|
<!--marker列表 --> |
|
|
<!--marker列表 --> |
|
|
<el-collapse accordion @change="collapseChange"> |
|
|
|
|
|
<el-collapse-item :name="item.name" v-for="item in filterMarkers" :key="item.id"> |
|
|
|
|
|
|
|
|
<el-collapse accordion> |
|
|
|
|
|
<el-collapse-item :name="item.sn" v-for="item in filterMarkers" :key="item.id"> |
|
|
<template #title> |
|
|
<template #title> |
|
|
<div class="flex flex-row w-100%"> |
|
|
<div class="flex flex-row w-100%"> |
|
|
<div class="flex-1 text-left font-500"> |
|
|
<div class="flex-1 text-left font-500"> |
|
|
{{ item.name }} |
|
|
{{ item.name }} |
|
|
</div> |
|
|
</div> |
|
|
<div class="text-gray-500 font-400 text-12px"> |
|
|
<div class="text-gray-500 font-400 text-12px"> |
|
|
{{ item.onlineStatus === 1 ? '在线' : '离线' }} |
|
|
|
|
|
|
|
|
{{ item.onlineStatus === 1 ? '在线' : '在线' }} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</template> |
|
|
</template> |
|
|
<div class="markerList-content"> |
|
|
<div class="markerList-content"> |
|
|
<div> <span>SN:</span>{{ item.sn }}</div> |
|
|
<div> <span>SN:</span>{{ item.sn }}</div> |
|
|
<div> <span>类型:</span>{{ item.gasChemical }}</div> |
|
|
<div> <span>类型:</span>{{ item.gasChemical }}</div> |
|
|
|
|
|
<hr /> |
|
|
<div> <span>气体状态:</span>{{ item.gasStatus }}</div> |
|
|
<div> <span>气体状态:</span>{{ item.gasStatus }}</div> |
|
|
<div> <span>电池告警状态:</span>{{ item.batteryStatus }}</div> |
|
|
<div> <span>电池告警状态:</span>{{ item.batteryStatus }}</div> |
|
|
<div> <span>电池:</span>{{ item.battery }}</div> |
|
|
|
|
|
|
|
|
|
|
|
<div> <span>围栏状态:</span>{{ item.fenceStatus }}</div> |
|
|
<div> <span>围栏状态:</span>{{ item.fenceStatus }}</div> |
|
|
<!-- <div> <span>在线状态:</span>{{ item.onlineStatus }}</div> --> |
|
|
|
|
|
|
|
|
<div> <span>在线状态:</span>{{ item.onlineStatus }}</div> |
|
|
|
|
|
<div> <span>启用状态:</span>{{ item.enableStatus === 1 ? '启用' : '备用' }}</div> |
|
|
|
|
|
<hr /> |
|
|
|
|
|
<div> <span>电量:</span>{{ item.battery }}</div> |
|
|
<div> <span>数值:</span>{{ item.value }} {{ item.unit }}</div> |
|
|
<div> <span>数值:</span>{{ item.value }} {{ item.unit }}</div> |
|
|
<div> <span>时间:</span>{{ dayjs(item.time).format('YYYY-MM-DD HH:mm:ss') }}</div> |
|
|
<div> <span>时间:</span>{{ dayjs(item.time).format('YYYY-MM-DD HH:mm:ss') }}</div> |
|
|
<!-- <div> |
|
|
|
|
|
<el-button type="primary" size="small">定位</el-button> |
|
|
|
|
|
<el-button type="primary" size="small">轨迹</el-button> |
|
|
|
|
|
</div> --> |
|
|
|
|
|
|
|
|
<div> |
|
|
|
|
|
<el-button |
|
|
|
|
|
type="primary" |
|
|
|
|
|
size="small" |
|
|
|
|
|
v-if="item.latitude && item.longitude" |
|
|
|
|
|
@click="setCenter(item)" |
|
|
|
|
|
>定位</el-button |
|
|
|
|
|
> |
|
|
|
|
|
<el-button type="primary" size="small" @click="onClickTrajectory(item)" |
|
|
|
|
|
>轨迹</el-button |
|
|
|
|
|
> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- {{ item }} --> |
|
|
<!-- {{ item }} --> |
|
|
</div> |
|
|
</div> |
|
|
@ -67,7 +80,7 @@ import { tdengineApi, tdStruct, tdQuery } from '@/api/gas/tdengine/index' |
|
|
import { MarkerData, FenceData } from './components/types/map.types' |
|
|
import { MarkerData, FenceData } from './components/types/map.types' |
|
|
|
|
|
|
|
|
import { useHandDetectorStore } from '@/store/modules/handDetector' |
|
|
import { useHandDetectorStore } from '@/store/modules/handDetector' |
|
|
|
|
|
|
|
|
|
|
|
import { ElMessage } from 'element-plus' |
|
|
import dayjs from 'dayjs' |
|
|
import dayjs from 'dayjs' |
|
|
|
|
|
|
|
|
const handDetectorStore = useHandDetectorStore() // 手持探测器 store |
|
|
const handDetectorStore = useHandDetectorStore() // 手持探测器 store |
|
|
@ -78,9 +91,6 @@ const fences = ref<FenceData[]>([]) |
|
|
|
|
|
|
|
|
const mapRef = ref<typeof OpenLayerMap>() |
|
|
const mapRef = ref<typeof OpenLayerMap>() |
|
|
const search = ref('') |
|
|
const search = ref('') |
|
|
function collapseChange(name: string) { |
|
|
|
|
|
console.log('collapseChange', name) |
|
|
|
|
|
} |
|
|
|
|
|
watch( |
|
|
watch( |
|
|
() => search.value, |
|
|
() => search.value, |
|
|
(newSearch, oldSearch) => { |
|
|
(newSearch, oldSearch) => { |
|
|
@ -90,6 +100,7 @@ watch( |
|
|
}, |
|
|
}, |
|
|
{ immediate: false } |
|
|
{ immediate: false } |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
// 手持设备数量 |
|
|
// 手持设备数量 |
|
|
const handDetectorCount = computed(() => markers.value.length) |
|
|
const handDetectorCount = computed(() => markers.value.length) |
|
|
const onlineCount = computed(() => markers.value.filter((item) => item.onlineStatus === 1).length) |
|
|
const onlineCount = computed(() => markers.value.filter((item) => item.onlineStatus === 1).length) |
|
|
@ -128,7 +139,6 @@ const getMarkers = async () => { |
|
|
} |
|
|
} |
|
|
}) |
|
|
}) |
|
|
markers.value = res2 as unknown as any[] |
|
|
markers.value = res2 as unknown as any[] |
|
|
getMarkersHistory() |
|
|
|
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
const getFences = async () => { |
|
|
const getFences = async () => { |
|
|
@ -145,31 +155,62 @@ const getFences = async () => { |
|
|
fences.value = fencesData as unknown as FenceData[] |
|
|
fences.value = fencesData as unknown as FenceData[] |
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
// const markersHistory = ref<tdStruct[]>([]) |
|
|
|
|
|
const getMarkersHistory = async () => { |
|
|
|
|
|
|
|
|
// 定位到手持设备 |
|
|
|
|
|
function setCenter(item: MarkerData) { |
|
|
|
|
|
console.log('setCenter', item) |
|
|
|
|
|
if (item.longitude && item.latitude) { |
|
|
|
|
|
mapRef.value?.setCenter([item.longitude || 0, item.latitude || 0]) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let currentMarker: MarkerData | null = null |
|
|
|
|
|
var trajectoryTimeRange = ref([dayjs().subtract(1, 'hour').valueOf(), dayjs().valueOf()]) |
|
|
|
|
|
// 时间范围改变 |
|
|
|
|
|
function timeRangeChange(range: { startTime: number; endTime: number }) { |
|
|
|
|
|
console.log('timeRangeChange', range) |
|
|
|
|
|
trajectoryTimeRange.value = [range.startTime,range.endTime] |
|
|
|
|
|
if (currentMarker) { |
|
|
|
|
|
showTrajectory(currentMarker) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
// 显示手持设备轨迹 |
|
|
|
|
|
async function showTrajectory(item: MarkerData) { |
|
|
|
|
|
console.log('showTrajectory', item) |
|
|
try { |
|
|
try { |
|
|
const data = await tdengineApi.getPage({ |
|
|
|
|
|
pageNo: 1, |
|
|
|
|
|
pageSize: 100, |
|
|
|
|
|
sn: '867989072729904' |
|
|
|
|
|
}) |
|
|
|
|
|
// markersHistory.value = data.list |
|
|
|
|
|
markers.value.map((item) => { |
|
|
|
|
|
if (item.sn === '867989072729904') { |
|
|
|
|
|
item.data = data.list.map((j) => { |
|
|
|
|
|
return { |
|
|
|
|
|
...j, |
|
|
|
|
|
lng: j.longitude, |
|
|
|
|
|
lat: j.latitude, |
|
|
|
|
|
time: dayjs(j.ts).format('YYYY-MM-DD HH:mm:ss'), |
|
|
|
|
|
timeStr: dayjs(j.ts).format('YYYY-MM-DD HH:mm:ss') |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!item.sn) { |
|
|
|
|
|
ElMessage.error('手持设备无效') |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
currentMarker = item |
|
|
|
|
|
const data = await tdengineApi.getHistoricalSn({ |
|
|
|
|
|
sn: item.sn, |
|
|
|
|
|
startTime: dayjs(trajectoryTimeRange.value[0]).format('YYYY-MM-DD HH:mm:ss'), |
|
|
|
|
|
endTime: dayjs(trajectoryTimeRange.value[1]).format('YYYY-MM-DD HH:mm:ss') |
|
|
|
|
|
|
|
|
|
|
|
// sn: '867989072729904' |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
item.data = data |
|
|
|
|
|
.filter((i) => i.longitude && i.latitude) |
|
|
|
|
|
.map((j) => { |
|
|
|
|
|
return { |
|
|
|
|
|
...j, |
|
|
|
|
|
lng: j.longitude, |
|
|
|
|
|
lat: j.latitude, |
|
|
|
|
|
time: dayjs(j.ts).format('YYYY-MM-DD HH:mm:ss'), |
|
|
|
|
|
timeStr: dayjs(j.ts).format('YYYY-MM-DD HH:mm:ss') |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
mapRef.value?.showTrajectory(trajectoryTimeRange.value[0], trajectoryTimeRange.value[1], [item]) |
|
|
} finally { |
|
|
} finally { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
// 点击轨迹 |
|
|
|
|
|
function onClickTrajectory(item: MarkerData) { |
|
|
|
|
|
console.log('onClickTrajectory', item) |
|
|
|
|
|
trajectoryTimeRange.value = [dayjs().subtract(1, 'hour').valueOf(), dayjs().valueOf()] |
|
|
|
|
|
showTrajectory(item) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
onMounted(() => { |
|
|
onMounted(() => { |
|
|
getMarkers() |
|
|
getMarkers() |
|
|
|