perf(customs): filter loaded refund orders before pagination

This commit is contained in:
2026-10-03 12:23:57 +08:00
parent 1fe2cada15
commit fc32d0b390
3 changed files with 10 additions and 7 deletions
@@ -142,6 +142,7 @@ export interface MerchantUnifiedOrderDetail {
export interface MerchantUnifiedOrderQuery { export interface MerchantUnifiedOrderQuery {
taxMode?: ApiTaxMode taxMode?: ApiTaxMode
loaded?: boolean
keyword?: string keyword?: string
fbaCode?: string fbaCode?: string
orderNo?: string orderNo?: string
@@ -16,7 +16,7 @@ export async function readCustomsDocuments() {
let failedCount = 0 let failedCount = 0
const size = 200 const size = 200
for (let page = 1; ; page += 1) { for (let page = 1; ; page += 1) {
const response = await getMerchantUnifiedOrders({ page, size, taxMode: 'TAX_REFUND' }) const response = await getMerchantUnifiedOrders({ page, size, taxMode: 'TAX_REFUND', loaded: true })
const total = Number(response.total) const total = Number(response.total)
const pages = Number(response.pages) const pages = Number(response.pages)
if (!Number.isSafeInteger(total) || total < 0 || Number(response.page) !== page if (!Number.isSafeInteger(total) || total < 0 || Number(response.page) !== page
@@ -17,19 +17,20 @@ const eligibility = evaluate(readFileSync(new URL('../utils/customsEligibility.t
const customsApi = evaluate(readFileSync(new URL('../api/customs.ts', import.meta.url), 'utf8'), { const customsApi = evaluate(readFileSync(new URL('../api/customs.ts', import.meta.url), 'utf8'), {
'@/api/http': {}, '@/modules/first-leg/api/firstLeg': {}, '@/api/http': {}, '@/modules/first-leg/api/firstLeg': {},
}) })
const order = (id, status = 'LOADED', taxMode = 'TAX_REFUND') => ({ id, status, taxMode, orderNo: `ORDER-${id}`, businessSummary: { inboundCode: `IN-${id}` } }) const order = (id, status = 'LOADED', taxMode = 'TAX_REFUND') => ({ id, status, taxMode, hasCompletedLoadingPlan: ['LOADED', 'DELIVERED', 'COMPLETED'].includes(status), orderNo: `ORDER-${id}`, businessSummary: { inboundCode: `IN-${id}` } })
const detail = id => ({ status: 'COMPLETED', merchantStatus: 'CUSTOMS_COMPLETED', inbounds: [{ orderId: id, taxMode: 'TAX_REFUND' }] }) const detail = id => ({ status: 'COMPLETED', merchantStatus: 'CUSTOMS_COMPLETED', inbounds: [{ orderId: id, taxMode: 'TAX_REFUND' }] })
function harness(t, orders, getDetail = async id => detail(id)) { function harness(t, orders, getDetail = async id => detail(id)) {
const store = { loadError: '', failPage: 0, transformPage: value => value }, calls = [], pageCalls = [] const store = { loadError: '', failPage: 0, transformPage: value => value }, calls = [], pageCalls = []
const unifiedApi = evaluate(readFileSync(new URL('../api/unifiedOrders.ts', import.meta.url), 'utf8'), { const unifiedApi = evaluate(readFileSync(new URL('../api/unifiedOrders.ts', import.meta.url), 'utf8'), {
'@/api/http': { apiRequest: async ({ method, url, params: { page, size, taxMode } }) => { '@/api/http': { apiRequest: async ({ method, url, params: { page, size, taxMode, loaded } }) => {
assert.equal(method, 'GET') assert.equal(method, 'GET')
assert.equal(url, '/merchant/v1/orders') assert.equal(url, '/merchant/v1/orders')
pageCalls.push({ page, size, taxMode }) pageCalls.push({ page, size, taxMode, loaded })
if (store.loadError || store.failPage === page) throw new Error(store.loadError || '第二页订单查询失败') if (store.loadError || store.failPage === page) throw new Error(store.loadError || '第二页订单查询失败')
// Model server filtering BEFORE pagination and COUNT, using the actual // Model server filtering BEFORE pagination and COUNT, using the actual
// request produced by the production API. Missing taxMode scans all rows. // request produced by the production API. Missing taxMode scans all rows.
const filtered = taxMode ? orders.filter(row => row.taxMode === taxMode) : orders const filtered = orders.filter(row => (!taxMode || row.taxMode === taxMode)
&& (loaded === undefined || row.hasCompletedLoadingPlan === loaded))
return store.transformPage({ page, size, total: filtered.length, pages: Math.ceil(filtered.length / size), return store.transformPage({ page, size, total: filtered.length, pages: Math.ceil(filtered.length / size),
records: filtered.slice((page - 1) * size, page * size).map(row => ({ orderId: row.id, orderNo: row.orderNo, mainStatus: row.status, taxMode: row.taxMode, inboundCode: row.businessSummary.inboundCode })) }) records: filtered.slice((page - 1) * size, page * size).map(row => ({ orderId: row.id, orderNo: row.orderNo, mainStatus: row.status, taxMode: row.taxMode, inboundCode: row.businessSummary.inboundCode })) })
} }, } },
@@ -52,12 +53,13 @@ function harness(t, orders, getDetail = async id => detail(id)) {
test('server-filtered request reaches five refund records originally on page 28 without scanning buy orders', async t => { test('server-filtered request reaches five refund records originally on page 28 without scanning buy orders', async t => {
const orders = Array.from({ length: 5528 }, (_, i) => order(`buy-${i}`, 'COMPLETED', 'BUY_DECLARATION')) const orders = Array.from({ length: 5528 }, (_, i) => order(`buy-${i}`, 'COMPLETED', 'BUY_DECLARATION'))
orders.push(...Array.from({ length: 2613 }, (_, i) => order(`not-loaded-${i}`, 'WAIT_MEASURE')))
orders.push(...Array.from({ length: 5 }, (_, i) => order(`historical-${i}`, 'COMPLETED'))) orders.push(...Array.from({ length: 5 }, (_, i) => order(`historical-${i}`, 'COMPLETED')))
const { view, calls, pageCalls } = harness(t, orders) const { view, calls, pageCalls } = harness(t, orders)
await view.load() await view.load()
assert.deepEqual(calls, Array.from({ length: 5 }, (_, i) => `historical-${i}`)) assert.deepEqual(calls, Array.from({ length: 5 }, (_, i) => `historical-${i}`))
assert.equal(view.records.value.length, 5) assert.equal(view.records.value.length, 5)
assert.deepEqual(pageCalls, [{ page: 1, size: 200, taxMode: 'TAX_REFUND' }]) assert.deepEqual(pageCalls, [{ page: 1, size: 200, taxMode: 'TAX_REFUND', loaded: true }])
view.queryModel.value.inboundCode = 'historical-4'; view.search() view.queryModel.value.inboundCode = 'historical-4'; view.search()
assert.equal(view.filteredRecords.value.length, 1) assert.equal(view.filteredRecords.value.length, 1)
view.queryModel.value = { orderNo: '', inboundCode: '', containerNo: '', status: '' }; view.search() view.queryModel.value = { orderNo: '', inboundCode: '', containerNo: '', status: '' }; view.search()
@@ -166,7 +168,7 @@ test('document fetch concurrency never exceeds four and each candidate is reques
assert.equal(new Set(calls).size, 205) assert.equal(new Set(calls).size, 205)
assert.equal(calls.length, 205) assert.equal(calls.length, 205)
assert.equal(pageCalls.length, 2) assert.equal(pageCalls.length, 2)
assert.deepEqual(pageCalls, [{ page: 1, size: 200, taxMode: 'TAX_REFUND' }, { page: 2, size: 200, taxMode: 'TAX_REFUND' }]) assert.deepEqual(pageCalls, [{ page: 1, size: 200, taxMode: 'TAX_REFUND', loaded: true }, { page: 2, size: 200, taxMode: 'TAX_REFUND', loaded: true }])
assert.equal(view.records.value.length, 205) assert.equal(view.records.value.length, 205)
}) })