地图订单修改
This commit is contained in:
@@ -451,15 +451,14 @@ async ServerLogin(code: string) {
|
||||
if (res.statusCode >= 200 && res.statusCode < 300) {
|
||||
try {
|
||||
const data = JSON.parse(res.data);
|
||||
// 使用服务器返回的实际路径,而不是构造的路径
|
||||
const avatarUrl = data.avatarPath ? `${API_BASE_URL}${data.avatarPath}` : data.avatarUrl;
|
||||
resolve({
|
||||
success: true,
|
||||
avatarUrl: data.avatarUrl
|
||||
avatarUrl: avatarUrl
|
||||
});
|
||||
} catch (error) {
|
||||
resolve({
|
||||
success: true,
|
||||
avatarUrl: `${API_BASE_URL}/avatars/${employeeId}.jpg`
|
||||
});
|
||||
reject(new Error(`解析响应失败: ${error}`));
|
||||
}
|
||||
} else {
|
||||
reject(new Error(`上传失败: HTTP ${res.statusCode}`));
|
||||
@@ -479,12 +478,13 @@ async ServerLogin(code: string) {
|
||||
*/
|
||||
async getEmployeeAvatar(employeeId: number): Promise<string> {
|
||||
try {
|
||||
// 尝试获取头像信息
|
||||
const response = await this.request<{ avatarUrl: string }>(`/employees/${employeeId}/avatar`);
|
||||
return response.avatarUrl || `${API_BASE_URL}/avatars/${employeeId}.jpg`;
|
||||
// 使用RESTful API获取头像信息,确保路径一致性
|
||||
const response = await this.request<{ avatarPath: string }>(`/employees/${employeeId}/avatar`);
|
||||
// 使用服务器返回的实际路径
|
||||
return response.avatarPath ? `${API_BASE_URL}${response.avatarPath}` : '/images/user-avatar.png';
|
||||
} catch (error) {
|
||||
// 如果获取失败,返回默认头像URL
|
||||
return `${API_BASE_URL}/avatars/${employeeId}.jpg`;
|
||||
// 如果获取失败,返回默认头像
|
||||
return '/images/user-avatar.png';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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})`);
|
||||
|
||||
@@ -260,6 +260,16 @@ class MapService {
|
||||
return R * c;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算路线(calculateRoute的别名方法)
|
||||
* @param origin 起点坐标字符串 (经度,纬度)
|
||||
* @param destination 终点坐标字符串 (经度,纬度)
|
||||
* @returns 路线规划结果
|
||||
*/
|
||||
async calculateRoute(origin: string, destination: string): Promise<RoutePlanResult> {
|
||||
return this.getDrivingRoute(origin, destination);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取路线规划(通用版本)
|
||||
* @param origin 起点坐标
|
||||
|
||||
@@ -14,6 +14,27 @@ export interface StatisticsData {
|
||||
timestamp: number; // 数据时间戳
|
||||
}
|
||||
|
||||
/**
|
||||
* 工作统计数据接口
|
||||
*/
|
||||
export interface WorkStats {
|
||||
todayOrders: number; // 今日订单数
|
||||
completedOrders: number; // 已完成订单数
|
||||
pendingOrders: number; // 待处理订单数
|
||||
timestamp: number; // 数据时间戳
|
||||
}
|
||||
|
||||
/**
|
||||
* 个人统计数据接口
|
||||
*/
|
||||
export interface PersonalStats {
|
||||
totalOrders: number; // 总订单数
|
||||
completedOrders: number; // 已完成订单数
|
||||
pendingOrders: number; // 待处理订单数
|
||||
averageDeliveryTime: number; // 平均配送时间(分钟)
|
||||
timestamp: number; // 数据时间戳
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计服务类
|
||||
* 提供系统统计数据的获取和缓存功能
|
||||
@@ -25,6 +46,13 @@ class StatisticsService {
|
||||
// 缓存超时时间(5分钟)
|
||||
private readonly cacheTimeout = 5 * 60 * 1000;
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
constructor() {
|
||||
// 不需要初始化HTTP客户端,直接使用apiService
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取系统统计数据
|
||||
* 采用一个API请求获取三个统计数据,后续操作客户端自行统计
|
||||
@@ -101,6 +129,64 @@ class StatisticsService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工作统计数据
|
||||
*/
|
||||
async getWorkStats(): Promise<WorkStats> {
|
||||
try {
|
||||
// 使用apiService的getOrderStats方法获取今日订单统计
|
||||
const response = await apiService.getOrderStats('today');
|
||||
|
||||
// 转换API响应格式为WorkStats格式
|
||||
return {
|
||||
todayOrders: response.totalOrders || 0,
|
||||
completedOrders: response.completedOrders || 0,
|
||||
pendingOrders: response.inProgressOrders || 0,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('获取工作统计数据失败:', error);
|
||||
// 如果API调用失败,返回默认值
|
||||
return {
|
||||
todayOrders: 0,
|
||||
completedOrders: 0,
|
||||
pendingOrders: 0,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取个人统计数据
|
||||
* 由于API中没有直接的个人统计接口,这里返回默认值
|
||||
* 实际应用中应该从订单服务中获取当前用户的订单统计
|
||||
*/
|
||||
async getPersonalStats(): Promise<PersonalStats> {
|
||||
try {
|
||||
// 在实际应用中,这里应该调用订单服务获取当前用户的订单统计
|
||||
// 由于API限制,暂时返回默认值
|
||||
console.warn('个人统计API不可用,返回默认值');
|
||||
|
||||
return {
|
||||
totalOrders: 0,
|
||||
completedOrders: 0,
|
||||
pendingOrders: 0,
|
||||
averageDeliveryTime: 0,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('获取个人统计数据失败:', error);
|
||||
// 如果API调用失败,返回默认值
|
||||
return {
|
||||
totalOrders: 0,
|
||||
completedOrders: 0,
|
||||
pendingOrders: 0,
|
||||
averageDeliveryTime: 0,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 手动刷新统计数据(清除缓存)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user