定位刷新超时返回最近一次位置
This commit is contained in:
@@ -2,9 +2,7 @@ import { View, Text, Map } from '@tarojs/components'
|
|||||||
import { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import Taro, { useDidShow } from '@tarojs/taro'
|
import Taro, { useDidShow } from '@tarojs/taro'
|
||||||
import { getToken } from '@/services/auth'
|
import { getToken } from '@/services/auth'
|
||||||
import { DEVICE_UNAVAILABLE_MESSAGE } from '@/services/api'
|
|
||||||
import { loadCurrentChildBindingContext } from '@/services/binding'
|
import { loadCurrentChildBindingContext } from '@/services/binding'
|
||||||
import { getDeviceOnlineStatus } from '@/services/device'
|
|
||||||
import {
|
import {
|
||||||
getCurrentDeviceLocation,
|
getCurrentDeviceLocation,
|
||||||
getDeviceTrajectory,
|
getDeviceTrajectory,
|
||||||
@@ -187,18 +185,11 @@ export default function Location() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const onlineStatus = await getDeviceOnlineStatus(resolvedDeviceId)
|
|
||||||
if (onlineStatus && !onlineStatus.online) {
|
|
||||||
setDeviceLocation(null)
|
|
||||||
setTrajectory([])
|
|
||||||
setSelectedPoint(null)
|
|
||||||
setCoordinates(DEFAULT_COORDINATES)
|
|
||||||
setLocationNotice(onlineStatus.message || '设备不在线或暂时无法上报位置')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentLocation = await getCurrentDeviceLocation(resolvedDeviceId)
|
const currentLocation = await getCurrentDeviceLocation(resolvedDeviceId)
|
||||||
setDeviceLocation(currentLocation)
|
setDeviceLocation(currentLocation)
|
||||||
|
if (currentLocation?.stale || currentLocation?.realtime === false) {
|
||||||
|
setLocationNotice('已显示最近一次定位')
|
||||||
|
}
|
||||||
|
|
||||||
const nextCoordinates = currentLocation
|
const nextCoordinates = currentLocation
|
||||||
? {
|
? {
|
||||||
@@ -249,9 +240,7 @@ export default function Location() {
|
|||||||
}
|
}
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
console.error('[location] load failed:', error)
|
console.error('[location] load failed:', error)
|
||||||
const message = error?.message === DEVICE_UNAVAILABLE_MESSAGE
|
const message = error?.status === 408 ? '暂时无法刷新定位' : error?.message || '位置更新失败'
|
||||||
? '设备不在线或处于休眠中,暂时无法获取位置'
|
|
||||||
: error?.message || '位置更新失败'
|
|
||||||
Taro.showToast({
|
Taro.showToast({
|
||||||
title: message,
|
title: message,
|
||||||
icon: 'none',
|
icon: 'none',
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ export interface DeviceLocation {
|
|||||||
device_time: string
|
device_time: string
|
||||||
server_time: string
|
server_time: string
|
||||||
updated_at: string
|
updated_at: string
|
||||||
|
stale?: boolean
|
||||||
|
realtime?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DeviceTrajectoryPoint extends DeviceLocation {
|
export interface DeviceTrajectoryPoint extends DeviceLocation {
|
||||||
|
|||||||
@@ -202,7 +202,12 @@ def _row_to_ai_conversation_item(row: Mapping) -> DeviceAiConversationItem:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _row_to_current_location_response(row: Mapping) -> DeviceLocationCurrentResponse:
|
def _row_to_current_location_response(
|
||||||
|
row: Mapping,
|
||||||
|
*,
|
||||||
|
stale: bool = False,
|
||||||
|
realtime: bool = True,
|
||||||
|
) -> DeviceLocationCurrentResponse:
|
||||||
return DeviceLocationCurrentResponse(
|
return DeviceLocationCurrentResponse(
|
||||||
child_id=int(row["child_id"]),
|
child_id=int(row["child_id"]),
|
||||||
child_name=row.get("child_name"),
|
child_name=row.get("child_name"),
|
||||||
@@ -219,6 +224,8 @@ def _row_to_current_location_response(row: Mapping) -> DeviceLocationCurrentResp
|
|||||||
device_time=row["device_time"],
|
device_time=row["device_time"],
|
||||||
server_time=row["server_time"],
|
server_time=row["server_time"],
|
||||||
updated_at=row["updated_at"],
|
updated_at=row["updated_at"],
|
||||||
|
stale=stale,
|
||||||
|
realtime=realtime,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -681,10 +688,21 @@ async def get_current_device_location(
|
|||||||
|
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
if row is None:
|
if row is not None:
|
||||||
raise HTTPException(status_code=408, detail="GPS数据上报超时")
|
logger.info(
|
||||||
|
"device stale location returned",
|
||||||
|
extra={
|
||||||
|
"event": "device_stale_location",
|
||||||
|
"request_id": getattr(request.state, "request_id", None),
|
||||||
|
"user_id": current_user_id,
|
||||||
|
"device_id": device_id,
|
||||||
|
"child_id": int(row["child_id"]),
|
||||||
|
"location_updated_at": row.get("updated_at"),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return _row_to_current_location_response(row, stale=True, realtime=False)
|
||||||
|
|
||||||
raise HTTPException(status_code=408, detail="GPS数据未刷新")
|
raise HTTPException(status_code=408, detail="GPS数据上报超时")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(status_code=408, detail=f"GPS数据上报失败: {e}")
|
raise HTTPException(status_code=408, detail=f"GPS数据上报失败: {e}")
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ class DeviceLocationPoint(BaseModel):
|
|||||||
|
|
||||||
class DeviceLocationCurrentResponse(DeviceLocationPoint):
|
class DeviceLocationCurrentResponse(DeviceLocationPoint):
|
||||||
updated_at: datetime
|
updated_at: datetime
|
||||||
|
stale: bool = False
|
||||||
|
realtime: bool = True
|
||||||
|
|
||||||
|
|
||||||
class DeviceLocationReportResponse(DeviceLocationCurrentResponse):
|
class DeviceLocationReportResponse(DeviceLocationCurrentResponse):
|
||||||
|
|||||||
Reference in New Issue
Block a user