From 8d8df2ab8106085b0c0fd189ac489039ff0fc75f Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 8 Sep 2026 11:45:30 +0800 Subject: [PATCH] fix(overseas): keep receiving warehouse action visible --- .../pages/LastMileOrdersView.behavior.test.ts | 25 ++++++++++++++++--- .../pages/LastMileOrdersView.vue | 16 ++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts b/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts index 167d8011..a5d3f021 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts +++ b/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts @@ -23,7 +23,8 @@ import { } from '../api/lastMileOrders' import LastMileOrdersView from './LastMileOrdersView.vue' -vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) })) +const canAccess = vi.hoisted(() => vi.fn<(permissionCode: string) => boolean>(() => true)) +vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: canAccess }) })) vi.mock('vue-router', () => ({ useRouter: () => ({ push: vi.fn() }) })) vi.mock('@/modules/warehouses', () => ({ listAllPlatformWarehouses: vi.fn() })) vi.mock('../api/lastMileOrders', () => ({ @@ -122,6 +123,7 @@ async function chooseContainer(wrapper: Awaited>) { describe('LastMileOrdersView pending order and container conversion', () => { beforeEach(() => { + canAccess.mockReset().mockReturnValue(true) vi.stubGlobal('ResizeObserver', ResizeObserverStub) vi.stubGlobal('localStorage', memoryStorage()) vi.mocked(listLastMileOrders).mockReset().mockResolvedValue({ records: [], page: 1, size: 10, total: 0, pages: 0 }) @@ -416,7 +418,7 @@ describe('LastMileOrdersView pending order and container conversion', () => { expect(confirm.disabled).toBe(true) }) - it('does not expose a receiving-warehouse edit when the server locks the container', async () => { + it('keeps a disabled receiving-warehouse action discoverable when the server locks the container', async () => { vi.mocked(listContainerPlanProgress).mockResolvedValueOnce({ records: [{ ...summary, canChangeReceivingWarehouse: false, receivingWarehouseLockReason: '海外仓已开始拆柜收货' }], page: 1, size: 10, total: 1, pages: 1, @@ -425,7 +427,24 @@ describe('LastMileOrdersView pending order and container conversion', () => { await wrapper.findAll('.el-radio-button').find((item) => item.text().startsWith('柜子'))!.trigger('click') await flushPromises() expect(wrapper.text()).toContain('海外仓已开始拆柜收货') - expect(button(wrapper, '修改接柜仓')).toBeUndefined() + const changeButton = button(wrapper, '修改接柜仓')! + expect(changeButton.exists()).toBe(true) + expect((changeButton.element as HTMLButtonElement).disabled).toBe(true) + expect(changeButton.attributes('title')).toBe('海外仓已开始拆柜收货') + expect(changeContainerReceivingWarehouse).not.toHaveBeenCalled() + }) + + it('keeps a disabled receiving-warehouse action discoverable without edit permission', async () => { + canAccess.mockImplementation((permissionCode: string) => permissionCode !== 'platform:overseas-warehouse:last-mile-order:edit') + const wrapper = await mountView() + await wrapper.findAll('.el-radio-button').find((item) => item.text().startsWith('柜子'))!.trigger('click') + await flushPromises() + const changeButton = button(wrapper, '修改接柜仓')! + expect(changeButton.exists()).toBe(true) + expect((changeButton.element as HTMLButtonElement).disabled).toBe(true) + expect(changeButton.attributes('title')).toBe('暂无修改接柜仓权限,请联系管理员开通尾程订单编辑权限') + await changeButton.trigger('click') + expect(listAllPlatformWarehouses).not.toHaveBeenCalled() expect(changeContainerReceivingWarehouse).not.toHaveBeenCalled() }) diff --git a/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue b/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue index af70bced..2220027e 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue @@ -154,6 +154,12 @@ function receivingWarehouseLabel(container: ContainerPlanProgressSummaryDto | nu return [code, name].filter(Boolean).join(' · ') || '—' } +function receivingWarehouseChangeDisabledReason(container: ContainerPlanProgressSummaryDto) { + if (!access.can(permission.lastMileOrderTransfer)) return '暂无修改接柜仓权限,请联系管理员开通尾程订单编辑权限' + if (!container.canChangeReceivingWarehouse) return container.receivingWarehouseLockReason || '当前柜已锁定,不能修改接柜仓' + return '' +} + function newReceivingWarehouseIdempotencyKey() { return `container-receiving-warehouse-${Date.now()}-${Math.random().toString(36).slice(2, 10)}` } @@ -340,7 +346,11 @@ async function loadReceivingWarehouseOptions() { } } function openReceivingWarehouseChange(container: ContainerPlanProgressSummaryDto) { - if (!container.canChangeReceivingWarehouse) return + const disabledReason = receivingWarehouseChangeDisabledReason(container) + if (disabledReason) { + ElMessage.warning(disabledReason) + return + } receivingWarehouseTarget.value = container Object.assign(receivingWarehouseForm, { warehouseId: '', remark: '' }) receivingWarehouseIdempotencyKey = newReceivingWarehouseIdempotencyKey() @@ -615,7 +625,9 @@ onMounted(() => { void load() }) 查看详情 - 修改接柜仓 + + 修改接柜仓 + 生成入库计划