Files
WXProgram/miniprogram/pages/index/index.ts

562 lines
16 KiB
TypeScript
Raw Normal View History

2025-10-16 21:32:16 +08:00
// index.ts
// 引入服务和工具函数
2025-10-19 23:38:54 +08:00
2025-10-16 21:32:16 +08:00
import userService from '../../services/userService';
// 引入主页面模块
2025-10-16 21:32:16 +08:00
import { MainPageModule } from './modules/mainPageModule';
2025-10-19 23:38:54 +08:00
// 导入类型定义
import { IndexPageComponent } from '../../types';
2025-10-16 21:32:16 +08:00
// 主页面组件
2025-10-19 23:38:54 +08:00
Component<IndexPageComponent['data'], any, any, any, false>({
2025-10-16 21:32:16 +08:00
data: {
2025-10-19 23:38:54 +08:00
longitude: 116.397428,
latitude: 39.90923,
scale: 16,
markers: [],
userInfo: null,
authStatus: {
hasWxCode: false,
userStatus: 'unknown'
},
showUserPanel: false,
showOrderPanel: false,
2025-10-19 23:38:54 +08:00
currentOrder: null,
currentDeliveryPerson: null,
currentWarehouse: null,
currentPanelPosition: { x: 0, y: 0 },
polyline: null,
pendingOrders: [],
currentRoute: null,
showRoute: false,
routeDistance: 0,
routeDuration: 0,
showWarehouseModal: false,
showDeliveryPersonModal: false,
2025-10-19 23:38:54 +08:00
warehouseModalState: 'bottom',
deliveryPersonModalState: 'bottom',
showSignOutButton: false,
showSignInButton: false,
showRegisterButton: false,
showAuthButton: true,
// mainPageModule: null as MainPageModule | null
2025-10-16 21:32:16 +08:00
},
lifetimes: {
attached() {
console.log('index page attached');
this.initPage();
2025-10-16 21:32:16 +08:00
},
2025-10-16 21:32:16 +08:00
detached() {
console.log('index page detached');
// 清理资源
if (this.data.mainPageModule) {
this.data.mainPageModule.cleanup();
}
},
2025-10-19 23:38:54 +08:00
// show() {
// console.log('index page show');
// // 页面显示时调用主页面模块的onShow方法
// if (this.data.mainPageModule) {
// this.data.mainPageModule.onShow();
// }
// },
2025-10-19 23:38:54 +08:00
// hide() {
// console.log('index page hide');
// // 页面隐藏时调用主页面模块的onHide方法
// if (this.data.mainPageModule) {
// this.data.mainPageModule.onHide();
// }
// }
2025-10-16 21:32:16 +08:00
},
methods: {
// 处理货运人员底部弹窗关闭
onDeliveryPersonModalClose() {
this.setData({
showDeliveryPersonModal: false
});
},
// 处理仓库底部弹窗关闭
onWarehouseModalClose() {
this.setData({
showWarehouseModal: false
});
},
// 初始化页面
async initPage() {
// 初始化主页面模块
this.setData({
mainPageModule: new MainPageModule(this)
});
2025-10-16 21:32:16 +08:00
// 异步检查登录状态
await this.checkAndUpdateLoginStatus();
},
// 异步检查并更新登录状态
async checkAndUpdateLoginStatus() {
try {
// 获取登录模块
if (!this.data.mainPageModule) {
console.error('mainPageModule未初始化');
return;
}
const loginModule = this.data.mainPageModule.getLoginModule();
2025-10-16 21:32:16 +08:00
// 显示加载状态
wx.showLoading({
title: '检查登录状态...',
mask: true
});
// 异步检查登录状态
const isLoggedIn = await this.asyncCheckLoginStatus(loginModule);
if (isLoggedIn) {
// 已登录状态 - 按钮状态会在refreshPageAfterLogin中统一更新
console.log('✅ 登录检查成功,等待统一页面刷新');
2025-10-16 21:32:16 +08:00
} else {
// 未登录状态
this.setData({
userInfo: null,
'authStatus.hasWxCode': false,
'authStatus.userStatus': 'unknown',
// 初始化按钮显示状态
showSignInButton: false,
showRegisterButton: false,
showAuthButton: true
});
}
} catch (error) {
console.error('检查登录状态失败:', error);
// 出错时设置为未登录状态
this.setData({
userInfo: null,
'authStatus.hasWxCode': false,
'authStatus.userStatus': 'unknown',
showSignInButton: false,
showRegisterButton: false,
showAuthButton:true
});
console.log('❌ 登录检查失败,重置为未登录状态');
console.log(' - authStatus.hasWxCode 设置为 false');
console.log(' - showRegisterButton 设置为 false');
} finally {
wx.hideLoading();
}
},
// 异步检查登录状态
2025-10-19 23:38:54 +08:00
async asyncCheckLoginStatus(loginModule: any): Promise<boolean> {
getApp<any>();
2025-10-16 21:32:16 +08:00
const app = getApp<any>();
// 首先检查本地是否有登录状态
if (app.globalData.isLoggedIn && app.globalData.userInfo) {
// 本地已有登录状态此时可以安全获取用户状态因为有token
const userStatus = await loginModule.determineUserStatus(app.globalData.userInfo);
// 更新页面状态
this.setData({
userInfo: app.globalData.userInfo,
'authStatus.hasWxCode': true,
'authStatus.userStatus': userStatus
});
console.log('✅ 使用本地登录状态,用户状态已更新:', userStatus);
// 登录成功后统一刷新页面
this.refreshPageAfterLogin();
2025-10-16 21:32:16 +08:00
return true;
}
// 如果本地没有登录状态,尝试执行静默登录
try {
const loginResult = await userService.wxLogin();
if (loginResult.success && loginResult.userInfo) {
2025-10-19 23:38:54 +08:00
const app = getApp<any>();
// 登录成功,更新全局用户信息
app.globalData.userInfo = loginResult.userInfo;
app.globalData.isLoggedIn = true;
2025-10-16 21:32:16 +08:00
// 登录成功后此时已经有token可以安全获取用户状态
const userStatus = await loginModule.determineUserStatus(loginResult.userInfo);
// 更新页面状态
this.setData({
userInfo: loginResult.userInfo,
'authStatus.hasWxCode': true,
'authStatus.userStatus': userStatus
});
console.log('✅ 静默登录成功,用户状态已更新:', userStatus);
// === 全局登录流程完成,登录成功 ===
// 统一在此处执行一次完整的页面刷新
this.refreshPageAfterLogin();
return true;
}
} catch (error) {
console.warn('静默登录失败:', error);
}
return false;
},
// 更新按钮显示状态
updateButtonDisplayStatus() {
if (!this.data.mainPageModule) {
console.error('mainPageModule未初始化');
return;
}
const loginModule = this.data.mainPageModule.getLoginModule();
2025-10-16 21:32:16 +08:00
const showSignInButton = loginModule.shouldShowSignInButton();
const showRegisterButton = loginModule.shouldShowRegisterButton();
// 签退按钮显示逻辑:已签到用户显示签退按钮
const showSignOutButton = this.data.authStatus && this.data.authStatus.userStatus === 'signed_in';
2025-10-16 21:32:16 +08:00
console.log('🔄 更新按钮显示状态:');
console.log(' - showSignInButton:', showSignInButton);
console.log(' - showRegisterButton:', showRegisterButton);
console.log(' - showSignOutButton:', showSignOutButton);
console.log(' - 当前用户状态:', this.data.authStatus ? this.data.authStatus.userStatus : 'undefined');
console.log(' - 当前hasWxCode:', this.data.authStatus ? this.data.authStatus.hasWxCode : 'undefined');
2025-10-16 21:32:16 +08:00
this.setData({
showSignInButton,
showRegisterButton,
showSignOutButton
});
console.log('✅ 按钮状态已更新到页面');
},
// 登录成功后统一刷新页面
2025-10-19 23:38:54 +08:00
async refreshPageAfterLogin() {
if (!this.data.mainPageModule) {
console.error('mainPageModule未初始化');
return;
}
const loginModule = this.data.mainPageModule.getLoginModule();
getApp<any>();
2025-10-16 21:32:16 +08:00
console.log('🔄 === 全局登录流程完成,执行统一页面刷新 ===');
// 1. 更新页面登录状态
2025-10-19 23:38:54 +08:00
const app = getApp<any>();
2025-10-16 21:32:16 +08:00
loginModule.updatePageAfterLogin(app.globalData.userInfo);
// 2. 更新按钮显示状态
this.updateButtonDisplayStatus();
// 3. 初始化主页面模块
await this.data.mainPageModule.onLoad();
2025-10-16 21:32:16 +08:00
// 4. 登录成功后只加载公开数据(仓库等),不加载业务数据
// 业务数据(员工位置等)只有在用户签到后才应该加载
2025-10-19 23:38:54 +08:00
if (app.globalData.isLoggedIn && this.data.authStatus.userStatus === 'signed_in') {
console.log('🔍 登录成功,开始加载公开数据...');
await this.data.mainPageModule.loadPublicData();
console.log('✅ 公开数据加载完成');
2025-10-16 21:32:16 +08:00
}
console.log('✅ 统一页面刷新完成');
},
// 处理仓库底部弹窗状态变化
onWarehouseModalStateChange(e: any) {
const state = e.detail.state;
this.setData({ warehouseModalState: state });
},
// 处理货运人员底部弹窗状态变化
onDeliveryPersonModalStateChange(e: any) {
const state = e.detail.state;
this.setData({ deliveryPersonModalState: state });
},
// 处理签到 - 已迁移到LoginModule
async handleSignIn() {
if (!this.data.mainPageModule) {
console.error('mainPageModule未初始化');
return;
}
const loginModule = this.data.mainPageModule.getLoginModule();
2025-10-16 21:32:16 +08:00
const success = await loginModule.handleSignIn();
if (success) {
// 更新按钮显示状态
this.updateButtonDisplayStatus();
// 刷新页面数据
await this.data.mainPageModule.refreshAllData();
2025-10-16 21:32:16 +08:00
}
},
2025-10-19 23:38:54 +08:00
2025-10-16 21:32:16 +08:00
// 处理授权登录 - 已迁移到LoginModule
async handleAuthLogin() {
if (!this.data.mainPageModule) {
console.error('mainPageModule未初始化');
return;
}
const loginModule = this.data.mainPageModule.getLoginModule();
2025-10-16 21:32:16 +08:00
const success = await loginModule.handleAuthLogin();
if (success) {
const app = getApp<any>();
const userStatus = loginModule.determineUserStatus(app.globalData.userInfo);
this.setData({
userInfo: app.globalData.userInfo,
'authStatus.hasWxCode': true,
'authStatus.userStatus': userStatus
});
console.log('✅ 手动登录成功authStatus.hasWxCode 设置为 true');
console.log('✅ 用户状态已更新:', userStatus);
// === 全局登录流程完成,登录成功 ===
// 统一在此处执行一次完整的页面刷新
this.refreshPageAfterLogin();
}
},
2025-10-19 23:38:54 +08:00
2025-10-16 21:32:16 +08:00
2025-10-19 23:38:54 +08:00
// 处理签退 - 已迁移到LoginModule
2025-10-16 21:32:16 +08:00
async handleSignOut() {
2025-10-19 23:38:54 +08:00
if (!this.data.mainPageModule) {
console.error('mainPageModule未初始化');
return;
}
const loginModule = this.data.mainPageModule.getLoginModule();
const success = await loginModule.handleSignOut();
if (success) {
// 更新按钮显示状态
this.updateButtonDisplayStatus();
2025-10-19 23:38:54 +08:00
// 刷新页面数据
await this.data.mainPageModule.refreshAllData();
2025-10-16 21:32:16 +08:00
}
},
2025-10-21 21:51:51 +08:00
// 处理绑定按钮点击
handleRegister() {
console.log('用户点击绑定按钮');
// 跳转到绑定页面
wx.navigateTo({
url: '/pages/apply/apply'
});
},
// 显示员工账号绑定表单 - 跳转到独立页面
2025-10-16 21:32:16 +08:00
showApplyForm() {
wx.navigateTo({
url: '/pages/apply/apply'
});
},
// 跳转到管理员页面
goToAdminPage() {
wx.navigateTo({
url: '/pages/admin/admin'
});
},
// 跳转到员工管理页面
goToEmployeeManagement() {
wx.navigateTo({
url: '/pages/employee/employee'
});
},
2025-10-16 21:32:16 +08:00
// 阻止事件冒泡
stopPropagation(e: any) {
if (e && typeof e.stopPropagation === 'function') {
e.stopPropagation();
}
2025-10-16 21:32:16 +08:00
},
// 获取性别文本表示
getGenderText(gender: number): string {
if (gender === 1) return '男';
if (gender === 2) return '女';
return '未知';
},
// 格式化坐标对
formatCoordinatePair(longitude: number, latitude: number): string {
return `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`;
},
// 用户登出
userLogout() {
if (this.data.mainPageModule) {
const loginModule = this.data.mainPageModule.getLoginModule();
2025-10-16 21:32:16 +08:00
loginModule.logout();
// 更新页面状态
this.setData({
isLoggedIn: false,
userInfo: null
});
// 更新按钮显示状态
this.updateButtonDisplayStatus();
}
},
// 显示用户面板
showUserPanel() {
this.setData({ showUserPanel: true });
},
2025-10-19 23:38:54 +08:00
// 跳转到管理界面(基于用户角色)
goToManagementPage() {
if (this.data.userInfo && this.data.userInfo.role) {
if (this.data.userInfo.role === 'ADMIN') {
// 管理员跳转到管理员界面 - 使用navigateTo保持当前页面状态
wx.navigateTo({
url: '/pages/staff/admin-dashboard'
});
} else {
// 员工跳转到员工界面 - 使用navigateTo保持当前页面状态
wx.navigateTo({
url: '/pages/staff/employee-dashboard'
});
}
} else {
// 未登录用户显示用户面板
this.setData({ showUserPanel: true });
}
},
2025-10-16 21:32:16 +08:00
// 隐藏用户面板
hideUserPanel() {
this.setData({ showUserPanel: false });
},
// 隐藏所有面板
hideAllPanels() {
if (this.data.mainPageModule) {
this.data.mainPageModule.hideAllPanels();
2025-10-16 21:32:16 +08:00
}
},
// 重置标记点状态
resetMarkers() {
if (this.data.mainPageModule) {
this.data.mainPageModule.resetMarkers();
2025-10-16 21:32:16 +08:00
}
},
// 地图点击事件
onMapTap(e: any) {
if (this.data.mainPageModule) {
this.data.mainPageModule.onMapTap(e);
2025-10-16 21:32:16 +08:00
}
},
// 标记点点击事件
onMarkerTap(e: any) {
if (this.data.mainPageModule) {
this.data.mainPageModule.onMarkerTap(e);
2025-10-16 21:32:16 +08:00
}
},
// 分配订单
async assignOrder(orderId: number, deliveryPersonId: number) {
if (this.data.mainPageModule) {
const orderModule = this.data.mainPageModule.getOrderModule();
2025-10-16 21:32:16 +08:00
await orderModule.assignOrder(orderId, deliveryPersonId);
}
},
// 更新订单状态
async updateOrderStatus(orderId: number, status: 'pending' | 'assigned' | 'in_transit' | 'delivered') {
if (this.data.mainPageModule) {
const orderModule = this.data.mainPageModule.getOrderModule();
2025-10-16 21:32:16 +08:00
await orderModule.updateOrderStatus(orderId, status);
}
},
// 展开仓库面板
expandWarehousePanel() {
if (this.data.mainPageModule) {
const warehouseModule = this.data.mainPageModule.getWarehouseModule();
2025-10-16 21:32:16 +08:00
warehouseModule.expandWarehousePanel();
}
},
// 收起仓库面板
collapseWarehousePanel() {
if (this.data.mainPageModule) {
const warehouseModule = this.data.mainPageModule.getWarehouseModule();
2025-10-16 21:32:16 +08:00
warehouseModule.collapseWarehousePanel();
}
},
// 展开员工面板
2025-10-16 21:32:16 +08:00
expandDeliveryPersonPanel() {
if (this.data.mainPageModule) {
const employeeModule = this.data.mainPageModule.getEmployeeModule();
employeeModule.expandDeliveryPersonPanel();
2025-10-16 21:32:16 +08:00
}
},
// 收起员工面板
2025-10-16 21:32:16 +08:00
collapseDeliveryPersonPanel() {
if (this.data.mainPageModule) {
const employeeModule = this.data.mainPageModule.getEmployeeModule();
employeeModule.collapseDeliveryPersonPanel();
2025-10-16 21:32:16 +08:00
}
},
// 刷新所有数据
async refreshAllData() {
if (this.data.mainPageModule) {
await this.data.mainPageModule.refreshAllData();
2025-10-16 21:32:16 +08:00
}
},
// 开始定位(处理地图控制按钮点击)
async startLocation() {
if (this.data.mainPageModule) {
const mapModule = this.data.mainPageModule.getMapModule();
2025-10-16 21:32:16 +08:00
await mapModule.startLocation();
}
},
}
});