This commit is contained in:
2026-08-07 20:07:37 +08:00
parent 28d0b81c5a
commit 99413ee155
27 changed files with 1065 additions and 595 deletions
@@ -333,4 +333,55 @@ describe('PalletsView', () => {
expect(document.body.textContent).not.toContain('托盘状态')
expect(document.body.textContent).not.toContain('最大承重')
})
it('keeps the latest detail when an older pallet request finishes last', async () => {
const secondPallet = { ...pallet, id: '20002', palletCode: 'TP-002' }
let resolveFirst!: (value: PlatformPalletResource) => void
let resolveSecond!: (value: PlatformPalletResource) => void
vi.mocked(getPlatformPallet).mockImplementation((_warehouseId, palletId) => new Promise((resolve) => {
if (String(palletId) === String(pallet.id)) resolveFirst = resolve
else resolveSecond = resolve
}))
const wrapper = await mountView()
const vm = wrapper.vm as unknown as {
detailOpen: boolean
detail: PlatformPalletResource | null
openDetail(row: PlatformPalletResource): Promise<void>
}
void vm.openDetail(pallet)
vm.detailOpen = false
await wrapper.vm.$nextTick()
void vm.openDetail(secondPallet)
resolveSecond(secondPallet)
await flushPromises()
resolveFirst(pallet)
await flushPromises()
expect(vm.detail?.palletCode).toBe('TP-002')
})
it('keeps the latest pallet selected for editing', async () => {
const secondPallet = { ...pallet, id: '20002', palletCode: 'TP-002', color: '蓝色' }
let resolveFirst!: (value: PlatformPalletResource) => void
let resolveSecond!: (value: PlatformPalletResource) => void
vi.mocked(getPlatformPallet).mockImplementation((_warehouseId, palletId) => new Promise((resolve) => {
if (String(palletId) === String(pallet.id)) resolveFirst = resolve
else resolveSecond = resolve
}))
const wrapper = await mountView()
const vm = wrapper.vm as unknown as {
form: { palletCode: string; color: string }
openEdit(row: PlatformPalletResource): Promise<void>
}
void vm.openEdit(pallet)
void vm.openEdit(secondPallet)
resolveSecond(secondPallet)
await flushPromises()
resolveFirst(pallet)
await flushPromises()
expect(vm.form).toMatchObject({ palletCode: 'TP-002', color: '蓝色' })
})
})
@@ -38,6 +38,8 @@ const deletingIds = ref(new Set<string>())
const formRef = ref<FormInstance>()
let warehouseSequence = 0
let palletSequence = 0
let detailSequence = 0
let editorSequence = 0
type PalletFilters = QueryModel & { warehouseId: string; palletCode: string; palletType: string }
type AppliedPalletFilters = Pick<PalletFilters, 'warehouseId' | 'palletCode' | 'palletType'>
@@ -226,6 +228,7 @@ function resetFilters() {
}
function openCreate() {
editorSequence += 1
Object.assign(form, emptyForm())
form.warehouseId = isActiveDomesticWarehouse(filters.value.warehouseId) ? filters.value.warehouseId : ''
editorOpen.value = true
@@ -254,16 +257,20 @@ async function fetchDetail(row: PlatformPalletResource) {
}
async function openDetail(row: PlatformPalletResource) {
const sequence = ++detailSequence
detailLoading.value = true
detailOpen.value = true
detail.value = null
try {
detail.value = await fetchDetail(row)
const result = await fetchDetail(row)
if (sequence !== detailSequence || !detailOpen.value) return
detail.value = result
} catch (error) {
if (sequence !== detailSequence) return
detailOpen.value = false
ElMessage.error(errorMessage(getApiErrorDetails(error, '托盘详情加载失败,请稍后重试')))
} finally {
detailLoading.value = false
if (sequence === detailSequence) detailLoading.value = false
}
}
@@ -272,9 +279,13 @@ async function openEdit(row: PlatformPalletResource) {
ElMessage.warning('仅支持编辑国内仓托盘')
return
}
const sequence = ++editorSequence
try {
assignForm(await fetchDetail(row))
const result = await fetchDetail(row)
if (sequence !== editorSequence) return
assignForm(result)
} catch (error) {
if (sequence !== editorSequence) return
ElMessage.error(errorMessage(getApiErrorDetails(error, '托盘详情加载失败,请稍后重试')))
}
}
@@ -341,6 +352,12 @@ watch([page, pageSize], ([nextPage, nextSize], [previousPage, previousSize]) =>
if (nextPage === previousPage && nextSize === previousSize) return
void loadPallets()
})
watch(detailOpen, (open) => {
if (open) return
detailSequence += 1
detailLoading.value = false
detail.value = null
})
watch(() => access.can(editorPermission.value), (canWrite) => {
if (!canWrite && editorOpen.value) editorOpen.value = false
}, { flush: 'sync' })