123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /**
- * 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();
- }
|