diff --git a/pages/customer-service/index.js b/pages/customer-service/index.js index 8663ddb..5faa564 100644 --- a/pages/customer-service/index.js +++ b/pages/customer-service/index.js @@ -11,40 +11,26 @@ Page({ 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'); - + + // 使用api.js中的请求工具,自动获取正确的服务器地址 + const apiResponse = await api.request(`/api/managers?type=${userType}`, 'GET'); + + console.log('API响应数据:', apiResponse ? JSON.stringify(apiResponse) : 'undefined'); + // 更宽松的响应检查,确保能处理各种有效的响应格式 - if (res && res.statusCode === 200 && res.data) { + if (apiResponse) { // 无论success字段是否存在,只要有data字段就尝试处理 - const dataSource = res.data.data || res.data; + const dataSource = apiResponse.data || apiResponse; if (Array.isArray(dataSource)) { const processedData = dataSource.map(item => { // 解析information字段中的信息 @@ -53,11 +39,11 @@ 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+鸡场 if (lines[0]) { const firstLine = lines[0].trim(); @@ -65,13 +51,13 @@ Page({ if (experienceMatch) { experience = experienceMatch[1].trim() + '年'; } - + const serviceCountMatch = firstLine.match(/服务(.*?)鸡场/); if (serviceCountMatch) { serviceCount = serviceCountMatch[1].trim(); } } - + // 解析第二行:数字 数字 数字% if (lines[1]) { const secondLine = lines[1].trim(); @@ -83,7 +69,7 @@ Page({ } } } - + // 提取egg_section中的数字部分,去掉"鸡蛋分"后缀 let score = Math.floor(Math.random() * 20) + 980; if (item.egg_section) { @@ -92,7 +78,7 @@ Page({ score = scoreMatch[1]; } } - + return { id: item.id || `id_${Date.now()}_${Math.random()}`, // 确保有id managerId: item.managerId || '', @@ -160,14 +146,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; }, @@ -198,16 +184,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, @@ -215,11 +201,11 @@ Page({ onlineCount: onlineCount }); console.log('数据更新成功'); - + // 应用当前的筛选条件 this.filterServices(); console.log('筛选条件应用完成'); - + // 如果没有数据,显示提示(确保在hideLoading后显示) if (services.length === 0) { setTimeout(() => { @@ -251,18 +237,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'; @@ -279,12 +265,12 @@ Page({ selected: -1 // 不选中任何tab }); } - + // 当页面显示时重新加载数据,确保数据最新 this.loadCustomerServices(); }, - - onUnload: function() { + + onUnload: function () { // 停止定期刷新 this.stopPeriodicRefresh(); }, @@ -314,27 +300,27 @@ 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); }); } - + this.setData({ filteredServices: filtered }); @@ -346,72 +332,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🎉 所有测试通过!聊天列表功能正常工作。'); @@ -420,7 +406,7 @@ Page({ console.log('\n❌ 测试失败!聊天列表功能存在问题。'); return false; } - + } catch (error) { console.error('测试过程中出现错误:', error.message); if (error.response) { @@ -496,17 +482,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 }); diff --git a/utils/api.js b/utils/api.js index eaf073f..e109b9d 100644 --- a/utils/api.js +++ b/utils/api.js @@ -109,9 +109,8 @@ function setDeviceType(deviceType) { } } -// 导出函数供外部使用 -// 将函数定义提升并直接导出,确保在小程序环境中正确识别 -module.exports = { +// 定义基础API导出 - 先不导出request,因为它在后面定义 +const baseApi = { setTestMode: setTestMode, isTestMode: isTestMode, setDeviceType: setDeviceType @@ -312,8 +311,12 @@ function request(url, method, data) { }); } -// 导出统一的API对象 +// 导出统一的API对象 - 合并基础API和其他功能 module.exports = { + // 包含基础API功能 + ...baseApi, + // 添加request函数 + request: request, // 添加商品到购物车 - 增强版本,即使本地找不到商品也尝试直接请求服务器 addToCart: function (goodsItem) { return new Promise((resolve, reject) => { @@ -321,7 +324,7 @@ module.exports = { const users = wx.getStorageSync('users') || {}; const userId = wx.getStorageSync('userId'); let userPhone = null; - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -335,7 +338,7 @@ module.exports = { userPhone = wx.getStorageSync('phoneNumber'); } } - + console.log('API.addToCart - userPhone:', userPhone, 'goodsItem:', goodsItem); // 1. 验证用户登录状态 @@ -934,19 +937,19 @@ module.exports = { // 1. 先获取用户的聊天列表,检查是否已经存在该聊天记录 return this.getChatList(user_phone).then(chatList => { console.log('获取到的聊天列表:', chatList); - + // 检查聊天列表中是否已经存在该聊天记录 // 需要检查两种组合:user_phone <-> manager_phone 和 manager_phone <-> user_phone const chatExists = Array.isArray(chatList) && chatList.some(chat => { return (chat.user_phone === user_phone && chat.manager_phone === manager_phone) || - (chat.user_phone === manager_phone && chat.manager_phone === user_phone); + (chat.user_phone === manager_phone && chat.manager_phone === user_phone); }); - + if (chatExists) { console.log('聊天记录已存在,不需要重复创建'); return { success: true, message: '聊天记录已存在' }; } - + // 2. 如果不存在,则调用服务器API创建聊天记录 return request('/api/chat/add', 'POST', { user_phone: user_phone, @@ -966,7 +969,7 @@ module.exports = { }).catch(err => { console.error('添加聊天记录请求失败:', err); console.error('错误详情:', { message: err.message, statusCode: err.statusCode, responseData: err.responseData }); - + // 如果是获取聊天列表失败,尝试直接创建聊天记录(作为降级策略) if (err.message.includes('获取聊天列表失败')) { console.log('获取聊天列表失败,尝试直接创建聊天记录'); @@ -988,7 +991,7 @@ module.exports = { return Promise.reject(new Error('添加聊天记录失败,请稍后重试')); }); } - + return Promise.reject(new Error('添加聊天记录失败,请稍后重试')); }); }, @@ -1382,9 +1385,9 @@ module.exports = { getProductList: function (status = 'published', options = {}) { const openid = wx.getStorageSync('openid'); console.log('API.getProductList - openid:', openid ? '存在' : '不存在', 'status:', status); - + // 不再因为没有openid而拒绝请求,允许未登录用户查看公开商品 - + // 确保分页参数存在,默认为page=1, pageSize=10 const page = options.page || 1; const pageSize = options.pageSize || 10; @@ -1398,7 +1401,7 @@ module.exports = { page: page, pageSize: pageSize }; - + // 无论openid是否存在,都添加到请求参数中,确保服务器接收到该参数 requestData.openid = openid || ''; @@ -1512,15 +1515,15 @@ module.exports = { }, // 获取personnel表数据 - getPersonnelData: function() { + getPersonnelData: function () { console.log('获取personnel表数据...'); return new Promise((resolve) => { request('/api/managers', 'GET', {}) // 使用现有的managers接口查询采购员数据 .then(res => { console.log('获取personnel表数据成功:', res); // 适配不同的数据返回格式 - const data = res && res.data && Array.isArray(res.data) ? res.data : - res && Array.isArray(res) ? res : []; + const data = res && res.data && Array.isArray(res.data) ? res.data : + res && Array.isArray(res) ? res : []; resolve(data); }) .catch(err => { @@ -1529,9 +1532,9 @@ module.exports = { }); }); }, - + // 根据手机号获取客服的managerId - 优化版 - getManagerIdByPhone: function(phoneNumber) { + getManagerIdByPhone: function (phoneNumber) { console.log('根据手机号获取managerId:', phoneNumber); return new Promise(async (resolve) => { // 严格验证手机号参数 @@ -1540,17 +1543,17 @@ module.exports = { resolve(null); return; } - + try { // 获取personnel表数据 const data = await this.getPersonnelData(); - + // 精确匹配手机号,确保找到正确的客服记录 const personnel = data.find(item => { // 严格检查phoneNumber字段,不依赖其他工作岗位字段 return item && item.phoneNumber === phoneNumber; }); - + if (personnel) { // 优先使用userId字段,其次使用id字段 const managerId = personnel.userId || personnel.id || null; @@ -1566,7 +1569,7 @@ module.exports = { } }); }, - + // 检查用户是否为客服(通过查询personnel表) checkIfUserIsCustomerService: function (phoneNumber = null) { console.log('API.checkIfUserIsCustomerService - phoneNumber:', phoneNumber); @@ -1577,7 +1580,7 @@ module.exports = { resolve(false); return; } - + // 使用getManagerIdByPhone来判断是否为客服 const managerId = await this.getManagerIdByPhone(phoneNumber); const isCustomerService = !!managerId; @@ -1585,28 +1588,28 @@ module.exports = { resolve(isCustomerService); }); }, - + // 统一的用户类型设置函数 - setUserType: function(userId, phoneNumber, currentType = '') { + setUserType: function (userId, phoneNumber, currentType = '') { console.log('API.setUserType - userId:', userId, 'phoneNumber:', phoneNumber, 'currentType:', currentType); return new Promise(async (resolve) => { try { // 初始化用户类型 let userType = currentType || ''; let managerId = null; - + // 获取本地存储的users信息 const users = wx.getStorageSync('users') || {}; - + // 检查是否为客服并获取managerId if (phoneNumber) { managerId = await this.getManagerIdByPhone(phoneNumber); } - + // 明确的用户类型判断逻辑 const isManager = !!managerId; const isRegularUser = !isManager && (currentType.includes('buyer') || currentType.includes('seller') || currentType.includes('both')); - + // 设置用户类型 if (isManager) { // 客服身份:仅设置为manager @@ -1629,7 +1632,7 @@ module.exports = { wx.removeStorageSync('managerId'); console.log('用户被识别为普通用户,类型:', userType); } - + // 更新users存储 if (userId) { if (!users[userId]) { @@ -1643,10 +1646,10 @@ module.exports = { } wx.setStorageSync('users', users); } - + // 存储用户类型信息 wx.setStorageSync('userType', userType); - + // 更新全局数据 if (getApp && getApp().globalData) { getApp().globalData.userType = userType; @@ -1654,10 +1657,10 @@ module.exports = { // 添加isCustomer标识,用于聊天功能判断 getApp().globalData.isCustomer = !isManager && (userType.includes('buyer') || userType.includes('seller') || userType.includes('both')); } - + // 确定是否为customer身份 const isCustomer = !isManager && (userType.includes('buyer') || userType.includes('seller') || userType.includes('both')); - + resolve({ success: true, userType: userType, @@ -1682,7 +1685,7 @@ module.exports = { if (!encryptedData || !iv) { return reject(new Error('登录必须进行手机号授权')); } - + // 1. 调用微信登录接口获取code wx.login({ success: loginRes => { @@ -1730,7 +1733,7 @@ module.exports = { wx.setStorageSync('sessionKey', sessionKey); } console.log('登录成功,openid:', openid); - + // 如果有手机号信息,上传到服务器 if (encryptedData && iv) { console.log('上传手机号信息到服务器'); @@ -1746,85 +1749,85 @@ module.exports = { wx.setStorageSync('userId', phoneRes.data.userId); userId = phoneRes.data.userId; } - + // 获取解密后的手机号 let phoneNumber = null; if (phoneRes.data && phoneRes.data.phoneNumber) { phoneNumber = phoneRes.data.phoneNumber; } - + // 获取用户信息 this.getUserInfo(openid).then(userInfoRes => { console.log('获取用户信息成功:', userInfoRes); let userInfo = null; let userType = ''; // 默认空类型 - + // 处理不同格式的响应 if (userInfoRes && userInfoRes.data) { userInfo = userInfoRes.data; } - + // 获取本地存储的users信息 - const users = wx.getStorageSync('users') || {}; - let currentType = ''; - - // 如果有userId,从users中获取当前类型 - if (userId && users[userId] && users[userId].type) { - currentType = users[userId].type; - console.log('从本地存储获取用户类型:', currentType); - } - - // 先设置基础用户类型 - userType = currentType || ''; - - // 使用客服身份判断逻辑:查询personnel表 - Promise.all([ - this.checkIfUserIsCustomerService(phoneNumber), - this.getManagerIdByPhone(phoneNumber) - ]).then(([isCustomerService, managerId]) => { - if (isCustomerService && managerId) { - // 如果是客服,确保userType包含manager - if (!userType.includes('manager')) { - userType = userType ? userType + ',manager' : 'manager'; - } - // 保存managerId到本地存储,用于WebSocket认证 - console.log(`保存客服的managerId: ${managerId} 到本地存储`); - wx.setStorageSync('managerId', managerId); - - // 更新users存储,包含managerId - if (userId) { - if (!users[userId]) { - users[userId] = {}; + const users = wx.getStorageSync('users') || {}; + let currentType = ''; + + // 如果有userId,从users中获取当前类型 + if (userId && users[userId] && users[userId].type) { + currentType = users[userId].type; + console.log('从本地存储获取用户类型:', currentType); } - users[userId].managerId = managerId; - } - console.log('用户被识别为客服:', phoneNumber, '用户类型:', userType); - } else { - // 如果不是客服,移除manager标识 - userType = userType.replace(/,?manager/g, '').replace(/^,|,$/g, ''); - // 清除managerId - wx.removeStorageSync('managerId'); - console.log('用户被识别为普通用户:', phoneNumber, '用户类型:', userType); - } - - // 更新users存储中的类型信息 - if (userId) { - if (!users[userId]) { - users[userId] = {}; - } - users[userId].type = userType; // 直接存储用户类型 - wx.setStorageSync('users', users); - } - - // 存储用户类型信息 - wx.setStorageSync('userType', userType); - + + // 先设置基础用户类型 + userType = currentType || ''; + + // 使用客服身份判断逻辑:查询personnel表 + Promise.all([ + this.checkIfUserIsCustomerService(phoneNumber), + this.getManagerIdByPhone(phoneNumber) + ]).then(([isCustomerService, managerId]) => { + if (isCustomerService && managerId) { + // 如果是客服,确保userType包含manager + if (!userType.includes('manager')) { + userType = userType ? userType + ',manager' : 'manager'; + } + // 保存managerId到本地存储,用于WebSocket认证 + console.log(`保存客服的managerId: ${managerId} 到本地存储`); + wx.setStorageSync('managerId', managerId); + + // 更新users存储,包含managerId + if (userId) { + if (!users[userId]) { + users[userId] = {}; + } + users[userId].managerId = managerId; + } + console.log('用户被识别为客服:', phoneNumber, '用户类型:', userType); + } else { + // 如果不是客服,移除manager标识 + userType = userType.replace(/,?manager/g, '').replace(/^,|,$/g, ''); + // 清除managerId + wx.removeStorageSync('managerId'); + console.log('用户被识别为普通用户:', phoneNumber, '用户类型:', userType); + } + + // 更新users存储中的类型信息 + if (userId) { + if (!users[userId]) { + users[userId] = {}; + } + users[userId].type = userType; // 直接存储用户类型 + wx.setStorageSync('users', users); + } + + // 存储用户类型信息 + wx.setStorageSync('userType', userType); + // 更新全局用户信息 if (getApp && getApp().globalData) { getApp().globalData.userInfo = userInfo; getApp().globalData.userType = userType; } - + // 将用户类型更新到服务器数据库 if (isCustomerService) { console.log('将客服身份更新到服务器数据库'); @@ -1833,7 +1836,7 @@ module.exports = { // 失败不影响登录流程 }); } - + // 登录成功后请求位置授权 - 已在登录页面手机号授权时同时请求,避免重复授权 // console.log('登录成功后请求位置授权'); // wx.authorize({ @@ -1893,7 +1896,7 @@ module.exports = { // }); // } // }); - + // 登录成功后请求位置授权 - 已在登录页面手机号授权时同时请求,避免重复授权 // console.log('登录成功后请求位置授权'); // wx.authorize({ @@ -2011,16 +2014,16 @@ module.exports = { // }); // } // }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, phoneRes, userInfo, userType, phoneNumber } + + resolve({ + success: true, + data: { openid, userId, sessionKey, phoneRes, userInfo, userType, phoneNumber } }); }).catch(checkErr => { console.error('检查客服身份失败:', checkErr); // 检查失败时默认为空类型 wx.setStorageSync('userType', ''); - + // 登录成功后请求位置授权 console.log('登录成功后请求位置授权'); wx.authorize({ @@ -2080,7 +2083,7 @@ module.exports = { }); } }); - + // 登录成功后请求位置授权 console.log('登录成功后请求位置授权'); wx.authorize({ @@ -2140,72 +2143,72 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, phoneRes, userInfo, userType: '', phoneNumber } + + resolve({ + success: true, + data: { openid, userId, sessionKey, phoneRes, userInfo, userType: '', phoneNumber } }); }); }).catch(userInfoErr => { console.warn('获取用户信息失败(不影响登录):', userInfoErr); - + // 获取本地存储的users信息 const users = wx.getStorageSync('users') || {}; let currentType = ''; - + // 如果有userId,从users中获取当前类型 if (userId && users[userId] && users[userId].type) { currentType = users[userId].type; } - + // 先设置基础用户类型 userType = currentType || ''; - + // 检查客服身份并获取managerId - Promise.all([ - this.checkIfUserIsCustomerService(phoneNumber), - this.getManagerIdByPhone(phoneNumber) - ]).then(([isCustomerService, managerId]) => { - if (isCustomerService && managerId) { - // 如果是客服,确保userType包含manager - if (!userType.includes('manager')) { - userType = userType ? userType + ',manager' : 'manager'; - } - - // 保存managerId到本地存储,用于WebSocket认证 - console.log(`保存客服的managerId: ${managerId} 到本地存储`); - wx.setStorageSync('managerId', managerId); - - // 更新users存储,包含managerId - if (userId) { - if (!users[userId]) { - users[userId] = {}; - } - users[userId].managerId = managerId; - } - } else { - // 如果不是客服,移除manager标识 - userType = userType.replace(/,?manager/g, '').replace(/^,|,$/g, ''); - // 清除managerId - wx.removeStorageSync('managerId'); + Promise.all([ + this.checkIfUserIsCustomerService(phoneNumber), + this.getManagerIdByPhone(phoneNumber) + ]).then(([isCustomerService, managerId]) => { + if (isCustomerService && managerId) { + // 如果是客服,确保userType包含manager + if (!userType.includes('manager')) { + userType = userType ? userType + ',manager' : 'manager'; } - - // 更新users存储 + + // 保存managerId到本地存储,用于WebSocket认证 + console.log(`保存客服的managerId: ${managerId} 到本地存储`); + wx.setStorageSync('managerId', managerId); + + // 更新users存储,包含managerId if (userId) { if (!users[userId]) { users[userId] = {}; } - users[userId].type = userType; - wx.setStorageSync('users', users); + users[userId].managerId = managerId; } - - wx.setStorageSync('userType', userType); - + } else { + // 如果不是客服,移除manager标识 + userType = userType.replace(/,?manager/g, '').replace(/^,|,$/g, ''); + // 清除managerId + wx.removeStorageSync('managerId'); + } + + // 更新users存储 + if (userId) { + if (!users[userId]) { + users[userId] = {}; + } + users[userId].type = userType; + wx.setStorageSync('users', users); + } + + wx.setStorageSync('userType', userType); + // 更新全局用户信息 if (getApp && getApp().globalData) { getApp().globalData.userType = userType; } - + // 将用户类型更新到服务器数据库 if (isCustomerService) { console.log('将客服身份更新到服务器数据库'); @@ -2214,7 +2217,7 @@ module.exports = { // 失败不影响登录流程 }); } - + // 登录成功后请求位置授权 console.log('登录成功后请求位置授权'); wx.authorize({ @@ -2274,10 +2277,10 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, phoneRes, userType, phoneNumber } + + resolve({ + success: true, + data: { openid, userId, sessionKey, phoneRes, userType, phoneNumber } }); }).catch(() => { // 如果检查也失败,默认为空类型 @@ -2341,10 +2344,10 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, phoneRes, userType: '', phoneNumber } + + resolve({ + success: true, + data: { openid, userId, sessionKey, phoneRes, userType: '', phoneNumber } }); }); }); @@ -2361,7 +2364,7 @@ module.exports = { let userInfo = null; let userType = 'customer'; // 默认客户类型 let phoneNumber = null; - + // 处理不同格式的响应 if (userInfoRes && userInfoRes.data) { userInfo = userInfoRes.data; @@ -2370,19 +2373,19 @@ module.exports = { phoneNumber = userInfo.phoneNumber; } } - + // 获取本地存储的users信息 const users = wx.getStorageSync('users') || {}; let currentType = ''; - + // 如果有userId,从users中获取当前类型 if (userId && users[userId] && users[userId].type) { currentType = users[userId].type; } - + // 先设置基础用户类型 userType = currentType || 'customer'; - + // 如果有手机号,尝试检查是否为客服 if (phoneNumber) { this.checkIfUserIsCustomerService(phoneNumber).then(isCustomerService => { @@ -2397,7 +2400,7 @@ module.exports = { userType = userType.replace(/,?manager/g, '').replace(/^,|,$/g, '') || 'customer'; console.log('用户被识别为普通用户:', phoneNumber, '用户类型:', userType); } - + // 更新users存储 if (userId) { if (!users[userId]) { @@ -2406,16 +2409,16 @@ module.exports = { users[userId].type = userType.replace('customer', ''); wx.setStorageSync('users', users); } - + // 存储用户类型信息 wx.setStorageSync('userType', userType); - + // 更新全局用户信息 if (getApp && getApp().globalData) { getApp().globalData.userInfo = userInfo; getApp().globalData.userType = userType; } - + // 登录成功后请求位置授权 console.log('登录成功后请求位置授权'); wx.authorize({ @@ -2475,10 +2478,10 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, userInfo, userType, phoneNumber } + + resolve({ + success: true, + data: { openid, userId, sessionKey, userInfo, userType, phoneNumber } }); }).catch(() => { // 检查失败时默认为普通用户 @@ -2542,22 +2545,22 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, userInfo, userType: 'customer', phoneNumber } + + resolve({ + success: true, + data: { openid, userId, sessionKey, userInfo, userType: 'customer', phoneNumber } }); }); } else { // 没有手机号,默认为普通用户 wx.setStorageSync('userType', 'customer'); - + // 更新全局用户信息 if (getApp && getApp().globalData) { getApp().globalData.userInfo = userInfo; getApp().globalData.userType = userType; } - + // 登录成功后请求位置授权 console.log('登录成功后请求位置授权'); wx.authorize({ @@ -2617,22 +2620,22 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, userInfo, userType } + + resolve({ + success: true, + data: { openid, userId, sessionKey, userInfo, userType } }); } }).catch(userInfoErr => { console.warn('获取用户信息失败(不影响登录):', userInfoErr); // 如果获取用户信息失败,仍然返回登录成功,但用户类型默认为客户 wx.setStorageSync('userType', 'customer'); - + // 更新全局用户信息 if (getApp && getApp().globalData) { getApp().globalData.userType = 'customer'; } - + // 登录成功后请求位置授权 console.log('登录成功后请求位置授权'); wx.authorize({ @@ -2692,10 +2695,10 @@ module.exports = { }); } }); - - resolve({ - success: true, - data: { openid, userId, sessionKey, userType: 'customer' } + + resolve({ + success: true, + data: { openid, userId, sessionKey, userType: 'customer' } }); }); } @@ -2792,11 +2795,11 @@ module.exports = { // 导入时间工具函数 const timeUtils = require('./time.js'); const userId = wx.getStorageSync('userId'); - + // 获取用户信息,包含手机号 const users = wx.getStorageSync('users') || {}; let userPhone = null; - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -2810,22 +2813,22 @@ module.exports = { userPhone = wx.getStorageSync('phoneNumber'); } } - + // 如果没有手机号,直接返回错误 if (!userPhone) { reject(new Error('请先登录并绑定手机号')); return; } - + // 构建收藏数据 const favoriteData = { user_phone: userPhone, productId: productId, date: timeUtils.toBeijingTimeISOString() // 当前时间 }; - + console.log('添加收藏请求数据:', favoriteData); - + // 发送请求到服务器 request('/api/favorites/add', 'POST', favoriteData).then(res => { console.log('添加收藏成功:', res); @@ -2845,7 +2848,7 @@ module.exports = { const users = wx.getStorageSync('users') || {}; const userId = wx.getStorageSync('userId'); let userPhone = null; - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -2859,20 +2862,20 @@ module.exports = { userPhone = wx.getStorageSync('phoneNumber'); } } - + // 如果没有手机号,直接返回错误 if (!userPhone) { reject(new Error('请先登录并绑定手机号')); return; } - + const cancelData = { user_phone: userPhone, productId: productId }; - + console.log('取消收藏请求数据:', cancelData); - + request('/api/favorites/cancel', 'POST', cancelData).then(res => { console.log('取消收藏成功:', res); resolve(res); @@ -2892,15 +2895,15 @@ module.exports = { reject(new Error('参数错误:必须传入有效的手机号')); return; } - + const userPhone = user_phone; - + const requestData = { user_phone: userPhone }; - + console.log('获取收藏列表请求数据:', requestData); - + // 将GET请求改为POST请求,因为GET请求通常不处理请求体 request('/api/favorites/list', 'POST', requestData).then(res => { console.log('获取收藏列表成功:', res); @@ -2930,27 +2933,27 @@ module.exports = { }, // 更新用户类型 - 恢复原有的类型转换功能 - updateUserType: async function(typeToAdd) { + updateUserType: async function (typeToAdd) { try { const userId = wx.getStorageSync('userId'); const openid = wx.getStorageSync('openid'); const userInfo = wx.getStorageSync('userInfo'); - + if (!userId || !openid) { console.log('用户未登录,无法更新用户类型'); return; } - + // 获取当前用户类型 let users = wx.getStorageSync('users') || {}; let currentType = users[userId] && users[userId].type ? users[userId].type : ''; - + // 计算新的用户类型(支持buyer、seller、both、manager) let newType = currentType; - + // 标记是否需要强制更新到服务器(即使类型没有变化) let forceUpdate = false; - + // 处理空字符串参数 - 可能是从客服登录流程调用的 if (typeToAdd === '') { // 检查当前类型是否包含manager @@ -2984,36 +2987,36 @@ module.exports = { } } } - + // 正常情况下,如果类型没有变化且不强制更新,不需要继续 if (newType === currentType && !forceUpdate) { return; } - + // 保留manager标识(如果有) const hasManager = currentType.includes('manager'); if (hasManager && !newType.includes('manager')) { newType = newType ? newType + ',manager' : 'manager'; } - + // 更新本地存储 if (!users[userId]) { users[userId] = {}; } users[userId].type = newType.replace('customer', ''); // 不存储customer类型 wx.setStorageSync('users', users); - + // 更新全局数据 const app = getApp(); if (app && app.globalData) { app.globalData.userType = newType; } - + // 同时更新本地的userType存储 wx.setStorageSync('userType', newType); - + console.log('用户类型更新成功:', newType); - + // 上传到服务器 const uploadData = { userId, @@ -3021,22 +3024,22 @@ module.exports = { type: newType, timestamp: Date.now() }; - + // 如果有userInfo,合并其属性但不覆盖已有的关键属性 if (userInfo) { - const userInfoCopy = {...userInfo}; + const userInfoCopy = { ...userInfo }; delete userInfoCopy.userId; // 不覆盖userId delete userInfoCopy.openid; // 不覆盖openid delete userInfoCopy.type; // 不覆盖type delete userInfoCopy.timestamp; // 不覆盖timestamp Object.assign(uploadData, userInfoCopy); } - + console.log('准备上传用户类型到服务器:', uploadData); - + // 调用用户信息更新API return request('/api/user/update', 'POST', uploadData); - + } catch (error) { console.error('更新用户类型失败:', error); throw error; @@ -3075,12 +3078,12 @@ module.exports = { const openid = wx.getStorageSync('openid'); const phoneNumber = wx.getStorageSync('phoneNumber') || ''; console.log('API.validateUserLogin - openid:', openid, 'phoneNumber:', phoneNumber); - + // 验证登录状态和手机号 if (!openid) { return Promise.reject(new Error('用户未登录')); } - + if (!phoneNumber) { return Promise.reject(new Error('用户未完成手机号授权')); } @@ -3090,7 +3093,7 @@ module.exports = { phoneNumber: phoneNumber }); }, - + // 撤回备案申请 withdrawSettlementApplication: function (openid) { return request('/api/settlement/withdraw', 'POST', { @@ -3468,12 +3471,12 @@ module.exports = { return data; }); }, - + // 预约商品 reserveProduct: function ({ id }) { return request('/api/products/reserve', 'POST', { productId: id }); }, - + /** * 上传入驻申请文件 * @param {String} filePath - 本地文件路径 @@ -3484,28 +3487,28 @@ module.exports = { return new Promise((resolve, reject) => { const openid = wx.getStorageSync('openid'); const userId = wx.getStorageSync('userId'); - + if (!openid) { reject(new Error('用户未登录')); return; } - + if (!filePath) { reject(new Error('文件路径不能为空')); return; } - + if (!fileType) { reject(new Error('文件类型不能为空')); return; } - + // 生成会话ID,确保文件上传的唯一性 const sessionId = `settlement_${Date.now()}_${Math.floor(Math.random() * 1000000)}`; - + console.log('开始上传入驻文件:', filePath, '文件类型:', fileType); console.log('上传会话ID:', sessionId); - + // 使用wx.uploadFile直接上传文件,参考publish页面的上传实现 wx.uploadFile({ url: BASE_URL + '/api/settlement/upload', @@ -3523,12 +3526,12 @@ module.exports = { try { console.log('入驻文件上传响应状态码:', res.statusCode); console.log('原始响应数据:', res.data); - + // 检查响应状态 if (res.statusCode >= 200 && res.statusCode < 300) { const data = JSON.parse(res.data); console.log('解析后的响应数据:', data); - + if (data.success) { console.log('入驻文件上传成功:', data.data?.fileUrl || ''); resolve(data.data || {}); @@ -3552,7 +3555,7 @@ module.exports = { }); }); }, - + // 获取收藏商品列表 getFavorites: function (phoneNumber) { console.log('API.getFavorites - phoneNumber:', phoneNumber); @@ -3573,7 +3576,7 @@ module.exports = { const users = wx.getStorageSync('users') || {}; const userId = wx.getStorageSync('userId'); let userPhone = null; - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -3587,20 +3590,20 @@ module.exports = { userPhone = wx.getStorageSync('phoneNumber'); } } - + // 如果没有手机号,直接返回错误 if (!userPhone) { reject(new Error('请先登录并绑定手机号')); return; } - + const requestData = { user_phone: userPhone, productId: productId }; - + console.log('取消收藏请求数据:', requestData); - + request('/api/favorites/remove', 'POST', requestData).then(res => { console.log('取消收藏成功:', res); resolve(res); @@ -3615,13 +3618,13 @@ module.exports = { getChatMessages: function (chatId, userPhone, options = {}) { return new Promise((resolve, reject) => { console.log('API.getChatMessages - chatId:', chatId, 'userPhone:', userPhone, 'options:', options); - + // 如果没有传入手机号,尝试从本地存储获取 if (!userPhone) { // 获取用户信息,包含手机号 const users = wx.getStorageSync('users') || {}; const userId = wx.getStorageSync('userId'); - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -3636,7 +3639,7 @@ module.exports = { } } } - + // 如果没有手机号,直接返回错误 if (!userPhone) { const error = new Error('请先登录并绑定手机号'); @@ -3644,19 +3647,19 @@ module.exports = { reject(error); return; } - + // 如果没有chatId,返回空数组 if (!chatId) { console.log('API.getChatMessages - 没有chatId,返回空数组'); resolve([]); return; } - + const requestData = { chat_id: chatId, user_phone: userPhone }; - + // 添加分页参数 if (options.before) { requestData.before = options.before; @@ -3664,12 +3667,12 @@ module.exports = { if (options.limit) { requestData.limit = options.limit; } - + console.log('API.getChatMessages - 请求数据:', requestData); - + request('/api/chat/messages', 'POST', requestData).then(res => { console.log('API.getChatMessages - 响应数据:', res); - + // 增强数据结构处理 let messages = []; if (Array.isArray(res)) { @@ -3681,7 +3684,7 @@ module.exports = { } else if (res && res.data && Array.isArray(res.data.messages)) { messages = res.data.messages; } - + console.log('API.getChatMessages - 处理后的消息数量:', messages.length); resolve(messages); }).catch(error => { @@ -3695,7 +3698,7 @@ module.exports = { sendMessage: function (senderPhone, receiverPhone, content) { return new Promise((resolve, reject) => { console.log('API.sendMessage - senderPhone:', senderPhone, 'receiverPhone:', receiverPhone, 'content:', content); - + // 验证必要参数 if (!senderPhone || !receiverPhone || !content) { const error = new Error('发送者电话、接收者电话和消息内容不能为空'); @@ -3703,18 +3706,18 @@ module.exports = { reject(error); return; } - + const requestData = { sender_phone: senderPhone, receiver_phone: receiverPhone, content: content }; - + console.log('API.sendMessage - 请求数据:', requestData); - + request('/api/chat/send', 'POST', requestData).then(res => { console.log('API.sendMessage - 响应数据:', res); - + // 处理不同格式的响应 if (res && (res.success || res.code === 200)) { resolve(res); @@ -3738,12 +3741,12 @@ module.exports = { reject(new Error('发送者电话和接收者电话不能为空')); return; } - + const requestData = { user_phone: userPhone, manager_phone: managerPhone }; - + request('/api/chat/delete', 'POST', requestData).then(res => { console.log('删除聊天消息成功:', res); resolve(res); @@ -3763,7 +3766,7 @@ module.exports = { // 获取用户信息,包含手机号 const users = wx.getStorageSync('users') || {}; const userId = wx.getStorageSync('userId'); - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -3778,19 +3781,19 @@ module.exports = { } } } - + // 如果没有手机号,直接返回错误 if (!userPhone) { reject(new Error('请先登录并绑定手机号')); return; } - + const requestData = { user_phone: userPhone }; - + console.log('获取聊天列表请求数据:', requestData); - + request('/api/chat/list', 'POST', requestData).then(res => { console.log('获取聊天列表成功:', res); // 标准化响应格式 @@ -3816,13 +3819,13 @@ module.exports = { reject(new Error('手机号不能为空')); return; } - + const requestData = { phone: phone }; - + console.log('获取业务员信息请求数据:', requestData); - + request('/api/personnel/get', 'POST', requestData).then(res => { console.log('获取业务员信息成功:', res); // 标准化响应格式 @@ -3847,7 +3850,7 @@ module.exports = { // 获取用户信息,包含手机号 const users = wx.getStorageSync('users') || {}; const userId = wx.getStorageSync('userId'); - + // 尝试从users中获取手机号 if (userId && users[userId] && users[userId].phoneNumber) { userPhone = users[userId].phoneNumber; @@ -3862,26 +3865,26 @@ module.exports = { } } } - + // 如果没有手机号,直接返回错误 if (!userPhone) { reject(new Error('请先登录并绑定手机号')); return; } - + // 如果没有chatId,直接返回错误 if (!chatId) { reject(new Error('聊天ID不能为空')); return; } - + const requestData = { chat_id: chatId, user_phone: userPhone }; - + console.log('API.markMessagesAsRead - 请求数据:', requestData); - + request('/api/chat/read', 'POST', requestData).then(res => { console.log('API.markMessagesAsRead - 响应数据:', res); resolve(res);