feat: 新增多个页面及功能,优化用户体验

在项目中新增了多个页面,包括押金页面、设备详情页面、反馈页面和帮助页面。同时,更新了订单支付和归还成功页面的逻辑,确保用户在支付和归还设备时能够获得清晰的反馈。优化了扫码和订单状态处理逻辑,提升了整体用户体验。
This commit is contained in:
8vd8
2025-04-21 14:54:00 +08:00
parent 41b409c327
commit 8431cdf2d6
12 changed files with 337 additions and 111 deletions
+71 -20
View File
@@ -6,24 +6,29 @@ import { queryById } from '@/config/user.js'
*/
class OrderMonitor {
constructor() {
this.activeOrders = new Map() // 存储活跃订单 Map<orderId, orderData>
this.activeOrders = new Map() // 存储活跃订单 Map<orderId, {orderData, pageName}>
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')
}
}