fix(pl): 隔离合同范围弹窗重开后的加载与搜索请求以阻止旧数据保存。

This commit is contained in:
wuzilong committed 2026-11-01 22:13:28 +08:00
1 parent 726575aaf2
commit bbe0144cdd
2 files changed
+158 -12

No files matched your search

@@ -215,18 +215,33 @@
return `车号:${c?.vehicleNumbersJson?.join('、') || '未填写'};引用:${c?.purchaseRefs?.map((r) => r.referenceNo).join('、') || '未填写'}`
}
let sessionVersion = 0
onBeforeUnmount(() => {
let loadVersion = 0
let searchVersion = 0
function invalidateSession() {
sessionVersion++
loadVersion++
})
searchVersion++
loadedContractId.value = ''
loading.value = false
searching.value = false
}
watch(
visible,
(value) => {
if (!value) invalidateSession()
},
{ flush: 'sync' }
)
onBeforeUnmount(invalidateSession)
async function searchContracts(keyword = '') {
const version = sessionVersion
const session = sessionVersion
const version = ++searchVersion
searching.value = true
try {
const result = await quotaCertApi.contracts(keyword)
if (version === sessionVersion) contracts.value = result
if (session === sessionVersion && version === searchVersion) contracts.value = result
} finally {
searching.value = false
if (session === sessionVersion && version === searchVersion) searching.value = false
}
}
async function loadFixedContract(id: string) {
@@ -239,7 +254,8 @@
}
async function open(id = '') {
if (saving.value) return
const session = ++sessionVersion
invalidateSession()
const session = sessionVersion
visible.value = true
id = props.fixedContractId || id
contractId.value = id
@@ -247,6 +263,8 @@
bindings.value = []
original.value = []
products.value = []
selectedProducts.value = []
contracts.value = []
loading.value = true
try {
const [purchase, transport] = await Promise.all([
@@ -259,11 +277,11 @@
certificates.transport = transport
if (id) await loadContract()
} finally {
loading.value = false
if (session === sessionVersion) loading.value = false
}
}
let loadVersion = 0
async function loadContract() {
const session = sessionVersion
const version = ++loadVersion
const id = contractId.value
loadedContractId.value = ''
@@ -273,7 +291,7 @@
quotaCertApi.products(id),
quotaCertApi.bindings(id)
])
if (version !== loadVersion) return
if (session !== sessionVersion || version !== loadVersion) return
products.value = rows
bindings.value = bindingPayload(scope)
original.value = JSON.parse(JSON.stringify(bindings.value))
@@ -282,7 +300,7 @@
]
loadedContractId.value = id
} finally {
if (version === loadVersion) loading.value = false
if (session === sessionVersion && version === loadVersion) loading.value = false
}
}
function setCertificates(kind: CertType, ids: string[]) {
@@ -321,13 +339,26 @@
)
}
async function save() {
if (!props.canEdit) return
if (
!props.canEdit ||
!visible.value ||
loading.value ||
!contractId.value ||
loadedContractId.value !== contractId.value
)
return
const session = sessionVersion
const targetContract = contractId.value
const version = loadVersion
saving.value = true
try {
const result = await quotaCertApi.saveBindings(targetContract, bindingPayload(bindings.value))
if (targetContract !== contractId.value || version !== loadVersion) return
if (
session !== sessionVersion ||
targetContract !== contractId.value ||
version !== loadVersion
)
return
bindings.value = bindingPayload(result)
original.value = JSON.parse(JSON.stringify(bindings.value))
ElMessage.success('合同及产品关联已保存')