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

400 lines
10 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 主页面模块 - 协调各个子模块,处理页面生命周期和事件分发
import { LoginModule } from './loginModule';
import { MapModule } from './mapModule';
import { OrderModule } from './orderModule';
import { WarehouseModule } from './warehouseModule';
import { EmployeeModule } from './employeeModule';
import { AdminModule } from './adminModule';
import { DeliveryPersonModule } from './deliveryPersonModule';
import { LocationModule } from './locationModule';
import { DataModule } from './dataModule';
import { showToast } from '../../../utils/helpers';
// 主页面模块接口定义
export interface MainPageModule {
getLoginModule(): LoginModule;
onLoad(): Promise<void>;
onShow(): void;
onHide(): void;
onLogout(): void;
hideAllPanels(): void;
resetMarkers(): void;
cleanup(): void;
refreshAllData(): Promise<void>;
}
export class MainPageModule {
private pageContext: any;
private dataModule: DataModule;
private loginModule: LoginModule;
private mapModule: MapModule;
private orderModule: OrderModule;
private warehouseModule: WarehouseModule;
private employeeModule: EmployeeModule;
private adminModule: AdminModule;
private deliveryPersonModule: DeliveryPersonModule;
private locationModule: LocationModule;
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.employeeModule = new EmployeeModule(this.pageContext, this.dataModule);
this.adminModule = new AdminModule(this.pageContext, this.dataModule);
this.deliveryPersonModule = new DeliveryPersonModule(this.pageContext, this.dataModule);
this.locationModule = new LocationModule(pageContext, this.dataModule);
}
/**
* 页面初始化
*/
async onLoad(): Promise<void> {
console.log('主页面模块初始化');
try {
// 初始化应用
await this.initApp();
// 初始化位置模块
await this.locationModule.initialize();
// 加载地图数据
await this.loadAllData();
console.log('主页面初始化完成');
} catch (error) {
console.error('页面初始化失败:', error);
showToast('页面初始化失败');
}
}
/**
* 页面显示
*/
onShow(): void {
console.log('主页面显示');
// 检查是否需要刷新数据
this.refreshDataIfNeeded();
}
/**
* 页面隐藏
*/
onHide(): void {
console.log('主页面隐藏');
// 清理位置模块
this.locationModule.cleanup();
}
/**
* 初始化应用
*/
private async initApp(): Promise<void> {
// 初始化数据
await this.dataModule.initializeData();
console.log('应用初始化');
}
/**
* 加载所有数据
*/
private async loadAllData(): Promise<void> {
try {
// 初始化地图
await this.mapModule.initMap();
// 加载公开数据(不需要登录)
await this.loadPublicData();
// 业务数据(订单和员工数据)在用户签到后单独加载
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);
// 公开数据加载失败不影响主要功能,只记录日志
}
}
/**
* 加载业务数据(仅在用户签到后调用)
*/
public async loadBusinessData(): Promise<void> {
console.log('加载业务数据');
try {
// 加载待处理订单(所有登录用户都可以看到)
await this.orderModule.loadPendingOrders();
console.log('业务数据加载完成');
} catch (error) {
console.error('加载业务数据失败:', error);
throw error; // 重新抛出错误,让调用方处理
}
}
/**
* 加载员工数据(仅在管理员签到后调用)
*/
public async loadEmployeeData(): Promise<void> {
console.log('加载员工数据');
try {
// 获取用户信息
const app = getApp<any>();
const userInfo = app.globalData.userInfo;
// 只有管理员才加载员工列表
if (userInfo && userInfo.role === 'ADMIN') {
console.log('管理员用户,加载员工列表');
await this.employeeModule.loadAllEmployees();
console.log('员工数据加载完成');
} else {
console.log('非管理员用户,跳过员工列表加载');
}
} catch (error) {
console.error('加载员工数据失败:', error);
throw error; // 重新抛出错误,让调用方处理
}
}
/**
* 检查是否需要刷新数据
*/
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 !== 'employee'
);
this.dataModule.updateMarkers(filteredMarkers);
}
/**
* 重置用户标记点
*/
private resetUserMarker(): void {
const { markers, userInfo } = this.pageContext.data;
const userRole = userInfo?.role || 'employee';
const iconPath = userRole === 'ADMIN' ? '/images/crown.png' : '/images/truck.png';
const updatedMarkers = markers.map((marker: any) => {
if (marker.id === -1) {
return {
...marker,
iconPath: iconPath
};
}
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 'employee':
// 员工标记点点击 - 根据角色分发到不同模块
if (marker.data.role === 'ADMIN') {
// 管理员 - 由adminModule处理
this.adminModule.onAdminMarkerClick(marker.data, e);
} else {
// 货运人员 - 由deliveryPersonModule处理包含订单列表
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;
}
/**
* 获取员工模块
*/
getEmployeeModule(): EmployeeModule {
return this.employeeModule;
}
/**
* 获取管理员模块
*/
getAdminModule(): AdminModule {
return this.adminModule;
}
/**
* 获取位置模块
*/
getLocationModule(): LocationModule {
return this.locationModule;
}
/**
* 刷新所有数据
*/
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('刷新数据失败');
}
}
/**
* 清理资源
*/
cleanup(): void {
console.log('清理主页面模块资源');
// 清理位置模块
this.locationModule.cleanup();
// 清理员工和管理员模块
this.employeeModule.cleanup();
this.adminModule.cleanup();
// 这里可以添加其他需要清理的资源
console.log('✅ 主页面模块清理完成');
}
/**
* 处理错误
*/
handleError(error: any, context: string): void {
console.error(`${context} 中发生错误:`, error);
showToast(`操作失败: ${context}`);
}
}