You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

394 lines
12 KiB

// pages/customer-service/index.js
const api = require('../../utils/api');
Page({
// 客服数据,将从后端动态获取
data: {
customerServices: [],
filteredServices: [],
searchKeyword: '',
selectedArea: '全部',
totalCount: 0,
onlineCount: 0,
userType: 'seller' // 初始化用户类型,默认为销售员
},
// 获取客服列表的方法
async fetchCustomerServices() {
try {
console.log('开始请求客服列表...');
// 导入API工具并使用正确的请求方法
const api = require('../../utils/api');
// 获取当前用户类型参数
const userType = this.data.userType || 'seller';
const res = await new Promise((resolve, reject) => {
wx.request({
url: `http://localhost:3003/api/managers?type=${userType}`,
method: 'GET',
timeout: 15000,
header: {
'content-type': 'application/json'
},
success: resolve,
fail: (error) => {
console.error('网络请求失败:', error);
reject(error);
}
});
});
console.log('API响应状态码:', res?.statusCode);
console.log('API响应数据:', res?.data ? JSON.stringify(res.data) : 'undefined');
// 更宽松的响应检查,确保能处理各种有效的响应格式
if (res && res.statusCode === 200 && res.data) {
// 无论success字段是否存在,只要有data字段就尝试处理
const dataSource = res.data.data || res.data;
if (Array.isArray(dataSource)) {
const processedData = dataSource.map(item => ({
id: item.id || `id_${Date.now()}_${Math.random()}`, // 确保有id
managerId: item.managerId || '',
managercompany: item.managercompany || '',
managerdepartment: item.managerdepartment || '',
organization: item.organization || '',
projectName: item.projectName || '',
name: item.name || '未知',
alias: item.alias || item.name || '未知',
phoneNumber: item.phoneNumber || '',
avatarUrl: item.avatar || item.avatarUrl || '', // 兼容avatar和avatarUrl
score: Math.floor(Math.random() * 20) + 980, // 随机生成分数
isOnline: !!item.online, // 转换为布尔值
responsibleArea: `${this.getRandomArea()}鸡蛋采购`,
experience: this.getRandomExperience(),
serviceCount: this.getRandomNumber(100, 300),
purchaseCount: this.getRandomNumber(10000, 30000),
profitIncreaseRate: this.getRandomNumber(10, 25),
profitFarmCount: this.getRandomNumber(50, 200),
skills: this.getRandomSkills()
}));
console.log('处理后的数据数量:', processedData.length);
return processedData;
} else {
console.error('响应数据格式错误,不是预期的数组格式:', dataSource);
return [];
}
} else {
console.error('获取客服列表失败,状态码:', res?.statusCode, '响应数据:', res?.data);
return [];
}
} catch (error) {
console.error('请求客服列表出错:', error);
// 网络错误时显示提示
wx.showToast({
title: '网络请求失败,请检查网络连接',
icon: 'none'
});
return [];
}
},
// 辅助函数:生成随机区域
getRandomArea() {
const areas = ['华北区', '华东区', '华南区', '全国', '西南区', '西北区', '东北区'];
return areas[Math.floor(Math.random() * areas.length)];
},
// 辅助函数:生成随机工作经验
getRandomExperience() {
const experiences = ['1-2年', '1-3年', '2-3年', '3-5年', '5年以上'];
return experiences[Math.floor(Math.random() * experiences.length)];
},
// 辅助函数:生成随机数字
getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
},
// 辅助函数:生成随机技能
getRandomSkills() {
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;
},
// 定期刷新客服列表(每30秒)
startPeriodicRefresh() {
this.refreshTimer = setInterval(() => {
console.log('定期刷新客服列表...');
this.loadCustomerServices();
}, 30000);
},
// 停止定期刷新
stopPeriodicRefresh() {
if (this.refreshTimer) {
clearInterval(this.refreshTimer);
this.refreshTimer = null;
}
},
// 加载客服列表
async loadCustomerServices() {
console.log('开始加载客服列表...');
// 确保在开始时调用hideLoading,防止重复调用showLoading
try {
wx.hideLoading();
} 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,
totalCount: services.length,
onlineCount: onlineCount
});
console.log('数据更新成功');
// 应用当前的筛选条件
this.filterServices();
console.log('筛选条件应用完成');
// 如果没有数据,显示提示(确保在hideLoading后显示)
if (services.length === 0) {
setTimeout(() => {
wx.showToast({
title: '暂无客服数据',
icon: 'none',
duration: 2000
});
}, 100);
}
} catch (error) {
console.error('加载客服列表失败:', error);
// 确保在hideLoading后显示错误提示
setTimeout(() => {
wx.showToast({
title: '加载失败,请重试',
icon: 'none',
duration: 2000
});
}, 100);
} finally {
wx.hideLoading();
}
},
onLoad: function (options) {
// 获取页面参数(seller=销售员,buyer=采购员)
this.setData({
userType: options.type || 'seller' // 默认销售员
});
console.log('客服列表页面加载,类型:', this.data.userType);
// 加载客服列表
this.loadCustomerServices();
// 检查当前用户身份
this.checkUserType();
},
/**
* 检查当前用户身份
*/
checkUserType: function() {
const app = getApp();
const userInfo = app.globalData.userInfo || {};
const isManager = userInfo.userType === 'manager' || userInfo.type === 'manager';
console.log('当前用户身份检查:', { isManager, userType: userInfo.userType });
this.setData({
isCurrentUserManager: isManager
});
},
onShow() {
// 更新自定义tabBar状态
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({
selected: -1 // 不选中任何tab
});
}
// 当页面显示时重新加载数据,确保数据最新
this.loadCustomerServices();
},
onUnload: function() {
// 停止定期刷新
this.stopPeriodicRefresh();
},
onSearch: function (e) {
const keyword = e.detail.value;
this.setData({
searchKeyword: keyword
});
this.filterServices();
},
onAreaFilter: function () {
// 区域筛选弹窗 - 鸡蛋采购区域
wx.showActionSheet({
itemList: ['全部', '华北区', '华东区', '华南区', '全国', '西南区', '西北区', '东北区'],
success: res => {
const areas = ['全部', '华北区', '华东区', '华南区', '全国', '西南区', '西北区', '东北区'];
const selectedArea = areas[res.tapIndex];
this.setData({
selectedArea: selectedArea
});
this.filterServices();
}
});
},
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);
});
}
// 区域筛选
if (selectedArea && selectedArea !== '全部') {
filtered = filtered.filter(item => {
return item.responsibleArea?.includes(selectedArea);
});
}
this.setData({
filteredServices: filtered
});
},
onChat: function (e) {
const id = e.currentTarget.dataset.id;
const service = this.data.customerServices.find(item => item.id === id);
if (!service) return;
// 获取当前用户的手机号
let userPhone = '';
try {
// 尝试从不同的存储位置获取手机号
const userInfo = wx.getStorageSync('userInfo');
if (userInfo && userInfo.phoneNumber) {
userPhone = userInfo.phoneNumber;
} else {
// 尝试从其他可能的存储位置获取
const users = wx.getStorageSync('users') || {};
const userId = wx.getStorageSync('userId');
if (userId && users[userId] && users[userId].phoneNumber) {
userPhone = users[userId].phoneNumber;
} else {
userPhone = wx.getStorageSync('phoneNumber');
}
}
} catch (e) {
console.error('获取用户手机号失败:', e);
}
console.log('当前用户手机号:', userPhone);
console.log('客服手机号:', service.phoneNumber);
// 验证手机号
if (!userPhone) {
wx.showToast({
title: '请先登录获取手机号',
icon: 'none'
});
return;
}
// 显示加载提示
wx.showLoading({
title: '正在建立聊天...',
});
// 调用API添加聊天记录
api.addChatRecord(userPhone, service.phoneNumber).then(res => {
console.log('添加聊天记录成功:', JSON.stringify(res, null, 2));
// 隐藏加载提示
wx.hideLoading();
// 打印所有可能的chatSessionId来源
console.log('聊天会话ID候选值:', {
res_data_chatSessionId: res?.data?.chatSessionId,
res_chatSessionId: res?.chatSessionId,
service_managerId: service?.managerId,
service_id: id,
service_phoneNumber: service?.phoneNumber
});
// 尝试从服务器响应中获取聊天会话ID,如果没有则使用客服手机号,再没有则使用managerId或id
const chatSessionId = res?.data?.chatSessionId || res?.chatSessionId || service?.phoneNumber || service?.managerId || id;
// 跳转到聊天页面
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, serverResponse: JSON.stringify(res, null, 2) });
}).catch(err => {
console.error('添加聊天记录失败:', err);
// 隐藏加载提示
wx.hideLoading();
wx.showToast({
title: '建立聊天失败,请重试',
icon: 'none'
});
});
},
onCall: function (e) {
const phone = e.currentTarget.dataset.phone;
wx.makePhoneCall({
phoneNumber: phone,
success: function () {
console.log('拨打电话成功');
},
fail: function () {
console.log('拨打电话失败');
}
});
},
// 查看客服详情
onViewDetail: function (e) {
const id = e.currentTarget.dataset.id;
wx.navigateTo({
url: `/pages/customer-service/detail?id=${id}`
});
},
onBack: function () {
wx.navigateBack();
}
});