```
docs(health-profile): 添加防编造加固修订记录到导出健康档案设计文档 补充了关于导出摘要出现虚构病例问题的详细分析和修复方案, 包括检索策略优化、空数据兜底处理和prompt重写等三层防护措施。 ```
This commit is contained in:
@@ -19,6 +19,7 @@ struct ArchiveListView: View {
|
||||
|
||||
@State private var filter: TimelineKind? = nil
|
||||
@State private var endingSymptom: Symptom?
|
||||
@State private var selectedEntry: TimelineEntry?
|
||||
@State private var showExportSheet = false
|
||||
@State private var showExportList = false
|
||||
|
||||
@@ -85,6 +86,11 @@ struct ArchiveListView: View {
|
||||
.sheet(item: $endingSymptom) { sym in
|
||||
SymptomEndSheet(symptom: sym)
|
||||
}
|
||||
.sheet(item: $selectedEntry) { entry in
|
||||
if let d = detail(for: entry) {
|
||||
TimelineEntryDetailView(detail: d)
|
||||
}
|
||||
}
|
||||
.fullScreenCover(isPresented: $showExportSheet) {
|
||||
HealthExportSheet()
|
||||
}
|
||||
@@ -94,6 +100,7 @@ struct ArchiveListView: View {
|
||||
private func rowView(for entry: TimelineEntry) -> some View {
|
||||
if entry.kind == .symptom, entry.isOngoing,
|
||||
let sym = symptoms.first(where: { "symptom-\($0.persistentModelID)" == entry.id }) {
|
||||
// 进行中症状:点 → 标记结束 sheet(沿用原交互)
|
||||
Button {
|
||||
endingSymptom = sym
|
||||
} label: {
|
||||
@@ -101,7 +108,42 @@ struct ArchiveListView: View {
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
} else {
|
||||
TimelineRow(entry: entry)
|
||||
// 其余条目(报告/指标/日记/已结束症状):点 → 只读详情
|
||||
Button {
|
||||
if detail(for: entry) != nil { selectedEntry = entry }
|
||||
} label: {
|
||||
TimelineRow(entry: entry)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
}
|
||||
|
||||
/// 把时间线条目反查回源记录(id 形如 `<kind>-<persistentModelID>` / `bp-<sys>-<dia>`)。
|
||||
private func detail(for entry: TimelineEntry) -> TimelineDetail? {
|
||||
switch entry.kind {
|
||||
case .report:
|
||||
return reports.first { "report-\($0.persistentModelID)" == entry.id }
|
||||
.map(TimelineDetail.report)
|
||||
case .diary:
|
||||
return diaries.first { "diary-\($0.persistentModelID)" == entry.id }
|
||||
.map(TimelineDetail.diary)
|
||||
case .symptom:
|
||||
return symptoms.first { "symptom-\($0.persistentModelID)" == entry.id }
|
||||
.map(TimelineDetail.symptom)
|
||||
case .indicator:
|
||||
if let i = indicators.first(where: { "indicator-\($0.persistentModelID)" == entry.id }) {
|
||||
return .indicator(i)
|
||||
}
|
||||
// 合并血压条目:bp-<sysID>-<diaID>
|
||||
if entry.id.hasPrefix("bp-"),
|
||||
let sys = indicators.first(where: { entry.id.hasPrefix("bp-\($0.persistentModelID)-") }) {
|
||||
let dia = indicators.first {
|
||||
$0.seriesKey == "bp.diastolic" &&
|
||||
abs($0.capturedAt.timeIntervalSince(sys.capturedAt)) <= 5
|
||||
}
|
||||
return .bloodPressure(sys: sys, dia: dia)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user