From f2344063ffd97ecd2c62978b6435cedac97c7632 Mon Sep 17 00:00:00 2001 From: luo Date: Wed, 14 Oct 2026 11:18:29 +0800 Subject: [PATCH] fix: some --- .../asset-package-history.vue | 32 +++++--- tests/package-history.test.mjs | 82 +++++++++++++++++++ 2 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 tests/package-history.test.mjs diff --git a/pages/asset-package-history/asset-package-history.vue b/pages/asset-package-history/asset-package-history.vue index d770c92..054513d 100644 --- a/pages/asset-package-history/asset-package-history.vue +++ b/pages/asset-package-history/asset-package-history.vue @@ -133,13 +133,28 @@ loading.value = true; try { - const data = await assetApi.getPackageHistory( - userStore.state.identifier, - page.value, - pageSize - ); + let visibleItems; + do { + const requestedPage = page.value; + const data = await assetApi.getPackageHistory( + userStore.state.identifier, + requestedPage, + pageSize + ); + const items = Array.isArray(data.items) ? data.items : []; + visibleItems = items.filter(item => Number(item?.status) !== 4); + const responseSize = Number(data.size) > 0 ? Number(data.size) : pageSize; + const responseTotal = data.total === null || data.total === undefined + ? NaN : Number(data.total); + // Pagination describes the backend's unfiltered records, not the + // visible list. Skip fully hidden pages to reach subsequent records. + noMore.value = Number.isFinite(responseTotal) && responseTotal >= 0 + ? requestedPage * responseSize >= responseTotal + : items.length < pageSize; + page.value = requestedPage + 1; + } while (visibleItems.length === 0 && !noMore.value); - const newData = (data.items || []).map(item => ({ + const newData = visibleItems.map(item => ({ ...item, activated_at: item.activated_at ? formatDate(item.activated_at) : '', created_at: formatDate(item.created_at), @@ -152,11 +167,6 @@ packageList.splice(0, packageList.length, ...newData); } - if (newData.length < pageSize) { - noMore.value = true; - } else { - page.value++; - } } catch (e) { console.error('加载套餐历史失败', e); } diff --git a/tests/package-history.test.mjs b/tests/package-history.test.mjs new file mode 100644 index 0000000..4e7d93e --- /dev/null +++ b/tests/package-history.test.mjs @@ -0,0 +1,82 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import vm from 'node:vm'; +import { readFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); +const vue = require('vue'); +const source = readFileSync(new URL('../pages/asset-package-history/asset-package-history.vue', import.meta.url), 'utf8'); +const plain = value => JSON.parse(JSON.stringify(value)); + +async function loadPage(responses) { + const requestedPages = []; + const context = vm.createContext({ console: { error() {} } }); + const exports = { + vue: { ref: vue.ref, reactive: vue.reactive, onMounted() {} }, + '@/api/index.js': { assetApi: { getPackageHistory: async (identifier, page, size) => { + assert.equal(identifier, 'A'); assert.equal(size, 10); + requestedPages.push(page); + return responses[page - 1] || { items: [] }; + } } }, + '@/store/index.js': { useUserStore: () => ({ state: { identifier: 'A' } }) } + }; + const script = source.match(/