This commit is contained in:
张成
2026-02-28 16:28:28 +08:00
parent 96da90daa8
commit 5ec4e7f440
9 changed files with 242 additions and 127 deletions

View File

@@ -69,40 +69,59 @@ class ChatManager {
return parsed;
}
/**
* 解析沟通详情返回值(两种形态二选一)
* 形态1 - 会话/职位信息: zpData.data + zpData.job
* 形态2 - 聊天消息列表: zpData.hasMore + zpData.messages
* 解析 get_chat_detail 设备端返回格式
* 格式: { type, code, message, data: { success, apiData: { response: { zpData } }, getBossData: { response: { zpData } } } }
* apiData.response.zpData = 消息列表 hasMore/messages/type/minMsgId
* getBossData.response.zpData = 会话 data+job
* @private
*/
_parse_chat_detail_response(response) {
if (!response) return null;
const raw = response.zpData != null ? response.zpData : response.data;
if (!raw) return { variant: 'unknown', data: null, job: null, hasMore: false, messages: [] };
if (!response) return { variant: 'unknown', data: null, job: null, hasMore: false, messages: [] };
// 形态2: 消息列表(有 messages 数组)
if (Array.isArray(raw.messages)) {
const d = response.data;
const api_data = d && d.apiData;
const get_boss_data = d && d.getBossData;
const msg_zp = api_data && api_data.response && api_data.response.zpData;
const boss_zp = get_boss_data && get_boss_data.response && get_boss_data.response.zpData;
if (msg_zp && Array.isArray(msg_zp.messages)) {
return {
variant: 'messages',
hasMore: !!raw.hasMore,
messages: raw.messages,
type: raw.type,
minMsgId: raw.minMsgId
hasMore: !!msg_zp.hasMore,
messages: msg_zp.messages,
type: msg_zp.type,
minMsgId: msg_zp.minMsgId,
data: (boss_zp && boss_zp.data) || null,
job: (boss_zp && boss_zp.job) || null
};
}
// 形态1: 会话详情data + job
if (raw.data != null || raw.job != null) {
if (boss_zp && (boss_zp.data != null || boss_zp.job != null)) {
return {
variant: 'session',
data: raw.data || null,
job: raw.job || null
data: boss_zp.data || null,
job: boss_zp.job || null,
hasMore: false,
messages: [],
type: null,
minMsgId: null
};
}
return { variant: 'unknown', data: null, job: null, hasMore: false, messages: [] };
}
/**
* 解析详情,统一返回 { variant, hasMore, minMsgId, messages, data, job }
* 入参可为设备端完整返回data.apiData/data.getBossData或已解析对象直接返回
*/
parseDetailResponse(apiResponse) {
if (apiResponse && (apiResponse.variant === 'messages' || apiResponse.variant === 'session' || apiResponse.variant === 'unknown')) {
return apiResponse;
}
return this._parse_chat_detail_response(apiResponse);
}
/**
* 获取沟通详情(会话信息或聊天消息列表)
* 返回值: { variant: 'session'|'messages', ... }
@@ -123,18 +142,17 @@ class ChatManager {
data: rest
});
const ok = response && (response.code === 0 || response.code === 200);
const ok = response && (response.code === 200 || response.code === 0);
if (!ok) {
console.error(`[聊天管理] 获取沟通详情失败:`, response);
throw new Error(response?.message || '获取沟通详情失败');
}
const parsed = this._parse_chat_detail_response(response);
const logExtra = parsed.variant === 'session'
? `会话`
? '会话'
: parsed.variant === 'messages'
? `消息 ${parsed.messages.length}`
: `未知`;
: '未知';
console.log(`[聊天管理] 成功获取沟通详情 (${logExtra})`);
return parsed;
}
@@ -268,8 +286,8 @@ class ChatManager {
const { friendId, platform = 'boss', ...detailParams } = params;
if (!friendId) throw new Error('friendId 不能为空');
const detail = await this.get_chat_detail(sn_code, mqttClient, { platform, ...detailParams });
const decision = await this.getReplyContentFromDetail(detail);
const parsed = await this.get_chat_detail(sn_code, mqttClient, { platform, ...detailParams });
const decision = await this.getReplyContentFromDetail(parsed);
if (!decision.replied) return decision;
await this.send_chat_message(sn_code, mqttClient, {