From a84111880523ab39f6280324e7933ccc91294bd8 Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Wed, 22 Jul 2026 15:48:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=98=B2=E6=AD=A2=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=AF=B7=E6=B1=82=E4=B8=B2=E6=89=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/wms/iostorinv/modules/form.vue | 48 +++++++++++++++++-- .../iostorinv/modules/outbound-form.test.ts | 11 +++++ .../wms/iostorinv/modules/outbound-form.ts | 15 ++++++ 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/form.vue index b28a4926..4eed162d 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/form.vue +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/form.vue @@ -27,6 +27,7 @@ import { filterOutboundBillTypeOptions, mergeOutboundInventory, type OutboundFormDetail, + shouldApplyEditResult, shouldClearDetailsForWarehouseChange, } from './outbound-form'; @@ -36,6 +37,9 @@ const details = ref([]); const currentStorId = ref(); let manualRowSequence = 0; let billTypeRequest: null | ReturnType = null; +let mainModalOpen = false; +let mainOpenToken = 0; +let activeEditId: string | undefined; const isEdit = computed(() => Boolean(formData.value?.iostorinvId)); const getTitle = computed(() => @@ -297,18 +301,25 @@ const [Modal, modalApi] = useVbenModal({ } }, async onOpenChange(open) { + const token = ++mainOpenToken; + mainModalOpen = open; if (!open) { + activeEditId = undefined; formData.value = undefined; details.value = []; currentStorId.value = undefined; return; } + // 新会话不继承上一编辑详情请求留下的锁状态。 + modalApi.unlock(); const data = modalApi.getData(); if (!data?.iostorinvId) { + activeEditId = undefined; formData.value = undefined; details.value = []; currentStorId.value = undefined; await outboundFormApi.resetForm(); + if (!mainModalOpen || mainOpenToken !== token || activeEditId) return; await outboundFormApi.setValues({ billCode: '保存时自动生成', billStatus: '生成', @@ -316,16 +327,41 @@ const [Modal, modalApi] = useVbenModal({ detailCount: 0, totalWeight: '0.000', }); + if (!mainModalOpen || mainOpenToken !== token || activeEditId) return; await loadBillTypeOptions(); return; } + const editId = data.iostorinvId; + activeEditId = editId; + formData.value = data; modalApi.lock(); try { - formData.value = data; - formData.value = await getIostorInv(data.iostorinvId); - await legacyFormApi.setValues(formData.value); + const editResult = await getIostorInv(editId); + if ( + !shouldApplyEditResult( + mainModalOpen, + mainOpenToken, + token, + activeEditId, + editId, + ) + ) { + return; + } + formData.value = editResult; + await legacyFormApi.setValues(editResult); } finally { - modalApi.unlock(); + if ( + shouldApplyEditResult( + mainModalOpen, + mainOpenToken, + token, + activeEditId, + editId, + ) + ) { + modalApi.unlock(); + } } }, }); @@ -358,7 +394,9 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.test.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.test.ts index 9f11026e..fd71feea 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.test.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.test.ts @@ -4,9 +4,20 @@ import { buildOutboundPayload, filterOutboundBillTypeOptions, mergeOutboundInventory, + shouldApplyEditResult, shouldClearDetailsForWarehouseChange, } from './outbound-form'; +describe('shouldApplyEditResult', () => { + it('只允许当前打开会话中同一编辑单据的响应落表', () => { + expect(shouldApplyEditResult(true, 2, 2, 'B', 'B')).toBe(true); + expect(shouldApplyEditResult(true, 2, 1, 'B', 'A')).toBe(false); + expect(shouldApplyEditResult(true, 2, 2, 'B', 'A')).toBe(false); + expect(shouldApplyEditResult(true, 2, 1, undefined, 'A')).toBe(false); + expect(shouldApplyEditResult(false, 2, 2, 'B', 'B')).toBe(false); + }); +}); + describe('filterOutboundBillTypeOptions', () => { it('从冷缓存接口结果中只提取启用的出库业务类型', () => { expect( diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.ts index 4b95be41..4568d31c 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/outbound-form.ts @@ -7,6 +7,21 @@ export interface OutboundDictItem { value: string; } +export function shouldApplyEditResult( + modalOpen: boolean, + currentToken: number, + requestToken: number, + activeEditId?: string, + requestEditId?: string, +) { + return ( + modalOpen && + currentToken === requestToken && + Boolean(requestEditId) && + activeEditId === requestEditId + ); +} + export interface OutboundFormValues { billType?: string; bizDate?: number | string | { valueOf: () => number };