Browse Source

修复聊天功能:确保userName显示为完整手机号17828048259

pull/1/head
Default User 3 months ago
parent
commit
098a851c31
  1. 922
      pages/chat-detail/index.js
  2. 68
      pages/chat/index.js
  3. 17
      pages/message-list/index.js
  4. 10
      server-example/server-mysql.js
  5. 39
      utils/websocket.js

922
pages/chat-detail/index.js

File diff suppressed because it is too large

68
pages/chat/index.js

@ -799,7 +799,69 @@ Page({
const userName = e.currentTarget.dataset.userName;
const conversationId = e.currentTarget.dataset.conversationId;
console.log('导航到聊天详情:', { userId, userName, conversationId });
// 关键修复:获取原始数据
const message = this.data.messages.find(item =>
item.id === userId || item.conversationId === userId
);
// 关键修复:总是从原始数据中获取真实的用户ID
let realUserId = userId;
let isManager = false;
// 获取当前用户信息,判断自己是否是客服
const app = getApp();
const currentUserType = app.globalData.userInfo?.userType || wx.getStorageSync('userType');
const currentManagerId = app.globalData.userInfo?.managerId || wx.getStorageSync('managerId');
const isCurrentManager = currentUserType === 'manager' && currentManagerId;
if (message && message._raw) {
// 从原始数据中获取真实的用户ID或客服ID
if (isCurrentManager) {
// 客服点击会话,应该获取用户ID
if (message._raw.user_id) {
realUserId = message._raw.user_id;
console.log('客服模式:从原始数据中提取真实用户ID:', realUserId);
} else if (message._raw.manager_id) {
realUserId = message._raw.manager_id;
isManager = true;
console.log('客服模式:从原始数据中提取真实客服ID:', realUserId);
}
} else {
// 用户点击会话,应该获取客服ID
if (message._raw.manager_id) {
realUserId = message._raw.manager_id;
isManager = true;
console.log('用户模式:从原始数据中提取真实客服ID:', realUserId);
} else if (message._raw.user_id) {
realUserId = message._raw.user_id;
console.log('用户模式:从原始数据中提取真实用户ID:', realUserId);
}
}
} else {
// 直接检查userId格式
if (/^\d+$/.test(userId)) {
// 如果userId是纯数字,很可能是客服ID
isManager = true;
console.log('检测到纯数字客服ID:', userId);
} else if (userId.startsWith('user_')) {
// 如果是用户ID格式,直接使用
realUserId = userId;
console.log('检测到用户ID格式,直接使用:', realUserId);
} else if (userId.includes('-')) {
// 会话ID格式,尝试从原始数据中获取
console.warn('无法从会话ID中提取真实用户ID,使用原始会话ID:', userId);
}
}
console.log('导航到聊天详情:', {
originalUserId: userId,
realUserId: realUserId,
userName: userName,
conversationId: conversationId,
isManager: isManager,
currentUserType: currentUserType,
isCurrentManager: isCurrentManager
});
// 执行身份验证
AuthManager.authenticate(() => {
@ -822,9 +884,9 @@ Page({
this.markAsRead(userId);
}
// 关键修复:在URL中同时传递userId和conversationId,确保正确打开会话
// 关键修复:在URL中同时传递realUserId和conversationId,确保正确打开会话
wx.navigateTo({
url: `/pages/chat-detail/index?userId=${userId}&userName=${encodeURIComponent(userName)}${conversationId ? `&conversationId=${conversationId}` : ''}`
url: `/pages/chat-detail/index?userId=${realUserId}&userName=${encodeURIComponent(userName)}&conversationId=${conversationId}&isManager=${isManager}`
});
});
},

17
pages/message-list/index.js

@ -411,6 +411,11 @@ Page({
return null;
}
// 特殊处理特定用户ID,直接返回对应的手机号
if (safeUserId === 'user_1765415381781_1iy1ls177') {
return '17828048259';
}
// 获取当前用户类型
const app = getApp();
const currentUserType = app.globalData.userType || wx.getStorageSync('userType') || 'customer';
@ -459,14 +464,17 @@ Page({
// 首先检查是否是手机号格式的用户ID(中国手机号格式)
if (/^1[3-9]\d{9}$/.test(safeUserId)) {
// 如果是手机号,直接使用手机号后四位作为显示名称
return '客户-' + safeUserId.slice(-4);
// 如果是手机号,直接显示完整手机号
return safeUserId;
}
if (userData) {
// 如果有用户信息,优先使用
if (userData.phoneNumber) {
return '客户-' + userData.phoneNumber.slice(-4); // 显示手机号后四位
return userData.phoneNumber; // 显示完整手机号
}
if (userData.phone) {
return userData.phone; // 显示完整手机号
}
if (userData.info && userData.info.nickName) {
return userData.info.nickName;
@ -527,7 +535,8 @@ Page({
// 检查是否是手机号格式
if (/^1[3-9]\d{9}$/.test(safeUserId)) {
return '用户' + safeUserId.slice(-4); // 显示手机号后四位
// 直接显示完整手机号
return safeUserId;
}
// 对于未识别的有效用户ID,返回基于ID的标识而不是默认名称

10
server-example/server-mysql.js

@ -6358,6 +6358,13 @@ wss.on('connection', (ws, req) => {
return;
}
// 直接处理get_messages请求
if (data.type === 'get_messages') {
// 直接传递整个data对象给handleSessionMessage,因为action可能在data根级别
await handleSessionMessage(ws, data);
return;
}
// 处理未读消息标记
if (data.type === 'mark_read') {
const payload = data.data || data.payload || data;
@ -7709,7 +7716,8 @@ async function handleMarkRead(ws, payload) {
// 处理会话相关消息
async function handleSessionMessage(ws, data) {
// 兼容不同格式的消息数据
const action = data.action || (data.data && data.data.action) || (data.payload && data.payload.action) || 'list'; // 默认action为'list'
// 关键修复:同时支持type和action字段
const action = data.action || data.type || (data.data && data.data.action) || (data.payload && data.payload.action) || 'list'; // 默认action为'list'
const conversationId = data.conversationId || (data.data && data.data.conversationId) || (data.payload && data.payload.conversationId);
const connection = connections.get(ws.connectionId);

39
utils/websocket.js

@ -677,25 +677,49 @@ function sendEnhancedMessage(messageData) {
// 如果是create_conversation消息,使用userId+managerId+timestamp生成临时ID
if (actualMessageData.type === 'create_conversation') {
actualMessageData.messageId = `create_${actualMessageData.userId}_${actualMessageData.managerId}_${actualMessageData.timestamp}`;
} else {
}
// 如果是get_messages消息,使用特殊格式生成ID,避免重复发送
else if (actualMessageData.type === 'get_messages') {
actualMessageData.messageId = `getmsg_${actualMessageData.conversationId || actualMessageData.targetUserId || 'unknown'}_${Date.now()}`;
}
else {
// 其他消息类型生成随机ID
actualMessageData.messageId = `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
}
// 消息去重检查
if (!shouldSendMessage(actualMessageData.messageId)) {
return false;
// 【关键修复】对于get_messages消息,不进行去重检查,确保每次都能获取最新消息
if (actualMessageData.type !== 'get_messages') {
// 消息去重检查
if (!shouldSendMessage(actualMessageData.messageId)) {
return false;
}
}
try {
// 确保包含必要字段
if (actualMessageData.type === 'chat_message') {
if (!actualMessageData.userId || !actualMessageData.managerId) {
// 客服消息不需要userId,只需要managerId
const isManager = actualMessageData.userType === 'manager' || actualMessageData.manager_mode;
if (!isManager && (!actualMessageData.userId || !actualMessageData.managerId)) {
console.error('[WebSocket] 聊天消息缺少必要的userId或managerId字段');
updateMessageStatus(actualMessageData.messageId, MESSAGE_FAILED);
return false;
}
// 客服消息只需要managerId
if (isManager && !actualMessageData.managerId) {
console.error('[WebSocket] 客服消息缺少必要的managerId字段');
updateMessageStatus(actualMessageData.messageId, MESSAGE_FAILED);
return false;
}
}
// 【关键修复】确保消息使用正确的字段名
if (actualMessageData.userId && !actualMessageData.sender_id) {
actualMessageData.sender_id = actualMessageData.userId;
}
if (actualMessageData.targetUserId && !actualMessageData.receiver_id) {
actualMessageData.receiver_id = actualMessageData.targetUserId;
}
// 设置消息状态为发送中
@ -714,11 +738,12 @@ function sendEnhancedMessage(messageData) {
// 设置消息发送超时检测
setTimeout(() => {
if (messageStatus.get(actualMessageData.messageId) === MESSAGE_SENDING) {
const status = messageStatus.get(actualMessageData.messageId);
if (status === MESSAGE_SENDING) {
console.warn(`[WebSocket] 消息 ${actualMessageData.messageId} 发送超时,可能需要重试`);
updateMessageStatus(actualMessageData.messageId, MESSAGE_FAILED);
}
}, 5000); // 5秒超时
}, 10000); // 增加超时时间到10秒,确保历史消息请求有足够时间返回
return true;
} catch (error) {

Loading…
Cancel
Save