1
This commit is contained in:
@@ -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, {
|
||||
|
||||
Reference in New Issue
Block a user