From b9c0681c47bb458cc2789c84e7c9e8c882986c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E7=9D=BF=20=E5=BC=A0?= Date: Tue, 22 Sep 2026 15:06:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=89=A9=E6=96=99=E9=A1=B5=E7=9A=84?= =?UTF-8?q?=E3=80=8C=E6=92=A4=E9=94=80=E3=80=8D=E6=8C=89=E9=92=AE=E6=96=87?= =?UTF-8?q?=E6=A1=88=E6=94=B9=E6=88=90=E3=80=8C=E6=92=A4=E9=94=80=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「撤销」在中文 UI 里默认指撤销上一步(Ctrl+Z),看不出在撤销什么;这一页又 没有状态列(文案即状态),用户看到一行数据和绿色「撤销」按钮,无从判断这条 物料被作废了。改成「撤销作废」后,按钮自身就说明了这条物料怎么了。 只改这一处按钮文案。全站其他实体(仓库与库位、主数据、组织、角色、往来单位) 仍用「停用/启用」,那是另一套配对,跟这里的「作废/撤销作废」不冲突。 测试补 1 条,同时锁住两个入口的互斥关系(作废的那行不该再有「作废」,有效的 那行不该有「撤销作废」)。变异验证两处:文案改回「撤销」、以及把作废按钮的 状态条件去掉让两个入口同时出现,断言都变红。 --- frontend/src/views/Materials.test.js | 40 +++++++++++++++++++++++++++- frontend/src/views/Materials.vue | 2 +- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/Materials.test.js b/frontend/src/views/Materials.test.js index 2a76caad..3411c495 100644 --- a/frontend/src/views/Materials.test.js +++ b/frontend/src/views/Materials.test.js @@ -1,6 +1,6 @@ import { flushPromises, mount } from '@vue/test-utils' import ElementPlus, { ElMessage, ElMessageBox } from 'element-plus' -import { beforeEach, describe, expect, test, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import Materials from './Materials.vue' import { codeRulesApi, materialCategoriesApi, unitsApi } from '../api/masterData' @@ -324,3 +324,41 @@ describe('物料检索框的候选项', () => { wrapper.unmount() }) }) + +describe('物料列表的作废入口文案', () => { + beforeEach(() => { + materialCategoriesApi.list.mockResolvedValue({ data: categories }) + unitsApi.list.mockResolvedValue({ data: [] }) + materialsStore.materials = [ + { id: 1, material_code: 'A010201', name: '作废物料', status: 'obsolete' }, + { id: 2, material_code: 'A010202', name: '有效物料', status: 'active' } + ] + }) + + afterEach(() => { + materialsStore.materials = [] + }) + + // 按钮文案得精确匹配:「撤销作废」里也含「作废」,用 includes 会把两个按钮看成同一个。 + function exactButton(wrapper, text) { + return wrapper.findAll('button').find(button => button.text().trim() === text) + } + + // 这一页没有状态列(文案即状态),所以按钮文案本身得说清这条物料怎么了。 + // 「撤销」在中文 UI 里默认指撤销上一步(Ctrl+Z),看不出在撤销什么;「撤销作废」 + // 才读得出「这条被作废了,点这里撤销那次作废」。 + test('作废的那行显示「撤销作废」,有效的那行显示「作废」', async () => { + const wrapper = mountMaterials() + await flushPromises() + + const restore = exactButton(wrapper, '撤销作废') + const obsolete = exactButton(wrapper, '作废') + + expect(restore).toBeTruthy() + expect(obsolete).toBeTruthy() + // 两个入口互斥:作废的那行不该再有「作废」,有效的那行不该有「撤销作废」。 + expect(restore.element.closest('tr').textContent).toContain('作废物料') + expect(obsolete.element.closest('tr').textContent).toContain('有效物料') + wrapper.unmount() + }) +}) diff --git a/frontend/src/views/Materials.vue b/frontend/src/views/Materials.vue index f2a12e9e..f1743286 100644 --- a/frontend/src/views/Materials.vue +++ b/frontend/src/views/Materials.vue @@ -62,7 +62,7 @@ 详情 编辑 作废 - 撤销 + 撤销作废