fix(client): preserve order category counts while refreshing
This commit is contained in:
@@ -454,7 +454,7 @@ export const useFirstLegOrdersStore = defineStore('client-first-leg-orders', ()
|
|||||||
loadError.value = ''
|
loadError.value = ''
|
||||||
orders.value = []
|
orders.value = []
|
||||||
total.value = 0
|
total.value = 0
|
||||||
queueCounts.value = { all: 0, fee: 0, customs: 0, draft: 0, loaded: 0, declared: 0, cleared: 0, scheduled: 0, delivering: 0, delivered: 0 }
|
// Keep the last confirmed category counts while refreshing; replace them only after validation.
|
||||||
orderProgress.value = {}
|
orderProgress.value = {}
|
||||||
const [orderResult, warehouseResult] = await Promise.allSettled([
|
const [orderResult, warehouseResult] = await Promise.allSettled([
|
||||||
getMerchantOrderWorkbench(query), loadWarehouseType('DOMESTIC'),
|
getMerchantOrderWorkbench(query), loadWarehouseType('DOMESTIC'),
|
||||||
@@ -487,6 +487,9 @@ export const useFirstLegOrdersStore = defineStore('client-first-leg-orders', ()
|
|||||||
}
|
}
|
||||||
} catch { loadError.value = '订单分页数据不完整,请重新加载' }
|
} catch { loadError.value = '订单分页数据不完整,请重新加载' }
|
||||||
} else loadError.value = orderResult.reason instanceof Error ? orderResult.reason.message : '订单数据加载失败'
|
} else loadError.value = orderResult.reason instanceof Error ? orderResult.reason.message : '订单数据加载失败'
|
||||||
|
if (loadError.value) {
|
||||||
|
queueCounts.value = { all: 0, fee: 0, customs: 0, draft: 0, loaded: 0, declared: 0, cleared: 0, scheduled: 0, delivering: 0, delivered: 0 }
|
||||||
|
}
|
||||||
loading.value = false
|
loading.value = false
|
||||||
return orders.value.length
|
return orders.value.length
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,3 +131,40 @@ test('retains server progress and rejects missing or foreign progress without in
|
|||||||
response = result(); delete response.queues.cleared
|
response = result(); delete response.queues.cleared
|
||||||
await h.store.load(); assert.match(h.store.loadError, /分页数据不完整/)
|
await h.store.load(); assert.match(h.store.loadError, /分页数据不完整/)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
test('category counts remain visible throughout refresh and update together after the response is validated', async t => {
|
||||||
|
const pending = deferred()
|
||||||
|
let refreshing = false
|
||||||
|
const h = harness(t, () => refreshing ? pending.promise : result())
|
||||||
|
await h.store.load()
|
||||||
|
const counts = h.store.queueCounts
|
||||||
|
refreshing = true
|
||||||
|
const request = h.store.load({ queue: 'fee' })
|
||||||
|
assert.equal(h.store.loading, true)
|
||||||
|
assert.equal(h.store.queueCounts, counts)
|
||||||
|
assert.equal(h.store.queueCounts.fee, 2)
|
||||||
|
const updated = result(1, 10, 3)
|
||||||
|
updated.queues = { ...updated.queues, all: 216, fee: 3 }
|
||||||
|
pending.resolve(updated)
|
||||||
|
await request
|
||||||
|
assert.equal(h.store.queueCounts.all, 216)
|
||||||
|
assert.equal(h.store.queueCounts.fee, 3)
|
||||||
|
assert.equal(h.store.loading, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('rapid category switches preserve counts and ignore an older response while the newest request is pending', async t => {
|
||||||
|
const older = deferred(), latest = deferred()
|
||||||
|
const h = harness(t, q => q.queue === 'fee' ? older.promise : q.queue === 'customs' ? latest.promise : result())
|
||||||
|
await h.store.load()
|
||||||
|
const oldRequest = h.store.load({ queue: 'fee' })
|
||||||
|
const newRequest = h.store.load({ queue: 'customs' })
|
||||||
|
const oldResult = result(1, 10, 2); oldResult.queues.all = 999
|
||||||
|
older.resolve(oldResult); await oldRequest
|
||||||
|
assert.equal(h.store.queueCounts.all, 215)
|
||||||
|
assert.equal(h.store.loading, true)
|
||||||
|
const newResult = result(1, 10, 1); newResult.queues.all = 216
|
||||||
|
latest.resolve(newResult); await newRequest
|
||||||
|
assert.equal(h.store.queueCounts.all, 216)
|
||||||
|
assert.equal(h.store.total, 1)
|
||||||
|
})
|
||||||
|
|||||||
@@ -507,6 +507,7 @@ const orderQueueCounts = computed(() => store.queueCounts)
|
|||||||
const pagedOrders = computed(() => store.orders)
|
const pagedOrders = computed(() => store.orders)
|
||||||
|
|
||||||
async function selectOrderQueue(queue: OrderQueue) {
|
async function selectOrderQueue(queue: OrderQueue) {
|
||||||
|
if (activeOrderQueue.value === queue && !store.loadError) return
|
||||||
activeOrderQueue.value = queue
|
activeOrderQueue.value = queue
|
||||||
tablePage.value = 1
|
tablePage.value = 1
|
||||||
await loadOrderPage()
|
await loadOrderPage()
|
||||||
|
|||||||
@@ -49,3 +49,13 @@ test('old same-page response cannot clamp a newer query or clear its current sel
|
|||||||
assert.deepEqual(h.selectedOrders.value, ['new-selection'])
|
assert.deepEqual(h.selectedOrders.value, ['new-selection'])
|
||||||
assert.equal(h.orderTableVersion.value, 1)
|
assert.equal(h.orderTableVersion.value, 1)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
test('clicking the current category does not reload or reset its page, but an error can be retried', async () => {
|
||||||
|
const h = harness(); h.tablePage.value = 3
|
||||||
|
await h.selectOrderQueue('all')
|
||||||
|
assert.equal(h.calls.length, 0); assert.equal(h.tablePage.value, 3)
|
||||||
|
h.store.loadError = 'failed'
|
||||||
|
await h.selectOrderQueue('all')
|
||||||
|
assert.equal(h.calls.length, 1); assert.equal(h.tablePage.value, 1)
|
||||||
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user