This commit is contained in:
2026-08-18 09:09:34 +08:00
parent dcbca0bf85
commit 8046f9b9ee
27 changed files with 230 additions and 83 deletions
@@ -200,8 +200,7 @@ async function submitManualEntry() {
await loadMeasurement()
emit('updated')
} catch (error) {
const details = setOperationError(error, '手动箱规录入失败,请检查后重试')
ElMessage.error(details.message)
setOperationError(error, '手动箱规录入失败,请检查后重试')
} finally {
manualEntrySubmitting.value = false
}
@@ -311,14 +310,26 @@ function validateDraft() {
})
if (general.length) errors.general = general
validationErrors.value = errors
const messages = Object.values(errors).flat()
if (messages.length) {
ElMessage.warning({
message: messages.length === 1 ? messages[0] : `${messages[0]}(另有 ${messages.length - 1} 项)`,
showClose: true,
duration: 4500,
})
}
return Object.keys(errors).length === 0
}
function setOperationError(error: unknown, fallback: string) {
const details = getApiErrorDetails(error, fallback)
operationError.value = details
conflictDetected.value = details.message.includes('版本已变化')
const conflict = details.message.includes('版本已变化')
|| details.message.includes('并发修改')
conflictDetected.value = conflict
operationError.value = conflict ? details : null
if (!conflict) {
ElMessage.error({ message: details.message, showClose: true, duration: 4500 })
}
return details
}
@@ -365,8 +376,7 @@ async function saveDraft() {
emit('saved')
emit('changed')
} catch (error) {
const details = setOperationError(error, '测量草稿保存失败,请检查后重试')
if (!conflictDetected.value) ElMessage.error(details.message)
setOperationError(error, '测量草稿保存失败,请检查后重试')
} finally {
saving.value = false
}
@@ -400,8 +410,7 @@ async function submitForReview() {
emit('submitted')
emit('changed')
} catch (error) {
const details = setOperationError(error, '测量数据提交失败,请检查图片和称重结果后重试')
if (!conflictDetected.value) ElMessage.error(details.message)
setOperationError(error, '测量数据提交失败,请检查图片和称重结果后重试')
} finally {
submitting.value = false
}
@@ -505,18 +514,9 @@ defineExpose({ saveDraft, submitForReview, updateActualGrossWeight, mayMaintain,
<ApiErrorMeta v-if="operationError" :details="operationError" />
<el-button size="small" @click="reloadLatest">加载最新版本</el-button>
</el-alert>
<el-alert v-else-if="operationError" type="error" :closable="false" show-icon class="measurement-alert">
<template #title>操作未完成</template>
<p>{{ operationError.message }}</p>
<ApiErrorMeta :details="operationError" />
</el-alert>
<el-alert v-if="Object.keys(validationErrors).length" type="error" :closable="false" show-icon class="measurement-alert">
<template #title>请修正测量草稿中的问题</template>
<ul>
<li v-for="message in Object.values(validationErrors).flat()" :key="message">{{ message }}</li>
</ul>
</el-alert>
<p v-if="Object.keys(validationErrors).length" class="sr-only" role="alert">
{{ Object.values(validationErrors).flat().join(';') }}
</p>
<form class="measurement-form" @submit.prevent="saveDraft">
<fieldset :disabled="!mayMaintain || saving">