fix(overseas): keep receiving warehouse action visible
This commit is contained in:
@@ -23,7 +23,8 @@ import {
|
|||||||
} from '../api/lastMileOrders'
|
} from '../api/lastMileOrders'
|
||||||
import LastMileOrdersView from './LastMileOrdersView.vue'
|
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('vue-router', () => ({ useRouter: () => ({ push: vi.fn() }) }))
|
||||||
vi.mock('@/modules/warehouses', () => ({ listAllPlatformWarehouses: vi.fn() }))
|
vi.mock('@/modules/warehouses', () => ({ listAllPlatformWarehouses: vi.fn() }))
|
||||||
vi.mock('../api/lastMileOrders', () => ({
|
vi.mock('../api/lastMileOrders', () => ({
|
||||||
@@ -122,6 +123,7 @@ async function chooseContainer(wrapper: Awaited<ReturnType<typeof mountView>>) {
|
|||||||
|
|
||||||
describe('LastMileOrdersView pending order and container conversion', () => {
|
describe('LastMileOrdersView pending order and container conversion', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
canAccess.mockReset().mockReturnValue(true)
|
||||||
vi.stubGlobal('ResizeObserver', ResizeObserverStub)
|
vi.stubGlobal('ResizeObserver', ResizeObserverStub)
|
||||||
vi.stubGlobal('localStorage', memoryStorage())
|
vi.stubGlobal('localStorage', memoryStorage())
|
||||||
vi.mocked(listLastMileOrders).mockReset().mockResolvedValue({ records: [], page: 1, size: 10, total: 0, pages: 0 })
|
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)
|
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({
|
vi.mocked(listContainerPlanProgress).mockResolvedValueOnce({
|
||||||
records: [{ ...summary, canChangeReceivingWarehouse: false, receivingWarehouseLockReason: '海外仓已开始拆柜收货' }],
|
records: [{ ...summary, canChangeReceivingWarehouse: false, receivingWarehouseLockReason: '海外仓已开始拆柜收货' }],
|
||||||
page: 1, size: 10, total: 1, pages: 1,
|
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 wrapper.findAll('.el-radio-button').find((item) => item.text().startsWith('柜子'))!.trigger('click')
|
||||||
await flushPromises()
|
await flushPromises()
|
||||||
expect(wrapper.text()).toContain('海外仓已开始拆柜收货')
|
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()
|
expect(changeContainerReceivingWarehouse).not.toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,12 @@ function receivingWarehouseLabel(container: ContainerPlanProgressSummaryDto | nu
|
|||||||
return [code, name].filter(Boolean).join(' · ') || '—'
|
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() {
|
function newReceivingWarehouseIdempotencyKey() {
|
||||||
return `container-receiving-warehouse-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`
|
return `container-receiving-warehouse-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`
|
||||||
}
|
}
|
||||||
@@ -340,7 +346,11 @@ async function loadReceivingWarehouseOptions() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function openReceivingWarehouseChange(container: ContainerPlanProgressSummaryDto) {
|
function openReceivingWarehouseChange(container: ContainerPlanProgressSummaryDto) {
|
||||||
if (!container.canChangeReceivingWarehouse) return
|
const disabledReason = receivingWarehouseChangeDisabledReason(container)
|
||||||
|
if (disabledReason) {
|
||||||
|
ElMessage.warning(disabledReason)
|
||||||
|
return
|
||||||
|
}
|
||||||
receivingWarehouseTarget.value = container
|
receivingWarehouseTarget.value = container
|
||||||
Object.assign(receivingWarehouseForm, { warehouseId: '', remark: '' })
|
Object.assign(receivingWarehouseForm, { warehouseId: '', remark: '' })
|
||||||
receivingWarehouseIdempotencyKey = newReceivingWarehouseIdempotencyKey()
|
receivingWarehouseIdempotencyKey = newReceivingWarehouseIdempotencyKey()
|
||||||
@@ -615,7 +625,9 @@ onMounted(() => { void load() })
|
|||||||
</span>
|
</span>
|
||||||
<span class="container-workbench-card__actions">
|
<span class="container-workbench-card__actions">
|
||||||
<el-button class="container-workbench-card__detail" plain @click="openContainerDetail(container)">查看详情</el-button>
|
<el-button class="container-workbench-card__detail" plain @click="openContainerDetail(container)">查看详情</el-button>
|
||||||
<el-button v-if="access.can(permission.lastMileOrderTransfer) && container.canChangeReceivingWarehouse" plain @click="openReceivingWarehouseChange(container)"><Pencil :size="15" />修改接柜仓</el-button>
|
<el-tooltip :content="receivingWarehouseChangeDisabledReason(container)" :disabled="!receivingWarehouseChangeDisabledReason(container)" placement="top">
|
||||||
|
<span><el-button plain :title="receivingWarehouseChangeDisabledReason(container) || '修改接柜仓'" :disabled="Boolean(receivingWarehouseChangeDisabledReason(container))" @click="openReceivingWarehouseChange(container)"><Pencil :size="15" />修改接柜仓</el-button></span>
|
||||||
|
</el-tooltip>
|
||||||
<el-button v-if="access.can(permission.inboundOrderCreate)" type="primary" :disabled="actionLoading || !canGenerateContainerPlans(container)" @click="openContainerConversionFor(container)">生成入库计划</el-button>
|
<el-button v-if="access.can(permission.inboundOrderCreate)" type="primary" :disabled="actionLoading || !canGenerateContainerPlans(container)" @click="openContainerConversionFor(container)">生成入库计划</el-button>
|
||||||
</span>
|
</span>
|
||||||
</article>
|
</article>
|
||||||
|
|||||||
Reference in New Issue
Block a user