地图订单修改

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

@@ -571,24 +571,21 @@ Page({
// 获取仓库信息
const warehouse = warehouses[warehouseIndex];
// 模拟终点坐标(实际应用中应该通过地图选择或搜索获取)
// 从已有仓库中获取一个坐标作为参考点
const referenceWarehouse = this.data.warehouses[0];
const endPoint = {
name: endName,
longitude: referenceWarehouse.address ? 102.715 + (Math.random() - 0.5) * 0.1 : 102.715,
latitude: referenceWarehouse.address ? 25.045 + (Math.random() - 0.5) * 0.1 : 25.045
};
// 创建订单数据
const newOrder: Omit<Order, 'id' | 'createTime'> = {
startPoint: {
id: warehouse.id,
name: warehouse.name,
longitude: 102.715, // 临时使用固定坐标
latitude: 25.045 // 临时使用固定坐标
longitude: warehouse.longitude || 0,
latitude: warehouse.latitude || 0
},
endPoint: {
name: endName,
// 后端服务器应该根据地址名称进行地理编码
// 这里只提供地址名称,由后端处理坐标获取
longitude: 0,
latitude: 0
},
endPoint,
status: 'pending',
goodsType,
goodsWeight

View File

@@ -10,6 +10,7 @@ import { MainPageModule } from './modules/mainPageModule';
// 导入类型定义
import { IndexPageComponent } from '../../types';
import { API_BASE_URL } from '../../services/apiService';
// 主页面组件
Component<IndexPageComponent['data'], any, any, any, false>({
@@ -94,6 +95,23 @@ Component<IndexPageComponent['data'], any, any, any, false>({
return `${API_BASE_URL}${avatarPath}`;
},
// 格式化时间戳用于wxml显示
formatTimestamp(timestamp: number): string {
if (!timestamp) {
return '未知';
}
const date = new Date(timestamp);
return date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
},
// 处理货运人员底部弹窗关闭
onDeliveryPersonModalClose() {

View File

@@ -236,11 +236,11 @@
<view class="modal-header">
<view class="delivery-person-header">
<view class="delivery-person-avatar">
<image src="{{currentDeliveryPerson.fullAvatarUrl}}" mode="aspectFill"></image>
<image src="{{currentDeliveryPerson.avatarPath ? currentDeliveryPerson.avatarPath : '/images/avatar.png'}}" mode="aspectFill"></image>
</view>
<view class="person-info-header">
<view class="modal-title">{{currentDeliveryPerson.name}}</view>
<view class="modal-subtitle">工号{{currentDeliveryPerson.phone}}</view>
<view class="modal-subtitle">角色{{currentDeliveryPerson.role}}</view>
</view>
</view>
</view>
@@ -248,16 +248,16 @@
<!-- 基础信息区 - 始终可见 -->
<view class="modal-basic-info">
<view class="detail-item">
<text class="detail-label">工号</text>
<text class="detail-value">{{currentDeliveryPerson.phone}}</text>
</view>
<view class="detail-item">
<text class="detail-label">状态</text>
<text class="detail-value status-badge status-{{currentDeliveryPerson.status === 'idle' ? 'idle' : currentDeliveryPerson.status === 'busy' ? 'busy' : currentDeliveryPerson.status === 'delivering' ? 'delivering' : 'offline'}}">{{deliveryService.getDeliveryPersonStatusText(currentDeliveryPerson.status)}}</text>
<text class="detail-label">用户ID</text>
<text class="detail-value">{{currentDeliveryPerson.userId}}</text>
</view>
<view class="detail-item">
<text class="detail-label">当前位置</text>
<text class="detail-value">{{currentDeliveryPerson.currentLocation.address}}</text>
<text class="detail-value">经度:{{currentDeliveryPerson.longitude}},纬度:{{currentDeliveryPerson.latitude}}</text>
</view>
<view class="detail-item">
<text class="detail-label">最后更新时间</text>
<text class="detail-value">{{currentDeliveryPerson.timestamp ? formatTimestamp(currentDeliveryPerson.timestamp) : '未知'}}</text>
</view>
</view>

View File

@@ -1,5 +1,6 @@
import { UserInfo, Marker } from '../../../types';
import { avatarCache } from '../../../utils/avatarCache';
import { API_BASE_URL } from '../../../services/apiService';
/**
* 页面数据管理模块
@@ -203,19 +204,22 @@ export class DataModule {
const processedPerson = { ...person };
if (person.avatarPath) {
try {
// 只有在用户已签到的情况下才使用头像缓存
const app = getApp<any>();
const isSignedIn = app.globalData.userInfo && app.globalData.userInfo.status === 'signed_in';
if (isSignedIn) {
processedPerson.avatarPath = await avatarCache.getAvatarPath(person.avatarPath);
} else {
// 未签到状态,直接使用原始路径
processedPerson.avatarPath = person.avatarPath;
// 将相对路径转换为完整URL
let avatarUrl = person.avatarPath;
if (!avatarUrl.startsWith('http')) {
avatarUrl = `${API_BASE_URL}${avatarUrl}`;
}
// 使用头像缓存获取本地图片路径
processedPerson.avatarPath = await avatarCache.getAvatarPath(avatarUrl);
} catch (error) {
console.error('处理货运人员头像缓存失败:', error);
// 如果头像缓存失败,使用默认头像
processedPerson.avatarPath = '/images/user-avatar.png';
}
} else {
// 如果没有头像路径,使用默认头像
processedPerson.avatarPath = '/images/user-avatar.png';
}
this.pageContext.setData({ currentDeliveryPerson: processedPerson });

View File

@@ -170,13 +170,14 @@ export class LocationModule {
zIndex: 30,
data: {
userId: user.userId,
name: user.name || user.userName || `用户${user.userId}`,
role: userRole,
avatarPath: user.avatarPath || undefined,
latitude: latitude, // 直接使用纬度字段
longitude: longitude, // 直接使用经度字段
timestamp: user.timestamp || lastUpdateTime,
lastUpdateTime: lastUpdateTime,
currentLocation: {
address: user.address || '位置信息获取中...',
longitude: longitude,
latitude: latitude
}
status: user.status || 'online'
}
};
@@ -294,20 +295,20 @@ export class LocationModule {
// 优先使用传入的用户数据中的头像信息
if (userData) {
// 尝试使用avatarPath相对路径
if (userData.avatarPath) {
if (userData.avatarPath && userData.avatarPath !== 'null') {
console.log(`📸 [LocationModule] 使用用户数据中的avatarPath: ${userData.avatarPath}`);
const fullAvatarUrl = `${API_BASE_URL}${userData.avatarPath}`;
return await avatarCache.getAvatarPath(fullAvatarUrl);
}
// 尝试使用avatarUrl完整URL
if (userData.avatarUrl) {
if (userData.avatarUrl && userData.avatarUrl !== 'null') {
console.log(`📸 [LocationModule] 使用用户数据中的avatarUrl: ${userData.avatarUrl}`);
return await avatarCache.getAvatarPath(userData.avatarUrl);
}
// 尝试使用avatar兼容字段
if (userData.avatar) {
if (userData.avatar && userData.avatar !== 'null') {
console.log(`📸 [LocationModule] 使用用户数据中的avatar: ${userData.avatar}`);
return await avatarCache.getAvatarPath(userData.avatar);
}

View File

@@ -4,6 +4,8 @@ import userService from '../../../services/userService';
import { showToast } from '../../../utils/helpers';
import { Marker } from '../../../types';
import { DataModule } from './dataModule';
import warehouseService from '../../../services/warehouseService';
import deliveryService from '../../../services/deliveryPersonService';
export class MapModule {
private pageContext: any;
@@ -152,15 +154,65 @@ export class MapModule {
/**
* 加载地图数据(仓库和货运人员)
*/
loadMapData(): void {
// 这里会调用具体的服务来获取数据
// 目前使用模拟数据
const markers = this.generateInitialMarkers();
async loadMapData(): Promise<void> {
try {
// 调用具体的服务来获取数据
const warehouses = await warehouseService.getWarehouses();
const deliveryPersons = await deliveryService.getDeliveryPersons();
// 生成标记点
const markers = this.generateMarkersFromData(warehouses, deliveryPersons);
// 更新数据模块中的标记点
this.dataModule.updateMarkers(markers);
console.log('地图数据加载完成');
} catch (error) {
console.error('加载地图数据失败:', error);
// 如果API调用失败使用空标记点
this.dataModule.updateMarkers([]);
}
}
/**
* 从数据生成标记点
*/
private generateMarkersFromData(warehouses: any[], deliveryPersons: any[]): Marker[] {
const markers: Marker[] = [];
// 更新数据模块中的标记点
this.dataModule.updateMarkers(markers);
// 添加仓库标记点
warehouses.forEach(warehouse => {
if (warehouse.longitude && warehouse.latitude) {
markers.push({
id: warehouse.id,
latitude: warehouse.latitude,
longitude: warehouse.longitude,
title: warehouse.name,
iconPath: '/images/warehouse-marker.png',
width: 30,
height: 30,
type: 'warehouse'
});
}
});
console.log('地图数据加载完成');
// 添加货运人员标记点
deliveryPersons.forEach(person => {
if (person.longitude && person.latitude) {
markers.push({
id: person.id,
latitude: person.latitude,
longitude: person.longitude,
title: person.name,
iconPath: '/images/delivery-marker.png',
width: 30,
height: 30,
type: 'employee'
});
}
});
return markers;
}
/**

View File

@@ -1,3 +1,4 @@
import mapService from '../../../services/mapService';
import orderService from '../../../services/orderService';
import { Order } from '../../../types';
import { showToast } from '../../../utils/helpers';
@@ -76,13 +77,8 @@ export class OrderModule {
console.log(`开始规划路线: 起点=${origin}, 终点=${destination}`);
// 这里应该调用地图服务的路线规划功能
// 目前先模拟一个简单的路线规划结果
const routeResult = {
distance: 1500, // 1.5公里
duration: 300, // 5分钟
polyline: null // 路线数据
};
// 调用地图服务的路线规划功能
const routeResult = await mapService.calculateRoute(origin, destination);
console.log('路线规划结果:', routeResult);

View File

@@ -1,6 +1,7 @@
// 员工界面 - 全屏工作面板
import { UserInfo } from '../../types';
import userService from '../../services/userService';
import statisticsService from '../../services/statisticsService';
Page({
data: {
@@ -81,15 +82,22 @@ Page({
/**
* 加载工作统计数据
*/
loadWorkStats() {
// 模拟加载工作统计数据
this.setData({
workStats: {
todayOrders: 8,
completedOrders: 5,
pendingOrders: 3
}
});
async loadWorkStats() {
try {
// 调用API获取工作统计数据
const workStats = await statisticsService.getWorkStats();
this.setData({ workStats });
} catch (error) {
console.error('加载工作统计数据失败:', error);
// 如果API调用失败设置默认值
this.setData({
workStats: {
todayOrders: 0,
completedOrders: 0,
pendingOrders: 0
}
});
}
},
/**

View File

@@ -260,8 +260,10 @@ Page({
},
endPoint: {
name: endName,
longitude: 102.715 + (Math.random() - 0.5) * 0.1,
latitude: 25.045 + (Math.random() - 0.5) * 0.1
// 后端服务器应该根据地址名称进行地理编码
// 这里只提供地址名称,由后端处理坐标获取
longitude: 0,
latitude: 0
},
status: 'pending',
goodsType,
@@ -316,21 +318,17 @@ Page({
success: (res) => {
if (res.confirm) {
// 调用删除订单接口
// orderService.deleteOrder(orderId).then(() => {
// this.showSuccess('订单删除成功');
// this.refreshData();
// }).catch(error => {
// console.error('删除订单失败:', error);
// this.showError('删除订单失败');
// });
// 暂时使用模拟删除
const orders = this.data.orders.filter(order => order.id !== orderId);
this.setData({
orders
orderService.deleteOrder(orderId).then((result) => {
if (result.success) {
this.showSuccess('订单删除成功');
this.refreshData();
} else {
this.showError(result.message || '删除失败');
}
}).catch(error => {
console.error('删除订单失败:', error);
this.showError('删除订单失败');
});
this.filterOrders();
this.showSuccess('订单删除成功');
}
}
});
@@ -426,6 +424,11 @@ Page({
});
},
// 阻止事件冒泡
stopPropagation(e: any) {
// 阻止事件冒泡,不执行任何操作
},
// 返回上一页
goBack() {
wx.navigateBack();

View File

@@ -73,7 +73,7 @@
</view>
<!-- 操作按钮 -->
<view class="order-actions" wx:if="{{item.status === 'pending'}}">
<view class="order-actions" wx:if="{{item.status === 'pending'}}" catchtap="stopPropagation">
<button class="action-btn assign-btn" bindtap="handleOrderTap" data-id="{{item.id}}">分配</button>
<button class="action-btn delete-btn" bindtap="deleteOrder" data-id="{{item.id}}">删除</button>
</view>

View File

@@ -11,9 +11,9 @@ Page({
totalOrders: 0, // 总订单数
completedOrders: 0, // 已完成订单数
pendingOrders: 0, // 待处理订单数
deliveryRate: 0, // 配送成功率
averageTime: 0 // 平均配送时间
},
averageDeliveryTime: 0, // 平均配送时间(分钟)
timestamp: 0 // 数据时间
} as any,
// 系统统计数据
systemStats: {
employeeCount: 0, // 员工总数
@@ -103,15 +103,9 @@ Page({
*/
async getPersonalStats() {
try {
// 这里应该调用个人统计API
// 暂时使用模拟数据
return {
totalOrders: 156,
completedOrders: 142,
pendingOrders: 14,
deliveryRate: 91.0,
averageTime: 45
};
// 调用个人统计API
const personalStats = await statisticsService.getPersonalStats();
return personalStats;
} catch (error) {
console.error('获取个人统计数据失败:', error);
// 返回默认值
@@ -119,8 +113,8 @@ Page({
totalOrders: 0,
completedOrders: 0,
pendingOrders: 0,
deliveryRate: 0,
averageTime: 0
averageDeliveryTime: 0,
timestamp: Date.now()
};
}
},