diff --git a/frontend/src/views/Materials.test.js b/frontend/src/views/Materials.test.js index 26e41306..2a76caad 100644 --- a/frontend/src/views/Materials.test.js +++ b/frontend/src/views/Materials.test.js @@ -7,10 +7,12 @@ import { codeRulesApi, materialCategoriesApi, unitsApi } from '../api/masterData const materialsStore = vi.hoisted(() => ({ materials: [], materialOptions: [], + historicalMaterialOptions: [], loading: false, pagination: { currentPage: 1, pageSize: 20, total: 0, totalPages: 0 }, fetchMaterials: vi.fn(), fetchMaterialOptions: vi.fn(), + fetchHistoricalMaterialOptions: vi.fn(), createMaterial: vi.fn(), updateMaterial: vi.fn(), obsoleteMaterial: vi.fn(), @@ -295,3 +297,30 @@ describe('新增物料后列表与搜索框保持一致', () => { wrapper.unmount() }) }) + +describe('物料检索框的候选项', () => { + beforeEach(() => { + materialCategoriesApi.list.mockResolvedValue({ data: categories }) + unitsApi.list.mockResolvedValue({ data: [] }) + materialsStore.fetchHistoricalMaterialOptions.mockReset() + materialsStore.materialOptions = [] + }) + + // 这一页的列表查询走 status='all',本身就显示着作废物料;检索框的候选要是只取有效 + // 物料,作废的那些就搜不出来——而这一页正是恢复它们的入口。列表和检索框必须同源。 + test('能检索到已作废的物料', async () => { + const obsolete = { id: 1, material_code: 'A010201', name: '作废物料', status: 'obsolete' } + materialsStore.historicalMaterialOptions = [obsolete] + + const wrapper = mountMaterials() + await flushPromises() + + expect(materialsStore.fetchHistoricalMaterialOptions).toHaveBeenCalled() + + setupState(wrapper).materialFilter('A010201') + await flushPromises() + + expect(setupState(wrapper).getFilteredMaterials()).toEqual([obsolete]) + wrapper.unmount() + }) +}) diff --git a/frontend/src/views/Materials.vue b/frontend/src/views/Materials.vue index f3e1481d..f2a12e9e 100644 --- a/frontend/src/views/Materials.vue +++ b/frontend/src/views/Materials.vue @@ -217,7 +217,10 @@ const form = reactive(createMaterialForm()) onMounted(async () => { materialsStore.fetchMaterials() - materialsStore.fetchMaterialOptions() + // 用含作废的那份选项:这一页的列表查询走 status='all',本身就显示着作废物料, + // 检索框却只给有效物料的话,作废的那些就搜不出来(而这一页正是恢复它们的入口)。 + // 业务单据页(入库/出库/申请)仍用只有有效物料的 materialOptions。 + materialsStore.fetchHistoricalMaterialOptions() const [categoryResponse, unitResponse] = await Promise.all([materialCategoriesApi.list(), unitsApi.list()]) categories.value = (categoryResponse.data || []).filter(item => item.status === 'active') units.value = (unitResponse.data || []).filter(item => item.status === 'active') @@ -302,7 +305,8 @@ function materialFilter(val) { } function getFilteredMaterials() { - return searchMaterialOptions(materialsStore.materialOptions, materialSearchText.value) + // 同 onMounted 的说明:候选要含作废物料,才对得上面向全量的列表查询。 + return searchMaterialOptions(materialsStore.historicalMaterialOptions, materialSearchText.value) } function handlePageChange(page) {