// 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(); } });