Release/test 合并上生产 #2
@@ -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<ReturnType<typeof mountView>>) {
|
||||
|
||||
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()
|
||||
})
|
||||
|
||||
|
||||
@@ -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() })
|
||||
</span>
|
||||
<span class="container-workbench-card__actions">
|
||||
<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>
|
||||
</span>
|
||||
</article>
|
||||
|
||||
Reference in New Issue
Block a user