优化
This commit is contained in:
@@ -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' })
|
||||
|
||||
Reference in New Issue
Block a user