From fc32d0b39053fd41edacd8427f867dafb9bfa158 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 3 Oct 2026 12:23:57 +0800 Subject: [PATCH] perf(customs): filter loaded refund orders before pagination --- src/modules/first-leg/api/unifiedOrders.ts | 1 + .../first-leg/utils/customsDocumentsReader.ts | 2 +- .../first-leg/views/CustomsDocumentsView.test.mjs | 14 ++++++++------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/modules/first-leg/api/unifiedOrders.ts b/src/modules/first-leg/api/unifiedOrders.ts index a49ead1..7c83e33 100644 --- a/src/modules/first-leg/api/unifiedOrders.ts +++ b/src/modules/first-leg/api/unifiedOrders.ts @@ -142,6 +142,7 @@ export interface MerchantUnifiedOrderDetail { export interface MerchantUnifiedOrderQuery { taxMode?: ApiTaxMode + loaded?: boolean keyword?: string fbaCode?: string orderNo?: string diff --git a/src/modules/first-leg/utils/customsDocumentsReader.ts b/src/modules/first-leg/utils/customsDocumentsReader.ts index 13bd447..37b65cc 100644 --- a/src/modules/first-leg/utils/customsDocumentsReader.ts +++ b/src/modules/first-leg/utils/customsDocumentsReader.ts @@ -16,7 +16,7 @@ export async function readCustomsDocuments() { let failedCount = 0 const size = 200 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 pages = Number(response.pages) if (!Number.isSafeInteger(total) || total < 0 || Number(response.page) !== page diff --git a/src/modules/first-leg/views/CustomsDocumentsView.test.mjs b/src/modules/first-leg/views/CustomsDocumentsView.test.mjs index b332823..3390943 100644 --- a/src/modules/first-leg/views/CustomsDocumentsView.test.mjs +++ b/src/modules/first-leg/views/CustomsDocumentsView.test.mjs @@ -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'), { '@/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' }] }) function harness(t, orders, getDetail = async id => detail(id)) { const store = { loadError: '', failPage: 0, transformPage: value => value }, calls = [], pageCalls = [] 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(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 || '第二页订单查询失败') // Model server filtering BEFORE pagination and COUNT, using the actual // 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), 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 => { 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'))) const { view, calls, pageCalls } = harness(t, orders) await view.load() assert.deepEqual(calls, Array.from({ length: 5 }, (_, i) => `historical-${i}`)) 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() assert.equal(view.filteredRecords.value.length, 1) 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(calls.length, 205) 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) })