地图订单修改

This commit is contained in:
2025-12-10 22:49:22 +08:00
parent 271b88232c
commit 528e4757dd
17 changed files with 325 additions and 183 deletions

View File

@@ -1,5 +1,5 @@
// 位置追踪服务 - 处理用户签到后的位置追踪和状态管理
import { LocationData } from '../types';
// import { LocationData } from '../types'; // 已弃用,服务器不再使用嵌套对象
import apiService from './apiService';
import userService from './userService';
import mapService from './mapService';
@@ -14,7 +14,9 @@ export interface OnlineUserInfo {
name: string;
avatarPath?: string; // 头像相对路径(服务器下发)
role: string;
lastLocation: LocationData;
latitude: number; // 纬度(直接字段,不再使用嵌套对象)
longitude: number; // 经度(直接字段,不再使用嵌套对象)
timestamp: number; // 时间戳(直接字段,不再使用嵌套对象)
lastUpdateTime: number;
status: 'online' | 'offline'| 'timeout';
}
@@ -220,7 +222,7 @@ class LocationTrackingService {
/**
* 获取当前位置
*/
public async getCurrentLocation(): Promise<LocationData> {
public async getCurrentLocation(): Promise<{ longitude: number; latitude: number; timestamp: number }> {
const userInfo = userService.getGlobalUserInfo();
if (!userInfo || !userInfo.id) {
throw new Error('用户未登录');
@@ -233,7 +235,6 @@ class LocationTrackingService {
console.log('[位置追踪服务] 获取真实位置成功:', location);
return {
userId: userInfo.id,
longitude: location.longitude,
latitude: location.latitude,
timestamp: Date.now()
@@ -243,7 +244,6 @@ class LocationTrackingService {
// 定位失败时返回默认位置作为降级方案
return {
userId: userInfo.id,
longitude: 102.833722,
latitude: 24.880095,
timestamp: Date.now()
@@ -417,22 +417,24 @@ class LocationTrackingService {
// 处理在线用户列表消息(服务器发送当前在线用户列表)
console.log('👥 处理在线用户列表,用户数量:', message.users ? message.users.length : 0);
if (message.users && Array.isArray(message.users)) {
this.triggerOnlineUserListCallbacks({
type: 'onlineUserList',
users: message.users.map((user: any) => ({
// 转换用户数据格式,确保与位置追踪服务兼容
const formattedUsers = message.users.map((user: any) => ({
userId: user.userId,
name: user.name,
role: user.role,
userStatus: user.userStatus,
lastUpdateTime: user.lastUpdateTime,
latitude: user.locationData?.latitude || user.latitude,
longitude: user.locationData?.longitude || user.longitude,
timestamp: user.locationData?.timestamp || user.timestamp,
avatarPath: user.avatarPath,
address: user.address
}))
});
}else {
latitude: user.latitude, // 直接使用latitude字段
longitude: user.longitude, // 直接使用longitude字段
timestamp: user.timestamp, // 直接使用timestamp字段
avatarPath: user.avatarPath || undefined, // 确保null转换为undefined
}));
console.log('📊 转换后的在线用户数据:', formattedUsers);
// 关键修复调用handleOnlineUserList方法填充onlineUsers Map
this.handleOnlineUserList(formattedUsers);
} else {
console.warn('❌ onlineUserList消息格式错误users字段不存在或不是数组');
}
break;
@@ -444,32 +446,29 @@ class LocationTrackingService {
if (message.users && Array.isArray(message.users)) {
// 转换用户数据格式,确保与位置追踪服务兼容
const formattedUsers = message.users.map((user: any) => {
// 支持多种数据格式locationData字段或直接字段
const locationData = user.locationData || user;
// 验证必需字段是否存在
if (!user.userId && !locationData.userId) {
if (!user.userId) {
console.error('❌ 用户数据缺少userId字段:', user);
return null;
}
if (locationData.latitude === undefined || locationData.longitude === undefined) {
if (user.latitude === undefined || user.longitude === undefined) {
console.error('❌ 用户数据缺少位置信息:', user);
return null;
}
// 对于位置更新消息允许缺少name和role字段从本地缓存中获取
const existingUser = this.onlineUsers.get(user.userId || locationData.userId);
const existingUser = this.onlineUsers.get(user.userId);
const formattedUser = {
userId: user.userId || locationData.userId,
name: user.name || user.userName || (existingUser ? existingUser.name : `用户${user.userId || locationData.userId}`),
userId: user.userId,
name: user.name || user.userName || (existingUser ? existingUser.name : `用户${user.userId}`),
role: user.role || (existingUser ? existingUser.role : 'DRIVER'),
userStatus: user.userStatus !== false, // 转换为布尔值
lastUpdateTime: user.lastUpdateTime || locationData.timestamp || Date.now(),
latitude: locationData.latitude,
longitude: locationData.longitude,
timestamp: locationData.timestamp || user.timestamp || Date.now(),
lastUpdateTime: user.lastUpdateTime || user.timestamp || Date.now(),
latitude: user.latitude,
longitude: user.longitude,
timestamp: user.timestamp || Date.now(),
avatarPath: user.avatarPath || (existingUser ? existingUser.avatarPath : undefined),
};
@@ -478,16 +477,16 @@ class LocationTrackingService {
console.error('❌ 用户数据缺少userId字段:', formattedUser);
return null;
}
if (formattedUser.latitude === undefined || formattedUser.longitude === undefined) {
console.error('❌ 用户数据缺少位置信息:', formattedUser);
return null;
}
return formattedUser;
}).filter((user: any) => user !== null); // 过滤掉无效数据
console.log('📊 转换后的用户位置数据:', formattedUsers);
this.triggerOnlineUserListCallbacks({
type: 'userLocationList',
users: formattedUsers
});
this.handleOnlineUserList(formattedUsers);
} else {
console.warn('❌ userLocationList消息格式错误users字段不存在或不是数组');
}
@@ -498,26 +497,6 @@ class LocationTrackingService {
}
}
/**
* 触发在线用户列表回调函数
* @param userList 在线用户列表数据
*/
private triggerOnlineUserListCallbacks(userList: any): void {
console.log('🔔 [apiService] 开始触发在线用户列表回调,消息类型:', userList.type);
console.log('📊 [apiService] 回调数据内容:', JSON.stringify(userList, null, 2));
try {
console.log('🔄 [apiService] 执行在线用户列表回调函数');
// 传递正确的数据格式只传递users数组而不是整个消息对象
this.handleOnlineUserList(userList.users);
console.log('✅ [apiService] 在线用户列表回调函数执行成功');
} catch (error) {
console.error('❌ [apiService] 在线用户列表回调函数执行失败:', error);
}
console.log('🏁 [apiService] 在线用户列表回调触发完成');
}
/**
* 处理在线用户列表
* @param userList 服务器下发的在线用户列表
@@ -542,7 +521,7 @@ class LocationTrackingService {
if (user && user.userId && user.latitude !== undefined && user.longitude !== undefined) {
newUserIds.add(user.userId);
// 提取位置数据(支持多种数据格式
// 提取位置数据(直接字段
const latitude = user.latitude;
const longitude = user.longitude;
const timestamp = user.timestamp || user.lastUpdateTime || Date.now();
@@ -556,19 +535,11 @@ class LocationTrackingService {
name: user.name || user.userName || (existingUser ? existingUser.name : `用户${user.userId}`),
avatarPath: user.avatarPath || (existingUser ? existingUser.avatarPath : undefined),
role: user.role || (existingUser ? existingUser.role : 'DRIVER'),
lastLocation: {
userId: user.userId,
longitude: longitude,
latitude: latitude,
timestamp: timestamp
},
latitude: latitude, // 直接使用纬度字段
longitude: longitude, // 直接使用经度字段
timestamp: timestamp, // 直接使用时间戳字段
lastUpdateTime: timestamp,
status: user.userStatus === false ? 'offline' : 'online',
// currentLocation: {
// address: user.address || (existingUser ? existingUser.currentLocation?.address : '位置信息获取中...'),
// longitude: longitude,
// latitude: latitude
// }
});
console.log(`[LocationTrackingService] 更新用户 ${user.userId} 位置: (${latitude}, ${longitude})`);