编辑评估:遇乐观锁409时自动拉取最新版本重试一次,仅真并发冲突才提示

This commit is contained in:
freedakgmail
2026-06-14 09:29:37 +08:00
parent a9c41bba57
commit 75033739aa
+31 -6
View File
@@ -28,6 +28,8 @@ import {
getDraft,
saveDraft,
deleteDraftApi,
fetchAssessmentDetail,
ApiError,
type DraftRecord,
type ClassificationResult,
type IndicatorQuestion,
@@ -693,24 +695,47 @@ export function NewAssessment(): JSX.Element {
const fullDescription =
`【项目】${projectName || '未命名'}|【客户】${customerName || '未提供'}\n${description}`;
const result = await runAssessment({
const knownDataArr = Object.entries(answers)
.filter((e): e is [string, number] => typeof e[1] === 'number')
.map(([k, v]): [string, number] => [k, v]);
const runWith = (expected: string | null) => runAssessment({
projectDescription: fullDescription,
confirmation: { businessType, ...(industry !== '' ? { industry } : {}) },
region,
...(effectiveEditId !== null ? { assessmentId: effectiveEditId, useLlm: false } : {}),
...(effectiveEditId !== null && editSavedAt !== null ? { expectedSavedAt: editSavedAt } : {}),
...(effectiveEditId !== null && expected !== null ? { expectedSavedAt: expected } : {}),
...(Number(clientTotalHeadcount) > 0 ? { clientTotalHeadcount: Number(clientTotalHeadcount) } : {}),
...(user?.id !== undefined ? { assessorId: user.id } : {}),
knownData: Object.entries(answers)
.filter((e): e is [string, number] => typeof e[1] === 'number')
.map(([k, v]) => [k, v]),
knownData: knownDataArr,
...(baselineQuote > 0 ? { costInputs: { baselineQuote } } : {}),
profitabilityInputs,
});
let result;
try {
result = await runWith(editSavedAt);
} catch (e) {
// 乐观锁冲突:自动拉取最新版本号后重试一次(单人编辑场景下不应被卡住)。
if (e instanceof ApiError && e.status === 409 && effectiveEditId !== null) {
const latest = await fetchAssessmentDetail(effectiveEditId).catch(() => null);
const freshSavedAt = latest?.savedAt ?? null;
if (freshSavedAt !== null && freshSavedAt !== editSavedAt) {
setEditSavedAt(freshSavedAt);
result = await runWith(freshSavedAt);
} else {
throw e;
}
} else {
throw e;
}
}
try { await deleteDraftApi(draftId); } catch { /* ignore */ }
navigate(`/assessments/${result.assessmentId}`);
} catch (err) {
setError(err instanceof Error ? err.message : '评估运行失败');
const msg = err instanceof ApiError && err.status === 409
? '该评估已被他人同时修改,请返回详情页刷新后重试。'
: err instanceof Error ? err.message : '评估运行失败';
setError(msg);
setRunning(false);
}
}