Commit f54aaa9445e0ce6b48e328293607f702c4843431

Authored by 权海
1 parent cbc1b201

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

@@ -316,16 +316,27 @@ class LocalHealthDataConvert { @@ -316,16 +316,27 @@ class LocalHealthDataConvert {
316 required List<DateTime> previousDays, 316 required List<DateTime> previousDays,
317 required List<HealthRawHrvStressPoint> hrvPoints, 317 required List<HealthRawHrvStressPoint> hrvPoints,
318 required List<HealthRawDailyStressPoint> dailyStressPoints, 318 required List<HealthRawDailyStressPoint> dailyStressPoints,
  319 + required List<HealthKitRawDataPoint> restingHeartRate,
319 }) { 320 }) {
320 final daily = <_HrvDaySummary>[]; 321 final daily = <_HrvDaySummary>[];
321 for (final day in days) { 322 for (final day in days) {
322 - final summary = _hrvDaySummary(day, hrvPoints, dailyStressPoints); 323 + final summary = _hrvDaySummary(
  324 + day,
  325 + hrvPoints,
  326 + dailyStressPoints,
  327 + restingHeartRate,
  328 + );
323 if (summary.hasData) daily.add(summary); 329 if (summary.hasData) daily.add(summary);
324 } 330 }
325 final validDaily = daily.where((e) => e.hrvAverage != null).toList(); 331 final validDaily = daily.where((e) => e.hrvAverage != null).toList();
326 final previousDaily = <_HrvDaySummary>[]; 332 final previousDaily = <_HrvDaySummary>[];
327 for (final day in previousDays) { 333 for (final day in previousDays) {
328 - final summary = _hrvDaySummary(day, hrvPoints, dailyStressPoints); 334 + final summary = _hrvDaySummary(
  335 + day,
  336 + hrvPoints,
  337 + dailyStressPoints,
  338 + const <HealthKitRawDataPoint>[],
  339 + );
329 if (summary.hasData) previousDaily.add(summary); 340 if (summary.hasData) previousDaily.add(summary);
330 } 341 }
331 final trendList = dateRangeType == 2 342 final trendList = dateRangeType == 2
@@ -336,6 +347,7 @@ class LocalHealthDataConvert { @@ -336,6 +347,7 @@ class LocalHealthDataConvert {
336 timeKey: dateKey(item.day), 347 timeKey: dateKey(item.day),
337 hrvAverage: item.hrvAverage, 348 hrvAverage: item.hrvAverage,
338 hrAverage: item.hrAverage, 349 hrAverage: item.hrAverage,
  350 + lastRestingHrValue: item.lastRestingHrValue,
339 comprehensiveStressScore: item.comprehensiveStressScore, 351 comprehensiveStressScore: item.comprehensiveStressScore,
340 state: item.state, 352 state: item.state,
341 ), 353 ),
@@ -528,9 +540,7 @@ class LocalHealthDataConvert { @@ -528,9 +540,7 @@ class LocalHealthDataConvert {
528 latestHrv: (latest?.result ?? 0).floor().toDouble(), 540 latestHrv: (latest?.result ?? 0).floor().toDouble(),
529 latestDataTime: latest?.rawEndTime, 541 latestDataTime: latest?.rawEndTime,
530 state: latest?.state.value, 542 state: latest?.state.value,
531 - tip: _latestHrvTip(  
532 - latest: latest  
533 - ), 543 + tip: _latestHrvTip(latest: latest),
534 ); 544 );
535 } 545 }
536 546
@@ -617,9 +627,7 @@ class LocalHealthDataConvert { @@ -617,9 +627,7 @@ class LocalHealthDataConvert {
617 ); 627 );
618 } 628 }
619 629
620 - static String? _latestHrvTip({  
621 - required HealthRawHrvStressPoint? latest  
622 - }) { 630 + static String? _latestHrvTip({required HealthRawHrvStressPoint? latest}) {
623 if (latest == null) return null; 631 if (latest == null) return null;
624 632
625 final isAboveBaseline = latest.result >= latest.baselineHrv; 633 final isAboveBaseline = latest.result >= latest.baselineHrv;
@@ -696,17 +704,24 @@ class LocalHealthDataConvert { @@ -696,17 +704,24 @@ class LocalHealthDataConvert {
696 DateTime day, 704 DateTime day,
697 List<HealthRawHrvStressPoint> hrv, 705 List<HealthRawHrvStressPoint> hrv,
698 List<HealthRawDailyStressPoint> dailyStress, 706 List<HealthRawDailyStressPoint> dailyStress,
  707 + List<HealthKitRawDataPoint> restingHeartRate,
699 ) { 708 ) {
700 final start = unixSeconds(day); 709 final start = unixSeconds(day);
701 final end = unixSeconds(day.add(const Duration(days: 1))); 710 final end = unixSeconds(day.add(const Duration(days: 1)));
702 final dayHrv = 711 final dayHrv =
703 hrv.where((e) => e.rawEndTime >= start && e.rawEndTime < end).toList(); 712 hrv.where((e) => e.rawEndTime >= start && e.rawEndTime < end).toList();
  713 + final dayRestingHr = restingHeartRate
  714 + .where((e) => e.endTime >= start && e.endTime < end)
  715 + .toList()
  716 + ..sort((a, b) => a.endTime.compareTo(b.endTime));
704 final stress = _dailyStressPointForDay(day, dailyStress); 717 final stress = _dailyStressPointForDay(day, dailyStress);
705 final hrvAverage = _averageOrNull(dayHrv.map((e) => e.result).toList()); 718 final hrvAverage = _averageOrNull(dayHrv.map((e) => e.result).toList());
706 return _HrvDaySummary( 719 return _HrvDaySummary(
707 day: day, 720 day: day,
708 hrvAverage: hrvAverage?.toDouble(), 721 hrvAverage: hrvAverage?.toDouble(),
709 hrAverage: stress?.stressScore.toDouble(), 722 hrAverage: stress?.stressScore.toDouble(),
  723 + lastRestingHrValue:
  724 + dayRestingHr.isEmpty ? null : dayRestingHr.last.value?.floor(),
710 comprehensiveStressScore: stress?.stressScore.toDouble(), 725 comprehensiveStressScore: stress?.stressScore.toDouble(),
711 state: stress?.state.value, 726 state: stress?.state.value,
712 ); 727 );
@@ -1019,6 +1034,7 @@ class _HrvDaySummary { @@ -1019,6 +1034,7 @@ class _HrvDaySummary {
1019 required this.day, 1034 required this.day,
1020 required this.hrvAverage, 1035 required this.hrvAverage,
1021 required this.hrAverage, 1036 required this.hrAverage,
  1037 + required this.lastRestingHrValue,
1022 required this.comprehensiveStressScore, 1038 required this.comprehensiveStressScore,
1023 required this.state, 1039 required this.state,
1024 }); 1040 });
@@ -1026,6 +1042,7 @@ class _HrvDaySummary { @@ -1026,6 +1042,7 @@ class _HrvDaySummary {
1026 final DateTime day; 1042 final DateTime day;
1027 final double? hrvAverage; 1043 final double? hrvAverage;
1028 final double? hrAverage; 1044 final double? hrAverage;
  1045 + final int? lastRestingHrValue;
1029 final double? comprehensiveStressScore; 1046 final double? comprehensiveStressScore;
1030 final int? state; 1047 final int? state;
1031 1048
@@ -128,6 +128,13 @@ class LocalHealthDataSource implements HealthDataSource { @@ -128,6 +128,13 @@ class LocalHealthDataSource implements HealthDataSource {
128 previousDays.isEmpty ? days.first : previousDays.first), 128 previousDays.isEmpty ? days.first : previousDays.first),
129 endDate: LocalHealthDataConvert.dateKey(days.last), 129 endDate: LocalHealthDataConvert.dateKey(days.last),
130 ); 130 );
  131 + final restingHeartRate = await coreService.queryRawDataPoints(
  132 + dataType: HealthDataUploadType.restingHeartRate.type,
  133 + startTime: LocalHealthDataConvert.unixSeconds(days.first),
  134 + endTime: LocalHealthDataConvert.unixSeconds(
  135 + days.last.add(const Duration(days: 1)),
  136 + ),
  137 + );
131 138
132 return AppSuccess( 139 return AppSuccess(
133 LocalHealthDataConvert.hrvStatistics( 140 LocalHealthDataConvert.hrvStatistics(
@@ -136,6 +143,7 @@ class LocalHealthDataSource implements HealthDataSource { @@ -136,6 +143,7 @@ class LocalHealthDataSource implements HealthDataSource {
136 previousDays: previousDays, 143 previousDays: previousDays,
137 hrvPoints: hrvPoints, 144 hrvPoints: hrvPoints,
138 dailyStressPoints: dailyStressPoints, 145 dailyStressPoints: dailyStressPoints,
  146 + restingHeartRate: restingHeartRate,
139 ), 147 ),
140 ); 148 );
141 } catch (error) { 149 } catch (error) {
@@ -381,9 +381,24 @@ void main() { @@ -381,9 +381,24 @@ void main() {
381 dailyStressPoint(currentDay, 34), 381 dailyStressPoint(currentDay, 34),
382 dailyStressPoint(previousDay, 90), 382 dailyStressPoint(previousDay, 90),
383 ], 383 ],
  384 + restingHeartRate: [
  385 + HealthKitRawDataPoint(
  386 + dataType: 9,
  387 + startTime: currentStart + 300,
  388 + endTime: currentStart + 300,
  389 + value: 61,
  390 + ),
  391 + HealthKitRawDataPoint(
  392 + dataType: 9,
  393 + startTime: currentStart + 900,
  394 + endTime: currentStart + 900,
  395 + value: 63,
  396 + ),
  397 + ],
384 ); 398 );
385 399
386 expect(statistics.hrvTrendList?.single.hrvAverage, 80); 400 expect(statistics.hrvTrendList?.single.hrvAverage, 80);
  401 + expect(statistics.hrvTrendList?.single.lastRestingHrValue, 63);
387 expect( 402 expect(
388 statistics.hrvTrendList?.single.comprehensiveStressScore, 403 statistics.hrvTrendList?.single.comprehensiveStressScore,
389 34, 404 34,
@@ -419,6 +434,7 @@ void main() { @@ -419,6 +434,7 @@ void main() {
419 dataTime: LocalHealthDataConvert.unixSeconds(mayDay), 434 dataTime: LocalHealthDataConvert.unixSeconds(mayDay),
420 ), 435 ),
421 ], 436 ],
  437 + restingHeartRate: const [],
422 ); 438 );
423 439
424 expect(statistics.hrvTrendList, hasLength(1)); 440 expect(statistics.hrvTrendList, hasLength(1));