From 5c4a381d87366d8e6c1254d9ea871aa0d698a23c Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 3 Oct 2026 23:44:35 +0800 Subject: [PATCH] fix(drivers): refresh cached list and summary when returning from details --- .../pages/DriversBehavior.test.ts | 42 +++++++++++++++++++ .../pages/DriversView.vue | 7 +++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/modules/overseas-master-data/pages/DriversBehavior.test.ts b/src/modules/overseas-master-data/pages/DriversBehavior.test.ts index 60127cc6..7e769ab9 100644 --- a/src/modules/overseas-master-data/pages/DriversBehavior.test.ts +++ b/src/modules/overseas-master-data/pages/DriversBehavior.test.ts @@ -1,5 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { flushPromises, shallowMount, type VueWrapper } from '@vue/test-utils' +import { defineComponent, h, KeepAlive, ref } from 'vue' import { ElMessage } from 'element-plus' import { ApiResponseError } from '@/shared/api/http' import * as api from '../api/drivers' @@ -44,6 +45,47 @@ beforeEach(() => { afterEach(() => { wrappers.splice(0).forEach(wrapper => wrapper.unmount()); vi.unstubAllGlobals() }) describe('driver page workflows', () => { + it('refreshes a cached list once on return and retains applied filters and pagination', async () => { + const showingList = ref(true) + const host = defineComponent({ setup: () => () => h(KeepAlive, null, { default: () => showingList.value ? h(DriversView) : h('div', '司机详情') }) }) + const wrapper = shallowMount(host, { global: { stubs: { ...stubs, KeepAlive: false, DriversView: false }, directives: { loading: () => undefined } } }) + wrappers.push(wrapper) + await flushPromises() + expect(api.listDrivers).toHaveBeenCalledTimes(1) + const list = wrapper.findComponent(DriversView) + const toolbar = list.findComponent({ name: 'QueryToolbar' }) + toolbar.vm.$emit('update:modelValue', { keyword: 'DR-TEST', licenseState: 'EXPIRING' }) + toolbar.vm.$emit('search'); await flushPromises() + list.findComponent({ name: 'DataTable' }).vm.$emit('update:page', 2); await flushPromises() + expect(api.listDrivers).toHaveBeenCalledTimes(3) + showingList.value = false; await flushPromises() + const refreshed = { ...structuredClone(driver), recordVersion: 3, reviewStatus: 'APPROVED' as const } + vi.mocked(api.listDrivers).mockResolvedValueOnce({ records: [refreshed], page: 2, size: 20, total: 1, pages: 1, summary: { total: 1, owned: 1, dispatched: 0, expiringSoon: 1, expired: 0 } }) + showingList.value = true; await flushPromises() + expect(api.listDrivers).toHaveBeenCalledTimes(4) + expect(api.listDrivers).toHaveBeenLastCalledWith({ keyword: 'DR-TEST', licenseState: 'EXPIRING', region: undefined, ownership: undefined, active: undefined, reviewStatus: undefined, page: 2, size: 20 }) + expect(wrapper.findComponent({ name: 'DataTable' }).props('data')).toEqual([refreshed]) + expect(wrapper.text()).toContain('司机总数1') + expect(api.getDriver).not.toHaveBeenCalled() + }) + + it('ignores a list response that arrives while its cached page is deactivated', async () => { + let resolveList!: (value: Awaited>) => void + vi.mocked(api.listDrivers).mockReturnValueOnce(new Promise(resolve => { resolveList = resolve })) + const showingList = ref(true) + const host = defineComponent({ setup: () => () => h(KeepAlive, null, { default: () => showingList.value ? h(DriversView) : h('div', '司机详情') }) }) + const wrapper = shallowMount(host, { global: { stubs: { ...stubs, KeepAlive: false, DriversView: false }, directives: { loading: () => undefined } } }) + wrappers.push(wrapper) + await flushPromises() + const list = wrapper.findComponent(DriversView) + showingList.value = false; await flushPromises() + resolveList({ records: [driver], page: 1, size: 20, total: 24, pages: 2, summary: { total: 24, owned: 20, dispatched: 4, expiringSoon: 3, expired: 1 } }); await flushPromises() + expect(list.findComponent({ name: 'DataTable' }).props('data')).toEqual([]) + showingList.value = true; await flushPromises() + expect(api.listDrivers).toHaveBeenCalledTimes(2) + expect(wrapper.findComponent({ name: 'DataTable' }).props('data')).toEqual([driver]) + }) + it('loads one paged request with server summary and does not request each driver or file', async () => { const wrapper = mount(DriversView) await flushPromises() diff --git a/src/modules/overseas-master-data/pages/DriversView.vue b/src/modules/overseas-master-data/pages/DriversView.vue index 385509bd..ba42344c 100644 --- a/src/modules/overseas-master-data/pages/DriversView.vue +++ b/src/modules/overseas-master-data/pages/DriversView.vue @@ -1,6 +1,6 @@