Commit 7605ac95aa560718b72f1a8e65f7eafaf97a471e

Authored by 权海
1 parent 23e3ab2d

feat(ui):对齐目标值

... ... @@ -1345,7 +1345,7 @@ class HealthRawDailyStressCalculator {
.toList()
..sort();
if (values.isEmpty) return null;
final stressValue = _average(values);
final stressValue = _integerDouble(_average(values));
final stressScore = _dailyStressScore(values).round().clamp(1, 100).toInt();
return HealthRawDailyStressPoint(
userId: userId,
... ... @@ -1423,6 +1423,8 @@ class HealthRawDailyStressCalculator {
math.max(min.toDouble(), math.min(max.toDouble(), value.toDouble()));
static double _round(double value) => (value * 10).round() / 10;
static double _integerDouble(num value) => value.toInt().toDouble();
}
HealthRawStressState healthRawRealtimeStressState(num value) {
... ... @@ -1447,6 +1449,8 @@ double? _positiveDouble(Object? value) {
return result;
}
double _integerDouble(num value) => value.toInt().toDouble();
HealthRawStressState? _stressStateFromDb(Object? value) {
final stateValue = value as int?;
if (stateValue == null) return null;
... ... @@ -2096,7 +2100,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable (
'raw_end_time': point.rawEndTime,
'user_id': point.userId,
'raw_hrv': point.rawHrv,
'result': point.result,
'result': _integerDouble(point.result),
'source_start_time': point.sourceStartTime,
'source_end_time': point.sourceEndTime,
'state': point.state.value,
... ... @@ -2114,7 +2118,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable (
'raw_end_time': point.rawEndTime,
'user_id': point.userId,
'raw_hr': point.rawHr,
'result': point.result,
'result': _integerDouble(point.result),
'source_start_time': point.sourceStartTime,
'source_end_time': point.sourceEndTime,
..._flagsRow(point.flags),
... ... @@ -2126,7 +2130,7 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable (
return <String, Object?>{
'date': point.date,
'user_id': point.userId,
'stress_value': point.stressValue,
'stress_value': _integerDouble(point.stressValue),
'stress_score': point.stressScore,
'state': point.state.value,
'data_time': point.dataTime,
... ...
... ... @@ -226,15 +226,16 @@ class HealthRawStressCalculator {
...hrWindow,
...restingHistory,
]);
final normalizedTrendHrv = _integerDouble(trendHrv);
results.add(
HealthRawHrvStressPoint(
userId: userId,
rawEndTime: point.endTime,
rawHrv: pointValue,
result: trendHrv,
result: normalizedTrendHrv,
sourceStartTime: sourceRange.start,
sourceEndTime: sourceRange.end,
state: _hrvState(trendHrv),
state: _hrvState(normalizedTrendHrv),
baselineHrv: baselineHrv,
baselineAwakeHrv: baselineAwakeHrv,
baselineSleepHrv: isSleep ? baselineSleepHrv : null,
... ... @@ -355,7 +356,7 @@ class HealthRawStressCalculator {
}
}
final stress = _round(_clamp(adjustment.value, 1, 100), 1);
final stress = _integerDouble(_clamp(adjustment.value, 1, 100));
final sourceRange = _sourceRangeForRealtime(
hrWindow: hrWindow,
restingHistory: restingHistory,
... ... @@ -571,6 +572,8 @@ class HealthRawStressCalculator {
return (value * scale).round() / scale;
}
static double _integerDouble(num value) => value.toInt().toDouble();
static List<int> _daysInRange(int startTime, int endTime) {
final start = DateTime.fromMillisecondsSinceEpoch(startTime * 1000);
final end = DateTime.fromMillisecondsSinceEpoch(endTime * 1000);
... ...
... ... @@ -3,11 +3,14 @@ import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'app/bootstrap/app_bootstrap.dart';
import 'app/double_feel_app.dart';
import 'core/services/health_raw_data_core_service.dart';
import 'core/theme/app_theme.dart';
import 'data/local/user_preferences_storage.dart';
Future<void> main() async {
runZonedGuarded<Future<Null>>(
... ... @@ -29,3 +32,99 @@ Future<void> main() async {
},
);
}
@pragma('vm:entry-point')
Future<void> healthBackgroundMain() async {
WidgetsFlutterBinding.ensureInitialized();
const channel = MethodChannel('doublefeel_flutter_health_background_channel');
await AppBootstrap.init();
channel.setMethodCallHandler((call) async {
switch (call.method) {
case 'runPendingHealthTasks':
await _runPendingHealthTasks(channel, call.arguments);
return true;
default:
return null;
}
});
await channel.invokeMethod('healthBackgroundTaskReady', {
'timestamp': DateTime.now().millisecondsSinceEpoch ~/ 1000,
});
}
Future<void> _runPendingHealthTasks(
MethodChannel channel,
Object? arguments,
) async {
final tasks = _backgroundHealthTasksFromArguments(arguments);
if (tasks.isEmpty) return;
for (final task in tasks) {
await channel.invokeMethod('healthBackgroundTaskReceived', {
'taskId': task.taskId,
});
}
final userPrefs = Get.find<UserPreferencesStorage>();
final userId = userPrefs.preferences.value.meUserInfo?.id ?? 0;
final token = userPrefs.accessToken;
if (userId <= 0 || token.isEmpty) {
for (final task in tasks) {
await channel.invokeMethod('healthBackgroundTaskFinished', {
'taskId': task.taskId,
'success': false,
'retryable': true,
'error': 'missingLogin',
});
}
return;
}
try {
await Get.find<HealthRawDataCoreService>().startCoreCaculate();
for (final task in tasks) {
await channel.invokeMethod('healthBackgroundTaskFinished', {
'taskId': task.taskId,
'success': true,
});
}
} catch (error) {
for (final task in tasks) {
await channel.invokeMethod('healthBackgroundTaskFinished', {
'taskId': task.taskId,
'success': false,
'retryable': true,
'error': error.toString(),
});
}
}
}
List<_BackgroundHealthTask> _backgroundHealthTasksFromArguments(
Object? arguments,
) {
final rawTasksValue =
arguments is Map<Object?, Object?> ? arguments['tasks'] : null;
final rawTasks =
rawTasksValue is List ? rawTasksValue.cast<Object?>() : const <Object?>[];
return rawTasks
.whereType<Map<Object?, Object?>>()
.map(_BackgroundHealthTask.fromMap)
.whereType<_BackgroundHealthTask>()
.toList(growable: false);
}
class _BackgroundHealthTask {
const _BackgroundHealthTask({required this.taskId});
final String taskId;
static _BackgroundHealthTask? fromMap(Map<Object?, Object?> map) {
final taskId = map['taskId'];
if (taskId is! String || taskId.isEmpty) return null;
return _BackgroundHealthTask(taskId: taskId);
}
}
... ...