缺少代码差异信息,无法生成具体的commit message。
请提供 "code differences" 的具体内容,以便我能够根据代码变更情况生成符合 Angular 规范的中文 commit message。
This commit is contained in:
@@ -2,6 +2,11 @@ import SwiftUI
|
||||
import SwiftData
|
||||
import Foundation
|
||||
|
||||
/// 趋势桶的来源类别。
|
||||
/// - `.monitor`:长期监测预设 / 自定义 / 血压(按 seriesKey 分组)。
|
||||
/// - `.lab`:任意出现 ≥2 次的化验/手动/报告指标(按 name+unit 分组,无 seriesKey)。
|
||||
enum SeriesKind { case monitor, lab }
|
||||
|
||||
/// 长期监测系列在 Trends 折线图里的展示桶。
|
||||
/// 单系列(血糖/体重/...)= 1 个 SeriesLine;血压特殊 = 收缩 + 舒张 2 条线同卡。
|
||||
struct SeriesBucket: Identifiable {
|
||||
@@ -10,6 +15,7 @@ struct SeriesBucket: Identifiable {
|
||||
let unit: String
|
||||
let lines: [SeriesLine]
|
||||
let latestDate: Date
|
||||
let kind: SeriesKind
|
||||
|
||||
struct SeriesLine: Identifiable {
|
||||
let id: String
|
||||
@@ -68,9 +74,79 @@ extension SeriesBucket {
|
||||
}
|
||||
}
|
||||
|
||||
// —— lab 段:任何没有 seriesKey 的指标,按 name+unit 归并;同名出现 ≥minPoints 次即成趋势。
|
||||
var labBuckets: [String: [Indicator]] = [:]
|
||||
for i in indicators {
|
||||
if let key = i.seriesKey, !key.isEmpty { continue } // seriesKey 指标只进 monitor 段
|
||||
let nk = normalizedKey(name: i.name, unit: i.unit)
|
||||
guard !nk.isEmpty else { continue }
|
||||
labBuckets[nk, default: []].append(i)
|
||||
}
|
||||
for (_, items) in labBuckets {
|
||||
guard items.count >= minPoints else { continue }
|
||||
if let bucket = buildLab(items: items) {
|
||||
results.append(bucket)
|
||||
}
|
||||
}
|
||||
|
||||
return results.sorted { $0.latestDate > $1.latestDate }
|
||||
}
|
||||
|
||||
/// name+unit 归一化:trim + 小写 + 折叠内部空白。空名返回空串(调用方跳过)。
|
||||
static func normalizedKey(name: String, unit: String) -> String {
|
||||
func norm(_ s: String) -> String {
|
||||
s.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
.lowercased()
|
||||
.components(separatedBy: .whitespacesAndNewlines)
|
||||
.filter { !$0.isEmpty }
|
||||
.joined(separator: " ")
|
||||
}
|
||||
let n = norm(name)
|
||||
guard !n.isEmpty else { return "" }
|
||||
return n + "|" + norm(unit)
|
||||
}
|
||||
|
||||
/// 解析参考范围字符串 → ClosedRange。支持 "3.9-6.1" / "3.9~6.1" / "3.9 - 6.1"。
|
||||
/// 单边("<5.2" / ">40" / "≤120")暂返回 nil(图不画带,正常)。
|
||||
static func parseRange(_ raw: String) -> ClosedRange<Double>? {
|
||||
let s = raw.replacingOccurrences(of: "~", with: "~")
|
||||
.replacingOccurrences(of: "~", with: "-")
|
||||
guard let regex = try? NSRegularExpression(
|
||||
pattern: #"(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)"#
|
||||
) else { return nil }
|
||||
let range = NSRange(s.startIndex..<s.endIndex, in: s)
|
||||
guard let m = regex.firstMatch(in: s, range: range),
|
||||
let r1 = Range(m.range(at: 1), in: s),
|
||||
let r2 = Range(m.range(at: 2), in: s),
|
||||
let lo = Double(s[r1]), let hi = Double(s[r2]),
|
||||
lo <= hi else { return nil }
|
||||
return lo...hi
|
||||
}
|
||||
|
||||
private static func buildLab(items: [Indicator]) -> SeriesBucket? {
|
||||
let sorted = items.sorted { $0.capturedAt < $1.capturedAt }
|
||||
guard let latest = sorted.last else { return nil }
|
||||
let points = sorted.compactMap { point(from: $0) }
|
||||
guard points.count >= 2 else { return nil } // 值无法解析为数字的会被丢弃,可能不足 2 点
|
||||
|
||||
let line = SeriesLine(
|
||||
id: "lab:\(latest.name)",
|
||||
seriesKey: "lab:\(latest.name)",
|
||||
label: nil,
|
||||
color: Tj.Palette.ink,
|
||||
points: points,
|
||||
referenceRange: parseRange(latest.range)
|
||||
)
|
||||
return SeriesBucket(
|
||||
id: "lab:\(normalizedKey(name: latest.name, unit: latest.unit))",
|
||||
title: latest.name,
|
||||
unit: latest.unit,
|
||||
lines: [line],
|
||||
latestDate: latest.capturedAt,
|
||||
kind: .lab
|
||||
)
|
||||
}
|
||||
|
||||
private static func buildSingle(key: String,
|
||||
items: [Indicator],
|
||||
profile: UserProfile?,
|
||||
@@ -106,7 +182,8 @@ extension SeriesBucket {
|
||||
title: title,
|
||||
unit: unit,
|
||||
lines: [line],
|
||||
latestDate: latest.capturedAt
|
||||
latestDate: latest.capturedAt,
|
||||
kind: .monitor
|
||||
)
|
||||
}
|
||||
|
||||
@@ -148,7 +225,8 @@ extension SeriesBucket {
|
||||
title: String(appLoc: "血压"),
|
||||
unit: "mmHg",
|
||||
lines: lines,
|
||||
latestDate: latest
|
||||
latestDate: latest,
|
||||
kind: .monitor
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user