Commit f54aaa9445e0ce6b48e328293607f702c4843431

Authored by 权海
1 parent cbc1b201

feat(ui):提供静息心率给趋势页面

... ... @@ -316,16 +316,27 @@ class LocalHealthDataConvert {
required List<DateTime> previousDays,
required List<HealthRawHrvStressPoint> hrvPoints,
required List<HealthRawDailyStressPoint> dailyStressPoints,
required List<HealthKitRawDataPoint> restingHeartRate,
}) {
final daily = <_HrvDaySummary>[];
for (final day in days) {
final summary = _hrvDaySummary(day, hrvPoints, dailyStressPoints);
final summary = _hrvDaySummary(
day,
hrvPoints,
dailyStressPoints,
restingHeartRate,
);
if (summary.hasData) daily.add(summary);
}
final validDaily = daily.where((e) => e.hrvAverage != null).toList();
final previousDaily = <_HrvDaySummary>[];
for (final day in previousDays) {
final summary = _hrvDaySummary(day, hrvPoints, dailyStressPoints);
final summary = _hrvDaySummary(
day,
hrvPoints,
dailyStressPoints,
const <HealthKitRawDataPoint>[],
);
if (summary.hasData) previousDaily.add(summary);
}
final trendList = dateRangeType == 2
... ... @@ -336,6 +347,7 @@ class LocalHealthDataConvert {
timeKey: dateKey(item.day),
hrvAverage: item.hrvAverage,
hrAverage: item.hrAverage,
lastRestingHrValue: item.lastRestingHrValue,
comprehensiveStressScore: item.comprehensiveStressScore,
state: item.state,
),
... ... @@ -528,9 +540,7 @@ class LocalHealthDataConvert {
latestHrv: (latest?.result ?? 0).floor().toDouble(),
latestDataTime: latest?.rawEndTime,
state: latest?.state.value,
tip: _latestHrvTip(
latest: latest
),
tip: _latestHrvTip(latest: latest),
);
}
... ... @@ -617,9 +627,7 @@ class LocalHealthDataConvert {
);
}
static String? _latestHrvTip({
required HealthRawHrvStressPoint? latest
}) {
static String? _latestHrvTip({required HealthRawHrvStressPoint? latest}) {
if (latest == null) return null;
final isAboveBaseline = latest.result >= latest.baselineHrv;
... ... @@ -696,17 +704,24 @@ class LocalHealthDataConvert {
DateTime day,
List<HealthRawHrvStressPoint> hrv,
List<HealthRawDailyStressPoint> dailyStress,
List<HealthKitRawDataPoint> restingHeartRate,
) {
final start = unixSeconds(day);
final end = unixSeconds(day.add(const Duration(days: 1)));
final dayHrv =
hrv.where((e) => e.rawEndTime >= start && e.rawEndTime < end).toList();
final dayRestingHr = restingHeartRate
.where((e) => e.endTime >= start && e.endTime < end)
.toList()
..sort((a, b) => a.endTime.compareTo(b.endTime));
final stress = _dailyStressPointForDay(day, dailyStress);
final hrvAverage = _averageOrNull(dayHrv.map((e) => e.result).toList());
return _HrvDaySummary(
day: day,
hrvAverage: hrvAverage?.toDouble(),
hrAverage: stress?.stressScore.toDouble(),
lastRestingHrValue:
dayRestingHr.isEmpty ? null : dayRestingHr.last.value?.floor(),
comprehensiveStressScore: stress?.stressScore.toDouble(),
state: stress?.state.value,
);
... ... @@ -1019,6 +1034,7 @@ class _HrvDaySummary {
required this.day,
required this.hrvAverage,
required this.hrAverage,
required this.lastRestingHrValue,
required this.comprehensiveStressScore,
required this.state,
});
... ... @@ -1026,6 +1042,7 @@ class _HrvDaySummary {
final DateTime day;
final double? hrvAverage;
final double? hrAverage;
final int? lastRestingHrValue;
final double? comprehensiveStressScore;
final int? state;
... ...
... ... @@ -128,6 +128,13 @@ class LocalHealthDataSource implements HealthDataSource {
previousDays.isEmpty ? days.first : previousDays.first),
endDate: LocalHealthDataConvert.dateKey(days.last),
);
final restingHeartRate = await coreService.queryRawDataPoints(
dataType: HealthDataUploadType.restingHeartRate.type,
startTime: LocalHealthDataConvert.unixSeconds(days.first),
endTime: LocalHealthDataConvert.unixSeconds(
days.last.add(const Duration(days: 1)),
),
);
return AppSuccess(
LocalHealthDataConvert.hrvStatistics(
... ... @@ -136,6 +143,7 @@ class LocalHealthDataSource implements HealthDataSource {
previousDays: previousDays,
hrvPoints: hrvPoints,
dailyStressPoints: dailyStressPoints,
restingHeartRate: restingHeartRate,
),
);
} catch (error) {
... ...
... ... @@ -381,9 +381,24 @@ void main() {
dailyStressPoint(currentDay, 34),
dailyStressPoint(previousDay, 90),
],
restingHeartRate: [
HealthKitRawDataPoint(
dataType: 9,
startTime: currentStart + 300,
endTime: currentStart + 300,
value: 61,
),
HealthKitRawDataPoint(
dataType: 9,
startTime: currentStart + 900,
endTime: currentStart + 900,
value: 63,
),
],
);
expect(statistics.hrvTrendList?.single.hrvAverage, 80);
expect(statistics.hrvTrendList?.single.lastRestingHrValue, 63);
expect(
statistics.hrvTrendList?.single.comprehensiveStressScore,
34,
... ... @@ -419,6 +434,7 @@ void main() {
dataTime: LocalHealthDataConvert.unixSeconds(mayDay),
),
],
restingHeartRate: const [],
);
expect(statistics.hrvTrendList, hasLength(1));
... ...