From 43611ecc5501b528c933084460a63ba905467ec9 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sun, 11 Oct 2026 19:33:25 +0800 Subject: [PATCH] fix: avoid duplicate inquiry fetch on capacity refresh --- .../pages/CapacityOfferDetailView.vue | 3 +-- .../pages/CapacityOffersBehavior.test.ts | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue b/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue index 24f21641..c803d2fb 100644 --- a/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue +++ b/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue @@ -52,12 +52,11 @@ async function load() { try { const value = await getCapacityOffer(String(route.params.offerNo)) let checked: CapacityInquiry | null = null - if (editing.value && editorOpen.value) checked = value.inquiries.records.find(row => row.bookingNo === editing.value?.bookingNo) || await getCapacityInquiry(editing.value.bookingNo) if (typeof route.query?.inquiry === 'string' && /^[A-Z][A-Z0-9-]{1,63}$/.test(route.query.inquiry)) { const returned = await getCapacityInquiry(route.query.inquiry) if (returned.offerNo !== value.offer.offerNo) throw new Error('登记不属于当前发布') if (current === sequence) { checked = returned; readonly.value = true; confirmMode.value = false; editorOpen.value = true } - } + } else if (editing.value && editorOpen.value) checked = value.inquiries.records.find(row => row.bookingNo === editing.value?.bookingNo) || await getCapacityInquiry(editing.value.bookingNo) if (current === sequence) { resetting = true; detail.value = value; if (checked) editing.value = checked; page.value = value.inquiries.page; size.value = value.inquiries.size; queueMicrotask(() => { resetting = false }) } } catch (cause) { if (current === sequence) { detail.value = null; error.value = getApiErrorDetails(cause, '发布详情读取失败') } } diff --git a/src/modules/overseas-master-data/pages/CapacityOffersBehavior.test.ts b/src/modules/overseas-master-data/pages/CapacityOffersBehavior.test.ts index a74728ac..c37a83b8 100644 --- a/src/modules/overseas-master-data/pages/CapacityOffersBehavior.test.ts +++ b/src/modules/overseas-master-data/pages/CapacityOffersBehavior.test.ts @@ -318,3 +318,29 @@ it('opens refreshed server guidance after fulfillment succeeds without replaying expect(editor.props('inquiry').progress.message).toBe('服务端下一待办') expect(api.commandCapacityInquiry).not.toHaveBeenCalled() }) +it('fetches an off-page returned inquiry once per refresh and retries without falling back to stale data', async () => { + state.route.query = { inquiry: inquiry.bookingNo } + vi.mocked(api.getCapacityOffer).mockResolvedValue({ offer, inquiries: pageOf([], 30) }) + vi.mocked(api.getCapacityInquiry).mockResolvedValue(inquiry) + const { wrapper } = mount(CapacityOfferDetailView); await flushPromises() + const editor = wrapper.findComponent({ name: 'CapacityInquiryDialog' }) + expect(editor.props('modelValue')).toBe(true) + vi.mocked(api.getCapacityOffer).mockClear(); vi.mocked(api.getCapacityInquiry).mockClear() + vi.mocked(api.getCapacityInquiry).mockResolvedValue({ ...inquiry, recordVersion: 7 }) + await button(wrapper, '重新核对').trigger('click'); await flushPromises() + expect(api.getCapacityOffer).toHaveBeenCalledOnce() + expect(api.getCapacityInquiry).toHaveBeenCalledExactlyOnceWith(inquiry.bookingNo) + expect(editor.props('inquiry').recordVersion).toBe(7) + vi.mocked(api.getCapacityInquiry).mockRejectedValueOnce(new Error('读取失败')) + await button(wrapper, '重新核对').trigger('click'); await flushPromises() + const error = wrapper.findComponent({ name: 'LoadErrorState' }) + expect(error.exists()).toBe(true) + vi.mocked(api.getCapacityOffer).mockClear(); vi.mocked(api.getCapacityInquiry).mockClear() + vi.mocked(api.getCapacityInquiry).mockResolvedValue({ ...inquiry, recordVersion: 8 }) + error.vm.$emit('retry'); await flushPromises() + expect(api.getCapacityOffer).toHaveBeenCalledOnce() + expect(api.getCapacityInquiry).toHaveBeenCalledExactlyOnceWith(inquiry.bookingNo) + expect(editor.props('inquiry').recordVersion).toBe(8) + expect(api.listCapacityInquiries).not.toHaveBeenCalled() + expect(api.commandCapacityInquiry).not.toHaveBeenCalled() +})