fix: preserve confirmed followup snapshots and expand flow checks

This commit is contained in:
2026-10-09 17:46:25 +08:00
parent 9185c6db04
commit e762a367da
7 changed files with 334 additions and 7 deletions
@@ -204,6 +204,8 @@ function stop() {
loading.value = false; uploading.value = false; mutation.value = ''; pollRunning = false
}
function installDetail(fresh: FollowupTaskDetail, preserve: boolean, preserveRoles = preserve) {
// Completed tasks use the server's confirmed snapshot, never an unsaved local draft.
preserve = preserve && fresh.status === 'review'
const keepRoles = preserveRoles && roleDirty.value && fresh.status === 'review'
if (!fresh.audio_available) releaseAudio()
if (retainedTranscriptNotice(fresh) && (!detail.value || detail.value.status !== fresh.status || !detail.value.transcript_available)) {
@@ -227,7 +229,8 @@ async function readDetail(id: number, preserve = false) {
const newlyApplied = detail.value?.status === 'review' && fresh.status === 'applied'
installDetail(fresh, preserve)
if (newlyApplied && !previewOnly.value) emit('applied', props.diagnosisId)
if (preserve) errorMessage.value = '服务端记录或版本已变化;已保留你的字段与日期修改,并取消所有选择。请重新核对当前值后选择采纳。'
if (preserve && fresh.status === 'review') errorMessage.value = '服务端记录或版本已变化;已保留你的字段与日期修改,并取消所有选择。请重新核对当前值后选择采纳。'
else if (preserve && newlyApplied) errorMessage.value = '任务已由其他人确认,已显示实际写入结果;本页未保存的修改未写入。'
}
async function refresh() {
if (!effectiveActive.value || !props.diagnosisId || pollRunning || busy.value) return
+19
View File
@@ -1423,3 +1423,22 @@ test('preview upload stops before create when readiness, upload permission or al
f.dispose()
}
})
test('dirty draft is replaced by the authoritative applied result from another operator', async () => {
let stored = task()
const copy = value => JSON.parse(JSON.stringify(value))
const f = setupPanel({ followupAudioLists: async () => ({ items: [copy(stored)] }), followupAudioDetail: async () => copy(stored) })
await settle(); await f.panel.openTask(1)
f.panel.reviewItems.value[0].values.fasting_blood_sugar = 9.9
stored = task(1, { status: 'applied', version: 2, items: [item({ values: { fasting_blood_sugar: 6.5 }, selected: true, needs_review: false })] })
await f.panel.refresh(); await settle()
assert.equal(f.panel.detail.value.status, 'applied')
assert.equal(f.panel.reviewItems.value[0].values.fasting_blood_sugar, 6.5)
assert.equal(f.panel.reviewItems.value[0].selected, true)
assert.equal(f.panel.reviewItems.value[0].needs_review, false)
assert.equal(f.panel.dirty.value, false)
assert.match(f.panel.errorMessage.value, /未保存.*未写入/)
assert.deepEqual(f.events, [['applied', 10]])
f.dispose()
})