messageHandlers.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /**
  2. * WebSocket消息处理器
  3. * 统一管理不同类型消息的处理逻辑
  4. *
  5. * @author kxmall
  6. * @date 2025-01-08
  7. */
  8. import { MESSAGE_TYPES } from './websocket.js';
  9. /**
  10. * 新订单通知处理器
  11. * @param {Object} message 消息对象
  12. * @param {Object} context 上下文对象(通常是Vue组件实例)
  13. */
  14. export function handleNewOrderNotification(message, context) {
  15. console.log('收到新订单通知:', message);
  16. // 显示通知
  17. uni.showToast({
  18. title: `新订单:${message.orderNo}`,
  19. icon: 'none',
  20. duration: 3000
  21. });
  22. // 播放提示音
  23. // #ifdef APP-PLUS
  24. if (plus && plus.device) {
  25. plus.device.beep();
  26. }
  27. // #endif
  28. // 尝试震动提醒
  29. // #ifdef APP-PLUS
  30. if (plus && plus.device) {
  31. plus.device.vibrate(500);
  32. }
  33. // #endif
  34. // #ifndef APP-PLUS
  35. // H5和小程序使用uni-app的API
  36. try {
  37. uni.vibrateShort({
  38. success: () => {
  39. console.log('震动成功');
  40. },
  41. fail: (err) => {
  42. console.log('震动失败:', err);
  43. }
  44. });
  45. } catch (error) {
  46. console.log('震动API不支持:', error);
  47. }
  48. // #endif
  49. // 如果上下文存在且有刷新方法,则刷新订单列表
  50. if (context && typeof context.resetData === 'function') {
  51. context.resetData();
  52. }
  53. // 显示详细信息弹窗(可选)
  54. if (message.urgencyLevel >= 2) { // 紧急或特急订单
  55. showOrderDetailModal(message, context);
  56. }
  57. }
  58. /**
  59. * 订单取消通知处理器
  60. * @param {Object} message 消息对象
  61. * @param {Object} context 上下文对象
  62. */
  63. export function handleOrderCancelNotification(message, context) {
  64. console.log('收到订单取消通知:', message);
  65. uni.showToast({
  66. title: `订单${message.orderNo}已取消`,
  67. icon: 'none',
  68. duration: 2000
  69. });
  70. // 刷新订单列表
  71. if (context && typeof context.resetData === 'function') {
  72. context.resetData();
  73. }
  74. }
  75. /**
  76. * 订单状态更新处理器
  77. * @param {Object} message 消息对象
  78. * @param {Object} context 上下文对象
  79. */
  80. export function handleOrderStatusUpdate(message, context) {
  81. console.log('收到订单状态更新:', message);
  82. uni.showToast({
  83. title: `订单${message.orderNo}状态更新`,
  84. icon: 'none',
  85. duration: 2000
  86. });
  87. // 刷新订单列表
  88. if (context && typeof context.resetData === 'function') {
  89. context.resetData();
  90. }
  91. }
  92. /**
  93. * 系统消息处理器
  94. * @param {Object} message 消息对象
  95. * @param {Object} context 上下文对象
  96. */
  97. export function handleSystemMessage(message, context) {
  98. console.log('收到系统消息:', message);
  99. const title = message.remark || '系统消息';
  100. // 重要系统消息使用模态框显示
  101. if (message.urgencyLevel >= 2) {
  102. uni.showModal({
  103. title: '系统通知',
  104. content: title,
  105. showCancel: false,
  106. confirmText: '知道了'
  107. });
  108. } else {
  109. // 普通消息使用Toast显示
  110. uni.showToast({
  111. title: title,
  112. icon: 'none',
  113. duration: 3000
  114. });
  115. }
  116. }
  117. /**
  118. * 显示订单详情弹窗
  119. * @param {Object} orderData 订单数据
  120. * @param {Object} context 上下文对象
  121. */
  122. function showOrderDetailModal(orderData, context) {
  123. const content = `
  124. 订单号:${orderData.orderNo || ''}
  125. 配送费:¥${orderData.freightPrice || '0'}
  126. 收货人:${orderData.consignee || ''}
  127. 地址:${orderData.address || ''}
  128. 匹配度:${orderData.matchScore || 0}分
  129. ${orderData.remark ? '备注:' + orderData.remark : ''}
  130. `.trim();
  131. uni.showModal({
  132. title: '紧急订单通知',
  133. content: content,
  134. showCancel: true,
  135. cancelText: '稍后处理',
  136. confirmText: '立即查看',
  137. success: (res) => {
  138. if (res.confirm && context) {
  139. // 跳转到订单详情或刷新页面
  140. if (typeof context.resetData === 'function') {
  141. context.resetData();
  142. }
  143. // 可以在这里添加跳转到订单详情的逻辑
  144. // uni.navigateTo({ url: `/pages/order/detail?id=${orderData.orderId}` });
  145. }
  146. }
  147. });
  148. }
  149. /**
  150. * WebSocket连接状态变化处理器
  151. * @param {String} status 连接状态
  152. * @param {Object} data 附加数据
  153. * @param {Object} context 上下文对象
  154. */
  155. export function handleConnectionStatusChange(status, data, context) {
  156. console.log('WebSocket连接状态变化:', status, data);
  157. switch (status) {
  158. case 'connected':
  159. console.log('WebSocket连接成功');
  160. // 可以在这里更新UI状态
  161. break;
  162. case 'disconnected':
  163. console.log('WebSocket连接断开');
  164. // 可以显示离线状态
  165. break;
  166. case 'error':
  167. console.error('WebSocket连接错误:', data);
  168. // 可以显示错误提示
  169. break;
  170. default:
  171. console.log('未知连接状态:', status);
  172. }
  173. }
  174. /**
  175. * 注册所有消息处理器到WebSocket管理器
  176. * @param {Object} wsManager WebSocket管理器实例
  177. * @param {Object} context 上下文对象
  178. */
  179. export function registerMessageHandlers(wsManager, context) {
  180. // 注册各种消息类型的处理器
  181. wsManager.onMessage(MESSAGE_TYPES.NEW_ORDER, (message) => {
  182. handleNewOrderNotification(message, context);
  183. });
  184. wsManager.onMessage(MESSAGE_TYPES.ORDER_CANCEL, (message) => {
  185. handleOrderCancelNotification(message, context);
  186. });
  187. wsManager.onMessage(MESSAGE_TYPES.ORDER_STATUS_UPDATE, (message) => {
  188. handleOrderStatusUpdate(message, context);
  189. });
  190. wsManager.onMessage(MESSAGE_TYPES.SYSTEM_MESSAGE, (message) => {
  191. handleSystemMessage(message, context);
  192. });
  193. // 注册连接状态变化处理器
  194. wsManager.onStatusChange((status, data) => {
  195. handleConnectionStatusChange(status, data, context);
  196. });
  197. }
  198. /**
  199. * 注销所有消息处理器
  200. * @param {Object} wsManager WebSocket管理器实例
  201. */
  202. export function unregisterMessageHandlers(wsManager) {
  203. wsManager.offMessage(MESSAGE_TYPES.NEW_ORDER);
  204. wsManager.offMessage(MESSAGE_TYPES.ORDER_CANCEL);
  205. wsManager.offMessage(MESSAGE_TYPES.ORDER_STATUS_UPDATE);
  206. wsManager.offMessage(MESSAGE_TYPES.SYSTEM_MESSAGE);
  207. wsManager.clearCallbacks();
  208. }