更新英文语言相关问题。

This commit is contained in:
wyf
2026-03-23 15:19:09 +08:00
parent 2d28a550bd
commit a1e835ecbc
20 changed files with 472 additions and 1040 deletions

View File

@@ -113,7 +113,8 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
final menuWidth = _calculateMaxMenuItemWidth(allTexts, textStyle);
popupWidth = menuWidth;
// 计算弹窗需要的实际高度(估算)
final estimatedItemHeight = 66.rpx; // 每个菜单项的估算高度
// final estimatedItemHeight = 66.rpx; // 每个菜单项的估算高度
final estimatedItemHeight = 100.rpx; // 每个菜单项的估算高度
//todo 更新菜单项,需要在此添加数量
// final itemCount =
// widget.device['bind_type'] == BindType.active.code ? 9 : 5;
@@ -151,7 +152,7 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
// 确保弹窗不会超出屏幕边界
popupTop = math.max(paddingOffset, popupTop);
actualPopupHeight =
math.min(actualPopupHeight, screenHeight * 0.7); // 限制最大高度为屏幕的70%
math.min(actualPopupHeight, screenHeight * 1); // 限制最大高度为屏幕的70%
// 计算左侧位置,确保不会超出屏幕右侧
double popupLeft = position.dx + size.width - popupWidth;
@@ -699,7 +700,7 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
maxWidth: MediaQuery.sizeOf(context).width * 0.6,
),
child: Text(
'${(widget.device['person']?['name'] as String?)?.isNotEmpty == true ? widget.device['person']!['name'] : '体征测设备'.tr}',
'${(widget.device['person']?['name'] as String?)?.isNotEmpty == true ? widget.device['person']!['name'] : '体征测设备'.tr}',
style: TextStyle(
fontFamily: 'Inter',
fontSize: 30.rpx,

View File

@@ -543,19 +543,19 @@ class _AfterCalibrationPersonPageState
),
// 床头文字
Positioned(
top: 23.rpx,
left: (MediaQuery.sizeOf(context)
.width *
0.65) /
2 -
26.rpx,
child: Text(
'床头'.tr,
style: TextStyle(
fontSize: 26.rpx,
color: themeController
.currentColor.sc4,
Align(
alignment:
Alignment.topCenter, // 顶部居中
child: Padding(
padding: EdgeInsets.only(
top: 23.rpx), // 距离顶部的距离
child: Text(
'床头'.tr,
style: TextStyle(
fontSize: 26.rpx,
color: themeController
.currentColor.sc4,
),
),
),
),

View File

@@ -420,19 +420,19 @@ class _CalibrationPageState extends State<CalibrationPage> {
),
// 床头文字
Positioned(
top: 23.rpx,
left: (MediaQuery.sizeOf(context)
.width *
0.65) /
2 -
26.rpx,
child: Text(
'床头'.tr,
style: TextStyle(
fontSize: 26.rpx,
color: themeController
.currentColor.sc4,
Align(
alignment:
Alignment.topCenter, // 顶部居中
child: Padding(
padding: EdgeInsets.only(
top: 23.rpx), // 距离顶部的距离
child: Text(
'床头'.tr,
style: TextStyle(
fontSize: 26.rpx,
color: themeController
.currentColor.sc4,
),
),
),
),

View File

@@ -414,19 +414,36 @@ class _CalibrationPersonPageState extends State<CalibrationPersonPage> {
),
// 床头文字
Positioned(
top: 23.rpx,
left: (MediaQuery.sizeOf(context)
.width *
0.65) /
2 -
26.rpx,
child: Text(
'床头'.tr,
style: TextStyle(
fontSize: 26.rpx,
color: themeController
.currentColor.sc4,
// Positioned(
// top: 23.rpx,
// left: (MediaQuery.sizeOf(context)
// .width *
// 0.65) /
// 2 -
// 26.rpx,
// child: Text(
// '床头'.tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: themeController
// .currentColor.sc4,
// ),
// ),
// ),
// 床头文字 - 自动居中版本
Align(
alignment:
Alignment.topCenter, // 顶部居中
child: Padding(
padding: EdgeInsets.only(
top: 23.rpx), // 距离顶部的距离
child: Text(
'床头'.tr,
style: TextStyle(
fontSize: 26.rpx,
color: themeController
.currentColor.sc4,
),
),
),
),

View File

@@ -21,6 +21,7 @@ import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/controller/weather/weather_controller.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/main.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/pages/person/select_time.dart';
import 'dart:ui' as ui;
@@ -710,7 +711,7 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
themeController.currentColor.sc9,
);
} else {
// await dealBindProcess();
await dealBindProcess();
CountdownController countdownController =
Get.find();
countdownController.countdown.value = 0;

View File

@@ -1355,8 +1355,12 @@ class _HomePageState extends State<HomePage> {
method: MyHttpMethod.put,
queryUrl: queryUrl,
data: data,
onSuccess: (res) {},
onFailure: (res) {},
onSuccess: (res) {
ef.log("更新绑定流程成功");
},
onFailure: (res) {
ef.log("更新绑定流程失败");
},
);
},
onFailure: (res) {},

View File

@@ -432,47 +432,121 @@ class MHTBlueToothController extends GetControllerEx<MHTBlueToothModel> {
}
//下发wifi指令
sendCommand(Map<String, dynamic> commandData) async {
// sendCommand(Map<String, dynamic> commandData) async {
// if (commandData == null || commandData.isEmpty) {
// throw "指令数据不能为空";
// }
// if (commandData['data'] == "FFFFFFFF00031000010014FD") {
// return;
// }
// ef.log("下发指令内容为: ${commandData['data']}");
// commandData['data'] = Base64Tool.encode(commandData['data']);
// if (Base64Tool.decode(commandData['data']) != "FFFFFFFF00031000010014FD" &&
// Base64Tool.decode(commandData['data']).length <= 24) {
// ef.log("下发指令: ${Base64Tool.decode(commandData['data'])}");
// } else {
// // ef.log("下发指令: ${Base64Tool.decode(commandData['data'])}");
// }
// ef.log("全部指令");
// ef.log("wifi指令控制下发时间-->${DateTime.now()}");
// commandData['wfr'] = true; //是否等待响应 true: 等待 false:不等待(默认)
// commandData['type'] = 0; //0 base64数据 1 二进制数据
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.sendWifiCommand;
// String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
// await requestWithLog(
// logTitle: "下发wifi控制指令",
// method: MyHttpMethod.post,
// queryUrl: queryUrl,
// data: commandData,
// onSuccess: (res) {
// ef.log("下发指令成功: ${res.msg}");
// EasyDartModule.logger.info("下发wifi控制指令成功: $res");
// },
// onFailure: (res) {
// ef.log("下发指令失败: ${res.msg}");
// EasyDartModule.logger.info("下发wifi控制指令失败: $res");
// throw "下发wifi控制指令失败: ${res.msg}";
// },
// );
// await Future.delayed(Duration(milliseconds: 100));
// }
//下发wifi指令
Future<void> sendCommand(Map<String, dynamic> commandData,
{int maxRetryCount = 3}) async {
if (commandData == null || commandData.isEmpty) {
throw "指令数据不能为空";
throw Exception("指令数据不能为空");
}
if (commandData['data'] == "FFFFFFFF00031000010014FD") {
return;
}
ef.log("下发指令内容为: ${commandData['data']}");
// ef.log("下发指令内容为: ${commandData['data']}");
commandData['data'] = Base64Tool.encode(commandData['data']);
if (Base64Tool.decode(commandData['data']) != "FFFFFFFF00031000010014FD" &&
Base64Tool.decode(commandData['data']).length <= 24) {
ef.log("下发指令: ${Base64Tool.decode(commandData['data'])}");
} else {
// ef.log("下发指令: ${Base64Tool.decode(commandData['data'])}");
}
ef.log("全部指令");
ef.log("wifi指令控制下发时间-->${DateTime.now()}");
commandData['wfr'] = false;
EasyDartModule.logger.info("设备mac${commandData['mac']}" +"wifi指令控制下发时间-->${DateTime.now()}");
commandData['wfr'] = true; //是否等待响应 true: 等待 false:不等待(默认)
commandData['type'] = 0; //0 base64数据 1 二进制数据
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.sendWifiCommand;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
await requestWithLog(
logTitle: "下发wifi控制指令",
method: MyHttpMethod.post,
queryUrl: queryUrl,
data: commandData,
onSuccess: (res) {
ef.log("下发指令成功: ${res.msg}");
EasyDartModule.logger.info("下发wifi控制指令成功: $res");
},
onFailure: (res) {
ef.log("下发指令失败: ${res.msg}");
EasyDartModule.logger.info("下发wifi控制指令失败: $res");
throw "下发wifi控制指令失败: ${res.msg}";
},
);
await Future.delayed(Duration(milliseconds: 100));
}
int retryCount = 0;
bool success = false;
dynamic lastError;
while (retryCount < maxRetryCount && !success) {
try {
if (retryCount > 0) {
ef.log("$retryCount 次重试下发wifi控制指令");
await Future.delayed(
Duration(milliseconds: 500 * retryCount)); // 递增延迟
}
ef.log("下发指令时间: ");
await requestWithLog(
logTitle:
"下发wifi控制指令${retryCount > 0 ? '(重试 $retryCount/$maxRetryCount)' : ''}",
method: MyHttpMethod.post,
queryUrl: queryUrl,
data: commandData,
onSuccess: (res) {
ef.log("下发指令成功: ${res.msg}");
EasyDartModule.logger.info("下发wifi控制指令成功: $res");
success = true;
},
onFailure: (res) {
ef.log("下发指令失败: ${res.msg}");
EasyDartModule.logger.info("下发wifi控制指令失败: $res");
lastError = "下发wifi控制指令失败: ${res.msg}";
throw Exception(lastError); // 抛出异常触发重试
},
);
await Future.delayed(Duration(milliseconds: 100));
} catch (e) {
lastError = e;
retryCount++;
if (retryCount >= maxRetryCount) {
ef.log("下发wifi控制指令失败已重试 $maxRetryCount");
EasyDartModule.logger.info("下发wifi控制指令失败已重试 $maxRetryCount 次: $e");
DailyLogUtils.writeLog("下发wifi控制指令失败已重试 $maxRetryCount 次: $e");
throw Exception("下发wifi控制指令失败已重试 $maxRetryCount 次: ${e.toString()}");
} else {
ef.log("下发wifi控制指令失败准备第 $retryCount 次重试");
}
}
}
}
//todo 解绑的时候删除自己所拥有的所有设备的睡眠习惯
}
@@ -492,641 +566,3 @@ void safeShowNotification(String msg) {
// print("TopSlideNotification 显示异常: $e\n$stack");
}
}
// import 'dart:async';
// import 'dart:convert';
// import 'package:EasyDartModule/EasyDartModule.dart';
// import 'package:easydevice/src/app/thapp.dart';
// import 'package:ef/ef.dart';
// import 'package:flutter/src/widgets/framework.dart';
// import 'package:json_annotation/json_annotation.dart';
// import 'package:vbvs_app/common/color/ServiceConstant.dart';
// import 'package:vbvs_app/common/color/app_uri_status.dart';
// import 'package:vbvs_app/common/util/DailyLogUtils.dart';
// import 'package:vbvs_app/common/util/FirmwareVersionService.dart';
// import 'package:vbvs_app/common/util/MyUtils.dart';
// import 'package:vbvs_app/common/util/base64Tool.dart';
// import 'package:vbvs_app/common/util/requestWithLog.dart';
// import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
// import 'package:vbvs_app/model/api_response.dart';
// import 'package:vbvs_app/pages/mh_page/device/model/BlueToothDataModel.dart';
// import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart';
// part 'mht_bluetooth_controller.g.dart';
// @JsonSerializable()
// class MHTBlueToothModel {
// bool? bluetooth = false; //蓝牙开关
// double? singal = -100;
// @JsonKey(ignore: true)
// List<BlueToothDataModel>? blueRawData = []; //蓝牙原始数据
// @JsonKey(ignore: true)
// List<BlueToothDataModel>? deviceDataStatus; //已经请求过状态的数据
// int? read = 0;
// int? deviceType; //绑定设备类型
// bool wifiPassShow = false;
// String? wifiPass;
// MHTBlueToothModel();
// static MHTBlueToothModel fromJson(Map<String, dynamic> json) =>
// _$MHTBlueToothModelFromJson(json);
// Map<String, dynamic> toJson() => _$MHTBlueToothModelToJson(this);
// }
// class MHTBlueToothController extends GetControllerEx<MHTBlueToothModel> {
// MHTBlueToothController() {
// attr = GetModel(MHTBlueToothModel()).obs;
// }
// Timer? _statusTimer;
// MHTRegisterController registerController = Get.find();
// RxString search = "".obs;
// RxString currentDeviceMac = "".obs; //当前正在绑定的设备用来显示loading
// THapp? currentDevice; //当前连接的设备
// BlueToothDataModel? currentFullDevice; //当前连接的设备
// RxInt blueConnectFlag = 0.obs; //当前蓝牙连接状态 0.正在连接 1.未连接 2.已连接
// RxBool bluetoothStatus = false.obs; //蓝牙开启状态
// RxInt connectStatus = 0.obs; //当前wifi连接状态 0未连接 1已连接
// RxInt netType = 0.obs; //当前网络类型 0.正在检测 1.wifi 2.4g设备 3.未知
// RxInt wifiConnectStatus = 1.obs; //获取wifi状态 0.正在检测 1.已检测完
// RxMap selectWifi = {}.obs; //正在连接wifi信息
// int returnPage = 0; //0返回首页 1.返回设备列表
// RxInt wifiStatus = 0.obs; //wifi连接状态 0未连接 1已连接
// RxList wifiList = [].obs;
// RxMap connect_wifi = {}.obs;
// RxString? cid = "".obs;
// RxBool isScanning = false.obs;
// RxMap<String, Map> localUpgradeMac = <String, Map>{}.obs; //mac 进度
// String? currentUpgradeVersion; //最新版本号
// String? currentUpgradeName; //最新固件名
// String? currentUpgradeUrl; //最新固件下载地址
// List<FirmwareVersionInfo> firmwareList = []; //固件版本列表
// RxBool allSelect = false.obs; //升级是否全选
// RxBool autoUpgrade = false.obs; //是否自动升级
// // wifi下发指令队列相关
// final List<Map<String, dynamic>> _commandQueue = []; // 指令队列
// bool _isSendingCommand = false; // 是否正在发送指令
// Timer? _commandTimeoutTimer; // 指令超时定时器
// int _currentRetryCount = 0; // 当前重试次数
// Map<String, dynamic>? _currentCommand; // 当前正在发送的指令
// // 最大重试次数
// static const int _maxRetryCount = 3;
// // 超时时间(秒)
// static const int _commandTimeoutSeconds = 10;
// void startStatusPolling() {
// updateDeviceStatus().then((res) {
// if (res.code == HttpStatusCodes.ok) {
// updateAll();
// } else {
// safeShowNotification(res.msg ?? "获取设备状态异常".tr);
// EasyDartModule.logger.info("获取设备状态异常: $res");
// DailyLogUtils.writeLog("获取设备状态异常: $res");
// }
// });
// if (_statusTimer == null) {
// _statusTimer = Timer.periodic(Duration(seconds: 2), (timer) {
// updateDeviceStatus().then((res) {
// if (res.code == HttpStatusCodes.ok) {
// updateAll();
// } else {
// safeShowNotification(res.msg ?? "获取设备状态异常".tr);
// EasyDartModule.logger.info("获取设备状态异常: $res");
// DailyLogUtils.writeLog("获取设备状态异常: $res");
// }
// }).catchError((e, stack) {
// print("updateDeviceStatus 执行异常: $e\n$stack");
// safeShowNotification("设备状态请求失败".tr);
// EasyDartModule.logger.info("设备状态异常: $e");
// DailyLogUtils.writeLog("设备状态异常: $e");
// });
// });
// }
// }
// void stopStatusPolling() {
// _statusTimer?.cancel();
// _statusTimer = null;
// }
// var shouldScan = true.obs;
// void pauseScanning() {
// shouldScan.value = false;
// update();
// }
// // 恢复扫描
// void resumeScanning() {
// shouldScan.value = true;
// update();
// }
// Future<ApiResponse> updateDeviceStatus() async {
// try {
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.get_bluetooth_device_status;
// String queryUrl = "$serviceAddress$serviceName$serviceApi";
// if (model.blueRawData != null && model.blueRawData!.isNotEmpty) {
// final macParams = model.blueRawData!
// .map((device) =>
// "mac=${Uri.encodeQueryComponent(device.mac!.replaceAll(':', ''))}")
// .join("&");
// if (queryUrl.contains('?')) {
// queryUrl += '&$macParams';
// } else {
// queryUrl += '?$macParams';
// }
// String? language = "";
// if (mhLanguageController.selectLanguage != null) {
// language = mhLanguageController.selectLanguage.value!.language_code;
// }
// if (language != null && language.isNotEmpty) {
// if (queryUrl.contains("?")) {
// queryUrl += "&lang=$language";
// } else {
// queryUrl += "?lang=$language";
// }
// }
// var response = await EasyDartModule.dio.get(queryUrl);
// var responseData =
// response.data is String ? jsonDecode(response.data) : response.data;
// ApiResponse res =
// ApiResponse.fromJson(responseData, (object) => object);
// if (res.code != HttpStatusCodes.ok) return res;
// if (response.data['data'] != null && response.data['data'] is List) {
// List<dynamic> responseList = response.data['data'];
// // 新建一个 Map便于快速通过 mac 查找返回的设备状态
// final Map<String, dynamic> responseMap = {
// for (var item in responseList)
// item['mac'.tr].toString().toUpperCase(): item
// };
// // 遍历 blueRawData更新 bind 状态
// for (var device in model.blueRawData!) {
// final macKey = device.mac!.replaceAll(':', '').toUpperCase();
// if (responseMap.containsKey(macKey)) {
// var item = responseMap[macKey];
// // 更新 device 绑定状态等信息
// device.bind = item['bind'] ?? device.bind;
// device.mac = item['bindMac'] ?? device.mac;
// }
// }
// model.deviceDataStatus =
// List<BlueToothDataModel>.from(model.blueRawData!);
// } else {
// model.deviceDataStatus = [];
// }
// updateAll();
// return res;
// } else {
// model.deviceDataStatus = [];
// return ApiResponse(code: 1, msg: "".tr);
// }
// } catch (e) {
// print("获取设备状态异常: $e");
// EasyDartModule.logger.info("获取设备状态异常: $e");
// DailyLogUtils.writeLog("获取设备状态异常: $e");
// return ApiResponse(code: -1, msg: "请求失败".tr);
// }
// return ApiResponse(code: -1, msg: "未知错误".tr);
// }
// bindDeviceAndMAC(BlueToothDataModel bleDevice, BuildContext context) async {
// try {
// if ((bleDevice.macA == null || bleDevice.macA.isEmpty) &&
// (bleDevice.macB == null || bleDevice.macB.isEmpty)) {
// TopSlideNotification.show(context,
// text: "传感器mac读取失败".tr, textColor: themeController.currentColor.sc9);
// currentDeviceMac.value = "";
// return;
// }
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.device_bind;
// String queryUrl = "$serviceAddress$serviceName$serviceApi";
// var data = {
// "deviceType": model.deviceType,
// "mac".tr: bleDevice.mac,
// "macA": bleDevice.macA,
// if (bleDevice.macB != null && bleDevice.macB!.isNotEmpty)
// "macB": bleDevice.macB,
// if (bleDevice.name != null && bleDevice.name!.isNotEmpty)
// 'param': {
// 'name': bleDevice.name,
// },
// };
// EasyDartModule.logger.info("绑定传感器数据: $data");
// var response =
// await EasyDartModule.dio.post(queryUrl, data: jsonEncode(data));
// if (response != null) {
// var responseData =
// response.data is String ? jsonDecode(response.data) : response.data;
// ApiResponse res =
// ApiResponse.fromJson(responseData, (object) => object);
// MyUtils.formatResponse(res, "绑定成功".tr, "绑定成功".tr);
// if (res.code == HttpStatusCodes.ok) {
// // PersonController personController = Get.find();
// // personController.currentPersonId.value = res.data['id'];
// //todo 绑定成功需要返回传感器id
// currentDeviceMac.value = "";
// if (res.data != null) {
// if (currentFullDevice != null) {
// currentFullDevice!.macAID = res.data['macA'];
// currentFullDevice!.macBID = res.data['macB'];
// currentFullDevice!.deviceID = res.data['id'];
// }
// }
// return res;
// } else {
// return res;
// }
// } else {
// return ApiResponse(code: -1, msg: "服务器失败".tr);
// }
// } catch (e) {
// EasyDartModule.logger.info("绑定异常: $e");
// DailyLogUtils.writeLog("蓝牙绑定: $e");
// }
// return ApiResponse(code: -1, msg: "未知错误".tr);
// }
// Future<bool> saveHabitData(sleepData) async {
// bool resFlag = false;
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.user_setting;
// String type = "sleep_habit_${sleepData['mac']}";
// String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
// var data = {
// "type": type,
// "mac".tr: sleepData['mac'.tr],
// "time": DateTime.now().millisecondsSinceEpoch,
// "data": sleepData,
// };
// await requestWithLog(
// logTitle: "更新睡眠习惯".tr,
// method: MyHttpMethod.put,
// queryUrl: queryUrl,
// data: data,
// onSuccess: (res) {
// resFlag = true;
// },
// onFailure: (res) {
// resFlag = false;
// },
// );
// return resFlag;
// }
// Future<Map> loadHabitDataApi(String mac, {int time = 3}) async {
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.user_setting;
// String type = "sleep_habit_${mac}";
// String queryUrl =
// "${serviceAddress}${serviceName}${serviceApi}?type=${type}";
// // 使用 Future 来等待异步操作完成
// Map<String, dynamic> result = {};
// await requestWithLog(
// logTitle: "更新睡眠习惯".tr,
// method: MyHttpMethod.get,
// queryUrl: queryUrl,
// onSuccess: (res) {
// ef.log("加载睡眠习惯成功: ${res.data}");
// result = res.data; // 将返回的数据存入 result
// },
// onFailure: (res) {
// ef.log("加载睡眠习惯失败: ${res.msg}");
// result = {}; // 如果失败,可以返回空的 Map
// },
// );
// return result; // 在 requestWithLog 完成之后返回 result
// }
// saveJiYiData(sleepData) async {
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.user_setting;
// String type = "sleep_jiyi_${sleepData['mac']}";
// String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
// var data = {
// "type": type,
// "mac": sleepData['mac'],
// "time": DateTime.now().millisecondsSinceEpoch,
// "data": sleepData,
// };
// await requestWithLog(
// logTitle: "更新睡眠记忆",
// method: MyHttpMethod.put,
// queryUrl: queryUrl,
// data: data,
// );
// }
// loadJiYiData(String mac, {int time = 3}) async {
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.user_setting;
// String type = "sleep_jiyi_${mac}";
// String queryUrl =
// "${serviceAddress}${serviceName}${serviceApi}?type=${type}";
// // 使用 Future 来等待异步操作完成
// Map<String, dynamic> result = {};
// await requestWithLog(
// logTitle: "更新记忆",
// method: MyHttpMethod.get,
// queryUrl: queryUrl,
// onSuccess: (res) {
// ef.log("加载记忆成功: ${res.data}");
// result = res.data; // 将返回的数据存入 result
// },
// onFailure: (res) {
// ef.log("加载记忆失败: ${res.msg}");
// result = {}; // 如果失败,可以返回空的 Map
// },
// );
// return result; // 在 requestWithLog 完成之后返回 result
// }
// saveMattressTimeData(sleepData) async {
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.user_setting;
// String type = "sleep_new_time_${sleepData['mac']}";
// String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
// var data = {
// "type": type,
// "mac": sleepData['mac'],
// "time": DateTime.now().millisecondsSinceEpoch,
// "data": sleepData,
// };
// await requestWithLog(
// logTitle: "更新新版倒计时",
// method: MyHttpMethod.put,
// queryUrl: queryUrl,
// data: data,
// );
// }
// loadMattressTimeData(String mac, {int time = 3}) async {
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.user_setting;
// String type = "sleep_new_time_${mac}";
// String queryUrl =
// "${serviceAddress}${serviceName}${serviceApi}?type=${type}";
// // 使用 Future 来等待异步操作完成
// Map<String, dynamic> result = {};
// await requestWithLog(
// logTitle: "更新新版倒计时",
// method: MyHttpMethod.get,
// queryUrl: queryUrl,
// onSuccess: (res) {
// ef.log("更新新版倒计时成功: ${res.data}");
// result = res.data; // 将返回的数据存入 result
// },
// onFailure: (res) {
// ef.log("更新新版倒计时失败: ${res.msg}");
// result = {}; // 如果失败,可以返回空的 Map
// },
// );
// return result; // 在 requestWithLog 完成之后返回 result
// }
// // 修改后的下发wifi指令方法带队列、重试和超时机制
// void sendCommand(Map<String, dynamic> commandData) {
// if (commandData == null || commandData.isEmpty) {
// throw "指令数据不能为空";
// }
// // 忽略特定的空指令
// if (commandData['data'] == "FFFFFFFF00031000010014FD") {
// return;
// }
// // 将指令添加到队列
// _commandQueue.add(commandData);
// ef.log("指令已加入队列,当前队列长度: ${_commandQueue.length}");
// // 如果没有正在发送的指令,开始处理队列
// if (!_isSendingCommand) {
// _processNextCommand();
// }
// }
// // 处理下一条指令
// void _processNextCommand() {
// if (_commandQueue.isEmpty) {
// _isSendingCommand = false;
// _currentCommand = null;
// return;
// }
// _isSendingCommand = true;
// _currentRetryCount = 0;
// _currentCommand = _commandQueue.removeAt(0);
// _sendCommandWithRetry();
// }
// // 带重试机制的指令发送
// void _sendCommandWithRetry() {
// if (_currentCommand == null) return;
// ef.log(
// "开始发送指令,第 ${_currentRetryCount + 1} 次尝试,指令内容: ${_currentCommand!['data']}");
// // 设置超时定时器
// _commandTimeoutTimer?.cancel();
// _commandTimeoutTimer = Timer(Duration(seconds: _commandTimeoutSeconds), () {
// _handleCommandTimeout();
// });
// // 复制指令数据,避免修改原始数据
// Map<String, dynamic> commandToSend = Map.from(_currentCommand!);
// // 调用原有的发送逻辑
// _executeSendCommand(commandToSend);
// }
// // 执行实际的指令发送
// void _executeSendCommand(Map<String, dynamic> commandData) async {
// ef.log("下发指令内容为: ${commandData['data']}");
// // Base64编码处理
// commandData['data'] = Base64Tool.encode(commandData['data']);
// // 调试日志
// if (Base64Tool.decode(commandData['data']) != "FFFFFFFF00031000010014FD" &&
// Base64Tool.decode(commandData['data']).length <= 24) {
// ef.log("下发指令: ${Base64Tool.decode(commandData['data'])}");
// }
// ef.log("全部指令");
// commandData['wfr'] = false;
// commandData['type'] = 0; //0 base64数据 1 二进制数据
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.sendWifiCommand;
// String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
// ef.log("wifi指令控制下发时间-->${DateTime.now()}");
// try {
// await requestWithLog(
// logTitle: "下发wifi控制指令",
// method: MyHttpMethod.post,
// queryUrl: queryUrl,
// data: commandData,
// onSuccess: (res) {
// // 取消超时定时器
// _commandTimeoutTimer?.cancel();
// _commandTimeoutTimer = null;
// ef.log("下发指令成功: ${res.msg}");
// EasyDartModule.logger.info("下发wifi控制指令成功: $res");
// // 指令发送成功,但还需要等待设备回复
// // 注意:需要在收到设备回复时调用 onCommandResponse(true)
// // 如果设备回复通过其他方式通知,则在这里不处理,等待回调
// },
// onFailure: (res) {
// // 取消超时定时器
// _commandTimeoutTimer?.cancel();
// _commandTimeoutTimer = null;
// ef.log("下发指令失败: ${res.msg}");
// EasyDartModule.logger.info("下发wifi指令控制失败: ${res.msg}");
// // 处理失败,进行重试
// _handleCommandFailure("下发指令失败: ${res.msg}");
// },
// );
// } catch (e) {
// // 捕获未知异常
// _commandTimeoutTimer?.cancel();
// _commandTimeoutTimer = null;
// ef.log("下发指令异常: $e");
// EasyDartModule.logger.info("下发wifi控制指令异常: $e");
// _handleCommandFailure("下发指令异常: $e");
// }
// }
// // 处理指令超时
// void _handleCommandTimeout() {
// ef.log("指令发送超时");
// EasyDartModule.logger.info("指令发送超时");
// _commandTimeoutTimer = null;
// _handleCommandFailure("指令发送超时");
// }
// // 处理指令失败(重试逻辑)
// void _handleCommandFailure(String error) {
// _currentRetryCount++;
// if (_currentRetryCount < _maxRetryCount) {
// // 未达到最大重试次数,继续重试
// ef.log("指令失败,准备第 ${_currentRetryCount + 1} 次重试,失败原因: $error");
// _sendCommandWithRetry();
// } else {
// // 已达到最大重试次数,放弃当前指令,处理下一条
// ef.log("指令重试已达最大次数,放弃当前指令,失败原因: $error");
// EasyDartModule.logger.info("指令发送失败,已重试 $_maxRetryCount 次: $error");
// // 可以在这里显示错误通知
// safeShowNotification("指令发送失败: $error");
// // 继续处理下一条指令
// _processNextCommand();
// }
// }
// // 设备回复回调(需要在收到设备回复时调用此方法)
// void onCommandResponse(bool success, {String? error}) {
// if (!_isSendingCommand || _currentCommand == null) {
// ef.log("收到设备回复,但当前没有正在发送的指令");
// return;
// }
// // 取消超时定时器
// _commandTimeoutTimer?.cancel();
// _commandTimeoutTimer = null;
// if (success) {
// ef.log("设备回复成功,继续发送下一条指令");
// // 指令成功,重置重试计数,处理下一条
// _currentRetryCount = 0;
// _processNextCommand();
// } else {
// ef.log("设备回复失败: $error");
// // 设备回复失败,按失败处理(进行重试)
// _handleCommandFailure(error ?? "设备回复失败");
// }
// }
// // 清空指令队列(可用于页面退出时)
// void clearCommandQueue() {
// _commandQueue.clear();
// _commandTimeoutTimer?.cancel();
// _commandTimeoutTimer = null;
// _isSendingCommand = false;
// _currentCommand = null;
// _currentRetryCount = 0;
// ef.log("指令队列已清空");
// }
// //todo 解绑的时候删除自己所拥有的所有设备的睡眠习惯
// }
// void safeShowNotification(String msg) {
// try {
// final ctx = Get.context;
// if (ctx != null && ctx.mounted) {
// TopSlideNotification.show(
// ctx,
// text: msg,
// textColor: themeController.currentColor.sc9,
// );
// } else {
// print("TopSlideNotification 未显示context 不可用或未挂载".tr);
// }
// } catch (e, stack) {
// // print("TopSlideNotification 显示异常: $e\n$stack");
// }
// }

View File

@@ -22,6 +22,7 @@ import 'package:vbvs_app/pages/mh_page/device/controller/mht_bluetooth_controlle
import 'package:vbvs_app/pages/mh_page/device/mht_blueteeth_device_page.dart';
import 'package:vbvs_app/pages/mh_page/homepage/component/HomeDeviceStausWidget.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
import 'package:EasyDartModule/EasyDartModule.dart' as edm;
class WebviewTestModel {
WebviewTestModel();
@@ -494,15 +495,22 @@ class WebviewTestController extends GetControllerEx<WebviewTestModel> {
return;
}
if (tmp['data'] != null && tmp['data'] is Map) {
var newData = tmp['data'];
MHTBlueToothController mhtBlueToothController = Get.find();
edm.EasyDartModule.logger.info("收到设备数据:${newData['mac']}" +"wifi指令控制回复时间-->${DateTime.now()}");
ef.log("wifi指令控制回复时间-->${DateTime.now()}");
// mhtBlueToothController.onCommandResponse(true);
var newData = tmp['data'];
var mac = newData['mac'];
ef.log("收到设备数据:${newData['mac']}");
String order = Base64Tool.decode(newData['data']);
final webviewTestController = Get.find<WebviewTestController>();
if (mac != selectDevice['mac']) {
return;
}
// ef.log("切换设备调试:" + "当前选中设备:${selectDevice['mac']}" +""+"收到设备数据:${mac}");
webviewTestController.web.jsbridge?.dart
?.updateDeviceStatusByWifi(order);
?.updateDeviceStatusByWifi(order,mac);
}
} catch (e) {
ef.log("ws error =>$e");

View File

@@ -1,17 +1,13 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
import 'package:vbvs_app/component/tool/NewTopSlideNotification.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/date/CalendarController.dart';
import 'package:vbvs_app/controller/sleep/sleep_report_controller.dart';
import 'package:vbvs_app/controller/sleep/sleep_time_convert.dart';
import 'package:vbvs_app/pages/sleep_report/QcReportWidget.dart';
import 'package:vbvs_app/pages/sleep_report/chart/StatusBarWithIndicator.dart';
@@ -52,30 +48,16 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
@override
void initState() {
super.initState();
if (!Get.isRegistered<SleepReportController>(tag: widget.data["tag"])) {
Get.put(tag: widget.data["tag"], SleepReportController());
}
sleepReportController = Get.find(tag: widget.data["tag"]);
// sleepReportController.sleepReport.value = {};
if (widget.data['date'] == null) {
widget.data['date'] = DateTime.now().millisecondsSinceEpoch;
}
}
@override
Widget build(BuildContext context) {
// Future.microtask(() {
// _initSleepReportData();
// });
final healthLevelInfo = getHealthLevelInfo(widget.data);
double lineWidth = 150.rpx;
try {
return LayoutBuilder(
builder: (context, bodySize) => GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),,
child: Container(
decoration: BoxDecoration(
image: (widget.data['noBackImg'] != null &&
@@ -135,291 +117,263 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
),
body: SafeArea(
top: true,
child: Obx(() {
try {
var sleepReport = sleepReportController.sleepReport.value;
if (sleepReport == null || sleepReport.isEmpty) {
return SingleChildScrollView(
child: Column(
children: [
Padding(
padding: EdgeInsets.fromLTRB(
30.rpx, 30.rpx, 30.rpx, 26.rpx),
child: Container(
width: double.infinity,
constraints: BoxConstraints(
minHeight: 90.rpx, // 最小高度
),
decoration: BoxDecoration(
// color: themeController.currentColor.sc5, // 背景色
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 0.rpx, 0.rpx, 0.rpx),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
// 左侧图标
Container(
margin: EdgeInsets.only(right: 7.rpx),
child: Icon(
Icons.info_outline,
size: 26.rpx,
color:
themeController.currentColor.sc8,
),
),
// 中间可换行文字
Expanded(
child: Container(
margin:
EdgeInsets.only(right: 69.rpx),
child: Text(
'5分钟快速检测可能受到用户当前状态、过程中说话动作、精神紧张等情况影响数据仅供参考。'
.tr,
style: TextStyle(
fontFamily: 'Inter',
fontSize: AppConstants()
.smaller_text_fontSize,
color: themeController
.currentColor.sc8,
height: 1.4,
),
softWrap: true,
),
),
),
],
child: SingleChildScrollView(
child: Column(
children: [
Padding(
padding:
EdgeInsets.fromLTRB(30.rpx, 30.rpx, 30.rpx, 26.rpx),
child: Container(
width: double.infinity,
constraints: BoxConstraints(
minHeight: 90.rpx, // 最小高度
),
decoration: BoxDecoration(
// color: themeController.currentColor.sc5, // 背景色
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 0.rpx, 0.rpx, 0.rpx),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// 左侧图标
Container(
margin: EdgeInsets.only(right: 7.rpx),
child: Icon(
Icons.info_outline,
size: 26.rpx,
color: themeController.currentColor.sc8,
),
),
),
// 中间可换行文字
Expanded(
child: Container(
margin: EdgeInsets.only(right: 69.rpx),
child: Text(
'5分钟快速检测可能受到用户当前状态、过程中说话动作、精神紧张等情况影响数据仅供参考。'
.tr,
style: TextStyle(
fontFamily: 'Inter',
fontSize: AppConstants()
.smaller_text_fontSize,
color: themeController.currentColor.sc8,
height: 1.4,
),
softWrap: true,
),
),
),
],
),
Padding(
padding:
EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0),
child: Container(
),
),
),
Padding(
padding: EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0),
child: Container(
decoration: BoxDecoration(
color: themeController.currentColor.sc5,
borderRadius: BorderRadius.circular(16.rpx),
),
child: Column(
children: [
// 第一个容器 - 包含Row布局
Container(
width: double.infinity,
padding: EdgeInsets.all(30.rpx),
decoration: BoxDecoration(
color: themeController.currentColor.sc5,
// color: themeController.currentColor.sc5,
borderRadius: BorderRadius.circular(16.rpx),
),
child: Column(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// 第一个容器 - 包含Row布局
Container(
width: double.infinity,
padding: EdgeInsets.all(30.rpx),
decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
borderRadius:
BorderRadius.circular(16.rpx),
),
child: Row(
// 左边的Column包含五行文字
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
CrossAxisAlignment.start,
children: [
// 左边的Column包含五行文字
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'${widget.data['person']['name']} (${widget.data['person']['gender']} ${widget.data['person']['age'].toInt()}岁)',
style: TextStyle(
fontSize: AppConstants()
.bigger_text_fontSize,
color: themeController
.currentColor.sc3,
// fontWeight: FontWeight.bold,
),
),
SizedBox(height: 18.rpx),
Text(
"快检得分:".tr +
'${widget.data['score']['score'].toInt()}',
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
SizedBox(height: 18.rpx),
Row(
children: [
Text(
"健康等级:".tr,
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
Text(
healthLevelInfo['text'],
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: healthLevelInfo[
'color'],
),
),
],
),
SizedBox(height: 18.rpx),
Text(
"设备ID".tr +
'${widget.data['mac']}',
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
SizedBox(height: 18.rpx),
Text(
"快检时间:".tr +
'${MyUtils.timestampToDateString(widget.data['create_time'].toInt())}',
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
],
Text(
'${widget.data['person']['name']} (${widget.data['person']['gender']} ${widget.data['person']['age'].toInt()}岁)',
style: TextStyle(
fontSize: AppConstants()
.bigger_text_fontSize,
color: themeController
.currentColor.sc3,
// fontWeight: FontWeight.bold,
),
),
// SizedBox(width: 20.rpx), // 左边文字和右边图片的间距
// 右边的本地图片
Container(
width: 120.rpx,
height: 190.rpx,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(12.rpx),
image: DecorationImage(
image: AssetImage(
'assets/img/black_body_still.png'), // 替换为您的本地图片路径
fit: BoxFit.cover,
SizedBox(height: 18.rpx),
Text(
"快检得分:".tr +
'${widget.data['score']['score'].toInt()}',
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
SizedBox(height: 18.rpx),
Row(
children: [
Text(
"健康等级:".tr,
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
Text(
healthLevelInfo['text'],
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color:
healthLevelInfo['color'],
),
),
],
),
SizedBox(height: 18.rpx),
Text(
"设备ID".tr +
'${widget.data['mac']}',
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
SizedBox(height: 18.rpx),
Text(
"快检时间:".tr +
'${MyUtils.timestampToDateString(widget.data['create_time'].toInt())}',
style: TextStyle(
fontSize: AppConstants()
.small_an_text_fontSize,
color: themeController
.currentColor.sc3,
),
),
],
),
),
// SizedBox(width: 20.rpx), // 左边文字和右边图片的间距
SizedBox(height: 34.rpx), // 两个容器之间的间距
// 第二个容器 - 包含StatusBarWithIndicator todo接入报告数据
// 右边的本地图片
Container(
width: double.infinity,
// height: 220.rpx,
width: 120.rpx,
height: 190.rpx,
decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
borderRadius:
BorderRadius.circular(16.rpx),
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 20.rpx, 30.rpx, 20.rpx),
child: StatusBarWithIndicator(
selectKey: widget.data['score']
['level']
.toInt(), // 这里传入对应的 level 值
showLabel: (widget.data['type']
['score'] as List)
.map<Map<String, dynamic>>(
(item) {
return {
'key': item['level']?.toInt() ??
0, // 使用 level 作为 key
'name': item['name'] ?? '',
'color': stringToColor(
item['color'] ??
''), // 将颜色字符串转换为 Color
'range':
item['range'] ?? '', // 添加范围数据
};
}).toList(),
showCurrentValue: true, // 显示当前值
currentValueText:
'当前属于'.tr, // 或者根据实际值动态生成
showRange: true, // 显示范围
BorderRadius.circular(12.rpx),
image: DecorationImage(
image: AssetImage(
'assets/img/black_body_still.png'), // 替换为您的本地图片路径
fit: BoxFit.cover,
),
),
),
SizedBox(height: 25.rpx), // 两个容器之间的间距
],
),
),
),
Padding(
padding:
EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0),
child: Container(
SizedBox(height: 34.rpx), // 两个容器之间的间距
// 第二个容器 - 包含StatusBarWithIndicator todo接入报告数据
Container(
width: double.infinity,
// padding: EdgeInsets.all(30.rpx),
// height: 220.rpx,
decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
borderRadius: BorderRadius.circular(16.rpx),
),
child: QcReportWidget(widget.data),
),
),
Padding(
padding:
EdgeInsets.fromLTRB(46.rpx, 0, 46.rpx, 0),
child: Column(
children: [
// Text(
// "MAC号".tr +
// ": ${widget.data['mac'] ?? '未知数据'.tr}",
// style: TextStyle(
// color: themeController.currentColor.sc4,
// fontSize:
// AppConstants().smaller_text_fontSize,
// ),
// ),
SizedBox(
height: 4.rpx,
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 20.rpx, 30.rpx, 20.rpx),
child: StatusBarWithIndicator(
selectKey: widget.data['score']['level']
.toInt(), // 这里传入对应的 level 值
showLabel:
(widget.data['type']['score'] as List)
.map<Map<String, dynamic>>((item) {
return {
'key': item['level']?.toInt() ??
0, // 使用 level 作为 key
'name': item['name'] ?? '',
'color': stringToColor(item['color'] ??
''), // 将颜色字符串转换为 Color
'range': item['range'] ?? '', // 添加范围数据
};
}).toList(),
showCurrentValue: true, // 显示当前值
currentValueText: '当前属于'.tr, // 或者根据实际值动态生成
showRange: true, // 显示范围
),
Text(
"本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。"
.tr,
style: TextStyle(
color: themeController.currentColor.sc4,
fontSize:
AppConstants().smaller_text_fontSize,
),
),
],
),
),
),
SizedBox(
height: 40.rpx,
),
]
.divide(SizedBox(
height: 25.rpx,
))
.addToEnd(SizedBox(height: 25.rpx)),
SizedBox(height: 25.rpx), // 两个容器之间的间距
],
),
),
);
} else {
return Container();
}
} catch (e, s) {
ef.log('ERROR:$e$s');
}
return NullDataWidget();
}),
),
Padding(
padding: EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0),
child: Container(
width: double.infinity,
// padding: EdgeInsets.all(30.rpx),
decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
borderRadius: BorderRadius.circular(16.rpx),
),
child: QcReportWidget(widget.data),
),
),
Padding(
padding: EdgeInsets.fromLTRB(46.rpx, 0, 46.rpx, 0),
child: Column(
children: [
// Text(
// "MAC号".tr +
// ": ${widget.data['mac'] ?? '未知数据'.tr}",
// style: TextStyle(
// color: themeController.currentColor.sc4,
// fontSize:
// AppConstants().smaller_text_fontSize,
// ),
// ),
SizedBox(
height: 4.rpx,
),
Text(
"本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。"
.tr,
style: TextStyle(
color: themeController.currentColor.sc4,
fontSize: AppConstants().smaller_text_fontSize,
),
),
],
),
),
SizedBox(
height: 40.rpx,
),
]
.divide(SizedBox(
height: 25.rpx,
))
.addToEnd(SizedBox(height: 25.rpx)),
),
),
),
),
),
@@ -434,42 +388,6 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
}
}
Future<void> loadSleepReport(int type) async {
if (sleepReportController.isLoading.value) return;
sleepReportController.model.type = type;
sleepReportController.isLoading.value = true;
String data = MyUtils.formatDate(calendarController.selectedDate.value!);
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.sleep_report;
String queryUrl =
"$serviceAddress$serviceName$serviceApi?mac=${widget.data['mac']}&time=$data&type=$type&sleepType=2";
await requestWithLog(
logTitle: "查询睡眠报告",
method: MyHttpMethod.get,
// queryUrl:
// "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=$data&type=$type",
queryUrl: queryUrl,
onSuccess: (res) {
final sleepData = Map<String, dynamic>.from(res.data);
// 处理时区转换
applyTimezoneConversion(sleepData);
sleepReportController.sleepReport.value = sleepData;
},
onFailure: (res) {
TopSlideNotification.show(
context,
text: res.msg!,
textColor: themeController.currentColor.sc9,
);
sleepReportController.sleepReport.value = {};
},
);
sleepReportController.isLoading.value = false;
sleepReportController.updateAll();
}
// 获取健康等级信息的方法
Map<String, dynamic> getHealthLevelInfo(Map data) {
// 默认值