diff --git a/src/components/exam/ExamSignPanel.tsx b/src/components/exam/ExamSignPanel.tsx index 219696f..9141b0c 100644 --- a/src/components/exam/ExamSignPanel.tsx +++ b/src/components/exam/ExamSignPanel.tsx @@ -234,11 +234,19 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { if (listRes.Status === 200 && listRes.Data?.listOptionalItem) { const items = listRes.Data.listOptionalItem; - setOptionalItemList(items); + // 根据 combination_code 去重,保留第一个出现的项目 + const uniqueItems = items.filter((item, index, self) => + index === self.findIndex((t) => t.combination_code === item.combination_code) + ); + setOptionalItemList(uniqueItems); - // 根据操作记录判断是否已经选择过(is_abandon = 0) + // 若任意记录 is_abandon=1,则视为“已确定”(已做过弃选/确认动作),不可再确认 + let hasConfirmedRecord = false; let selectedFromRecord: number | null = null; if (recordRes.Status === 200 && recordRes.Data) { + hasConfirmedRecord = recordRes.Data.some((r) => r.is_abandon === 1); + + // 预选:优先取 is_abandon=0 的组合码(若有) const selectedRecord = recordRes.Data.find( (r) => r.is_abandon === 0 && r.combination_code ); @@ -250,21 +258,20 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { } } - if (items.length > 0) { + if (uniqueItems.length > 0) { if ( selectedFromRecord != null && - items.some((i) => i.combination_code === selectedFromRecord) + uniqueItems.some((i) => i.combination_code === selectedFromRecord) ) { - // 后端已有已选记录 + // 有历史记录时,仅做“默认选中”,不标记为已确认 setSelectedOptionalItem(selectedFromRecord); - setOptionalConfirmed(true); - setShowOptionalConfirmTip(false); } else { - // 尚未选择,需要前端引导用户选择并确认 + // 无历史记录,默认不选 setSelectedOptionalItem(null); - setOptionalConfirmed(false); - setShowOptionalConfirmTip(false); } + // 只要存在可选项目:默认未确认;但若出现 is_abandon=1 记录,则视为已确定 + setOptionalConfirmed(hasConfirmedRecord); + setShowOptionalConfirmTip(false); } else { // 没有可选项目,则视为无需确认 setSelectedOptionalItem(null);