fix(client): ignore stale customs dialog responses

This commit is contained in:
2026-10-02 12:21:04 +08:00
parent 605388e666
commit 1e707f613c
2 changed files with 98 additions and 8 deletions
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { computed, nextTick, ref, watch } from 'vue'
import { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Download, FileText, LockKeyhole, Pencil, Trash2, Upload } from '@lucide/vue'
import {
@@ -46,6 +46,8 @@ const replaceInput = ref<HTMLInputElement>()
const mutating = ref(false)
const downloadingKey = ref('')
const clearanceResults = ref<MerchantClearanceResult[]>([])
let detailRequest = 0
onBeforeUnmount(() => { detailRequest += 1 })
const taxRefundInbounds = computed(() => detail.value?.inbounds.filter((item) => item.taxMode === 'TAX_REFUND') ?? [])
const locked = computed(() => Boolean(detail.value?.startedAt) || detail.value?.status === 'DECLARING' || detail.value?.status === 'COMPLETED')
@@ -67,29 +69,46 @@ function initializeSelection(value: MerchantCustomsContainer) {
}
async function loadDetail() {
if (!props.orderId) return
if (!props.modelValue || !props.orderId) return
const request = ++detailRequest
const orderId = props.orderId
const isCurrent = () => request === detailRequest && props.modelValue && props.orderId === orderId
loading.value = true
errorMessage.value = ''
try {
const result = await getMerchantCustomsForOrder(props.orderId)
const result = await getMerchantCustomsForOrder(orderId)
if (!isCurrent()) return
detail.value = result
initializeSelection(result)
try { clearanceResults.value = await getMerchantClearanceResults(props.orderId) } catch { clearanceResults.value = [] }
let results: MerchantClearanceResult[] = []
try { results = await getMerchantClearanceResults(orderId) } catch { /* Detail remains available for a failed result query. */ }
if (!isCurrent()) return
clearanceResults.value = results
emit('updated', result)
} catch (error) {
if (!isCurrent()) return
detail.value = null
errorMessage.value = merchantCustomsErrorMessage(error, '退税报关资料加载失败')
} finally {
loading.value = false
if (isCurrent()) loading.value = false
}
}
watch(() => props.modelValue, (open) => {
watch(() => [props.modelValue, props.orderId] as const, ([open]) => {
detailRequest += 1
detail.value = null
clearanceResults.value = []
selectedInboundIds.value = []
editingDocument.value = null
replacingDocument.value = null
errorMessage.value = ''
loading.value = false
if (!open) return
detail.value = props.initialDetail ?? null
const initial = props.initialDetail
detail.value = initial?.inbounds.some((item) => item.orderId === props.orderId) ? initial : null
if (detail.value) initializeSelection(detail.value)
void loadDetail()
})
}, { immediate: true })
function close() {
emit('update:modelValue', false)