修改页面逻辑

This commit is contained in:
not-like-juvenile
2026-02-03 12:01:10 +08:00
parent 8efe6d5e89
commit c803a77c8f
12 changed files with 904 additions and 181 deletions

View File

@@ -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 的 iddriver_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}`
})
},