/** * WebSocket消息处理器 * 统一管理不同类型消息的处理逻辑 * * @author kxmall * @date 2025-01-08 */ import { MESSAGE_TYPES } from './websocket.js'; /** * 新订单通知处理器 * @param {Object} message 消息对象 * @param {Object} context 上下文对象(通常是Vue组件实例) */ export function handleNewOrderNotification(message, context) { console.log('收到新订单通知:', message); // 显示通知 uni.showToast({ title: `新订单:${message.orderNo}`, icon: 'none', duration: 3000 }); // 播放提示音 // #ifdef APP-PLUS if (plus && plus.device) { plus.device.beep(); } // #endif // 尝试震动提醒 // #ifdef APP-PLUS if (plus && plus.device) { plus.device.vibrate(500); } // #endif // #ifndef APP-PLUS // H5和小程序使用uni-app的API try { uni.vibrateShort({ success: () => { console.log('震动成功'); }, fail: (err) => { console.log('震动失败:', err); } }); } catch (error) { console.log('震动API不支持:', error); } // #endif // 如果上下文存在且有刷新方法,则刷新订单列表 if (context && typeof context.resetData === 'function') { context.resetData(); } // 显示详细信息弹窗(可选) if (message.urgencyLevel >= 2) { // 紧急或特急订单 showOrderDetailModal(message, context); } } /** * 订单取消通知处理器 * @param {Object} message 消息对象 * @param {Object} context 上下文对象 */ export function handleOrderCancelNotification(message, context) { console.log('收到订单取消通知:', message); uni.showToast({ title: `订单${message.orderNo}已取消`, icon: 'none', duration: 2000 }); // 刷新订单列表 if (context && typeof context.resetData === 'function') { context.resetData(); } } /** * 订单状态更新处理器 * @param {Object} message 消息对象 * @param {Object} context 上下文对象 */ export function handleOrderStatusUpdate(message, context) { console.log('收到订单状态更新:', message); uni.showToast({ title: `订单${message.orderNo}状态更新`, icon: 'none', duration: 2000 }); // 刷新订单列表 if (context && typeof context.resetData === 'function') { context.resetData(); } } /** * 系统消息处理器 * @param {Object} message 消息对象 * @param {Object} context 上下文对象 */ export function handleSystemMessage(message, context) { console.log('收到系统消息:', message); const title = message.remark || '系统消息'; // 重要系统消息使用模态框显示 if (message.urgencyLevel >= 2) { uni.showModal({ title: '系统通知', content: title, showCancel: false, confirmText: '知道了' }); } else { // 普通消息使用Toast显示 uni.showToast({ title: title, icon: 'none', duration: 3000 }); } } /** * 显示订单详情弹窗 * @param {Object} orderData 订单数据 * @param {Object} context 上下文对象 */ function showOrderDetailModal(orderData, context) { const content = ` 订单号:${orderData.orderNo || ''} 配送费:¥${orderData.freightPrice || '0'} 收货人:${orderData.consignee || ''} 地址:${orderData.address || ''} 匹配度:${orderData.matchScore || 0}分 ${orderData.remark ? '备注:' + orderData.remark : ''} `.trim(); uni.showModal({ title: '紧急订单通知', content: content, showCancel: true, cancelText: '稍后处理', confirmText: '立即查看', success: (res) => { if (res.confirm && context) { // 跳转到订单详情或刷新页面 if (typeof context.resetData === 'function') { context.resetData(); } // 可以在这里添加跳转到订单详情的逻辑 // uni.navigateTo({ url: `/pages/order/detail?id=${orderData.orderId}` }); } } }); } /** * WebSocket连接状态变化处理器 * @param {String} status 连接状态 * @param {Object} data 附加数据 * @param {Object} context 上下文对象 */ export function handleConnectionStatusChange(status, data, context) { console.log('WebSocket连接状态变化:', status, data); switch (status) { case 'connected': console.log('WebSocket连接成功'); // 可以在这里更新UI状态 break; case 'disconnected': console.log('WebSocket连接断开'); // 可以显示离线状态 break; case 'error': console.error('WebSocket连接错误:', data); // 可以显示错误提示 break; default: console.log('未知连接状态:', status); } } /** * 注册所有消息处理器到WebSocket管理器 * @param {Object} wsManager WebSocket管理器实例 * @param {Object} context 上下文对象 */ export function registerMessageHandlers(wsManager, context) { // 注册各种消息类型的处理器 wsManager.onMessage(MESSAGE_TYPES.NEW_ORDER, (message) => { handleNewOrderNotification(message, context); }); wsManager.onMessage(MESSAGE_TYPES.ORDER_CANCEL, (message) => { handleOrderCancelNotification(message, context); }); wsManager.onMessage(MESSAGE_TYPES.ORDER_STATUS_UPDATE, (message) => { handleOrderStatusUpdate(message, context); }); wsManager.onMessage(MESSAGE_TYPES.SYSTEM_MESSAGE, (message) => { handleSystemMessage(message, context); }); // 注册连接状态变化处理器 wsManager.onStatusChange((status, data) => { handleConnectionStatusChange(status, data, context); }); } /** * 注销所有消息处理器 * @param {Object} wsManager WebSocket管理器实例 */ export function unregisterMessageHandlers(wsManager) { wsManager.offMessage(MESSAGE_TYPES.NEW_ORDER); wsManager.offMessage(MESSAGE_TYPES.ORDER_CANCEL); wsManager.offMessage(MESSAGE_TYPES.ORDER_STATUS_UPDATE); wsManager.offMessage(MESSAGE_TYPES.SYSTEM_MESSAGE); wsManager.clearCallbacks(); }