fix(pl): 隔离合同范围弹窗重开后的加载与搜索请求以阻止旧数据保存。
This commit is contained in:
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('合同及产品关联已保存')
|
||||
|
||||
Reference in new issue
Block a user