fix: 物料页的「撤销」按钮文案改成「撤销作废」

「撤销」在中文 UI 里默认指撤销上一步(Ctrl+Z),看不出在撤销什么;这一页又
没有状态列(文案即状态),用户看到一行数据和绿色「撤销」按钮,无从判断这条
物料被作废了。改成「撤销作废」后,按钮自身就说明了这条物料怎么了。

只改这一处按钮文案。全站其他实体(仓库与库位、主数据、组织、角色、往来单位)
仍用「停用/启用」,那是另一套配对,跟这里的「作废/撤销作废」不冲突。

测试补 1 条,同时锁住两个入口的互斥关系(作废的那行不该再有「作废」,有效的
那行不该有「撤销作废」)。变异验证两处:文案改回「撤销」、以及把作废按钮的
状态条件去掉让两个入口同时出现,断言都变红。
This commit is contained in:
文睿 张 2026-09-22 15:06:08 +08:00
parent 43f680219e
commit b9c0681c47
2 changed files with 40 additions and 2 deletions

View File

@ -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()
})
})

View File

@ -62,7 +62,7 @@
<el-button size="small" @click="showDetail(row)">详情</el-button>
<el-button v-if="authStore.isAdmin" size="small" type="primary" @click="showEditModal(row)">编辑</el-button>
<el-button v-if="authStore.isAdmin && row.status !== 'obsolete'" size="small" type="danger" @click="handleDelete(row.id)">作废</el-button>
<el-button v-if="authStore.isAdmin && row.status === 'obsolete'" size="small" type="success" @click="handleRestore(row.id)">撤销</el-button>
<el-button v-if="authStore.isAdmin && row.status === 'obsolete'" size="small" type="success" @click="handleRestore(row.id)">撤销作废</el-button>
</template>
</el-table-column>
</BaseTable>