diff --git a/pages/order/payment.vue b/pages/order/payment.vue index 5ac4a89..06ac308 100644 Binary files a/pages/order/payment.vue and b/pages/order/payment.vue differ diff --git a/pages/return/index.vue b/pages/return/index.vue index fdcbc2d..76faa75 100644 --- a/pages/return/index.vue +++ b/pages/return/index.vue @@ -89,12 +89,16 @@ export default { statusCheckTimer: null, maxStatusChecks: 30, // 最多检查30次 currentStatusChecks: 0, - statusCheckInterval: 5000 // 5秒检查一次 + statusCheckInterval: 5000, // 5秒检查一次 + isPageActive: false // 跟踪页面是否活跃 } }, onLoad(options) { console.log('Return page loaded with options:', JSON.stringify(options)) + // 标记页面为活跃状态 + this.isPageActive = true + // 获取传递的参数 this.orderInfo.orderId = options.orderId || '' this.deviceId = options.deviceNo || options.deviceId || '' @@ -118,7 +122,10 @@ export default { // 如果订单ID有效,将订单添加到全局监控服务 try { if (this.$orderMonitor) { - this.$orderMonitor.addOrder({orderId: this.orderInfo.orderId}) + // 先确保移除之前的监控(防止重复添加) + this.$orderMonitor.removeOrder({orderId: this.orderInfo.orderId}) + // 添加到监控队列,明确指定为归还页面 + this.$orderMonitor.addOrder({orderId: this.orderInfo.orderId}, 'return') console.log('订单已添加到监控队列:', this.orderInfo.orderId) } else { console.warn('$orderMonitor 未定义,无法添加订单到监控队列') @@ -142,14 +149,46 @@ export default { // 注册全局订单完成事件监听器 uni.$on('orderCompleted', this.handleOrderCompleted) }, + // 添加onHide生命周期,处理页面隐藏时的清理工作 + onHide() { + console.log('归还页面隐藏,清理计时器资源和监控服务') + // 标记页面为非活跃状态 + this.isPageActive = false + + // 清理所有计时器 + this.clearTimer() + this.clearStatusCheckTimer() + + // 从全局订单监控服务中移除当前订单 + this.removeFromOrderMonitor() + }, onUnload() { + console.log('归还页面卸载,清理所有资源') + // 标记页面为非活跃状态 + this.isPageActive = false + // 页面卸载时清除定时器 this.clearTimer() this.clearStatusCheckTimer() + + // 从全局订单监控服务中移除当前订单 + this.removeFromOrderMonitor() + // 注销全局事件监听 uni.$off('orderCompleted', this.handleOrderCompleted) }, methods: { + // 从订单监控服务中移除当前订单 + removeFromOrderMonitor() { + if (this.orderInfo.orderId && this.$orderMonitor) { + try { + this.$orderMonitor.removeOrder({orderId: this.orderInfo.orderId}) + console.log('订单已从监控队列移除:', this.orderInfo.orderId) + } catch (error) { + console.error('从监控队列移除订单失败:', error) + } + } + }, // 处理订单完成事件(可由任何地方触发) handleOrderCompleted(orderData) { console.log('收到订单完成事件:', orderData) @@ -206,8 +245,14 @@ export default { // 获取订单详情 async getOrderDetails() { + // 如果页面不再活跃,不执行API请求 + if (!this.isPageActive) { + console.log('页面已不活跃,跳过订单详情请求') + return + } + try { - uni.showLoading({ title: '加载中' }) + // uni.showLoading({ title: '加载中' }) if (!this.orderInfo.orderId) { throw new Error('订单ID不能为空') @@ -320,10 +365,22 @@ export default { // 更新使用时长的定时器 startTimer() { + // 清除现有计时器,确保不重复 + this.clearTimer() + // 每分钟更新一次使用时长 this.timer = setInterval(() => { - this.getOrderDetails() + // 只有当页面活跃时才执行更新 + if (this.isPageActive) { + console.log('执行定时更新订单信息') + this.getOrderDetails() + } else { + console.log('页面已不活跃,停止计时器') + this.clearTimer() + } }, 60000) + + console.log('已启动使用时长更新计时器') }, // 清除定时器 @@ -331,6 +388,7 @@ export default { if (this.timer) { clearInterval(this.timer) this.timer = null + console.log('已清除使用时长更新计时器') } }, @@ -339,36 +397,47 @@ export default { if (this.statusCheckTimer) { clearInterval(this.statusCheckTimer) this.statusCheckTimer = null + console.log('已清除归还状态检查计时器') } }, // 开始状态检查定时器 startStatusCheckTimer() { this.currentStatusChecks = 0 + // 确保之前的计时器被清除 this.clearStatusCheckTimer() this.statusCheckTimer = setInterval(() => { - this.currentStatusChecks++ - this.checkReturnStatus() - - // 如果超过最大检查次数,停止定时器 - if (this.currentStatusChecks >= this.maxStatusChecks) { - this.clearStatusCheckTimer() + // 只有当页面活跃时才执行检查 + if (this.isPageActive) { + this.currentStatusChecks++ + console.log(`执行归还状态检查 (${this.currentStatusChecks}/${this.maxStatusChecks})`) + this.checkReturnStatus() - // 提示用户手动刷新 - uni.showToast({ - title: '请手动刷新查看归还状态', - icon: 'none', - duration: 3000 - }) + // 如果超过最大检查次数,停止定时器 + if (this.currentStatusChecks >= this.maxStatusChecks) { + this.clearStatusCheckTimer() + + // 提示用户手动刷新 + uni.showToast({ + title: '请手动刷新查看归还状态', + icon: 'none', + duration: 3000 + }) + } + } else { + console.log('页面已不活跃,停止状态检查计时器') + this.clearStatusCheckTimer() } }, this.statusCheckInterval) + + console.log('已启动归还状态检查计时器') }, // 通过设备号查询使用中的订单 async getOrderByDevice() { try { - uni.showLoading({ title: '加载中' }) + // uni.showLoading({ title: '加载中' }) if (!this.deviceId) { throw new Error('设备号不能为空') @@ -432,7 +501,10 @@ export default { // 检查归还状态 async checkReturnStatus() { try { - await this.getOrderDetails() + // 只有页面活跃时才执行检查 + if (this.isPageActive) { + await this.getOrderDetails() + } } catch (error) { console.error('检查归还状态失败:', error) } diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/config/user.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/config/user.js.map index e019854..b444467 100644 --- a/unpackage/dist/dev/.sourcemap/mp-weixin/config/user.js.map +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/config/user.js.map @@ -1 +1 @@ -{"version":3,"file":"user.js","sources":["config/user.js"],"sourcesContent":["import request from './http'\n\n\nexport const login = (data) => {\n return request({\n url: '/app/user/login',\n method: 'get',\n data\n })\n}\n\n\nexport const getMyIndexInfo = (data) => {\n return request({\n url: '/app/user/userInfo',\n method: 'get',\n data,\n })\n}\n\n// 添加押金提现API\nexport const withdrawDeposit = (orderNo) => {\n console.log('调用提现API,订单号:', orderNo)\n return request({\n url: `/app/withdraw/add/${orderNo}`,\n method: 'get',\n hideLoading: true\n })\n}\n\n//获取所有全部订单\nexport const getOrderList = (data) => {\n return request({\n url: '/app/order/list',\n method: 'get',\n data,\n hideLoading:true\n })\n}\n\n//查询是否有订单\nexport const queryHasOrder = (deviceNo) => {\n return request({\n url: `/app/order/list?deviceNo=${deviceNo}&orderStatus=in_used`,\n method: 'get',\n })\n}\n\n// 查询指定设备号下,特定状态的订单列表\nexport const checkOrdersByStatus = (deviceNo, statuses) => {\n // statuses 是一个包含状态字符串的数组,例如 ['in_used', 'waiting_for_payment']\n const statusQuery = statuses.join(','); // 后端需要支持逗号分隔的状态查询\n return request({\n url: `/app/order/list?deviceNo=${deviceNo}&orderStatus=${statusQuery}`,\n method: 'get',\n\t\thideLoading: true // 隐藏加载提示,避免干扰用户\n })\n}\n\n//设备查询\nexport const getDeviceInfo = (deviceNo) => {\n return request({\n url: `/app/device/${deviceNo}`,\n method: 'get',\n })\n}\n\n\n//创建订单\nexport const createOrder = (data) => {\n return request({\n url: '/app/order/add',\n method: 'post',\n data,\n })\n}\n\n//查询订单\nexport const queryById = (id) => {\n return request({\n url: `/app/order/${id}`,\n method: 'get',\n hideLoading: true\n })\n}\n\n\n//取消订单\nexport const cancelOrder = (data) => {\n return request({\n url: '/orderInfo/cancelOrder',\n method: 'get',\n data,\n })\n}\n\n\n//结束订单\nexport const overOrderById = (orderId) => {\n console.log(`调用结束订单API, orderId: ${orderId}`)\n return request({\n url: `/app/order/close/${orderId}`,\n method: 'get',\n })\n}\n\n//立即租借\nexport const rentPowerBank = (deviceNo, phone) => {\n return request({\n url: '/app/device/rentPowerBank',\n method: 'post',\n data: { deviceNo, phone }\n })\n}\n\n//确认支付并弹出充电宝\nexport const confirmPaymentAndRent = (orderId) => {\n console.log(`确认支付并弹出充电宝, orderId: ${orderId}`)\n return request({\n url: `/app/device/confirmPaymentAndRent?orderId=${orderId}`,\n method: 'post'\n })\n}\n\n\n\n//投诉反馈\nexport const addUserFeedback = (data) => {\n return request({\n url: '/app/feedback/add',\n method: 'post',\n data,\n })\n}\n\n//强制打开空格子\nexport const forcefOpenEmptyGrid = (deviceNo) => {\n console.log(`强制打开空格子, deviceNo: ${deviceNo}`)\n return request({\n url: `/app/device/forcef/${deviceNo}`,\n method: 'post'\n })\n}\n\n// 通过订单号获取订单信息\nexport const getOrderByOrderNo = (orderNo) => {\n console.log('通过订单号获取订单信息:', orderNo)\n return request({\n url: `/app/order/byOrderNo/${orderNo}`,\n method: 'get',\n hideLoading: true\n })\n}\n\n// 更新订单套餐信息\nexport const updateOrderPackage = (data) => {\n console.log('更新订单套餐信息:', data)\n return request({\n url: '/app/device/updateOrderPackage',\n method: 'post',\n data\n })\n}\n\n// 更新用户余额\nexport const updateUserBalance = (orderId) => {\n return request({\n url: `/app/user/updateBalance/${orderId}`,\n method: 'get',\n hideLoading: true\n })\n}\n"],"names":["request","uni"],"mappings":";;;AAGY,MAAC,QAAQ,CAAC,SAAS;AAC3B,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACR,CAAK;AACL;AAGY,MAAC,iBAAiB,CAAC,SAAS;AACpC,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACR,CAAK;AACL;AAGY,MAAC,kBAAkB,CAAC,YAAY;AACxCC,gBAAAA,MAAY,MAAA,OAAA,wBAAA,gBAAgB,OAAO;AACnC,SAAOD,oBAAQ;AAAA,IACX,KAAK,qBAAqB,OAAO;AAAA,IACjC,QAAQ;AAAA,IACR,aAAa;AAAA,EACrB,CAAK;AACL;AAGY,MAAC,eAAe,CAAC,SAAS;AAClC,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,aAAY;AAAA,EACpB,CAAK;AACL;AAWY,MAAC,sBAAsB,CAAC,UAAU,aAAa;AAEvD,QAAM,cAAc,SAAS,KAAK,GAAG;AACrC,SAAOA,oBAAQ;AAAA,IACX,KAAK,4BAA4B,QAAQ,gBAAgB,WAAW;AAAA,IACpE,QAAQ;AAAA,IACd,aAAa;AAAA;AAAA,EACf,CAAK;AACL;AAGY,MAAC,gBAAgB,CAAC,aAAa;AACvC,SAAOA,oBAAQ;AAAA,IACX,KAAK,eAAe,QAAQ;AAAA,IAC5B,QAAQ;AAAA,EAChB,CAAK;AACL;AAaY,MAAC,YAAY,CAAC,OAAO;AAC7B,SAAOA,oBAAQ;AAAA,IACX,KAAK,cAAc,EAAE;AAAA,IACrB,QAAQ;AAAA,IACR,aAAa;AAAA,EACrB,CAAK;AACL;AAuBY,MAAC,gBAAgB,CAAC,UAAU,UAAU;AAC9C,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,EAAE,UAAU,MAAO;AAAA,EACjC,CAAK;AACL;AAGY,MAAC,wBAAwB,CAAC,YAAY;AAC9CC,gBAAY,MAAA,MAAA,OAAA,yBAAA,wBAAwB,OAAO,EAAE;AAC7C,SAAOD,oBAAQ;AAAA,IACX,KAAK,6CAA6C,OAAO;AAAA,IACzD,QAAQ;AAAA,EAChB,CAAK;AACL;AAiCY,MAAC,qBAAqB,CAAC,SAAS;AACxCC,gBAAAA,MAAA,MAAA,OAAA,yBAAY,aAAa,IAAI;AAC7B,SAAOD,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACR,CAAK;AACL;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"user.js","sources":["config/user.js"],"sourcesContent":["import request from './http'\n\n\nexport const login = (data) => {\n return request({\n url: '/app/user/login',\n method: 'get',\n data\n })\n}\n\n\nexport const getMyIndexInfo = (data) => {\n return request({\n url: '/app/user/userInfo',\n method: 'get',\n data,\n })\n}\n\n// 添加押金提现API\nexport const withdrawDeposit = (orderNo) => {\n console.log('调用提现API,订单号:', orderNo)\n return request({\n url: `/app/withdraw/add/${orderNo}`,\n method: 'get',\n hideLoading: true\n })\n}\n\n//获取所有全部订单\nexport const getOrderList = (data) => {\n return request({\n url: '/app/order/list',\n method: 'get',\n data,\n hideLoading:true\n })\n}\n\n//查询是否有订单\nexport const queryHasOrder = (deviceNo) => {\n return request({\n url: `/app/order/list?deviceNo=${deviceNo}&orderStatus=in_used`,\n method: 'get',\n })\n}\n\n// 查询指定设备号下,特定状态的订单列表\nexport const checkOrdersByStatus = (deviceNo, statuses) => {\n // statuses 是一个包含状态字符串的数组,例如 ['in_used', 'waiting_for_payment']\n const statusQuery = statuses.join(','); // 后端需要支持逗号分隔的状态查询\n return request({\n url: `/app/order/list?deviceNo=${deviceNo}&orderStatus=${statusQuery}`,\n method: 'get',\n\t\thideLoading: true // 隐藏加载提示,避免干扰用户\n })\n}\n\n//设备查询\nexport const getDeviceInfo = (deviceNo) => {\n return request({\n url: `/app/device/${deviceNo}`,\n method: 'get',\n })\n}\n\n\n//创建订单\nexport const createOrder = (data) => {\n return request({\n url: '/app/order/add',\n method: 'post',\n data,\n })\n}\n\n//查询订单\nexport const queryById = (id) => {\n console.log(`查询订单详情, orderId: ${id}`)\n return request({\n url: `/app/order/${id}`,\n method: 'get',\n hideLoading: true\n })\n}\n\n\n//取消订单\nexport const cancelOrder = (data) => {\n return request({\n url: '/orderInfo/cancelOrder',\n method: 'get',\n data,\n })\n}\n\n\n//结束订单\nexport const overOrderById = (orderId) => {\n console.log(`调用结束订单API, orderId: ${orderId}`)\n return request({\n url: `/app/order/close/${orderId}`,\n method: 'get',\n })\n}\n\n//立即租借\nexport const rentPowerBank = (deviceNo, phone) => {\n return request({\n url: '/app/device/rentPowerBank',\n method: 'post',\n data: { deviceNo, phone }\n })\n}\n\n//确认支付并弹出充电宝\nexport const confirmPaymentAndRent = (orderId) => {\n console.log(`确认支付并弹出充电宝, orderId: ${orderId}`)\n return request({\n url: `/app/device/confirmPaymentAndRent?orderId=${orderId}`,\n method: 'post'\n })\n}\n\n\n\n//投诉反馈\nexport const addUserFeedback = (data) => {\n return request({\n url: '/app/feedback/add',\n method: 'post',\n data,\n })\n}\n\n//强制打开空格子\nexport const forcefOpenEmptyGrid = (deviceNo) => {\n console.log(`强制打开空格子, deviceNo: ${deviceNo}`)\n return request({\n url: `/app/device/forcef/${deviceNo}`,\n method: 'post'\n })\n}\n\n// 通过订单号获取订单信息\nexport const getOrderByOrderNo = (orderNo) => {\n console.log('通过订单号获取订单信息:', orderNo)\n return request({\n url: `/app/order/byOrderNo/${orderNo}`,\n method: 'get',\n hideLoading: true\n })\n}\n\n// 更新订单套餐信息\nexport const updateOrderPackage = (data) => {\n console.log('更新订单套餐信息:', data)\n return request({\n url: '/app/device/updateOrderPackage',\n method: 'post',\n data\n })\n}\n\n// 更新用户余额\nexport const updateUserBalance = (orderId) => {\n return request({\n url: `/app/user/updateBalance/${orderId}`,\n method: 'post',\n hideLoading: true\n })\n}\n"],"names":["request","uni"],"mappings":";;;AAGY,MAAC,QAAQ,CAAC,SAAS;AAC3B,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACR,CAAK;AACL;AAGY,MAAC,iBAAiB,CAAC,SAAS;AACpC,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACR,CAAK;AACL;AAGY,MAAC,kBAAkB,CAAC,YAAY;AACxCC,gBAAAA,MAAY,MAAA,OAAA,wBAAA,gBAAgB,OAAO;AACnC,SAAOD,oBAAQ;AAAA,IACX,KAAK,qBAAqB,OAAO;AAAA,IACjC,QAAQ;AAAA,IACR,aAAa;AAAA,EACrB,CAAK;AACL;AAGY,MAAC,eAAe,CAAC,SAAS;AAClC,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,aAAY;AAAA,EACpB,CAAK;AACL;AAWY,MAAC,sBAAsB,CAAC,UAAU,aAAa;AAEvD,QAAM,cAAc,SAAS,KAAK,GAAG;AACrC,SAAOA,oBAAQ;AAAA,IACX,KAAK,4BAA4B,QAAQ,gBAAgB,WAAW;AAAA,IACpE,QAAQ;AAAA,IACd,aAAa;AAAA;AAAA,EACf,CAAK;AACL;AAGY,MAAC,gBAAgB,CAAC,aAAa;AACvC,SAAOA,oBAAQ;AAAA,IACX,KAAK,eAAe,QAAQ;AAAA,IAC5B,QAAQ;AAAA,EAChB,CAAK;AACL;AAaY,MAAC,YAAY,CAAC,OAAO;AAC7BC,gBAAA,MAAA,MAAA,OAAA,wBAAY,oBAAoB,EAAE,EAAE;AACpC,SAAOD,oBAAQ;AAAA,IACX,KAAK,cAAc,EAAE;AAAA,IACrB,QAAQ;AAAA,IACR,aAAa;AAAA,EACrB,CAAK;AACL;AAuBY,MAAC,gBAAgB,CAAC,UAAU,UAAU;AAC9C,SAAOA,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,EAAE,UAAU,MAAO;AAAA,EACjC,CAAK;AACL;AAGY,MAAC,wBAAwB,CAAC,YAAY;AAC9CC,gBAAY,MAAA,MAAA,OAAA,yBAAA,wBAAwB,OAAO,EAAE;AAC7C,SAAOD,oBAAQ;AAAA,IACX,KAAK,6CAA6C,OAAO;AAAA,IACzD,QAAQ;AAAA,EAChB,CAAK;AACL;AAiCY,MAAC,qBAAqB,CAAC,SAAS;AACxCC,gBAAAA,MAAA,MAAA,OAAA,yBAAY,aAAa,IAAI;AAC7B,SAAOD,oBAAQ;AAAA,IACX,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACR,CAAK;AACL;AAGY,MAAC,oBAAoB,CAAC,YAAY;AAC1C,SAAOA,oBAAQ;AAAA,IACX,KAAK,2BAA2B,OAAO;AAAA,IACvC,QAAQ;AAAA,IACR,aAAa;AAAA,EACrB,CAAK;AACL;;;;;;;;;;;;"} \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/payment.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/payment.js.map index cf5cdd2..2f2fad0 100644 --- a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/payment.js.map +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/payment.js.map @@ -1 +1 @@ -{"version":3,"file":"payment.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvb3JkZXIvcGF5bWVudC52dWU"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/order/payment.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"} \ No newline at end of file +{"version":3,"file":"payment.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvb3JkZXIvcGF5bWVudC52dWU"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/order/payment.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"} \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/return/index.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/return/index.js.map index c59aa25..55a64c8 100644 --- a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/return/index.js.map +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/return/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvcmV0dXJuL2luZGV4LnZ1ZQ"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/return/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvcmV0dXJuL2luZGV4LnZ1ZQ"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/return/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"} \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/utils/orderMonitor.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/utils/orderMonitor.js.map index 30bb43f..2a8f76b 100644 --- a/unpackage/dist/dev/.sourcemap/mp-weixin/utils/orderMonitor.js.map +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/utils/orderMonitor.js.map @@ -1 +1 @@ -{"version":3,"file":"orderMonitor.js","sources":["utils/orderMonitor.js"],"sourcesContent":["import { queryById } from '@/config/user.js'\r\n\r\n/**\r\n * 订单监控服务\r\n * 用于在后台监控订单状态变化,特别是归还完成状态\r\n */\r\nclass OrderMonitor {\r\n constructor() {\r\n this.activeOrders = new Map() // 存储活跃订单 Map\r\n this.timer = null\r\n this.checkInterval = 10000 // 10秒检查一次\r\n this.isRunning = false\r\n }\r\n \r\n /**\r\n * 添加订单到监控队列\r\n * @param {Object} orderData 订单数据对象,必须包含orderId字段\r\n */\r\n addOrder(orderData) {\r\n if (!orderData || !orderData.orderId) {\r\n console.error('添加订单监控失败:无效的订单数据')\r\n return\r\n }\r\n \r\n console.log('添加订单到监控队列:', orderData.orderId)\r\n this.activeOrders.set(orderData.orderId, orderData)\r\n \r\n // 如果监控服务尚未启动,则启动\r\n if (!this.isRunning) {\r\n this.start()\r\n }\r\n }\r\n \r\n /**\r\n * 移除订单的监控\r\n * @param {String} orderId 订单ID\r\n */\r\n removeOrder(orderId) {\r\n if (this.activeOrders.has(orderId)) {\r\n console.log('从监控队列移除订单:', orderId)\r\n this.activeOrders.delete(orderId)\r\n \r\n // 如果没有订单需要监控了,停止服务\r\n if (this.activeOrders.size === 0) {\r\n this.stop()\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * 启动监控服务\r\n */\r\n start() {\r\n if (this.isRunning) return\r\n \r\n console.log('启动订单监控服务')\r\n this.isRunning = true\r\n this.checkOrders()\r\n \r\n this.timer = setInterval(() => {\r\n this.checkOrders()\r\n }, this.checkInterval)\r\n }\r\n \r\n /**\r\n * 停止监控服务\r\n */\r\n stop() {\r\n if (!this.isRunning) return\r\n \r\n console.log('停止订单监控服务')\r\n this.isRunning = false\r\n \r\n if (this.timer) {\r\n clearInterval(this.timer)\r\n this.timer = null\r\n }\r\n }\r\n \r\n /**\r\n * 检查所有活跃订单的状态\r\n */\r\n async checkOrders() {\r\n if (this.activeOrders.size === 0) return\r\n \r\n console.log(`检查 ${this.activeOrders.size} 个活跃订单状态`)\r\n \r\n for (const [orderId, orderData] of this.activeOrders.entries()) {\r\n try {\r\n await this.checkOrderStatus(orderId)\r\n } catch (error) {\r\n console.error(`检查订单状态失败: ${orderId}`, error)\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * 检查单个订单的状态\r\n * @param {String} orderId 订单ID\r\n */\r\n async checkOrderStatus(orderId) {\r\n try {\r\n console.log(`检查订单 ${orderId} 的状态`)\r\n const result = await queryById(orderId)\r\n \r\n if (result.code === 200 && result.data) {\r\n const orderData = result.data\r\n \r\n // 更新本地存储的订单数据\r\n this.activeOrders.set(orderId, orderData)\r\n \r\n // 检查订单是否已完成\r\n if (orderData.orderStatus === 'used_done' || orderData.orderStatus === 'used_down') {\r\n console.log(`订单 ${orderId} 已完成!`)\r\n \r\n // 触发全局事件\r\n uni.$emit('orderCompleted', orderData)\r\n \r\n // 显示全局通知\r\n uni.showToast({\r\n title: '充电宝归还成功',\r\n icon: 'success',\r\n duration: 2000\r\n })\r\n \r\n // 播放通知声音(如果需要)\r\n const innerAudioContext = uni.createInnerAudioContext()\r\n innerAudioContext.src = '/static/audio/return_success.mp3'\r\n innerAudioContext.play()\r\n \r\n // 完成的订单不再需要监控\r\n this.removeOrder(orderId)\r\n \r\n // 如果用户不在归还页面,则显示归还成功弹窗\r\n setTimeout(() => {\r\n uni.showModal({\r\n title: '归还成功',\r\n content: '充电宝已归还成功,剩余押金将退还到您的账户',\r\n confirmText: '查看详情',\r\n success: (res) => {\r\n if (res.confirm) {\r\n // 跳转到归还成功页面查看详情\r\n uni.redirectTo({\r\n url: `/pages/order/return-success?orderId=${orderId}`\r\n })\r\n }\r\n }\r\n })\r\n }, 500)\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`检查订单 ${orderId} 状态出错:`, error)\r\n }\r\n }\r\n}\r\n\r\n// 导出单例实例\r\nexport const orderMonitor = new OrderMonitor()\r\n\r\n// 页面加载时自动恢复监控上次的活跃订单(如果有)\r\nconst initOrderMonitor = () => {\r\n const lastActiveOrderId = uni.getStorageSync('activeOrderId')\r\n if (lastActiveOrderId) {\r\n const lastOrderData = { orderId: lastActiveOrderId }\r\n orderMonitor.addOrder(lastOrderData)\r\n }\r\n}\r\n\r\n// 初始化\r\ninitOrderMonitor() "],"names":["uni","queryById"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"orderMonitor.js","sources":["utils/orderMonitor.js"],"sourcesContent":["import { queryById } from '@/config/user.js'\r\n\r\n/**\r\n * 订单监控服务\r\n * 用于在后台监控订单状态变化,特别是归还完成状态\r\n */\r\nclass OrderMonitor {\r\n constructor() {\r\n this.activeOrders = new Map() // 存储活跃订单 Map\r\n this.timer = null\r\n this.checkInterval = 10000 // 10秒检查一次\r\n this.isRunning = false\r\n this.currentPage = null // 当前活跃页面\r\n }\r\n \r\n /**\r\n * 添加订单到监控队列\r\n * @param {Object} orderData 订单数据对象,必须包含orderId字段\r\n * @param {String} pageName 关联的页面名称,默认为'return'\r\n */\r\n addOrder(orderData, pageName = 'return') {\r\n if (!orderData || !orderData.orderId) {\r\n console.error('添加订单监控失败:无效的订单数据')\r\n return\r\n }\r\n \r\n console.log(`添加订单到监控队列: ${orderData.orderId}, 页面: ${pageName}`)\r\n this.activeOrders.set(orderData.orderId, {\r\n ...orderData,\r\n pageName\r\n })\r\n \r\n // 如果监控服务尚未启动,则启动\r\n if (!this.isRunning) {\r\n this.start()\r\n }\r\n }\r\n \r\n /**\r\n * 移除订单的监控\r\n * @param {Object} params 包含orderId或pageName的对象\r\n */\r\n removeOrder(params) {\r\n if (!params) return\r\n \r\n // 如果提供了orderId,直接删除该订单\r\n if (params.orderId && this.activeOrders.has(params.orderId)) {\r\n console.log('从监控队列移除订单:', params.orderId)\r\n this.activeOrders.delete(params.orderId)\r\n } \r\n // 如果提供了pageName,删除该页面关联的所有订单\r\n else if (params.pageName) {\r\n console.log('从监控队列移除页面相关订单:', params.pageName)\r\n for (const [orderId, data] of this.activeOrders.entries()) {\r\n if (data.pageName === params.pageName) {\r\n this.activeOrders.delete(orderId)\r\n }\r\n }\r\n }\r\n \r\n // 如果没有订单需要监控了,停止服务\r\n if (this.activeOrders.size === 0) {\r\n this.stop()\r\n }\r\n }\r\n \r\n /**\r\n * 设置当前活跃页面\r\n * @param {String} pageName 页面名称\r\n */\r\n setActivePage(pageName) {\r\n this.currentPage = pageName\r\n console.log('设置当前活跃页面:', pageName)\r\n }\r\n \r\n /**\r\n * 启动监控服务\r\n */\r\n start() {\r\n if (this.isRunning) return\r\n \r\n console.log('启动订单监控服务')\r\n this.isRunning = true\r\n this.checkOrders()\r\n \r\n this.timer = setInterval(() => {\r\n this.checkOrders()\r\n }, this.checkInterval)\r\n }\r\n \r\n /**\r\n * 停止监控服务\r\n */\r\n stop() {\r\n if (!this.isRunning) return\r\n \r\n console.log('停止订单监控服务')\r\n this.isRunning = false\r\n \r\n if (this.timer) {\r\n clearInterval(this.timer)\r\n this.timer = null\r\n }\r\n }\r\n \r\n /**\r\n * 检查所有活跃订单的状态\r\n */\r\n async checkOrders() {\r\n if (this.activeOrders.size === 0) return\r\n \r\n console.log(`检查 ${this.activeOrders.size} 个活跃订单状态, 当前页面: ${this.currentPage}`)\r\n \r\n // 只检查当前活跃页面关联的订单,或无页面关联的订单\r\n for (const [orderId, data] of this.activeOrders.entries()) {\r\n try {\r\n // 只在归还页面(或页面未指定时)才执行轮询\r\n if (!data.pageName || data.pageName === 'return') {\r\n if (this.currentPage === 'return' || this.currentPage === null) {\r\n await this.checkOrderStatus(orderId)\r\n } else {\r\n console.log(`跳过订单状态检查: ${orderId}, 当前不在归还页面`)\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`检查订单状态失败: ${orderId}`, error)\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * 检查单个订单的状态\r\n * @param {String} orderId 订单ID\r\n */\r\n async checkOrderStatus(orderId) {\r\n try {\r\n console.log(`检查订单 ${orderId} 的状态`)\r\n const result = await queryById(orderId)\r\n \r\n if (result.code === 200 && result.data) {\r\n const orderData = result.data\r\n const existingData = this.activeOrders.get(orderId)\r\n const pageName = existingData ? existingData.pageName : null\r\n \r\n // 更新本地存储的订单数据,保留页面关联信息\r\n this.activeOrders.set(orderId, {\r\n ...orderData,\r\n pageName\r\n })\r\n \r\n // 检查订单是否已完成\r\n if (orderData.orderStatus === 'used_done' || orderData.orderStatus === 'used_down') {\r\n console.log(`订单 ${orderId} 已完成!`)\r\n \r\n // 触发全局事件\r\n uni.$emit('orderCompleted', orderData)\r\n \r\n // 显示全局通知\r\n uni.showToast({\r\n title: '充电宝归还成功',\r\n icon: 'success',\r\n duration: 2000\r\n })\r\n \r\n // 播放通知声音(如果需要)\r\n const innerAudioContext = uni.createInnerAudioContext()\r\n innerAudioContext.src = '/static/audio/return_success.mp3'\r\n innerAudioContext.play()\r\n \r\n // 完成的订单不再需要监控\r\n this.removeOrder({orderId})\r\n \r\n // 如果用户不在归还页面,则显示归还成功弹窗\r\n setTimeout(() => {\r\n uni.showModal({\r\n title: '归还成功',\r\n content: '充电宝已归还成功,剩余押金将退还到您的账户',\r\n confirmText: '查看详情',\r\n success: (res) => {\r\n if (res.confirm) {\r\n // 跳转到归还成功页面查看详情\r\n uni.redirectTo({\r\n url: `/pages/order/return-success?orderId=${orderId}`\r\n })\r\n }\r\n }\r\n })\r\n }, 500)\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`检查订单 ${orderId} 状态出错:`, error)\r\n }\r\n }\r\n}\r\n\r\n// 导出单例实例\r\nexport const orderMonitor = new OrderMonitor()\r\n\r\n// 监听页面切换事件\r\nuni.onAppRoute((route) => {\r\n const pagePath = route.path || ''\r\n const pageSegments = pagePath.split('/')\r\n const pageName = pageSegments[pageSegments.length - 1]\r\n \r\n // 设置当前活跃页面\r\n orderMonitor.setActivePage(pageName || null)\r\n \r\n console.log('页面切换:', pagePath, '当前活跃页面:', pageName)\r\n})\r\n\r\n// 页面加载时自动恢复监控上次的活跃订单(如果有)\r\nconst initOrderMonitor = () => {\r\n const lastActiveOrderId = uni.getStorageSync('activeOrderId')\r\n if (lastActiveOrderId) {\r\n const lastOrderData = { orderId: lastActiveOrderId }\r\n orderMonitor.addOrder(lastOrderData, 'return')\r\n }\r\n}\r\n\r\n// 初始化\r\ninitOrderMonitor() "],"names":["uni","queryById"],"mappings":"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"} \ No newline at end of file diff --git a/unpackage/dist/dev/mp-weixin/common/vendor.js b/unpackage/dist/dev/mp-weixin/common/vendor.js index 38b0145..44042b2 100644 --- a/unpackage/dist/dev/mp-weixin/common/vendor.js +++ b/unpackage/dist/dev/mp-weixin/common/vendor.js @@ -6876,7 +6876,7 @@ function initOnError() { function initRuntimeSocketService() { const hosts = "10.8.0.5,192.168.1.15,127.0.0.1"; const port = "8090"; - const id = "mp-weixin_V-Usyu"; + const id = "mp-weixin_WlfuId"; const lazy = typeof swan !== "undefined"; let restoreError = lazy ? () => { } : initOnError(); diff --git a/unpackage/dist/dev/mp-weixin/config/user.js b/unpackage/dist/dev/mp-weixin/config/user.js index 83c2015..32211e0 100644 --- a/unpackage/dist/dev/mp-weixin/config/user.js +++ b/unpackage/dist/dev/mp-weixin/config/user.js @@ -47,6 +47,7 @@ const getDeviceInfo = (deviceNo) => { }); }; const queryById = (id) => { + common_vendor.index.__f__("log", "at config/user.js:80", `查询订单详情, orderId: ${id}`); return config_http.request({ url: `/app/order/${id}`, method: "get", @@ -61,20 +62,27 @@ const rentPowerBank = (deviceNo, phone) => { }); }; const confirmPaymentAndRent = (orderId) => { - common_vendor.index.__f__("log", "at config/user.js:118", `确认支付并弹出充电宝, orderId: ${orderId}`); + common_vendor.index.__f__("log", "at config/user.js:119", `确认支付并弹出充电宝, orderId: ${orderId}`); return config_http.request({ url: `/app/device/confirmPaymentAndRent?orderId=${orderId}`, method: "post" }); }; const updateOrderPackage = (data) => { - common_vendor.index.__f__("log", "at config/user.js:157", "更新订单套餐信息:", data); + common_vendor.index.__f__("log", "at config/user.js:158", "更新订单套餐信息:", data); return config_http.request({ url: "/app/device/updateOrderPackage", method: "post", data }); }; +const updateUserBalance = (orderId) => { + return config_http.request({ + url: `/app/user/updateBalance/${orderId}`, + method: "post", + hideLoading: true + }); +}; exports.checkOrdersByStatus = checkOrdersByStatus; exports.confirmPaymentAndRent = confirmPaymentAndRent; exports.getDeviceInfo = getDeviceInfo; @@ -84,5 +92,6 @@ exports.login = login; exports.queryById = queryById; exports.rentPowerBank = rentPowerBank; exports.updateOrderPackage = updateOrderPackage; +exports.updateUserBalance = updateUserBalance; exports.withdrawDeposit = withdrawDeposit; //# sourceMappingURL=../../.sourcemap/mp-weixin/config/user.js.map diff --git a/unpackage/dist/dev/mp-weixin/pages/order/payment.js b/unpackage/dist/dev/mp-weixin/pages/order/payment.js index 2264c96..065c31b 100644 --- a/unpackage/dist/dev/mp-weixin/pages/order/payment.js +++ b/unpackage/dist/dev/mp-weixin/pages/order/payment.js @@ -76,6 +76,7 @@ const _sfc_main = { formattedTime = this.formatTime(/* @__PURE__ */ new Date()); } } catch (e) { + common_vendor.index.__f__("error", "at pages/order/payment.vue:158", "时间格式化错误:", e); formattedTime = this.formatTime(/* @__PURE__ */ new Date()); } this.orderInfo = { @@ -84,12 +85,12 @@ const _sfc_main = { createTime: formattedTime, phone: orderData.phone, deposit: this.passedDepositAmount || orderData.depositAmount || "99.00", - amount: orderData.packagePrice || this.packageInfo.price || "0.00" + // 优先使用传递的押金,然后是订单中的押金,最后默认99元 + amount: orderData.amount || this.packageInfo.price || "0.00" }; - if (orderData.packageTime) { - this.packageInfo.time = `${orderData.packageTime / 60}小时`; - this.packageInfo.price = orderData.packagePrice || "0.00"; - } else if (this.packageInfo.time) { + if (!orderData.packageTime && this.packageInfo.time) { + this.orderInfo.packageTime = this.packageInfo.time; + this.orderInfo.packagePrice = this.packageInfo.price; } } else { throw new Error("获取订单信息失败"); @@ -126,6 +127,11 @@ const _sfc_main = { title: "支付成功", icon: "success" }); + try { + await config_user.updateUserBalance(this.orderId); + } catch (error) { + common_vendor.index.__f__("warn", "at pages/order/payment.vue:223", "更新用户余额失败:", error); + } setTimeout(() => { common_vendor.index.redirectTo({ url: `/pages/order/index?orderId=${this.orderId}` @@ -133,6 +139,7 @@ const _sfc_main = { }, 1500); }, fail: (err) => { + common_vendor.index.__f__("error", "at pages/order/payment.vue:234", "支付失败:", err); throw new Error("支付失败,请重试"); } }); @@ -229,7 +236,7 @@ const _sfc_main = { throw new Error("查询订单状态失败"); } } catch (error) { - common_vendor.index.__f__("error", "at pages/order/payment.vue:332", "查询订单状态错误:", error); + common_vendor.index.__f__("error", "at pages/order/payment.vue:342", "查询订单状态错误:", error); return null; } } diff --git a/unpackage/dist/dev/mp-weixin/pages/return/index.js b/unpackage/dist/dev/mp-weixin/pages/return/index.js index 797bc24..cee622f 100644 --- a/unpackage/dist/dev/mp-weixin/pages/return/index.js +++ b/unpackage/dist/dev/mp-weixin/pages/return/index.js @@ -21,15 +21,18 @@ const _sfc_main = { maxStatusChecks: 30, // 最多检查30次 currentStatusChecks: 0, - statusCheckInterval: 5e3 + statusCheckInterval: 5e3, // 5秒检查一次 + isPageActive: false + // 跟踪页面是否活跃 }; }, onLoad(options) { - common_vendor.index.__f__("log", "at pages/return/index.vue:96", "Return page loaded with options:", JSON.stringify(options)); + common_vendor.index.__f__("log", "at pages/return/index.vue:97", "Return page loaded with options:", JSON.stringify(options)); + this.isPageActive = true; this.orderInfo.orderId = options.orderId || ""; this.deviceId = options.deviceNo || options.deviceId || ""; - common_vendor.index.__f__("log", "at pages/return/index.vue:102", `初始化参数: orderId=${this.orderInfo.orderId}, deviceId=${this.deviceId}`); + common_vendor.index.__f__("log", "at pages/return/index.vue:106", `初始化参数: orderId=${this.orderInfo.orderId}, deviceId=${this.deviceId}`); if (!this.orderInfo.orderId && this.deviceId) { this.getOrderByDevice(); } else if (this.orderInfo.orderId) { @@ -39,13 +42,14 @@ const _sfc_main = { common_vendor.index.setStorageSync("activeOrderId", this.orderInfo.orderId); try { if (this.$orderMonitor) { - this.$orderMonitor.addOrder({ orderId: this.orderInfo.orderId }); - common_vendor.index.__f__("log", "at pages/return/index.vue:122", "订单已添加到监控队列:", this.orderInfo.orderId); + this.$orderMonitor.removeOrder({ orderId: this.orderInfo.orderId }); + this.$orderMonitor.addOrder({ orderId: this.orderInfo.orderId }, "return"); + common_vendor.index.__f__("log", "at pages/return/index.vue:129", "订单已添加到监控队列:", this.orderInfo.orderId); } else { - common_vendor.index.__f__("warn", "at pages/return/index.vue:124", "$orderMonitor 未定义,无法添加订单到监控队列"); + common_vendor.index.__f__("warn", "at pages/return/index.vue:131", "$orderMonitor 未定义,无法添加订单到监控队列"); } } catch (error) { - common_vendor.index.__f__("error", "at pages/return/index.vue:127", "添加订单到监控队列失败:", error); + common_vendor.index.__f__("error", "at pages/return/index.vue:134", "添加订单到监控队列失败:", error); } } else { common_vendor.index.showToast({ @@ -58,15 +62,37 @@ const _sfc_main = { } common_vendor.index.$on("orderCompleted", this.handleOrderCompleted); }, - onUnload() { + // 添加onHide生命周期,处理页面隐藏时的清理工作 + onHide() { + common_vendor.index.__f__("log", "at pages/return/index.vue:154", "归还页面隐藏,清理计时器资源和监控服务"); + this.isPageActive = false; this.clearTimer(); this.clearStatusCheckTimer(); + this.removeFromOrderMonitor(); + }, + onUnload() { + common_vendor.index.__f__("log", "at pages/return/index.vue:166", "归还页面卸载,清理所有资源"); + this.isPageActive = false; + this.clearTimer(); + this.clearStatusCheckTimer(); + this.removeFromOrderMonitor(); common_vendor.index.$off("orderCompleted", this.handleOrderCompleted); }, methods: { + // 从订单监控服务中移除当前订单 + removeFromOrderMonitor() { + if (this.orderInfo.orderId && this.$orderMonitor) { + try { + this.$orderMonitor.removeOrder({ orderId: this.orderInfo.orderId }); + common_vendor.index.__f__("log", "at pages/return/index.vue:186", "订单已从监控队列移除:", this.orderInfo.orderId); + } catch (error) { + common_vendor.index.__f__("error", "at pages/return/index.vue:188", "从监控队列移除订单失败:", error); + } + } + }, // 处理订单完成事件(可由任何地方触发) handleOrderCompleted(orderData) { - common_vendor.index.__f__("log", "at pages/return/index.vue:155", "收到订单完成事件:", orderData); + common_vendor.index.__f__("log", "at pages/return/index.vue:194", "收到订单完成事件:", orderData); if (orderData.orderId === this.orderInfo.orderId || orderData.orderNo === this.orderInfo.orderNo) { this.showReturnSuccessModal(orderData); } @@ -108,18 +134,21 @@ const _sfc_main = { }, // 获取订单详情 async getOrderDetails() { + if (!this.isPageActive) { + common_vendor.index.__f__("log", "at pages/return/index.vue:250", "页面已不活跃,跳过订单详情请求"); + return; + } try { - common_vendor.index.showLoading({ title: "加载中" }); if (!this.orderInfo.orderId) { throw new Error("订单ID不能为空"); } - common_vendor.index.__f__("log", "at pages/return/index.vue:216", "请求订单详情, orderId:", this.orderInfo.orderId); + common_vendor.index.__f__("log", "at pages/return/index.vue:261", "请求订单详情, orderId:", this.orderInfo.orderId); const result = await config_user.queryById(this.orderInfo.orderId); - common_vendor.index.__f__("log", "at pages/return/index.vue:218", "订单详情结果:", JSON.stringify(result)); + common_vendor.index.__f__("log", "at pages/return/index.vue:263", "订单详情结果:", JSON.stringify(result)); if (result.code === 200 && result.data) { const orderData = result.data; - common_vendor.index.__f__("log", "at pages/return/index.vue:222", "订单原始数据:", orderData); - common_vendor.index.__f__("log", "at pages/return/index.vue:223", "开始时间字段:", orderData.startTime, typeof orderData.startTime); + common_vendor.index.__f__("log", "at pages/return/index.vue:267", "订单原始数据:", orderData); + common_vendor.index.__f__("log", "at pages/return/index.vue:268", "开始时间字段:", orderData.startTime, typeof orderData.startTime); if (orderData.orderStatus) { this.orderInfo.orderStatus = orderData.orderStatus; } @@ -129,12 +158,12 @@ const _sfc_main = { return; } this.updateOrderInfo(orderData); - common_vendor.index.__f__("log", "at pages/return/index.vue:245", "更新后的开始时间:", this.orderInfo.startTime); + common_vendor.index.__f__("log", "at pages/return/index.vue:290", "更新后的开始时间:", this.orderInfo.startTime); } else { throw new Error(result.msg || "获取订单详情失败"); } } catch (error) { - common_vendor.index.__f__("error", "at pages/return/index.vue:250", "获取订单详情错误:", error); + common_vendor.index.__f__("error", "at pages/return/index.vue:295", "获取订单详情错误:", error); common_vendor.index.showToast({ title: error.message || "获取订单信息失败", icon: "none" @@ -157,7 +186,7 @@ const _sfc_main = { }, // 使用后端返回的使用时长和费用数据 updateOrderInfo(orderData) { - common_vendor.index.__f__("log", "at pages/return/index.vue:278", "更新订单信息:", JSON.stringify(orderData)); + common_vendor.index.__f__("log", "at pages/return/index.vue:323", "更新订单信息:", JSON.stringify(orderData)); this.orderInfo.usedTime = orderData.usedTime || "0分钟"; this.orderInfo.currentFee = orderData.currentFee || orderData.actualDeviceAmount || orderData.payAmount || "0.00"; if (orderData.orderStatus) { @@ -166,16 +195,16 @@ const _sfc_main = { this.orderInfo._rawStartTime = orderData.startTime; if (orderData.startTime) { try { - common_vendor.index.__f__("log", "at pages/return/index.vue:297", "API返回的开始时间:", orderData.startTime); + common_vendor.index.__f__("log", "at pages/return/index.vue:342", "API返回的开始时间:", orderData.startTime); this.orderInfo.startTime = orderData.startTime; } catch (e) { - common_vendor.index.__f__("error", "at pages/return/index.vue:301", "更新开始时间错误:", e); + common_vendor.index.__f__("error", "at pages/return/index.vue:346", "更新开始时间错误:", e); this.orderInfo.startTime = "未知"; } } else { - common_vendor.index.__f__("warn", "at pages/return/index.vue:305", "API返回的订单数据中没有startTime字段"); + common_vendor.index.__f__("warn", "at pages/return/index.vue:350", "API返回的订单数据中没有startTime字段"); if (orderData.createTime) { - common_vendor.index.__f__("log", "at pages/return/index.vue:308", "使用createTime作为备选:", orderData.createTime); + common_vendor.index.__f__("log", "at pages/return/index.vue:353", "使用createTime作为备选:", orderData.createTime); this.orderInfo.startTime = orderData.createTime; } else { this.orderInfo.startTime = "未知"; @@ -187,15 +216,24 @@ const _sfc_main = { }, // 更新使用时长的定时器 startTimer() { + this.clearTimer(); this.timer = setInterval(() => { - this.getOrderDetails(); + if (this.isPageActive) { + common_vendor.index.__f__("log", "at pages/return/index.vue:375", "执行定时更新订单信息"); + this.getOrderDetails(); + } else { + common_vendor.index.__f__("log", "at pages/return/index.vue:378", "页面已不活跃,停止计时器"); + this.clearTimer(); + } }, 6e4); + common_vendor.index.__f__("log", "at pages/return/index.vue:383", "已启动使用时长更新计时器"); }, // 清除定时器 clearTimer() { if (this.timer) { clearInterval(this.timer); this.timer = null; + common_vendor.index.__f__("log", "at pages/return/index.vue:391", "已清除使用时长更新计时器"); } }, // 清除状态检查定时器 @@ -203,6 +241,7 @@ const _sfc_main = { if (this.statusCheckTimer) { clearInterval(this.statusCheckTimer); this.statusCheckTimer = null; + common_vendor.index.__f__("log", "at pages/return/index.vue:400", "已清除归还状态检查计时器"); } }, // 开始状态检查定时器 @@ -210,22 +249,28 @@ const _sfc_main = { this.currentStatusChecks = 0; this.clearStatusCheckTimer(); this.statusCheckTimer = setInterval(() => { - this.currentStatusChecks++; - this.checkReturnStatus(); - if (this.currentStatusChecks >= this.maxStatusChecks) { + if (this.isPageActive) { + this.currentStatusChecks++; + common_vendor.index.__f__("log", "at pages/return/index.vue:414", `执行归还状态检查 (${this.currentStatusChecks}/${this.maxStatusChecks})`); + this.checkReturnStatus(); + if (this.currentStatusChecks >= this.maxStatusChecks) { + this.clearStatusCheckTimer(); + common_vendor.index.showToast({ + title: "请手动刷新查看归还状态", + icon: "none", + duration: 3e3 + }); + } + } else { + common_vendor.index.__f__("log", "at pages/return/index.vue:429", "页面已不活跃,停止状态检查计时器"); this.clearStatusCheckTimer(); - common_vendor.index.showToast({ - title: "请手动刷新查看归还状态", - icon: "none", - duration: 3e3 - }); } }, this.statusCheckInterval); + common_vendor.index.__f__("log", "at pages/return/index.vue:434", "已启动归还状态检查计时器"); }, // 通过设备号查询使用中的订单 async getOrderByDevice() { try { - common_vendor.index.showLoading({ title: "加载中" }); if (!this.deviceId) { throw new Error("设备号不能为空"); } @@ -237,16 +282,16 @@ const _sfc_main = { "Clientid": common_vendor.index.getStorageSync("client_id") } }); - common_vendor.index.__f__("log", "at pages/return/index.vue:387", "通过设备号查询订单结果:", JSON.stringify(inUseRes)); + common_vendor.index.__f__("log", "at pages/return/index.vue:456", "通过设备号查询订单结果:", JSON.stringify(inUseRes)); if (inUseRes.statusCode === 200 && inUseRes.data.code === 200 && inUseRes.data.data) { const inUseOrder = inUseRes.data.data; - common_vendor.index.__f__("log", "at pages/return/index.vue:391", "使用中的订单:", inUseOrder); + common_vendor.index.__f__("log", "at pages/return/index.vue:460", "使用中的订单:", inUseOrder); this.orderInfo.orderId = inUseOrder.orderId; if (inUseOrder.orderStatus) { this.orderInfo.orderStatus = inUseOrder.orderStatus; } if (inUseOrder.startTime) { - common_vendor.index.__f__("log", "at pages/return/index.vue:403", "inUse API返回的开始时间:", inUseOrder.startTime); + common_vendor.index.__f__("log", "at pages/return/index.vue:472", "inUse API返回的开始时间:", inUseOrder.startTime); this.orderInfo.startTime = inUseOrder.startTime; } this.getOrderDetails(); @@ -256,7 +301,7 @@ const _sfc_main = { throw new Error("未找到使用中的订单"); } } catch (error) { - common_vendor.index.__f__("error", "at pages/return/index.vue:417", "通过设备号查询订单失败:", error); + common_vendor.index.__f__("error", "at pages/return/index.vue:486", "通过设备号查询订单失败:", error); common_vendor.index.showToast({ title: error.message || "获取订单信息失败", icon: "none" @@ -271,9 +316,11 @@ const _sfc_main = { // 检查归还状态 async checkReturnStatus() { try { - await this.getOrderDetails(); + if (this.isPageActive) { + await this.getOrderDetails(); + } } catch (error) { - common_vendor.index.__f__("error", "at pages/return/index.vue:437", "检查归还状态失败:", error); + common_vendor.index.__f__("error", "at pages/return/index.vue:509", "检查归还状态失败:", error); } }, // 返回首页 diff --git a/unpackage/dist/dev/mp-weixin/utils/orderMonitor.js b/unpackage/dist/dev/mp-weixin/utils/orderMonitor.js index c2d2eef..3d461a1 100644 --- a/unpackage/dist/dev/mp-weixin/utils/orderMonitor.js +++ b/unpackage/dist/dev/mp-weixin/utils/orderMonitor.js @@ -7,34 +7,56 @@ class OrderMonitor { this.timer = null; this.checkInterval = 1e4; this.isRunning = false; + this.currentPage = null; } /** * 添加订单到监控队列 * @param {Object} orderData 订单数据对象,必须包含orderId字段 + * @param {String} pageName 关联的页面名称,默认为'return' */ - addOrder(orderData) { + addOrder(orderData, pageName = "return") { if (!orderData || !orderData.orderId) { - common_vendor.index.__f__("error", "at utils/orderMonitor.js:21", "添加订单监控失败:无效的订单数据"); + common_vendor.index.__f__("error", "at utils/orderMonitor.js:23", "添加订单监控失败:无效的订单数据"); return; } - common_vendor.index.__f__("log", "at utils/orderMonitor.js:25", "添加订单到监控队列:", orderData.orderId); - this.activeOrders.set(orderData.orderId, orderData); + common_vendor.index.__f__("log", "at utils/orderMonitor.js:27", `添加订单到监控队列: ${orderData.orderId}, 页面: ${pageName}`); + this.activeOrders.set(orderData.orderId, { + ...orderData, + pageName + }); if (!this.isRunning) { this.start(); } } /** * 移除订单的监控 - * @param {String} orderId 订单ID + * @param {Object} params 包含orderId或pageName的对象 */ - removeOrder(orderId) { - if (this.activeOrders.has(orderId)) { - common_vendor.index.__f__("log", "at utils/orderMonitor.js:40", "从监控队列移除订单:", orderId); - this.activeOrders.delete(orderId); - if (this.activeOrders.size === 0) { - this.stop(); + removeOrder(params) { + if (!params) + return; + if (params.orderId && this.activeOrders.has(params.orderId)) { + common_vendor.index.__f__("log", "at utils/orderMonitor.js:48", "从监控队列移除订单:", params.orderId); + this.activeOrders.delete(params.orderId); + } else if (params.pageName) { + common_vendor.index.__f__("log", "at utils/orderMonitor.js:53", "从监控队列移除页面相关订单:", params.pageName); + for (const [orderId, data] of this.activeOrders.entries()) { + if (data.pageName === params.pageName) { + this.activeOrders.delete(orderId); + } } } + if (this.activeOrders.size === 0) { + this.stop(); + } + } + /** + * 设置当前活跃页面 + * @param {String} pageName 页面名称 + */ + setActivePage(pageName) { + this.currentPage = pageName; + common_vendor.index.__f__("log", "at utils/orderMonitor.js:73", "设置当前活跃页面:", pageName); } /** * 启动监控服务 @@ -42,7 +64,7 @@ class OrderMonitor { start() { if (this.isRunning) return; - common_vendor.index.__f__("log", "at utils/orderMonitor.js:56", "启动订单监控服务"); + common_vendor.index.__f__("log", "at utils/orderMonitor.js:82", "启动订单监控服务"); this.isRunning = true; this.checkOrders(); this.timer = setInterval(() => { @@ -55,7 +77,7 @@ class OrderMonitor { stop() { if (!this.isRunning) return; - common_vendor.index.__f__("log", "at utils/orderMonitor.js:71", "停止订单监控服务"); + common_vendor.index.__f__("log", "at utils/orderMonitor.js:97", "停止订单监控服务"); this.isRunning = false; if (this.timer) { clearInterval(this.timer); @@ -68,12 +90,18 @@ class OrderMonitor { async checkOrders() { if (this.activeOrders.size === 0) return; - common_vendor.index.__f__("log", "at utils/orderMonitor.js:86", `检查 ${this.activeOrders.size} 个活跃订单状态`); - for (const [orderId, orderData] of this.activeOrders.entries()) { + common_vendor.index.__f__("log", "at utils/orderMonitor.js:112", `检查 ${this.activeOrders.size} 个活跃订单状态, 当前页面: ${this.currentPage}`); + for (const [orderId, data] of this.activeOrders.entries()) { try { - await this.checkOrderStatus(orderId); + if (!data.pageName || data.pageName === "return") { + if (this.currentPage === "return" || this.currentPage === null) { + await this.checkOrderStatus(orderId); + } else { + common_vendor.index.__f__("log", "at utils/orderMonitor.js:122", `跳过订单状态检查: ${orderId}, 当前不在归还页面`); + } + } } catch (error) { - common_vendor.index.__f__("error", "at utils/orderMonitor.js:92", `检查订单状态失败: ${orderId}`, error); + common_vendor.index.__f__("error", "at utils/orderMonitor.js:126", `检查订单状态失败: ${orderId}`, error); } } } @@ -83,13 +111,18 @@ class OrderMonitor { */ async checkOrderStatus(orderId) { try { - common_vendor.index.__f__("log", "at utils/orderMonitor.js:103", `检查订单 ${orderId} 的状态`); + common_vendor.index.__f__("log", "at utils/orderMonitor.js:137", `检查订单 ${orderId} 的状态`); const result = await config_user.queryById(orderId); if (result.code === 200 && result.data) { const orderData = result.data; - this.activeOrders.set(orderId, orderData); + const existingData = this.activeOrders.get(orderId); + const pageName = existingData ? existingData.pageName : null; + this.activeOrders.set(orderId, { + ...orderData, + pageName + }); if (orderData.orderStatus === "used_done" || orderData.orderStatus === "used_down") { - common_vendor.index.__f__("log", "at utils/orderMonitor.js:114", `订单 ${orderId} 已完成!`); + common_vendor.index.__f__("log", "at utils/orderMonitor.js:153", `订单 ${orderId} 已完成!`); common_vendor.index.$emit("orderCompleted", orderData); common_vendor.index.showToast({ title: "充电宝归还成功", @@ -99,7 +132,7 @@ class OrderMonitor { const innerAudioContext = common_vendor.index.createInnerAudioContext(); innerAudioContext.src = "/static/audio/return_success.mp3"; innerAudioContext.play(); - this.removeOrder(orderId); + this.removeOrder({ orderId }); setTimeout(() => { common_vendor.index.showModal({ title: "归还成功", @@ -117,16 +150,23 @@ class OrderMonitor { } } } catch (error) { - common_vendor.index.__f__("error", "at utils/orderMonitor.js:153", `检查订单 ${orderId} 状态出错:`, error); + common_vendor.index.__f__("error", "at utils/orderMonitor.js:192", `检查订单 ${orderId} 状态出错:`, error); } } } const orderMonitor = new OrderMonitor(); +common_vendor.index.onAppRoute((route) => { + const pagePath = route.path || ""; + const pageSegments = pagePath.split("/"); + const pageName = pageSegments[pageSegments.length - 1]; + orderMonitor.setActivePage(pageName || null); + common_vendor.index.__f__("log", "at utils/orderMonitor.js:209", "页面切换:", pagePath, "当前活跃页面:", pageName); +}); const initOrderMonitor = () => { const lastActiveOrderId = common_vendor.index.getStorageSync("activeOrderId"); if (lastActiveOrderId) { const lastOrderData = { orderId: lastActiveOrderId }; - orderMonitor.addOrder(lastOrderData); + orderMonitor.addOrder(lastOrderData, "return"); } }; initOrderMonitor(); diff --git a/utils/orderMonitor.js b/utils/orderMonitor.js index a8c993b..7056987 100644 --- a/utils/orderMonitor.js +++ b/utils/orderMonitor.js @@ -6,24 +6,29 @@ import { queryById } from '@/config/user.js' */ class OrderMonitor { constructor() { - this.activeOrders = new Map() // 存储活跃订单 Map + this.activeOrders = new Map() // 存储活跃订单 Map this.timer = null this.checkInterval = 10000 // 10秒检查一次 this.isRunning = false + this.currentPage = null // 当前活跃页面 } /** * 添加订单到监控队列 * @param {Object} orderData 订单数据对象,必须包含orderId字段 + * @param {String} pageName 关联的页面名称,默认为'return' */ - addOrder(orderData) { + addOrder(orderData, pageName = 'return') { if (!orderData || !orderData.orderId) { console.error('添加订单监控失败:无效的订单数据') return } - console.log('添加订单到监控队列:', orderData.orderId) - this.activeOrders.set(orderData.orderId, orderData) + console.log(`添加订单到监控队列: ${orderData.orderId}, 页面: ${pageName}`) + this.activeOrders.set(orderData.orderId, { + ...orderData, + pageName + }) // 如果监控服务尚未启动,则启动 if (!this.isRunning) { @@ -33,18 +38,39 @@ class OrderMonitor { /** * 移除订单的监控 - * @param {String} orderId 订单ID + * @param {Object} params 包含orderId或pageName的对象 */ - removeOrder(orderId) { - if (this.activeOrders.has(orderId)) { - console.log('从监控队列移除订单:', orderId) - this.activeOrders.delete(orderId) - - // 如果没有订单需要监控了,停止服务 - if (this.activeOrders.size === 0) { - this.stop() + removeOrder(params) { + if (!params) return + + // 如果提供了orderId,直接删除该订单 + if (params.orderId && this.activeOrders.has(params.orderId)) { + console.log('从监控队列移除订单:', params.orderId) + this.activeOrders.delete(params.orderId) + } + // 如果提供了pageName,删除该页面关联的所有订单 + else if (params.pageName) { + console.log('从监控队列移除页面相关订单:', params.pageName) + for (const [orderId, data] of this.activeOrders.entries()) { + if (data.pageName === params.pageName) { + this.activeOrders.delete(orderId) + } } } + + // 如果没有订单需要监控了,停止服务 + if (this.activeOrders.size === 0) { + this.stop() + } + } + + /** + * 设置当前活跃页面 + * @param {String} pageName 页面名称 + */ + setActivePage(pageName) { + this.currentPage = pageName + console.log('设置当前活跃页面:', pageName) } /** @@ -83,11 +109,19 @@ class OrderMonitor { async checkOrders() { if (this.activeOrders.size === 0) return - console.log(`检查 ${this.activeOrders.size} 个活跃订单状态`) + console.log(`检查 ${this.activeOrders.size} 个活跃订单状态, 当前页面: ${this.currentPage}`) - for (const [orderId, orderData] of this.activeOrders.entries()) { + // 只检查当前活跃页面关联的订单,或无页面关联的订单 + for (const [orderId, data] of this.activeOrders.entries()) { try { - await this.checkOrderStatus(orderId) + // 只在归还页面(或页面未指定时)才执行轮询 + if (!data.pageName || data.pageName === 'return') { + if (this.currentPage === 'return' || this.currentPage === null) { + await this.checkOrderStatus(orderId) + } else { + console.log(`跳过订单状态检查: ${orderId}, 当前不在归还页面`) + } + } } catch (error) { console.error(`检查订单状态失败: ${orderId}`, error) } @@ -105,9 +139,14 @@ class OrderMonitor { if (result.code === 200 && result.data) { const orderData = result.data + const existingData = this.activeOrders.get(orderId) + const pageName = existingData ? existingData.pageName : null - // 更新本地存储的订单数据 - this.activeOrders.set(orderId, orderData) + // 更新本地存储的订单数据,保留页面关联信息 + this.activeOrders.set(orderId, { + ...orderData, + pageName + }) // 检查订单是否已完成 if (orderData.orderStatus === 'used_done' || orderData.orderStatus === 'used_down') { @@ -129,7 +168,7 @@ class OrderMonitor { innerAudioContext.play() // 完成的订单不再需要监控 - this.removeOrder(orderId) + this.removeOrder({orderId}) // 如果用户不在归还页面,则显示归还成功弹窗 setTimeout(() => { @@ -158,12 +197,24 @@ class OrderMonitor { // 导出单例实例 export const orderMonitor = new OrderMonitor() +// 监听页面切换事件 +uni.onAppRoute((route) => { + const pagePath = route.path || '' + const pageSegments = pagePath.split('/') + const pageName = pageSegments[pageSegments.length - 1] + + // 设置当前活跃页面 + orderMonitor.setActivePage(pageName || null) + + console.log('页面切换:', pagePath, '当前活跃页面:', pageName) +}) + // 页面加载时自动恢复监控上次的活跃订单(如果有) const initOrderMonitor = () => { const lastActiveOrderId = uni.getStorageSync('activeOrderId') if (lastActiveOrderId) { const lastOrderData = { orderId: lastActiveOrderId } - orderMonitor.addOrder(lastOrderData) + orderMonitor.addOrder(lastOrderData, 'return') } }