修改页面逻辑
This commit is contained in:
@@ -53,7 +53,7 @@
|
||||
</view>
|
||||
|
||||
<view class="order-actions">
|
||||
<button class="action-btn primary" @click="viewOrderDetail(order.id, order.status)">查看详情</button>
|
||||
<button class="action-btn primary" @click="viewOrderDetail(order)">查看详情</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -93,11 +93,15 @@ export default {
|
||||
checkForNewCompletedOrder() {
|
||||
const completedOrderFromStorage = uni.getStorageSync('completed_order_for_history')
|
||||
if (completedOrderFromStorage) {
|
||||
// 如果有,将其添加到订单列表的开头
|
||||
// 检查是否已经存在于列表中,避免重复添加
|
||||
const exists = this.orderList.some(order => order.id === completedOrderFromStorage.id)
|
||||
if (!exists) {
|
||||
this.orderList.unshift(completedOrderFromStorage)
|
||||
// 仅在本地存储条目标记为已完成(status >= 4)时才合并到历史
|
||||
const storedStatus = Number(completedOrderFromStorage && (completedOrderFromStorage.status ?? 0))
|
||||
if (storedStatus >= 4) {
|
||||
const exists = this.orderList.some(order => order.id === completedOrderFromStorage.id)
|
||||
if (!exists) {
|
||||
this.orderList.unshift(completedOrderFromStorage)
|
||||
}
|
||||
} else {
|
||||
console.warn('checkForNewCompletedOrder: ignoring stored completed_order_for_history with non-completed status', completedOrderFromStorage)
|
||||
}
|
||||
// 清除本地存储,防止下次进入页面时重复添加
|
||||
uni.removeStorageSync('completed_order_for_history')
|
||||
@@ -107,122 +111,114 @@ export default {
|
||||
// 加载历史订单(从数据库读取)
|
||||
async loadOrderHistory() {
|
||||
try {
|
||||
const ready = await Promise.race([supaReady, new Promise(resolve => setTimeout(() => resolve(false), 1500))])
|
||||
if (!ready) console.warn('supaReady timeout/failed in loadOrderHistory - proceeding')
|
||||
await supaReady
|
||||
} catch (e) {
|
||||
console.warn('supaReady failed', e)
|
||||
}
|
||||
|
||||
// Ensure profile is loaded so getCurrentUserId returns ak_users.id when available
|
||||
try {
|
||||
await getCurrentUser()
|
||||
} catch (e) {
|
||||
console.warn('getCurrentUser failed in loadOrderHistory', e)
|
||||
}
|
||||
|
||||
const uid = getCurrentUserId()
|
||||
console.log('loadOrderHistory: currentUserId=', uid)
|
||||
|
||||
// 首先查 ml_delivery_tasks 中分配给当前用户的任务(仅包含已接/分配的 status >= 2)
|
||||
let dtRes: any = { data: [] }
|
||||
// 首先尝试解析出 ml_delivery_drivers 的 id(driver_id),避免直接使用 auth user id 导致不匹配
|
||||
let driverId: string | null = null
|
||||
try {
|
||||
let queryUid = uid
|
||||
// 如果 uid 为空,尝试从 supa session 获取 auth id 并映射到 ak_users.id
|
||||
if (!queryUid || queryUid === '') {
|
||||
try {
|
||||
const sess = supa.getSession && supa.getSession()
|
||||
const sessId = sess && sess.user && sess.user.getString && sess.user.getString('id')
|
||||
console.log('loadOrderHistory: session id fallback=', sessId)
|
||||
if (sessId) {
|
||||
const akRes = await supa.from('ak_users').select('id').eq('auth_id', sessId).limit(1).execute()
|
||||
if (akRes && Array.isArray(akRes.data) && akRes.data.length > 0) {
|
||||
queryUid = (akRes.data[0] as any).id
|
||||
console.log('loadOrderHistory: mapped ak_users.id=', queryUid)
|
||||
if (uid && uid !== '') {
|
||||
// 尝试直接按 user_id 查找 driver
|
||||
const drvRes: any = await supa.from('ml_delivery_drivers').select('id').eq('user_id', uid).limit(1).execute()
|
||||
if (drvRes && Array.isArray(drvRes.data) && drvRes.data.length > 0) {
|
||||
driverId = drvRes.data[0].id
|
||||
} else {
|
||||
// 回退:尝试 ak_users 表根据 auth_id 查出 ak_users.id,再查 ml_delivery_drivers
|
||||
const akRes: any = await supa.from('ak_users').select('id').eq('auth_id', uid).limit(1).execute()
|
||||
if (akRes && Array.isArray(akRes.data) && akRes.data.length > 0) {
|
||||
const akId = akRes.data[0].id
|
||||
const drvRes2: any = await supa.from('ml_delivery_drivers').select('id').eq('user_id', akId).limit(1).execute()
|
||||
if (drvRes2 && Array.isArray(drvRes2.data) && drvRes2.data.length > 0) {
|
||||
driverId = drvRes2.data[0].id
|
||||
}
|
||||
}
|
||||
} catch (mapErr) {
|
||||
console.warn('loadOrderHistory: ak_users mapping failed', mapErr)
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('loadOrderHistory: driver lookup failed', err)
|
||||
}
|
||||
|
||||
if (queryUid && queryUid !== '') {
|
||||
dtRes = await supa.from('ml_delivery_tasks')
|
||||
.select('order_id,status')
|
||||
.eq('driver_id', queryUid)
|
||||
// 直接以 ml_delivery_tasks 作为数据源(配送端真源)
|
||||
let tasksRes: any = { data: [] }
|
||||
try {
|
||||
if (driverId) {
|
||||
tasksRes = await supa.from('ml_delivery_tasks')
|
||||
.select('*')
|
||||
.eq('driver_id', driverId)
|
||||
.gte('status', 2)
|
||||
.order('created_at', { ascending: false })
|
||||
.limit(200)
|
||||
.execute()
|
||||
} else {
|
||||
dtRes = { data: [] }
|
||||
tasksRes = { data: [] }
|
||||
}
|
||||
console.log('loadOrderHistory: delivery_tasks dtRes=', dtRes)
|
||||
} catch (err) {
|
||||
console.error('loadOrderHistory: delivery_tasks query failed', err)
|
||||
dtRes = { data: [] }
|
||||
console.error('loadOrderHistory: ml_delivery_tasks query failed', err)
|
||||
tasksRes = { data: [] }
|
||||
}
|
||||
|
||||
const orderIds = (dtRes && Array.isArray(dtRes.data)) ? dtRes.data.map((r: any) => r.order_id) : []
|
||||
console.log('loadOrderHistory: tasksRes=', tasksRes)
|
||||
|
||||
// 如果没有通过 delivery_tasks 找到订单,改为直接读取最近完成/已取货订单(兼容测试环境)
|
||||
let ordersRes
|
||||
// 如果任务包含 order_id,则从 ml_orders 查询 order_no 用于显示
|
||||
const orderIdsFromTasks = (tasksRes && Array.isArray(tasksRes.data)) ? tasksRes.data.map((r: any) => r.order_id).filter(Boolean) : []
|
||||
let ordersRes: any = { data: [] }
|
||||
try {
|
||||
if (orderIds.length > 0) {
|
||||
ordersRes = await supa.from('ml_orders').select('*').in('id', orderIds).order('created_at', { ascending: false }).limit(200).execute()
|
||||
} else {
|
||||
ordersRes = await supa.from('ml_orders').select('*').in('order_status', [4,5]).order('created_at', { ascending: false }).limit(200).execute()
|
||||
if (orderIdsFromTasks.length > 0) {
|
||||
ordersRes = await supa.from('ml_orders').select('id,order_no').in('id', orderIdsFromTasks).execute()
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('loadOrderHistory: ml_orders query failed', err)
|
||||
console.warn('loadOrderHistory: ml_orders lookup failed', err)
|
||||
ordersRes = { data: [] }
|
||||
}
|
||||
|
||||
console.log('loadOrderHistory: ordersRes=', ordersRes)
|
||||
|
||||
const mapOrder = (r: any) => ({
|
||||
id: r.id,
|
||||
order_no: r.order_no || String(r.cid || ''),
|
||||
status: r.order_status ?? r.status ?? 0,
|
||||
pickup_address: r.pickup_address || r.shipping_address || { detail: '', area: '' },
|
||||
delivery_address: r.delivery_address || r.shipping_address || { detail: '', area: '' },
|
||||
pickup_contact: r.pickup_contact || r.shipping_contact || { name: '', phone: '' },
|
||||
delivery_contact: r.delivery_contact || r.shipping_contact || { name: '', phone: '' },
|
||||
delivery_fee: r.delivery_fee || r.delivery_fees || 0,
|
||||
distance: r.distance || 0,
|
||||
estimated_time: r.estimated_time || 0,
|
||||
created_at: r.created_at
|
||||
const orderNoMap: Record<string,string> = {}
|
||||
if (ordersRes && Array.isArray(ordersRes.data)) {
|
||||
ordersRes.data.forEach((o: any) => { if (o && o.id) orderNoMap[o.id] = o.order_no })
|
||||
}
|
||||
|
||||
const parseAddress = (a: any) => {
|
||||
if (!a) return { detail: '', area: '' }
|
||||
let obj = a
|
||||
if (typeof a === 'string') {
|
||||
try { obj = JSON.parse(a) } catch (e) { obj = { detail: a } }
|
||||
}
|
||||
const detail = obj.detail || obj.address || obj.full_address || obj.address_detail || obj.name || ''
|
||||
const area = (obj.city || obj.district || obj.area || '')
|
||||
return { detail, area }
|
||||
}
|
||||
|
||||
const parseContact = (c: any) => {
|
||||
if (!c) return { name: '', phone: '' }
|
||||
let obj = c
|
||||
if (typeof c === 'string') {
|
||||
try { obj = JSON.parse(c) } catch (e) { obj = { name: c } }
|
||||
}
|
||||
return { name: obj.name || obj.contact_name || obj.receiver_name || '', phone: obj.phone || obj.mobile || obj.contact_phone || '' }
|
||||
}
|
||||
|
||||
const mapTaskToOrder = (t: any) => ({
|
||||
id: t.id,
|
||||
// 优先使用任务自身的 order_no 字段(若存在),否则使用从 ml_orders 查询到的 order_no
|
||||
order_no: t.order_no || t.orderNo || t.trade_no || orderNoMap[t.order_id] || '',
|
||||
status: Number(t.status) || 0,
|
||||
pickup_address: parseAddress(t.pickup_address),
|
||||
delivery_address: parseAddress(t.delivery_address),
|
||||
pickup_contact: parseContact(t.pickup_contact),
|
||||
delivery_contact: parseContact(t.delivery_contact),
|
||||
delivery_fee: Number(t.delivery_fee) || 0,
|
||||
distance: Number(t.distance) || 0,
|
||||
estimated_time: Number(t.estimated_time) || 0,
|
||||
created_at: t.created_at,
|
||||
order_id: t.order_id || ''
|
||||
})
|
||||
|
||||
this.orderList = (ordersRes && ordersRes.data) ? ordersRes.data.map(mapOrder) : []
|
||||
|
||||
// 额外:把当前分配给本司机但尚未完成的任务对应订单也展示在列表顶部(便于查看当前任务)
|
||||
try {
|
||||
if (uid && uid !== '') {
|
||||
// 仅获取已经被接取/分配给本司机的任务(status >= 2),包括进行中和已取货但未完成的
|
||||
const taskRes: any = await supa.from('ml_delivery_tasks')
|
||||
.select('order_id,status')
|
||||
.eq('driver_id', uid)
|
||||
.gte('status', 2)
|
||||
.order('created_at', { ascending: false })
|
||||
.limit(50)
|
||||
.execute()
|
||||
if (taskRes && Array.isArray(taskRes.data) && taskRes.data.length > 0) {
|
||||
const taskOrderIds = taskRes.data.map((t: any) => t.order_id).filter((id: any) => id)
|
||||
if (taskOrderIds.length > 0) {
|
||||
const curOrdersRes: any = await supa.from('ml_orders').select('*').in('id', taskOrderIds).execute()
|
||||
const curMapped = (curOrdersRes && Array.isArray(curOrdersRes.data)) ? curOrdersRes.data.map(mapOrder) : []
|
||||
// 把当前任务对应订单插入到列表最前面(避免重复)
|
||||
curMapped.forEach((o: any) => {
|
||||
if (!this.orderList.some((ex: any) => ex.id === o.id)) {
|
||||
this.orderList.unshift(o)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('loadOrderHistory: fetch current tasks failed', err)
|
||||
}
|
||||
this.orderList = (tasksRes && Array.isArray(tasksRes.data)) ? tasksRes.data.map(mapTaskToOrder) : []
|
||||
|
||||
// 检查是否有新完成的订单(在加载初始数据后)
|
||||
this.checkForNewCompletedOrder()
|
||||
@@ -253,9 +249,11 @@ export default {
|
||||
},
|
||||
|
||||
// 查看订单详情
|
||||
viewOrderDetail(orderId: string, status: number) {
|
||||
viewOrderDetail(order: any) {
|
||||
// 优先传递 ml_orders.id,但如果订单表对应行确实缺失,详情页逻辑现在支持用 Task ID 回退显示
|
||||
const targetId = order.order_id || order.id
|
||||
uni.navigateTo({
|
||||
url: `/pages/mall/delivery/order-detail?id=${orderId}&status=${status}`
|
||||
url: `/pages/mall/delivery/order-detail?id=${targetId}&status=${order.status}`
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user