|
|
|
@ -11,26 +11,27 @@ Page({ |
|
|
|
onlineCount: 0, |
|
|
|
userType: 'seller' // 初始化用户类型,默认为销售员
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 获取客服列表的方法
|
|
|
|
async fetchCustomerServices() { |
|
|
|
try { |
|
|
|
console.log('开始请求客服列表...'); |
|
|
|
// 导入API工具并使用正确的请求方法
|
|
|
|
const api = require('../../utils/api'); |
|
|
|
|
|
|
|
|
|
|
|
// 获取当前用户类型参数
|
|
|
|
const userType = this.data.userType || 'seller'; |
|
|
|
|
|
|
|
// 使用api.js中的请求工具,自动获取正确的服务器地址
|
|
|
|
const apiResponse = await api.request(`/api/managers?type=${userType}`, 'GET'); |
|
|
|
|
|
|
|
console.log('API响应数据:', apiResponse ? JSON.stringify(apiResponse) : 'undefined'); |
|
|
|
|
|
|
|
|
|
|
|
// 直接使用api.request函数,该函数已经配置了正确的BASE_URL
|
|
|
|
const res = await api.request(`/api/managers?type=${userType}`, 'GET', {}); |
|
|
|
|
|
|
|
console.log('API响应数据:', res ? JSON.stringify(res) : 'undefined'); |
|
|
|
|
|
|
|
// 更宽松的响应检查,确保能处理各种有效的响应格式
|
|
|
|
if (apiResponse) { |
|
|
|
// 无论success字段是否存在,只要有data字段就尝试处理
|
|
|
|
const dataSource = apiResponse.data || apiResponse; |
|
|
|
// 注意:api.request函数直接返回res.data,所以res已经是响应数据,不再有statusCode字段
|
|
|
|
if (res) { |
|
|
|
// 无论success字段是否存在,只要有数据就尝试处理
|
|
|
|
const dataSource = Array.isArray(res) ? res : (res.data || []); |
|
|
|
if (Array.isArray(dataSource)) { |
|
|
|
const processedData = dataSource.map(item => { |
|
|
|
// 解析information字段中的信息
|
|
|
|
@ -39,46 +40,70 @@ Page({ |
|
|
|
let purchaseCount = ''; |
|
|
|
let profitFarmCount = ''; |
|
|
|
let profitIncreaseRate = ''; |
|
|
|
|
|
|
|
|
|
|
|
if (item.information) { |
|
|
|
// 处理不同类型的换行符(\r\n和\n)
|
|
|
|
const lines = item.information.split(/\r?\n/).filter(line => line.trim()); |
|
|
|
|
|
|
|
// 解析第一行:服务平台X年 服务X+鸡场
|
|
|
|
|
|
|
|
// 解析第一行:服务平台X年 服务X家(或X+鸡场)
|
|
|
|
if (lines[0]) { |
|
|
|
const firstLine = lines[0].trim(); |
|
|
|
const experienceMatch = firstLine.match(/服务平台(.*?)年/); |
|
|
|
if (experienceMatch) { |
|
|
|
experience = experienceMatch[1].trim() + '年'; |
|
|
|
// 提取完整的经验信息,包括"服务平台"
|
|
|
|
const fullExperienceMatch = firstLine.match(/(服务平台.*?年|服务平台.*?月)/); |
|
|
|
if (fullExperienceMatch) { |
|
|
|
// 直接使用完整的经验信息,如"服务平台1年"或"服务平台2个月"
|
|
|
|
experience = fullExperienceMatch[1].trim(); |
|
|
|
} else { |
|
|
|
// 如果没有匹配到,使用默认格式
|
|
|
|
experience = '服务平台1年'; |
|
|
|
} |
|
|
|
|
|
|
|
const serviceCountMatch = firstLine.match(/服务(.*?)鸡场/); |
|
|
|
if (serviceCountMatch) { |
|
|
|
serviceCount = serviceCountMatch[1].trim(); |
|
|
|
|
|
|
|
// 匹配服务数量,支持多种格式:服务66家、服务100+鸡场等
|
|
|
|
// 确保只匹配最后一个"服务"后面的数量
|
|
|
|
const serviceMatches = firstLine.match(/服务(.*?)(家|鸡场)/g); |
|
|
|
if (serviceMatches && serviceMatches.length > 0) { |
|
|
|
// 使用最后一个匹配项
|
|
|
|
const lastServiceMatch = serviceMatches[serviceMatches.length - 1]; |
|
|
|
const serviceCountMatch = lastServiceMatch.match(/服务(.*?)(家|鸡场)/); |
|
|
|
if (serviceCountMatch) { |
|
|
|
serviceCount = serviceCountMatch[1].trim(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 解析第二行:数字 数字 数字%
|
|
|
|
if (lines[1]) { |
|
|
|
const secondLine = lines[1].trim(); |
|
|
|
const numbers = secondLine.split(/\s+/).filter(num => num.trim()); |
|
|
|
if (numbers.length >= 3) { |
|
|
|
|
|
|
|
// 解析数字行:数字 数字% 或 数字 数字 数字%
|
|
|
|
for (let i = 1; i < lines.length; i++) { |
|
|
|
const line = lines[i].trim(); |
|
|
|
// 匹配数字序列
|
|
|
|
const numbers = line.split(/\s+/).filter(num => num.trim() && /\d/.test(num)); |
|
|
|
if (numbers.length >= 2) { |
|
|
|
// 销售相关数据:累计销售和客户满意度
|
|
|
|
purchaseCount = numbers[0].trim(); |
|
|
|
profitFarmCount = numbers[1].trim(); |
|
|
|
profitIncreaseRate = numbers[2].replace('%', '').trim(); |
|
|
|
profitFarmCount = numbers[1].replace('%', '').trim(); |
|
|
|
// 如果有第三个数字,可能是其他数据
|
|
|
|
if (numbers.length >= 3) { |
|
|
|
profitIncreaseRate = numbers[2].replace('%', '').trim(); |
|
|
|
} |
|
|
|
break; // 只处理第一行数字
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 提取egg_section中的数字部分,去掉"鸡蛋分"后缀
|
|
|
|
let score = Math.floor(Math.random() * 20) + 980; |
|
|
|
|
|
|
|
// 处理鸡蛋分显示
|
|
|
|
let score = '新人暂无'; |
|
|
|
if (item.egg_section) { |
|
|
|
const scoreMatch = item.egg_section.match(/(\d+)/); |
|
|
|
if (scoreMatch) { |
|
|
|
score = scoreMatch[1]; |
|
|
|
if (item.egg_section.trim() === '新人暂无') { |
|
|
|
// 新人暂无,直接显示
|
|
|
|
score = '新人暂无'; |
|
|
|
} else { |
|
|
|
// 提取egg_section中的数字部分,去掉"鸡蛋分"后缀
|
|
|
|
const scoreMatch = item.egg_section.match(/(\d+)/); |
|
|
|
if (scoreMatch) { |
|
|
|
score = scoreMatch[1]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
id: item.id || `id_${Date.now()}_${Math.random()}`, // 确保有id
|
|
|
|
managerId: item.managerId || '', |
|
|
|
@ -89,7 +114,33 @@ Page({ |
|
|
|
name: item.name || '未知', |
|
|
|
alias: item.alias || item.name || '未知', |
|
|
|
phoneNumber: item.phoneNumber || '', |
|
|
|
avatarUrl: item.avatar || item.avatarUrl || '', // 兼容avatar和avatarUrl
|
|
|
|
// 解析头像URL,处理JSON数组格式和多余字符
|
|
|
|
avatarUrl: function() { |
|
|
|
let url = ''; |
|
|
|
const avatarData = item.avatar || item.avatarUrl || ''; |
|
|
|
if (avatarData) { |
|
|
|
try { |
|
|
|
// 尝试解析JSON数组
|
|
|
|
const avatarArray = JSON.parse(avatarData); |
|
|
|
if (Array.isArray(avatarArray) && avatarArray.length > 0) { |
|
|
|
// 提取数组中的第一个URL,并清理多余字符
|
|
|
|
url = avatarArray[0].trim() |
|
|
|
.replace(/^`/, '') // 移除开头的反引号
|
|
|
|
.replace(/`$/, '') // 移除结尾的反引号
|
|
|
|
.replace(/^"/, '') // 移除开头的引号
|
|
|
|
.replace(/"$/, ''); // 移除结尾的引号
|
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
// 如果不是JSON数组,直接使用,并清理多余字符
|
|
|
|
url = avatarData.trim() |
|
|
|
.replace(/^`/, '') // 移除开头的反引号
|
|
|
|
.replace(/`$/, '') // 移除结尾的反引号
|
|
|
|
.replace(/^"/, '') // 移除开头的引号
|
|
|
|
.replace(/"$/, ''); // 移除结尾的引号
|
|
|
|
} |
|
|
|
} |
|
|
|
return url; |
|
|
|
}(), |
|
|
|
score: score, // 使用数据库中的鸡蛋分,提取数字部分
|
|
|
|
isOnline: !!item.online, // 转换为布尔值
|
|
|
|
responsibleArea: item.responsible_area || '', // 使用数据库中的负责区域
|
|
|
|
@ -104,13 +155,22 @@ Page({ |
|
|
|
}; |
|
|
|
}); |
|
|
|
console.log('处理后的数据数量:', processedData.length); |
|
|
|
|
|
|
|
// 按鸡蛋分从高到低排序
|
|
|
|
processedData.sort((a, b) => { |
|
|
|
const scoreA = parseInt(a.score) || 0; |
|
|
|
const scoreB = parseInt(b.score) || 0; |
|
|
|
return scoreB - scoreA; |
|
|
|
}); |
|
|
|
|
|
|
|
console.log('排序后的数据:', processedData.map(item => ({ id: item.id, name: item.name, score: item.score }))); |
|
|
|
return processedData; |
|
|
|
} else { |
|
|
|
console.error('响应数据格式错误,不是预期的数组格式:', dataSource); |
|
|
|
return []; |
|
|
|
} |
|
|
|
} else { |
|
|
|
console.error('获取客服列表失败,状态码:', res?.statusCode, '响应数据:', res?.data); |
|
|
|
console.error('获取客服列表失败,响应数据无效:', res); |
|
|
|
return []; |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
@ -146,14 +206,14 @@ Page({ |
|
|
|
const allSkills = ['渠道拓展', '供应商维护', '质量把控', '精准把控市场价格', '谈判技巧', '库存管理']; |
|
|
|
const skillCount = Math.floor(Math.random() * 3) + 2; // 2-4个技能
|
|
|
|
const selectedSkills = []; |
|
|
|
|
|
|
|
|
|
|
|
while (selectedSkills.length < skillCount) { |
|
|
|
const skill = allSkills[Math.floor(Math.random() * allSkills.length)]; |
|
|
|
if (!selectedSkills.includes(skill)) { |
|
|
|
selectedSkills.push(skill); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return selectedSkills; |
|
|
|
}, |
|
|
|
|
|
|
|
@ -184,16 +244,16 @@ Page({ |
|
|
|
} catch (e) { |
|
|
|
console.log('没有正在显示的loading'); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
wx.showLoading({ title: '加载中...' }); |
|
|
|
try { |
|
|
|
const services = await this.fetchCustomerServices(); |
|
|
|
console.log('获取到的客服数量:', services.length); |
|
|
|
|
|
|
|
|
|
|
|
// 计算在线数量
|
|
|
|
const onlineCount = services.filter(item => item.isOnline).length; |
|
|
|
console.log('在线客服数量:', onlineCount); |
|
|
|
|
|
|
|
|
|
|
|
// 更新数据
|
|
|
|
this.setData({ |
|
|
|
customerServices: services, |
|
|
|
@ -201,11 +261,11 @@ Page({ |
|
|
|
onlineCount: onlineCount |
|
|
|
}); |
|
|
|
console.log('数据更新成功'); |
|
|
|
|
|
|
|
|
|
|
|
// 应用当前的筛选条件
|
|
|
|
this.filterServices(); |
|
|
|
console.log('筛选条件应用完成'); |
|
|
|
|
|
|
|
|
|
|
|
// 如果没有数据,显示提示(确保在hideLoading后显示)
|
|
|
|
if (services.length === 0) { |
|
|
|
setTimeout(() => { |
|
|
|
@ -237,18 +297,18 @@ Page({ |
|
|
|
userType: options.type || 'seller' // 默认销售员
|
|
|
|
}); |
|
|
|
console.log('客服列表页面加载,类型:', this.data.userType); |
|
|
|
|
|
|
|
|
|
|
|
// 加载客服列表
|
|
|
|
this.loadCustomerServices(); |
|
|
|
|
|
|
|
|
|
|
|
// 检查当前用户身份
|
|
|
|
this.checkUserType(); |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 检查当前用户身份 |
|
|
|
*/ |
|
|
|
checkUserType: function () { |
|
|
|
checkUserType: function() { |
|
|
|
const app = getApp(); |
|
|
|
const userInfo = app.globalData.userInfo || {}; |
|
|
|
const isManager = userInfo.userType === 'manager' || userInfo.type === 'manager'; |
|
|
|
@ -265,12 +325,12 @@ Page({ |
|
|
|
selected: -1 // 不选中任何tab
|
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 当页面显示时重新加载数据,确保数据最新
|
|
|
|
this.loadCustomerServices(); |
|
|
|
}, |
|
|
|
|
|
|
|
onUnload: function () { |
|
|
|
|
|
|
|
onUnload: function() { |
|
|
|
// 停止定期刷新
|
|
|
|
this.stopPeriodicRefresh(); |
|
|
|
}, |
|
|
|
@ -284,11 +344,11 @@ Page({ |
|
|
|
}, |
|
|
|
|
|
|
|
onAreaFilter: function () { |
|
|
|
// 区域筛选弹窗 - 鸡蛋采购区域
|
|
|
|
// 区域筛选弹窗 - 使用用户要求的具体省份
|
|
|
|
wx.showActionSheet({ |
|
|
|
itemList: ['全部', '华北区', '华东区', '华南区', '全国', '西南区', '西北区', '东北区'], |
|
|
|
itemList: ['全部', '全国', '云南', '四川', '贵州', '广西'], |
|
|
|
success: res => { |
|
|
|
const areas = ['全部', '华北区', '华东区', '华南区', '全国', '西南区', '西北区', '东北区']; |
|
|
|
const areas = ['全部', '全国', '云南', '四川', '贵州', '广西']; |
|
|
|
const selectedArea = areas[res.tapIndex]; |
|
|
|
this.setData({ |
|
|
|
selectedArea: selectedArea |
|
|
|
@ -300,27 +360,49 @@ Page({ |
|
|
|
|
|
|
|
filterServices: function () { |
|
|
|
const { customerServices, searchKeyword, selectedArea } = this.data; |
|
|
|
|
|
|
|
|
|
|
|
// 首先进行关键词搜索
|
|
|
|
let filtered = customerServices; |
|
|
|
|
|
|
|
// 关键词搜索
|
|
|
|
if (searchKeyword) { |
|
|
|
const keyword = searchKeyword.toLowerCase(); |
|
|
|
filtered = filtered.filter(item => { |
|
|
|
return item.alias?.toLowerCase().includes(keyword) || |
|
|
|
item.name.toLowerCase().includes(keyword) || |
|
|
|
item.phoneNumber?.includes(keyword) || |
|
|
|
item.managercompany?.toLowerCase().includes(keyword); |
|
|
|
return item.alias?.toLowerCase().includes(keyword) || |
|
|
|
item.name.toLowerCase().includes(keyword) || |
|
|
|
item.phoneNumber?.includes(keyword) || |
|
|
|
item.managercompany?.toLowerCase().includes(keyword); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
// 区域筛选
|
|
|
|
|
|
|
|
// 然后进行区域筛选和排序
|
|
|
|
if (selectedArea && selectedArea !== '全部') { |
|
|
|
// 筛选出符合条件的客服
|
|
|
|
filtered = filtered.filter(item => { |
|
|
|
return item.responsibleArea?.includes(selectedArea); |
|
|
|
return item.responsibleArea?.includes(selectedArea) || item.responsibleArea?.includes('全国'); |
|
|
|
}); |
|
|
|
|
|
|
|
// 按所选地区优先排序
|
|
|
|
filtered.sort((a, b) => { |
|
|
|
// 优先显示所选地区的客服
|
|
|
|
const aHasSelectedArea = a.responsibleArea?.includes(selectedArea); |
|
|
|
const bHasSelectedArea = b.responsibleArea?.includes(selectedArea); |
|
|
|
|
|
|
|
if (aHasSelectedArea && !bHasSelectedArea) return -1; |
|
|
|
if (!aHasSelectedArea && bHasSelectedArea) return 1; |
|
|
|
|
|
|
|
// 同一地区的客服按鸡蛋分排序
|
|
|
|
const scoreA = parseInt(a.score) || 0; |
|
|
|
const scoreB = parseInt(b.score) || 0; |
|
|
|
return scoreB - scoreA; |
|
|
|
}); |
|
|
|
} else { |
|
|
|
// 全部区域时,按鸡蛋分排序
|
|
|
|
filtered.sort((a, b) => { |
|
|
|
const scoreA = parseInt(a.score) || 0; |
|
|
|
const scoreB = parseInt(b.score) || 0; |
|
|
|
return scoreB - scoreA; |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
this.setData({ |
|
|
|
filteredServices: filtered |
|
|
|
}); |
|
|
|
@ -332,72 +414,72 @@ Page({ |
|
|
|
console.log('=== 开始测试聊天列表功能 ==='); |
|
|
|
console.log('测试用户手机号:', userPhone); |
|
|
|
console.log('测试客服手机号:', managerPhone); |
|
|
|
|
|
|
|
|
|
|
|
// 1. 测试添加聊天记录(双向)
|
|
|
|
console.log('\n1. 测试添加聊天记录(双向)...'); |
|
|
|
const addChatResponse = await api.addChatRecord(userPhone, managerPhone); |
|
|
|
console.log('添加聊天记录响应:', addChatResponse); |
|
|
|
|
|
|
|
|
|
|
|
// 2. 测试用户获取聊天列表
|
|
|
|
console.log('\n2. 测试用户获取聊天列表...'); |
|
|
|
const userChatListResponse = await api.getChatList(userPhone); |
|
|
|
console.log('用户聊天列表响应:', userChatListResponse); |
|
|
|
console.log('用户聊天列表数量:', Array.isArray(userChatListResponse) ? userChatListResponse.length : 0); |
|
|
|
|
|
|
|
|
|
|
|
// 3. 测试客服获取聊天列表
|
|
|
|
console.log('\n3. 测试客服获取聊天列表...'); |
|
|
|
const managerChatListResponse = await api.getChatList(managerPhone); |
|
|
|
console.log('客服聊天列表响应:', managerChatListResponse); |
|
|
|
console.log('客服聊天列表数量:', Array.isArray(managerChatListResponse) ? managerChatListResponse.length : 0); |
|
|
|
|
|
|
|
|
|
|
|
// 4. 验证双向聊天记录是否都能正确获取
|
|
|
|
console.log('\n4. 验证双向聊天记录...'); |
|
|
|
|
|
|
|
|
|
|
|
// 检查用户是否能看到与客服的聊天记录
|
|
|
|
const userHasManagerChat = Array.isArray(userChatListResponse) && userChatListResponse.some(chat => |
|
|
|
const userHasManagerChat = Array.isArray(userChatListResponse) && userChatListResponse.some(chat => |
|
|
|
(chat.user_phone === userPhone && chat.manager_phone === managerPhone) || |
|
|
|
(chat.user_phone === managerPhone && chat.manager_phone === userPhone) |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
// 检查客服是否能看到与用户的聊天记录
|
|
|
|
const managerHasUserChat = Array.isArray(managerChatListResponse) && managerChatListResponse.some(chat => |
|
|
|
const managerHasUserChat = Array.isArray(managerChatListResponse) && managerChatListResponse.some(chat => |
|
|
|
(chat.user_phone === userPhone && chat.manager_phone === managerPhone) || |
|
|
|
(chat.user_phone === managerPhone && chat.manager_phone === userPhone) |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
if (userHasManagerChat) { |
|
|
|
console.log('✓ 用户可以看到与客服的聊天记录'); |
|
|
|
} else { |
|
|
|
console.log('❌ 用户无法看到与客服的聊天记录'); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (managerHasUserChat) { |
|
|
|
console.log('✓ 客服可以看到与用户的聊天记录'); |
|
|
|
} else { |
|
|
|
console.log('❌ 客服无法看到与用户的聊天记录'); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 5. 测试重复添加聊天记录(应该不会重复创建)
|
|
|
|
console.log('\n5. 测试重复添加聊天记录...'); |
|
|
|
const duplicateAddResponse = await api.addChatRecord(userPhone, managerPhone); |
|
|
|
console.log('重复添加聊天记录响应:', duplicateAddResponse); |
|
|
|
|
|
|
|
|
|
|
|
// 6. 再次测试获取聊天列表,确保数量没有变化
|
|
|
|
console.log('\n6. 再次测试获取聊天列表,确保数量没有变化...'); |
|
|
|
const finalUserChatListResponse = await api.getChatList(userPhone); |
|
|
|
console.log('最终用户聊天列表数量:', Array.isArray(finalUserChatListResponse) ? finalUserChatListResponse.length : 0); |
|
|
|
|
|
|
|
|
|
|
|
const initialLength = Array.isArray(userChatListResponse) ? userChatListResponse.length : 0; |
|
|
|
const finalLength = Array.isArray(finalUserChatListResponse) ? finalUserChatListResponse.length : 0; |
|
|
|
|
|
|
|
|
|
|
|
if (finalLength === initialLength) { |
|
|
|
console.log('✓ 重复添加聊天记录没有导致重复数据'); |
|
|
|
} else { |
|
|
|
console.log('❌ 重复添加聊天记录导致了重复数据'); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log('\n=== 聊天列表功能测试完成 ==='); |
|
|
|
|
|
|
|
|
|
|
|
// 总结测试结果
|
|
|
|
if (userHasManagerChat && managerHasUserChat) { |
|
|
|
console.log('\n🎉 所有测试通过!聊天列表功能正常工作。'); |
|
|
|
@ -406,7 +488,7 @@ Page({ |
|
|
|
console.log('\n❌ 测试失败!聊天列表功能存在问题。'); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
console.error('测试过程中出现错误:', error.message); |
|
|
|
if (error.response) { |
|
|
|
@ -482,17 +564,17 @@ Page({ |
|
|
|
console.log('聊天建立成功:', JSON.stringify(res, null, 2)); |
|
|
|
// 隐藏加载提示
|
|
|
|
wx.hideLoading(); |
|
|
|
|
|
|
|
|
|
|
|
// 使用客服手机号作为聊天会话ID
|
|
|
|
const chatSessionId = service.phoneNumber; |
|
|
|
|
|
|
|
|
|
|
|
// 跳转到聊天页面,确保正确传递客服手机号和用户名
|
|
|
|
wx.navigateTo({ |
|
|
|
url: `/pages/chat-detail/index?userId=${chatSessionId}&userName=${encodeURIComponent(service?.alias || '')}&phone=${service?.phoneNumber || ''}&isManager=true` |
|
|
|
}); |
|
|
|
console.log('跳转到聊天页面:', { |
|
|
|
chatUserId: chatSessionId, |
|
|
|
userName: service?.alias, |
|
|
|
console.log('跳转到聊天页面:', { |
|
|
|
chatUserId: chatSessionId, |
|
|
|
userName: service?.alias, |
|
|
|
customerServicePhone: service?.phoneNumber, |
|
|
|
userPhone: userPhone |
|
|
|
}); |
|
|
|
|