From 6b371148afc17c437613883fd25d827abd4ef74c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Fri, 13 Mar 2026 17:06:02 +0800 Subject: [PATCH] 1 --- api/middleware/mqtt/mqttDispatcher.js | 78 +++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/api/middleware/mqtt/mqttDispatcher.js b/api/middleware/mqtt/mqttDispatcher.js index 8d549c3..7ea9380 100644 --- a/api/middleware/mqtt/mqttDispatcher.js +++ b/api/middleware/mqtt/mqttDispatcher.js @@ -1,6 +1,7 @@ const db = require('../dbProxy.js'); const logProxy = require('../logProxy.js'); const deviceManager = require('../schedule/core/deviceManager.js'); +const chatManager = require('../job/managers/chatManager'); /** * MQTT 消息分发器 @@ -323,12 +324,79 @@ class MqttDispatcher { return; } - console.log(`[MQTT Boss 消息] 收到设备 ${sn_code} 的新消息,payload 长度:`, typeof payload === 'string' ? payload.length : 'object'); + // 按你给的结构解析:取第一条消息的文本等关键信息 + const firstMsg = Array.isArray(payload.messages) && payload.messages.length > 0 + ? payload.messages[0] + : null; - // TODO: 这里可以根据业务需要: - // - 写入 chat_message / chat_reply_intent_log 等表 - // - 触发 AI 自动回复流程 - // 当前先只是打印日志,预留扩展点。 + const fromUidObj = firstMsg && firstMsg.from && firstMsg.from.uid; + const toUidObj = firstMsg && firstMsg.to && firstMsg.to.uid; + const text = firstMsg && firstMsg.body && typeof firstMsg.body.text === 'string' + ? firstMsg.body.text + : null; + + const normalized = { + sn_code, + type: payload.type || null, + version: payload.version || null, + from_uid: fromUidObj && typeof fromUidObj.low === 'number' ? String(fromUidObj.low) : null, + to_uid: toUidObj && typeof toUidObj.low === 'number' ? String(toUidObj.low) : null, + text, + raw: payload + }; + + console.log('[MQTT Boss 消息] 解析结果:', { + sn_code: normalized.sn_code, + type: normalized.type, + version: normalized.version, + from_uid: normalized.from_uid, + to_uid: normalized.to_uid, + text: normalized.text + }); + + // 落库到 chat_message 表(与自动沟通的落库格式保持一致) + try { + const chatMessageModel = db.getModel('chat_message'); + const platform = 'boss'; + const friendId = normalized.from_uid ? Number(normalized.from_uid) : 0; + const mid = + firstMsg && firstMsg.mid && typeof firstMsg.mid.low === 'number' + ? firstMsg.mid.low + : 0; + const base = { + sn_code, + platform, + friendId, + encryptFriendId: '', + fetch_time: new Date() + }; + if (friendId && chatMessageModel) { + const existing = await chatMessageModel.findOne({ + where: { sn_code, platform, friendId, mid } + }); + const row = { ...base, mid, message_data: firstMsg }; + if (existing) { + await existing.update(row); + } else { + await chatMessageModel.create(row); + } + } + } catch (e) { + console.warn('[MQTT Boss 消息] 写入 chat_message 失败:', e.message); + } + + // 调用现有 AI 自动回复流程(基于 get_chat_detail + getReplyContentFromDetail) + try { + if (normalized.from_uid && this.mqttClient) { + const result = await chatManager.auto_reply_with_ai(sn_code, this.mqttClient, { + friendId: Number(normalized.from_uid), + platform: 'boss' + }); + console.log('[MQTT Boss 消息] AI 自动回复结果:', result); + } + } catch (e) { + console.warn('[MQTT Boss 消息] AI 自动回复失败:', e.message); + } } catch (error) { console.error('[MQTT Boss 消息] 处理 Boss 消息失败:', error); }