Files
WXProgram/miniprogram/pages/index/modules/mainPageModule.ts
2025-10-16 21:32:16 +08:00

308 lines
7.6 KiB
TypeScript

// 主页面模块 - 协调各个子模块,处理页面生命周期和事件分发
import { LoginModule } from './loginModule';
import { MapModule } from './mapModule';
import { OrderModule } from './orderModule';
import { WarehouseModule } from './warehouseModule';
import { DeliveryPersonModule } from './deliveryPersonModule';
import { DataModule } from './dataModule';
import { showToast } from '../../../utils/helpers';
export class MainPageModule {
private pageContext: any;
private loginModule: LoginModule;
private mapModule: MapModule;
private orderModule: OrderModule;
private warehouseModule: WarehouseModule;
private deliveryPersonModule: DeliveryPersonModule;
private dataModule: DataModule;
constructor(pageContext: any) {
this.pageContext = pageContext;
// 初始化各个子模块
this.dataModule = new DataModule(pageContext);
this.loginModule = new LoginModule(pageContext, this.dataModule);
this.mapModule = new MapModule(pageContext, this.dataModule);
this.orderModule = new OrderModule(pageContext, this.dataModule);
this.warehouseModule = new WarehouseModule(pageContext, this.dataModule);
this.deliveryPersonModule = new DeliveryPersonModule(pageContext, this.dataModule);
}
/**
* 页面初始化
*/
async onLoad(): Promise<void> {
console.log('主页面模块初始化');
try {
// 初始化应用
await this.initApp();
// 加载地图数据
await this.loadAllData();
console.log('主页面初始化完成');
} catch (error) {
console.error('页面初始化失败:', error);
showToast('页面初始化失败');
}
}
/**
* 页面显示
*/
onShow(): void {
console.log('主页面显示');
// 检查是否需要刷新数据
this.refreshDataIfNeeded();
}
/**
* 初始化应用
*/
private async initApp(): Promise<void> {
// 初始化数据
this.dataModule.initializeData();
console.log('应用初始化');
}
/**
* 加载所有数据
*/
private async loadAllData(): Promise<void> {
try {
// 初始化地图
await this.mapModule.initMap();
// 加载公开数据(不需要登录)
await this.loadPublicData();
// 检查是否已登录,只有已登录用户才能加载业务数据
const app = getApp<any>();
if (app.globalData.isLoggedIn) {
await this.loadBusinessData();
} else {
console.log('用户未登录,不加载业务数据');
}
} catch (error) {
console.error('加载数据失败:', error);
showToast('数据加载失败');
}
}
/**
* 加载公开数据(不需要登录)
*/
private async loadPublicData(): Promise<void> {
console.log('加载公开数据');
try {
// 加载仓库数据(公开数据,不需要登录)
await this.warehouseModule.loadWarehouses();
console.log('公开数据加载完成');
} catch (error) {
console.error('加载公开数据失败:', error);
// 公开数据加载失败不影响主要功能,只记录日志
}
}
/**
* 加载业务数据
*/
private async loadBusinessData(): Promise<void> {
console.log('加载业务数据');
try {
// 并行加载各种业务数据(需要登录)
await Promise.all([
this.orderModule.loadPendingOrders(),
this.deliveryPersonModule.loadDeliveryPersons()
]);
console.log('所有业务数据加载完成');
} catch (error) {
console.error('加载业务数据失败:', error);
showToast('业务数据加载失败');
}
}
/**
* 检查是否需要刷新数据
*/
private refreshDataIfNeeded(): void {
// 这里可以添加数据刷新逻辑
// 例如:检查上次刷新时间,如果超过一定时间则重新加载数据
console.log('检查数据刷新');
}
/**
* 处理登出
*/
onLogout(): void {
console.log('用户登出');
// 清除业务数据
this.clearBusinessData();
// 重置用户标记点图标
this.resetUserMarker();
showToast('已登出');
}
/**
* 清除业务数据
*/
private clearBusinessData(): void {
this.dataModule.updatePendingOrders([]);
const filteredMarkers = this.pageContext.data.markers.filter((marker: any) =>
marker.type !== 'warehouse' && marker.type !== 'delivery_person'
);
this.dataModule.updateMarkers(filteredMarkers);
}
/**
* 重置用户标记点
*/
private resetUserMarker(): void {
const { markers } = this.pageContext.data;
const updatedMarkers = markers.map((marker: any) => {
if (marker.id === -1) {
return {
...marker,
iconPath: '/images/trucks.png'
};
}
return marker;
});
this.dataModule.updateMarkers(updatedMarkers);
}
/**
* 隐藏所有面板
*/
hideAllPanels(): void {
this.dataModule.toggleUserPanel(false);
this.dataModule.toggleOrderPanel(false);
this.dataModule.toggleWarehouseModal(false);
this.dataModule.toggleDeliveryPersonModal(false);
}
/**
* 重置标记点状态
*/
resetMarkers(): void {
// 这里可以添加标记点状态重置逻辑
console.log('重置标记点状态');
}
/**
* 分发地图点击事件
*/
onMapTap(e: any): void {
this.mapModule.onMapTap(e);
}
/**
* 分发标记点点击事件
*/
onMarkerTap(e: any): void {
const markerId = e.markerId;
const { markers } = this.pageContext.data;
// 找到被点击的标记点
const marker = markers.find((m: any) => m.id === markerId);
if (!marker) {
console.warn('未找到标记点:', markerId);
return;
}
// 根据标记点类型分发到不同的模块
switch (marker.type) {
case 'warehouse':
this.warehouseModule.onWarehouseMarkerClick(marker.data, e);
break;
case 'delivery_person':
this.deliveryPersonModule.onDeliveryPersonMarkerClick(marker.data, e);
break;
default:
this.mapModule.onMarkerTap(e);
break;
}
}
/**
* 获取登录模块
*/
getLoginModule(): LoginModule {
return this.loginModule;
}
/**
* 获取地图模块
*/
getMapModule(): MapModule {
return this.mapModule;
}
/**
* 获取订单模块
*/
getOrderModule(): OrderModule {
return this.orderModule;
}
/**
* 获取仓库模块
*/
getWarehouseModule(): WarehouseModule {
return this.warehouseModule;
}
/**
* 获取货运人员模块
*/
getDeliveryPersonModule(): DeliveryPersonModule {
return this.deliveryPersonModule;
}
/**
* 刷新所有数据
*/
async refreshAllData(): Promise<void> {
console.log('刷新所有数据');
try {
// 刷新公开数据(不需要登录)
await this.loadPublicData();
// 检查是否已登录,只有已登录用户才能刷新业务数据
const app = getApp<any>();
if (app.globalData.isLoggedIn) {
await this.loadBusinessData();
showToast('数据刷新成功');
} else {
console.log('用户未登录,无法刷新业务数据');
showToast('公开数据已刷新,请登录以刷新业务数据');
}
} catch (error) {
console.error('刷新数据失败:', error);
showToast('刷新数据失败');
}
}
/**
* 处理错误
*/
handleError(error: any, context: string): void {
console.error(`${context} 中发生错误:`, error);
showToast(`操作失败: ${context}`);
}
}