更新快检功能必传mac参数

This commit is contained in:
wyf
2026-03-14 10:44:28 +08:00
parent 6472baf993
commit 2d28a550bd
28 changed files with 1993 additions and 795 deletions

BIN
assets/img/heartpointEx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -653,6 +653,8 @@
"快检中...": "Quick Checking...", "快检中...": "Quick Checking...",
"体验异常结束": "Abnormal experience ended", "体验异常结束": "Abnormal experience ended",
"是否确认结束?": "Are you sure to end?", "是否确认结束?": "Are you sure to end?",
"当前设备已离线,无法快检!": "The current device is offline and cannot be checked!",
"设备正在快检中,请稍后再试!": "The device is currently checking, please try again later!",
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "Usage Instructions:When using the Health Quick Check function, the user only needs to lie flat or sit above the vital signs sensor while it is operating normally, remain still, and then tap **“Start Quick Check.”", "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "Usage Instructions:When using the Health Quick Check function, the user only needs to lie flat or sit above the vital signs sensor while it is operating normally, remain still, and then tap **“Start Quick Check.”",
"注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。": "Note:This report is generated based on physiological waveform data such as heart rate and respiration, analyzed using an AI algorithm model. The results are for reference only. Sections of the report showing no abnormal data do not necessarily indicate the absence of potential health risks. If you feel unwell, please seek medical attention promptly.", "注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。": "Note:This report is generated based on physiological waveform data such as heart rate and respiration, analyzed using an AI algorithm model. The results are for reference only. Sections of the report showing no abnormal data do not necessarily indicate the absence of potential health risks. If you feel unwell, please seek medical attention promptly.",
"Copyright © 2020-2030 东华智能睡眠中心 版权所有": "Copyright © 2020-2030 Donghua Smart Sleep Center All Rights Reserved" "Copyright © 2020-2030 东华智能睡眠中心 版权所有": "Copyright © 2020-2030 Donghua Smart Sleep Center All Rights Reserved"

View File

@@ -652,6 +652,8 @@
"快检时间:": "快检时间:", "快检时间:": "快检时间:",
"快检中...": "快检中...", "快检中...": "快检中...",
"体验异常结束": "体验异常结束", "体验异常结束": "体验异常结束",
"当前设备已离线,无法快检!": "当前设备已离线,无法快检!",
"设备正在快检中,请稍后再试!": "设备正在快检中,请稍后再试!",
"是否确认结束?": "是否确认结束?", "是否确认结束?": "是否确认结束?",
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。", "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。",
"注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。":"注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。", "注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。":"注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。",

View File

@@ -651,6 +651,8 @@
"快检中...": "快檢中...", "快检中...": "快檢中...",
"体验异常结束": "體驗異常結束", "体验异常结束": "體驗異常結束",
"是否确认结束?": "是否確認結束?", "是否确认结束?": "是否確認結束?",
"当前设备已离线,无法快检!": "當前設備已離線,無法快檢! ",
"设备正在快检中,请稍后再试!": "當前設備正在快檢中,請稍後再試!",
"注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。": "注意本頁報告基於心率、呼吸等體徵波形數據通過AI算法模型分析完成其結果僅供參考其中報告未見數據異常部分並不表示沒有潛在的疾病風險如有不適請即時就医。", "注本页报告是基于心率、呼吸等体征波形数据通过AI算法模型分析完成其结果仅供参考其中报告未见数据异常部分并不代表没有潜在性的疾病风险如有不适请及时就医。": "注意本頁報告基於心率、呼吸等體徵波形數據通過AI算法模型分析完成其結果僅供參考其中報告未見數據異常部分並不表示沒有潛在的疾病風險如有不適請即時就医。",
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能時,只需平躺或坐在正常運行中的體徵传感器传感器上方,保持靜止,然後點擊“啟動快檢”,待進度條完成,即可得出快檢報告。", "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能時,只需平躺或坐在正常運行中的體徵传感器传感器上方,保持靜止,然後點擊“啟動快檢”,待進度條完成,即可得出快檢報告。",
"Copyright © 2020-2030 东华智能睡眠中心 版权所有": " 版權所有©2020-2030 東華智能睡眠中心" "Copyright © 2020-2030 东华智能睡眠中心 版权所有": " 版權所有©2020-2030 東華智能睡眠中心"

View File

@@ -233,7 +233,7 @@
"输入wifi密码": "输入wifi密码", "输入wifi密码": "输入wifi密码",
"配网成功": "配网成功", "配网成功": "配网成功",
"配网失败": "配网失败", "配网失败": "配网失败",
"4g设备配置wifi提示": "4g设备配置wifi提示", "4g设备配置wifi提示": "该设备为4G设备无需配置wifi",
"获取设备网络类型失败": "获取设备网络类型失败", "获取设备网络类型失败": "获取设备网络类型失败",
"刷新": "刷新", "刷新": "刷新",
"获取wifi列表成功": "获取wifi列表成功", "获取wifi列表成功": "获取wifi列表成功",

Binary file not shown.

View File

@@ -8,8 +8,8 @@ import 'package:vbvs_app/enum/APPPackageType.dart';
class AppConstants { class AppConstants {
// App-related constants // App-related constants
static const String zhmht_app_version = "SWES_1.2026.3.6"; //眠花糖 static const String zhmht_app_version = "SWES_1.2026.3.12"; //眠花糖
static const String theh_app_version = "1.2601.12"; //太和 static const String theh_app_version = "1.2603.11"; //太和
// 1. 纯字符串列表格式 // 1. 纯字符串列表格式
static const List<String> integerTimeZones = [ static const List<String> integerTimeZones = [

View File

@@ -9,6 +9,7 @@ import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart'; import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/NewTopSlideNotification.dart';
import 'package:vbvs_app/controller/setting/language/language_controller.dart'; import 'package:vbvs_app/controller/setting/language/language_controller.dart';
import 'package:vbvs_app/enum/APPPackageType.dart'; import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/model/api_response.dart'; import 'package:vbvs_app/model/api_response.dart';
@@ -46,10 +47,13 @@ class DeviceTypeController extends GetControllerEx<DeviceTypeModel> {
RxList cqHistoryList = [].obs; RxList cqHistoryList = [].obs;
RxMap currentCq = {}.obs; RxMap currentCq = {}.obs;
LanguageController languageController = Get.find(); LanguageController languageController = Get.find();
// 404:未找到快检信息 200:快检进行中 201:快检完成 202:快检超时 203:已取消 500:计算错误 // 404:未找到快检信息 200:快检进行中 201:快检完成 202:快检超时 203:已取消 500:计算错误 501 有效数据不足
RxInt experience_status = 404.obs; RxInt experience_status = 404.obs;
RxInt experience_percent = 0.obs; //体验进度 RxInt experience_percent = 0.obs; //体验进度
RxString experience_id = "".obs; //体验id RxString experience_id = "".obs; //体验id
RxBool own = false.obs; //体验id
RxString errmsg = "".obs;
RxBool qcListLoading = true.obs;
Future<ApiResponse> getDeviceType() async { Future<ApiResponse> getDeviceType() async {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr); ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr);
@@ -112,23 +116,37 @@ class DeviceTypeController extends GetControllerEx<DeviceTypeModel> {
experience_status.value = res.data['status']; experience_status.value = res.data['status'];
experience_percent.value = res.data['per'] ?? 0; experience_percent.value = res.data['per'] ?? 0;
experience_id.value = res.data['id'] ?? ""; experience_id.value = res.data['id'] ?? "";
own.value = res.data['own'] ?? false;
updateAll(); updateAll();
}, },
onFailure: (res) { onFailure: (res) {
flag = false; flag = false;
experience_status.value = -1;
}, },
); );
return flag; return flag;
} }
Future<bool> getCheckHistory({String? id}) async { Future<bool> getCheckHistory({required String mac, String? id}) async {
qcListLoading.value = true;
String serviceAddress = ServiceConstant.qc_service_address; String serviceAddress = ServiceConstant.qc_service_address;
String serviceApi = ServiceConstant.getCheckHistory; String serviceApi = ServiceConstant.getCheckHistory;
String queryUrl = "$serviceAddress$serviceApi"; String queryUrl = "$serviceAddress$serviceApi";
// 如果id不为空拼接到url上 // 构建查询参数
List<String> params = [];
// 添加mac参数必选
params.add("mac=$mac");
// 如果id不为空添加到参数列表
if (id != null && id.isNotEmpty) { if (id != null && id.isNotEmpty) {
queryUrl = "$queryUrl?id=$id"; params.add("id=$id");
}
// 如果有参数拼接到url上
if (params.isNotEmpty) {
queryUrl = "$queryUrl?${params.join('&')}";
} }
bool flag = false; bool flag = false;
@@ -146,11 +164,15 @@ class DeviceTypeController extends GetControllerEx<DeviceTypeModel> {
// 如果是Map赋值给currentCq // 如果是Map赋值给currentCq
currentCq.value = res.data as Map<String, dynamic>; currentCq.value = res.data as Map<String, dynamic>;
} }
qcListLoading.value = false;
updateAll(); updateAll();
}, },
onFailure: (res) { onFailure: (res) {
flag = false; flag = false;
qcListLoading.value = false;
currentCq.value = {}; currentCq.value = {};
NewTopSlideNotification.show(
text: "数据加载失败", textColor: themeController.currentColor.sc9);
}, },
); );
return flag; return flag;

View File

@@ -0,0 +1,154 @@
import 'package:ef/ef.dart';
enum APPQuickCheckStatus {
notFound, // 404: 未找到快检信息
inProgress, // 200: 快检进行中
completed, // 201: 快检完成
timeout, // 202: 快检超时
cancelled, // 203: 已取消
calculateError, // 500: 计算错误
insufficientData, // 501: 有效数据不足
}
extension APPQuickCheckStatusExtension on APPQuickCheckStatus {
/// 获取整型值
int get value {
switch (this) {
case APPQuickCheckStatus.notFound:
return 404;
case APPQuickCheckStatus.inProgress:
return 200;
case APPQuickCheckStatus.completed:
return 201;
case APPQuickCheckStatus.timeout:
return 202;
case APPQuickCheckStatus.cancelled:
return 203;
case APPQuickCheckStatus.calculateError:
return 500;
case APPQuickCheckStatus.insufficientData:
return 501;
}
}
/// 根据整型值解析为枚举
static APPQuickCheckStatus? fromInt(int? type) {
switch (type) {
case 404:
return APPQuickCheckStatus.notFound;
case 200:
return APPQuickCheckStatus.inProgress;
case 201:
return APPQuickCheckStatus.completed;
case 202:
return APPQuickCheckStatus.timeout;
case 203:
return APPQuickCheckStatus.cancelled;
case 500:
return APPQuickCheckStatus.calculateError;
case 501:
return APPQuickCheckStatus.insufficientData;
default:
return null;
}
}
/// 根据整型值返回对应名称字符串
static String? nameFromInt(int? type) {
final status = fromInt(type);
return status?.description;
}
/// 获取描述文本
String get description {
switch (this) {
case APPQuickCheckStatus.notFound:
return "未找到快检信息".tr;
case APPQuickCheckStatus.inProgress:
return "快检进行中".tr;
case APPQuickCheckStatus.completed:
return "快检完成".tr;
case APPQuickCheckStatus.timeout:
return "快检超时".tr;
case APPQuickCheckStatus.cancelled:
return "已取消".tr;
case APPQuickCheckStatus.calculateError:
return "计算错误".tr;
case APPQuickCheckStatus.insufficientData:
return "有效数据不足".tr;
}
}
/// 判断是否为结束状态(已完成、错误、超时、取消等)
bool get isFinished {
switch (this) {
case APPQuickCheckStatus.completed:
case APPQuickCheckStatus.timeout:
case APPQuickCheckStatus.cancelled:
case APPQuickCheckStatus.calculateError:
case APPQuickCheckStatus.insufficientData:
return true;
case APPQuickCheckStatus.inProgress:
case APPQuickCheckStatus.notFound:
return false;
}
}
/// 判断是否为错误状态
bool get isError {
switch (this) {
case APPQuickCheckStatus.timeout:
case APPQuickCheckStatus.cancelled:
case APPQuickCheckStatus.calculateError:
case APPQuickCheckStatus.insufficientData:
return true;
case APPQuickCheckStatus.completed:
case APPQuickCheckStatus.inProgress:
case APPQuickCheckStatus.notFound:
return false;
}
}
/// 下拉选项用 - label 列表(展示)
static List<String> get labelList =>
APPQuickCheckStatus.values.map((e) => e.description).toList();
/// 下拉选项用 - value 列表(对应值)
static List<int> get valueList =>
APPQuickCheckStatus.values.map((e) => e.value).toList();
/// 下拉选项用 - map 列表
static List<Map<String, dynamic>> get list => APPQuickCheckStatus.values
.map((e) => {"id": e.value, "name": e.description})
.toList();
/// 获取指定状态的列表(可过滤)
static List<Map<String, dynamic>> getFilteredList({
bool includeNotFound = true,
bool includeInProgress = true,
bool includeCompleted = true,
bool includeTimeout = true,
bool includeCancelled = true,
bool includeCalculateError = true,
bool includeInsufficientData = true,
}) {
final List<APPQuickCheckStatus> filteredStatus = [];
if (includeNotFound) filteredStatus.add(APPQuickCheckStatus.notFound);
if (includeInProgress) filteredStatus.add(APPQuickCheckStatus.inProgress);
if (includeCompleted) filteredStatus.add(APPQuickCheckStatus.completed);
if (includeTimeout) filteredStatus.add(APPQuickCheckStatus.timeout);
if (includeCancelled) filteredStatus.add(APPQuickCheckStatus.cancelled);
if (includeCalculateError)
filteredStatus.add(APPQuickCheckStatus.calculateError);
if (includeInsufficientData)
filteredStatus.add(APPQuickCheckStatus.insufficientData);
return filteredStatus
.map((e) => {
"id": e.value,
"name": e.description,
})
.toList();
}
}

View File

@@ -718,6 +718,7 @@ void initEasyDartModule() {
if (call != null) { if (call != null) {
try { try {
if (json['path'] != "/smartbed/connect") { if (json['path'] != "/smartbed/connect") {
ef.log("[实时数据更新]");
call(json["data"]); call(json["data"]);
} else { } else {
call(json); call(json);

View File

@@ -20,6 +20,7 @@ import 'package:vbvs_app/component/tool/ToggleColorContainer.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/device/blueteeth_bind_controller.dart'; import 'package:vbvs_app/controller/device/blueteeth_bind_controller.dart';
import 'package:vbvs_app/controller/device/body_device_controller.dart'; import 'package:vbvs_app/controller/device/body_device_controller.dart';
import 'package:vbvs_app/controller/device/device_type_controller.dart';
import 'package:vbvs_app/controller/person/person_controller.dart'; import 'package:vbvs_app/controller/person/person_controller.dart';
import 'package:vbvs_app/enum/BindType.dart'; import 'package:vbvs_app/enum/BindType.dart';
import 'package:vbvs_app/model/api_response.dart'; import 'package:vbvs_app/model/api_response.dart';
@@ -118,7 +119,7 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
// widget.device['bind_type'] == BindType.active.code ? 9 : 5; // widget.device['bind_type'] == BindType.active.code ? 9 : 5;
final itemCount = widget.device['bind_type'] == BindType.active.code final itemCount = widget.device['bind_type'] == BindType.active.code
? 9 ? 9
: (getWifiPermissionByOpType(widget.device) ? 6 : 5); : (getWifiPermissionByOpType(widget.device) ? 7 : 6);
final estimatedPopupHeight = final estimatedPopupHeight =
(itemCount * estimatedItemHeight) + 40.rpx; // 加上padding (itemCount * estimatedItemHeight) + 40.rpx; // 加上padding
@@ -1222,6 +1223,25 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
child: CustomCard( child: CustomCard(
borderRadius: AppConstants().button_container_radius, borderRadius: AppConstants().button_container_radius,
onTap: () async { onTap: () async {
// bool online = widget.device['status']['status'] == 1;
// if (!online) {
// NewTopSlideNotification.show(
// text: "当前设备已离线,无法快检!".tr,
// textColor: themeController.currentColor.sc9);
// return;
// }
DeviceTypeController deviceTypeController =
Get.find();
await deviceTypeController
.checkReportStatus(widget.device['mac']);
// if (deviceTypeController.experience_status.value ==
// 200 &&
// !deviceTypeController.own.value) {
// NewTopSlideNotification.show(
// text: "设备正在快检中,请稍后再试!".tr,
// textColor: themeController.currentColor.sc9);
// return;
// }
await Get.toNamed("/healthCheckPage", await Get.toNamed("/healthCheckPage",
arguments: widget.device); arguments: widget.device);
}, },

View File

@@ -96,7 +96,7 @@ class _HealthReportCardWidgetState extends State<HealthReportCardWidget> {
String ID = reportData['id']; String ID = reportData['id'];
DeviceTypeController deviceTypeController = DeviceTypeController deviceTypeController =
Get.find(); Get.find();
await deviceTypeController.getCheckHistory(id: ID); await deviceTypeController.getCheckHistory(id: ID,mac: reportData['mac']);
if (deviceTypeController.currentCq.value == null || if (deviceTypeController.currentCq.value == null ||
deviceTypeController.currentCq.value.isEmpty) { deviceTypeController.currentCq.value.isEmpty) {
NewTopSlideNotification.show( NewTopSlideNotification.show(

View File

@@ -20,6 +20,7 @@ import 'package:vbvs_app/controller/device/device_type_controller.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/enum/APPQuickCheckStatus.dart';
import 'package:vbvs_app/model/WebSocketMessage.dart'; import 'package:vbvs_app/model/WebSocketMessage.dart';
import 'package:vbvs_app/pages/device/component/DeviceStatusInfoWidget.dart'; import 'package:vbvs_app/pages/device/component/DeviceStatusInfoWidget.dart';
import 'package:vbvs_app/pages/device_bind/componnet/CalibrationProgressWidget.dart'; import 'package:vbvs_app/pages/device_bind/componnet/CalibrationProgressWidget.dart';
@@ -68,13 +69,22 @@ class _HealthCheckPageState extends State<HealthCheckPage>
_isInitialized = true; _isInitialized = true;
}); });
// 如果当前状态是体验中,启动定时器 // 如果当前状态是体验中,启动定时器
if (deviceTypeController.experience_status.value == 200) { if (deviceTypeController.experience_status.value == 200 &&
deviceTypeController.own.value) {
_startCheckStatusTimer(); _startCheckStatusTimer();
} }
}); });
} catch (e) { } catch (e) {
ef.log("快检初始化数据失败"); ef.log("快检初始化数据失败");
} }
_initWebSocket();
super.initState();
}
Future<void> _initWebSocket() async {
// 发送WebSocket请求
try { try {
Future.delayed(Duration(seconds: 0), () { Future.delayed(Duration(seconds: 0), () {
CommonVariables.callMap["/vsbs/web/rt/marttress"] = (data) { CommonVariables.callMap["/vsbs/web/rt/marttress"] = (data) {
@@ -128,13 +138,6 @@ class _HealthCheckPageState extends State<HealthCheckPage>
edm.EasyDartModule.logger edm.EasyDartModule.logger
.error("[webscoekt]格式化数据错误-->${{"mac": widget.personInfo['mac']}}"); .error("[webscoekt]格式化数据错误-->${{"mac": widget.personInfo['mac']}}");
} }
_initWebSocket();
super.initState();
}
void _initWebSocket() {
// 发送WebSocket请求
if (widget.personInfo['status'] != null) { if (widget.personInfo['status'] != null) {
try { try {
onlineState = onlineState =
@@ -151,6 +154,11 @@ class _HealthCheckPageState extends State<HealthCheckPage>
.info("[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}"); .info("[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}");
DailyLogUtils.writeLog( DailyLogUtils.writeLog(
"[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}"); "[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}");
edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage(
path: "/vsbs/web/rt/marttress",
type: 1,
data: {"mac": widget.personInfo['mac']})));
await Future.delayed(Duration(seconds: 3));
edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage( edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage(
path: "/vsbs/web/rt/marttress", path: "/vsbs/web/rt/marttress",
type: 1, type: 1,
@@ -177,12 +185,14 @@ class _HealthCheckPageState extends State<HealthCheckPage>
edm.EasyDartModule.logger.info("app切回页面重连websocket"); edm.EasyDartModule.logger.info("app切回页面重连websocket");
_initWebSocket(); _initWebSocket();
_initWebSocket();
// 重新查询状态,然后根据状态决定是否启动定时器 // 重新查询状态,然后根据状态决定是否启动定时器
deviceTypeController deviceTypeController
.checkReportStatus(widget.personInfo['mac']) .checkReportStatus(widget.personInfo['mac'])
.then((_) { .then((_) {
// 如果当前状态是体验中,重新启动定时器 // 如果当前状态是体验中,重新启动定时器
if (deviceTypeController.experience_status.value != 404) { if (deviceTypeController.experience_status.value != 404 &&
deviceTypeController.own.value) {
_startCheckStatusTimer(); _startCheckStatusTimer();
} }
}); });
@@ -258,7 +268,9 @@ class _HealthCheckPageState extends State<HealthCheckPage>
child: returnIconButtom, child: returnIconButtom,
), ),
Obx(() { Obx(() {
return deviceTypeController.experience_status.value != 200 return deviceTypeController.experience_status.value !=
200 ||
!deviceTypeController.own.value
? Positioned( ? Positioned(
right: 0.rpx, right: 0.rpx,
child: ClickableContainer( child: ClickableContainer(
@@ -324,7 +336,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
children: [ children: [
if (deviceTypeController if (deviceTypeController
.experience_status.value != .experience_status.value !=
200) 200 ||
!deviceTypeController.own.value)
Padding( Padding(
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 0.rpx, 30.rpx, 100.rpx), 30.rpx, 0.rpx, 30.rpx, 100.rpx),
@@ -1222,7 +1235,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
), ),
if (deviceTypeController if (deviceTypeController
.experience_status.value == .experience_status.value ==
200) 200 &&
deviceTypeController.own.value)
Padding( Padding(
padding: padding:
EdgeInsets.fromLTRB(46.rpx, 0, 46.rpx, 0), EdgeInsets.fromLTRB(46.rpx, 0, 46.rpx, 0),
@@ -1275,7 +1289,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
child: SingleChildScrollView( child: SingleChildScrollView(
child: deviceTypeController child: deviceTypeController
.experience_status.value != .experience_status.value !=
200 200 ||
!deviceTypeController.own.value
? Container() ? Container()
: Column( : Column(
children: [ children: [
@@ -1404,7 +1419,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
)), )),
if (deviceTypeController if (deviceTypeController
.experience_status.value != .experience_status.value !=
200) 200 ||
!deviceTypeController.own.value)
ClickableContainer( ClickableContainer(
backgroundColor: backgroundColor:
Colors.transparent, // 可自定义背景色 Colors.transparent, // 可自定义背景色
@@ -1470,7 +1486,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
), ),
if (deviceTypeController if (deviceTypeController
.experience_status.value != .experience_status.value !=
200) 200 ||
!deviceTypeController.own.value)
Padding( Padding(
padding: EdgeInsets.fromLTRB( padding: EdgeInsets.fromLTRB(
100.rpx, 0, 100.rpx, 0), 100.rpx, 0, 100.rpx, 0),
@@ -1484,7 +1501,24 @@ class _HealthCheckPageState extends State<HealthCheckPage>
await deviceTypeController await deviceTypeController
.checkReportStatus( .checkReportStatus(
widget.personInfo['mac']); widget.personInfo['mac']);
if (!canStart) { // if (!canStart) {
// NewTopSlideNotification.show(
// text: "设备正在快检中,请稍后再试!".tr,
// textColor: themeController
// .currentColor.sc9);
// return;
// }
if (!deviceTypeController.own.value &&
deviceTypeController
.experience_status
.value ==
APPQuickCheckStatus
.inProgress.value) {
NewTopSlideNotification.show(
text: "设备正在快检中,请稍后再试!".tr,
textColor: themeController
.currentColor.sc9);
return; return;
} }
bool opRes = bool opRes =
@@ -1543,7 +1577,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
), ),
if (deviceTypeController if (deviceTypeController
.experience_status.value == .experience_status.value ==
200) 200 &&
deviceTypeController.own.value)
Padding( Padding(
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
100.rpx, 0.rpx, 100.rpx, 60.rpx), 100.rpx, 0.rpx, 100.rpx, 60.rpx),
@@ -1554,7 +1589,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
), ),
if (deviceTypeController if (deviceTypeController
.experience_status.value == .experience_status.value ==
200) 200 &&
deviceTypeController.own.value)
Padding( Padding(
padding: EdgeInsets.fromLTRB( padding: EdgeInsets.fromLTRB(
100.rpx, 0, 100.rpx, 0), 100.rpx, 0, 100.rpx, 0),
@@ -1702,7 +1738,8 @@ class _HealthCheckPageState extends State<HealthCheckPage>
progressNotifier.value = progressNotifier.value =
deviceTypeController.experience_percent.value.toDouble(); deviceTypeController.experience_percent.value.toDouble();
deviceTypeController.updateAll(); deviceTypeController.updateAll();
if (deviceTypeController.experience_status.value == 201) { if (deviceTypeController.experience_status.value ==
APPQuickCheckStatus.completed.value) {
//体验正常结束 //体验正常结束
deviceTypeController.experience_status.value = 404; deviceTypeController.experience_status.value = 404;
deviceTypeController.experience_status.value = 0; deviceTypeController.experience_status.value = 0;
@@ -1710,24 +1747,60 @@ class _HealthCheckPageState extends State<HealthCheckPage>
edm.EasyDartModule.logger.info("快检结束,停止定时查询"); edm.EasyDartModule.logger.info("快检结束,停止定时查询");
_checkStatusTimer?.cancel(); _checkStatusTimer?.cancel();
await deviceTypeController.getCheckHistory( await deviceTypeController.getCheckHistory(
id: deviceTypeController.experience_id.value); id: deviceTypeController.experience_id.value,mac: widget.personInfo['mac']);
Get.toNamed('/healthQuickCheckReportPage', Get.toNamed('/healthQuickCheckReportPage',
arguments: deviceTypeController.currentCq.value); arguments: deviceTypeController.currentCq.value);
} }
if (deviceTypeController.experience_status.value != 200 && // if (deviceTypeController.experience_status.value != APPQuickCheckStatus.inProgress.value &&
deviceTypeController.experience_status.value != 201 && // deviceTypeController.experience_status.value != 201 &&
deviceTypeController.experience_status.value != 404 && // deviceTypeController.experience_status.value != 404 &&
deviceTypeController.experience_status.value != 203) { // deviceTypeController.experience_status.value != 203) {
// //体验异常结束
// deviceTypeController.experience_status.value = 404;
// deviceTypeController.experience_percent.value = 0;
// progressNotifier.value = 0;
// edm.EasyDartModule.logger.info("快检结束,停止定时查询");
// _checkStatusTimer?.cancel();
// // NewTopSlideNotification.show(
// // text:
// // "体验异常结束".tr,
// // textColor: themeController.currentColor.sc9);
// }
if (deviceTypeController.experience_status.value ==
APPQuickCheckStatus.timeout.value ||
deviceTypeController.experience_status.value ==
APPQuickCheckStatus.calculateError.value ||
deviceTypeController.experience_status.value ==
APPQuickCheckStatus.insufficientData.value) {
// 根据状态码获取对应的枚举
APPQuickCheckStatus? status = APPQuickCheckStatusExtension.fromInt(
deviceTypeController.experience_status.value);
// 获取对应的状态描述文字
String statusMessage = status?.description ?? "体验异常结束".tr;
//体验异常结束 //体验异常结束
deviceTypeController.experience_status.value = 404; deviceTypeController.experience_status.value = 404;
deviceTypeController.experience_percent.value = 0; deviceTypeController.experience_percent.value = 0;
progressNotifier.value = 0; progressNotifier.value = 0;
edm.EasyDartModule.logger.info("快检结束,停止定时查询"); edm.EasyDartModule.logger
.info("快检结束,停止定时查询 - 状态: ${status?.description}");
_checkStatusTimer?.cancel(); _checkStatusTimer?.cancel();
// NewTopSlideNotification.show( // NewTopSlideNotification.show(
// text: // text: statusMessage,
// "体验异常结束".tr,
// textColor: themeController.currentColor.sc9); // textColor: themeController.currentColor.sc9);
await showTipDialog(
context,
Text(
statusMessage,
style: TextStyle(
color: Colors.white,
),
),
);
}
if (!deviceTypeController.own.value) {
_checkStatusTimer?.cancel();
} }
}); });
} }

View File

@@ -25,7 +25,12 @@ class _HealthExperienceHistoryState extends State<HealthExperienceHistory> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
loadData(widget.data);
WidgetsBinding.instance.addPostFrameCallback((_) {
loadData(widget.data).then((aa) {
deviceTypeController.updateAll();
});
});
} }
@override @override
@@ -35,6 +40,7 @@ class _HealthExperienceHistoryState extends State<HealthExperienceHistory> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
try {
return LayoutBuilder( return LayoutBuilder(
builder: (context, bodysize) => GestureDetector( builder: (context, bodysize) => GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),, // onTap: () => FocusScope.of(context).unfocus(),,
@@ -86,38 +92,45 @@ class _HealthExperienceHistoryState extends State<HealthExperienceHistory> {
child: Padding( child: Padding(
padding: padding:
EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 0), EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 0),
child: Column( child: Obx(() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
if (deviceTypeController.qcListLoading.value)
Center(
child: CircularProgressIndicator(
strokeWidth: 2,
valueColor: AlwaysStoppedAnimation<Color>(
themeController.currentColor.sc1,
),
),
),
if (!deviceTypeController.qcListLoading.value)
Expanded( Expanded(
child: Obx(() { child: Obx(() {
final list = deviceTypeController.cqHistoryList.value; final list =
deviceTypeController.cqHistoryList.value;
return list.isEmpty return list.isEmpty
? const NullDataWidget() ? const NullDataWidget()
: _buildMessageListView(list); : _buildMessageListView(list);
}), }),
), ),
], ],
), );
}),
), ),
), ),
), ),
), ),
), ),
); );
} catch (e) {
return Container();
}
} }
Future<void> loadData(data) async { Future<void> loadData(data) async {
//todo 请求历史体征数据 deviceTypeController.getCheckHistory(mac: data['mac']);
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.message_list;
// String queryUrl =
// "${serviceAddress}${serviceName}${serviceApi}?type=app_vsm&mac=${data['mac']}";
// ApiResponse apiResponse = await requestWithLog(
// logTitle: "查询消息回看数据", method: MyHttpMethod.get, queryUrl: queryUrl);
// messageReviewController.messageList.value = apiResponse.data;
// messageReviewController.updateAll();
deviceTypeController.getCheckHistory();
} }
Widget _buildMessageListView(List dataList) { Widget _buildMessageListView(List dataList) {

View File

@@ -17,6 +17,7 @@ import 'package:vbvs_app/controller/device/device_type_controller.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/main.dart';
import 'package:vbvs_app/model/WebSocketMessage.dart'; import 'package:vbvs_app/model/WebSocketMessage.dart';
import 'package:vbvs_app/pages/device/component/DeviceStatusInfoWidget.dart'; import 'package:vbvs_app/pages/device/component/DeviceStatusInfoWidget.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@@ -52,12 +53,12 @@ class _InstantBodyPageState extends State<InstantBodyPage>
@override @override
void initState() { void initState() {
WidgetsBinding.instance.addObserver(this); // 添加生命周期观察者 WidgetsBinding.instance.addObserver(this); // 添加生命周期观察者
// edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage( _initWebSocket();
// path: "/vsbs/web/rt/marttress", super.initState();
// type: 1, }
// data: {"mac": widget.personInfo['mac']})));
// _startOnlineTimer(); // 初始化时启动定时器
Future<void> _initWebSocket() async {
// 发送WebSocket请求
try { try {
Future.delayed(Duration(seconds: 0), () { Future.delayed(Duration(seconds: 0), () {
CommonVariables.callMap["/vsbs/web/rt/marttress"] = (data) { CommonVariables.callMap["/vsbs/web/rt/marttress"] = (data) {
@@ -111,12 +112,6 @@ class _InstantBodyPageState extends State<InstantBodyPage>
edm.EasyDartModule.logger edm.EasyDartModule.logger
.error("[webscoekt]格式化数据错误-->${{"mac": widget.personInfo['mac']}}"); .error("[webscoekt]格式化数据错误-->${{"mac": widget.personInfo['mac']}}");
} }
_initWebSocket();
super.initState();
}
void _initWebSocket() {
// 发送WebSocket请求
if (widget.personInfo['status'] != null) { if (widget.personInfo['status'] != null) {
try { try {
onlineState = onlineState =
@@ -133,11 +128,21 @@ class _InstantBodyPageState extends State<InstantBodyPage>
.info("[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}"); .info("[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}");
DailyLogUtils.writeLog( DailyLogUtils.writeLog(
"[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}"); "[webscoekt]发送请求:数据-->${{"mac": widget.personInfo['mac']}}");
try {
edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage( edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage(
path: "/vsbs/web/rt/marttress", path: "/vsbs/web/rt/marttress",
type: 1, type: 1,
data: {"mac": widget.personInfo['mac']}))); data: {"mac": widget.personInfo['mac']})));
await Future.delayed(Duration(seconds: 3));
edm.EasyDartModule.websocket.sendData(jsonEncode(WebSocketMessage(
path: "/vsbs/web/rt/marttress",
type: 1,
data: {"mac": widget.personInfo['mac']})));
} catch (e) {
ef.log("msg");
}
_startOnlineTimer(); _startOnlineTimer();
ef.log("websocket初始化成功");
} }
//y //y
@@ -159,7 +164,7 @@ class _InstantBodyPageState extends State<InstantBodyPage>
_initWebSocket(); _initWebSocket();
} else if (state == AppLifecycleState.paused) { } else if (state == AppLifecycleState.paused) {
// 应用进入后台时关闭WebSocket // 应用进入后台时关闭WebSocket
_closeWebSocket(); // _closeWebSocket();
} }
} }
@@ -659,7 +664,6 @@ class _InstantBodyPageState extends State<InstantBodyPage>
], ],
), ),
), ),
SizedBox( SizedBox(
height: 40.rpx, height: 40.rpx,
), ),

View File

@@ -1,3 +1,84 @@
// import 'package:flutter/material.dart';
// import 'package:get/get.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';
// class CalibrationProgressWidget extends StatelessWidget {
// final ValueNotifier<double> progressNotifier;
// final ValueNotifier<bool> failureNotifier;
// const CalibrationProgressWidget({
// Key? key,
// required this.progressNotifier,
// required this.failureNotifier,
// }) : super(key: key);
// @override
// Widget build(BuildContext context) {
// return ValueListenableBuilder<double>(
// valueListenable: progressNotifier,
// builder: (context, progress, _) {
// return ValueListenableBuilder<bool>(
// valueListenable: failureNotifier,
// builder: (context, isFailure, __) {
// return Column(
// mainAxisSize: MainAxisSize.min,
// children: <Widget>[
// Text(
// isFailure ? '失败'.tr : '${progress.toStringAsFixed(0)}%',
// style: TextStyle(
// fontSize: 26.rpx,
// color: isFailure
// ? Colors.red
// : themeController.currentColor.sc3,
// ),
// ),
// SizedBox(height: 40.rpx),
// Stack(
// children: [
// Container(
// width: double.infinity,
// height: 21.rpx,
// decoration: BoxDecoration(
// color: stringToColor("#D9D9D9"),
// borderRadius: BorderRadius.circular(
// AppConstants().button_container_radius,
// ),
// ),
// ),
// Container(
// width: progress / 100 *
// MediaQuery.of(context).size.width *
// 0.8,
// height: 21.rpx,
// decoration: BoxDecoration(
// gradient: LinearGradient(
// colors: isFailure
// ? [themeController.currentColor.sc9]
// : [
// themeController.currentColor.sc2,
// themeController.currentColor.sc2,
// ],
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// ),
// borderRadius: BorderRadius.circular(
// AppConstants().button_container_radius,
// ),
// ),
// ),
// ],
// ),
// ],
// );
// },
// );
// },
// );
// }
// }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/appConstants.dart';
@@ -37,6 +118,7 @@ class CalibrationProgressWidget extends StatelessWidget {
SizedBox(height: 40.rpx), SizedBox(height: 40.rpx),
Stack( Stack(
children: [ children: [
// 背景进度条
Container( Container(
width: double.infinity, width: double.infinity,
height: 21.rpx, height: 21.rpx,
@@ -47,10 +129,11 @@ class CalibrationProgressWidget extends StatelessWidget {
), ),
), ),
), ),
Container( // 使用LayoutBuilder获取父容器宽度
width: progress / 100 * LayoutBuilder(
MediaQuery.of(context).size.width * builder: (context, constraints) {
0.8, return Container(
width: progress / 100 * constraints.maxWidth,
height: 21.rpx, height: 21.rpx,
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
@@ -67,6 +150,8 @@ class CalibrationProgressWidget extends StatelessWidget {
AppConstants().button_container_radius, AppConstants().button_container_radius,
), ),
), ),
);
},
), ),
], ],
), ),

View File

@@ -490,7 +490,8 @@ void showConfirmDialog(
blurSigma: 3.0, blurSigma: 3.0,
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: themeController.currentColor.sc5, // color: themeController.currentColor.sc5,
color: themeController.currentColor.sc17,
borderRadius: BorderRadius.circular(20.0), borderRadius: BorderRadius.circular(20.0),
), ),
padding: EdgeInsetsDirectional.fromSTEB(31.rpx, 0, 31.rpx, 0), padding: EdgeInsetsDirectional.fromSTEB(31.rpx, 0, 31.rpx, 0),

View File

@@ -5,7 +5,6 @@ import 'package:flutter_svg/svg.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/DailyLogUtils.dart';
import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart';

View File

@@ -1231,14 +1231,21 @@ class _MHTWifiPageState extends State<MHTWifiPage> {
blueteethBindController.updateAll(); blueteethBindController.updateAll();
updateDeviceBindStatus( updateDeviceBindStatus(
blueteethBindController.currentDeviceMac!.value); blueteethBindController.currentDeviceMac!.value);
await showTipDialog( // await showTipDialog(
// context,
// Text(
// "4g设备配置wifi提示".tr,
// style: TextStyle(
// color: themeController.currentColor.sc3,
// fontSize: AppConstants().title_text_fontSize),
// ));
TopSlideNotification.show(
context, context,
Text( text: "4g设备配置wifi提示".tr,
"4g设备配置wifi提示".tr, textColor: themeController.currentColor.sc2,
style: TextStyle( );
color: themeController.currentColor.sc3, blueteethBindController.wifiStatus.value = 1;
fontSize: AppConstants().title_text_fontSize), _navigateToNextPage();
));
} else if (aa == 'unknown') { } else if (aa == 'unknown') {
blueteethBindController.netType.value = 3; blueteethBindController.netType.value = 3;
blueteethBindController.updateAll(); blueteethBindController.updateAll();

View File

@@ -124,3 +124,138 @@ class ScatterPlotChart extends StatelessWidget {
); );
} }
} }
// import 'dart:math' as math;
// import 'package:fl_chart/fl_chart.dart';
// import 'package:flutter/material.dart';
// import 'package:vbvs_app/common/util/FitTool.dart';
// import 'package:vbvs_app/common/util/MyUtils.dart';
// class ScatterPlotChart extends StatelessWidget {
// final List<ScatterSpot> points;
// final double xMin;
// final double xMax;
// final double yMin;
// final double yMax;
// final Color pointColor;
// ScatterPlotChart({
// required this.points,
// required this.xMin,
// required this.xMax,
// required this.yMin,
// required this.yMax,
// required this.pointColor,
// });
// // 计算固定6格的间隔
// double _calculateInterval(double min, double max) {
// double range = max - min;
// if (range <= 0) return 100; // 默认值
// // 固定分成6格
// return range / 6;
// }
// @override
// Widget build(BuildContext context) {
// double xInterval = _calculateInterval(xMin, xMax);
// double yInterval = _calculateInterval(yMin, yMax);
// return SizedBox(
// child: ScatterChart(
// ScatterChartData(
// backgroundColor: Colors.transparent,
// gridData: FlGridData(
// show: true,
// horizontalInterval: yInterval,
// verticalInterval: xInterval,
// getDrawingHorizontalLine: (value) {
// return FlLine(
// color: themeController.currentColor.sc4,
// strokeWidth: 1.rpx,
// dashArray: [5, 5], // 设置虚线 [实线长度, 空白长度]
// );
// },
// getDrawingVerticalLine: (value) {
// return FlLine(
// color: themeController.currentColor.sc4,
// strokeWidth: 1.rpx,
// dashArray: [5, 5], // 设置虚线
// );
// },
// ),
// titlesData: FlTitlesData(
// show: true,
// leftTitles: AxisTitles(
// sideTitles: SideTitles(
// showTitles: true,
// reservedSize: 70.rpx,
// interval: yInterval,
// getTitlesWidget: (double value, TitleMeta meta) {
// // 显示所有刻度值
// return Padding(
// padding: EdgeInsets.only(right: 14.rpx),
// child: Text(
// value.toStringAsFixed(0),
// style: TextStyle(
// fontSize: 18.rpx,
// color: themeController.currentColor.sc4,
// ),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// ),
// );
// },
// ),
// ),
// bottomTitles: AxisTitles(
// sideTitles: SideTitles(
// showTitles: true,
// interval: xInterval,
// getTitlesWidget: (double value, TitleMeta meta) {
// return Text(
// value.toStringAsFixed(0),
// style: TextStyle(
// fontSize: 18.rpx,
// color: themeController.currentColor.sc4,
// ),
// );
// },
// ),
// ),
// rightTitles: AxisTitles(
// sideTitles: SideTitles(showTitles: false),
// ),
// topTitles: AxisTitles(
// sideTitles: SideTitles(showTitles: false),
// ),
// ),
// borderData: FlBorderData(
// show: true,
// border: Border.all(
// color: themeController.currentColor.sc4,
// width: 0.5,
// ),
// ),
// scatterSpots: points.map((point) {
// return ScatterSpot(
// point.x,
// point.y,
// dotPainter: FlDotCirclePainter(
// radius: 3.rpx,
// color: pointColor,
// ),
// );
// }).toList(),
// minX: xMin,
// maxX: xMax,
// minY: yMin,
// maxY: yMax,
// ),
// ),
// );
// }
// }

View File

@@ -393,6 +393,7 @@ class _HeartPointWidgetState extends State<HeartPointWidget> {
), ),
].divide(SizedBox(width: 20.rpx)), ].divide(SizedBox(width: 20.rpx)),
), ),
], ],
), ),
), ),

View File

@@ -272,10 +272,14 @@ class _QcBreatheStandardWidgetState extends State<QcBreatheStandardWidget> {
EdgeInsetsDirectional.fromSTEB(0.rpx, 0.rpx, 0.rpx, 0.rpx), EdgeInsetsDirectional.fromSTEB(0.rpx, 0.rpx, 0.rpx, 0.rpx),
child: Row( child: Row(
children: [ children: [
_buildBreathItem(avgBreath), _buildBreathItem(avgBreath,
_buildBreathItem(baseBreath), valueColor: stringToColor("#00C1AA")),
_buildBreathItem(minBreath), _buildBreathItem(baseBreath,
_buildBreathItem(maxBreath), valueColor: stringToColor("#FF7159")),
_buildBreathItem(minBreath,
valueColor: stringToColor("#E3AFDD")),
_buildBreathItem(maxBreath,
valueColor: stringToColor("#FF9F66")),
], ],
), ),
), ),
@@ -289,7 +293,7 @@ class _QcBreatheStandardWidgetState extends State<QcBreatheStandardWidget> {
} }
} }
Widget _buildBreathItem(Map<String, dynamic> data) { Widget _buildBreathItem(Map<String, dynamic> data, {Color? valueColor}) {
return Expanded( return Expanded(
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(horizontal: 4.rpx, vertical: 4.rpx), padding: EdgeInsets.symmetric(horizontal: 4.rpx, vertical: 4.rpx),
@@ -322,7 +326,7 @@ class _QcBreatheStandardWidgetState extends State<QcBreatheStandardWidget> {
child: Text( child: Text(
"${data['value']}", "${data['value']}",
style: TextStyle( style: TextStyle(
color: themeController.currentColor.sc2, color: valueColor ?? themeController.currentColor.sc2,
fontSize: AppConstants().normal_text_fontSize, fontSize: AppConstants().normal_text_fontSize,
), ),
maxLines: 2, maxLines: 2,
@@ -330,7 +334,7 @@ class _QcBreatheStandardWidgetState extends State<QcBreatheStandardWidget> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
SizedBox(width: 4.rpx), SizedBox(width: 6.rpx),
Flexible( Flexible(
fit: FlexFit.loose, fit: FlexFit.loose,
child: Text( child: Text(

View File

@@ -1,3 +1,219 @@
// import 'package:ef/ef.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_svg/svg.dart';
// import 'package:flutterflow_ui/flutterflow_ui.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/component/tool/ClickableContainer.dart';
// import 'package:vbvs_app/enum/APPPackageType.dart';
// import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
// import 'package:vbvs_app/pages/sleep_report/chart/FatigueCircleIndicator.dart';
// import 'package:EasyDartModule/EasyDartModule.dart' as es;
// class QcHeartHealthWidget extends StatefulWidget {
// var reportData; // 改为更通用的名称
// QcHeartHealthWidget({super.key, required this.reportData});
// @override
// State<QcHeartHealthWidget> createState() => _QcHeartHealthWidgetState();
// }
// class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> {
// @override
// void setState(VoidCallback callback) {
// super.setState(callback);
// }
// @override
// void initState() {
// super.initState();
// }
// @override
// void dispose() {
// super.dispose();
// }
// @override
// Widget build(BuildContext context) {
// try {
// if (widget.reportData == null) {
// return Container();
// }
// // 从reportData中获取xljk数据
// List xljkData = widget.reportData['xljk'] ?? [];
// if (xljkData.isEmpty) {
// return Container();
// }
// var showLabel = convertMentalHealthData(xljkData);
// // 如果没有有效数据,不显示组件
// if (showLabel.isEmpty) {
// return Container();
// }
// return Container(
// width: double.infinity,
// decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
// borderRadius: BorderRadius.circular(
// AppConstants().normal_container_radius), // 你可以按需调整圆角半径
// ),
// child: Padding(
// padding:
// EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 0.rpx),
// child: Column(
// mainAxisSize: MainAxisSize.max,
// children: [
// Container(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Text(
// "心理健康评估".tr,
// style: TextStyle(
// color: themeController.currentColor.sc3,
// fontSize: AppConstants().title_text_fontSize),
// ),
// ClickableContainer(
// backgroundColor: Colors.transparent,
// highlightColor: Colors.white, // 或设置为你需要的水波纹颜色
// padding: EdgeInsetsDirectional.fromSTEB(
// 14.rpx, 10.rpx, 14.rpx, 10.rpx), //
// borderRadius: 0.rpx, // 圆形点击区域
// onTap: () {
// if (AppConstants().ent_type ==
// APPPackageType.MHT.code) {
// showTipDialog(
// context,
// Container(
// child: Text(
// "心率健康评估主要通过用户睡眠报告中的时间点、体征数据及HRV数据等信息来判断其心理健康水平、疲劳程度。"
// .tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: Colors.black,
// ),
// ),
// ),
// backgroundColor: Color(0xFFFFFFFF),
// colors: [
// Color(0XFF1592AA),
// Color(0xFF0C83A7),
// Color(0xFF006FA3)
// ],
// );
// } else {
// showTipDialog(
// context,
// Container(
// child: Text(
// "心率健康评估主要通过用户睡眠报告中的时间点、体征数据及HRV数据等信息来判断其心理健康水平、疲劳程度。"
// .tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// backgroundColor: themeController.currentColor.sc17,
// colors: AppConstants().thNormalButton,
// );
// }
// },
// child: Container(
// padding: EdgeInsetsDirectional.fromSTEB(
// 0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部
// width: 28.rpx,
// height: 28.rpx,
// child: SvgPicture.asset(
// 'assets/img/icon/explain.svg',
// fit: BoxFit.cover,
// color: themeController.currentColor.sc4,
// ),
// ),
// ),
// ],
// ),
// ),
// SizedBox(
// height: 104.rpx,
// ),
// Padding(
// padding: EdgeInsetsDirectional.fromSTEB(
// 30.rpx, 0.rpx, 30.rpx, 0.rpx),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// if (showLabel.length > 0)
// Flexible(
// flex: 1,
// child: FatigueCircleIndicator(
// data: showLabel[0],
// ),
// ),
// if (showLabel.length > 1)
// Flexible(
// flex: 1,
// child: FatigueCircleIndicator(
// data: showLabel[1],
// ),
// ),
// ].divide(SizedBox(
// width: 110.rpx,
// )),
// ),
// ),
// SizedBox(
// height: 72.rpx,
// ),
// ],
// ),
// ),
// );
// } catch (e) {
// es.EasyDartModule.logger.error("心理健康绘制异常${e}");
// return Container();
// }
// }
// List<Map<String, dynamic>> convertMentalHealthData(List data) {
// return data.map<Map<String, dynamic>>((item) {
// final String? colorStr = item['color'];
// final int value = item['val'].toInt() ?? 0; // 注意这里从val取值
// final String explain =
// (item['tips'] != null && (item['tips'] as String).trim().isNotEmpty)
// ? item['tips']
// : '未知数据'.tr;
// // 根据value值确定level描述
// String level = '';
// if (value <= 30) {
// level = '较低';
// } else if (value <= 60) {
// level = '正常';
// } else if (value <= 80) {
// level = '偏高';
// } else {
// level = '严重';
// }
// return {
// 'name': item['name'] ?? '未知指标',
// 'color': colorStr != null && colorStr.isNotEmpty
// ? stringToColor(colorStr)
// : stringToColor("#00C1AA"), // 默认颜色
// 'percent': value,
// 'explain': level, // 使用计算出的level
// "bottomColor": stringToColor("#393D49"),
// };
// }).toList();
// }
// }
import 'package:ef/ef.dart'; import 'package:ef/ef.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
@@ -20,6 +236,9 @@ class QcHeartHealthWidget extends StatefulWidget {
} }
class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> { class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> {
// 缓存xljk的配置数据用于根据level获取对应的name
Map<int, String>? _xljkNameMap;
@override @override
void setState(VoidCallback callback) { void setState(VoidCallback callback) {
super.setState(callback); super.setState(callback);
@@ -28,6 +247,7 @@ class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_initXljkConfig();
} }
@override @override
@@ -35,6 +255,44 @@ class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> {
super.dispose(); super.dispose();
} }
// 初始化xljk配置映射
void _initXljkConfig() {
try {
if (widget.reportData == null) return;
Map<String, dynamic> typeData = widget.reportData['type'] ?? {};
List<dynamic> xljkConfigList = typeData['xljk'] ?? [];
if (xljkConfigList.isNotEmpty) {
_xljkNameMap = {};
for (var config in xljkConfigList) {
int level = config['level'] ?? 0;
_xljkNameMap![level] = config['name'] ?? '未知';
}
}
} catch (e) {
es.EasyDartModule.logger.error("初始化xljk配置异常$e");
}
}
// 辅助方法将颜色字符串转换为Color对象
Color _getColorFromString(String colorStr) {
try {
// 如果颜色字符串以#开头,直接使用
if (colorStr.startsWith('#')) {
return Color(int.parse('0xFF${colorStr.substring(1)}'));
}
// 如果是6位十六进制颜色码不带#
else if (colorStr.length == 6) {
return Color(int.parse('0xFF$colorStr'));
}
} catch (e) {
es.EasyDartModule.logger.error("颜色转换异常:$e");
}
// 默认返回主题色
return themeController.currentColor.sc3;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
try { try {
@@ -42,7 +300,7 @@ class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> {
return Container(); return Container();
} }
// 从reportData中获取xljk数据 // 从reportData中获取xljk数据(这是实际的心率健康数据)
List xljkData = widget.reportData['xljk'] ?? []; List xljkData = widget.reportData['xljk'] ?? [];
if (xljkData.isEmpty) { if (xljkData.isEmpty) {
return Container(); return Container();
@@ -183,32 +441,39 @@ class _QcHeartHealthWidgetState extends State<QcHeartHealthWidget> {
List<Map<String, dynamic>> convertMentalHealthData(List data) { List<Map<String, dynamic>> convertMentalHealthData(List data) {
return data.map<Map<String, dynamic>>((item) { return data.map<Map<String, dynamic>>((item) {
final String? colorStr = item['color']; final String? colorStr = item['color'];
final int value = item['val'].toInt() ?? 0; // 注意这里从val取值 final int value = item['val']?.toInt() ?? 0;
final int level = item['level'] ?? 0; // 获取level值
final String explain = final String explain =
(item['tips'] != null && (item['tips'] as String).trim().isNotEmpty) (item['tips'] != null && (item['tips'] as String).trim().isNotEmpty)
? item['tips'] ? item['tips']
: '未知数据'.tr; : '未知数据'.tr;
// 根据value值确定level描述 // 从配置映射中获取对应的name如果没有则使用默认级别描述
String level = ''; String levelName;
if (value <= 30) { if (_xljkNameMap != null && _xljkNameMap!.containsKey(level)) {
level = '较低'; levelName = _xljkNameMap![level]!;
} else if (value <= 60) {
level = '正常';
} else if (value <= 80) {
level = '偏高';
} else { } else {
level = '严重'; // 默认级别判断逻辑
if (value <= 30) {
levelName = '较低';
} else if (value <= 60) {
levelName = '正常';
} else if (value <= 80) {
levelName = '偏高';
} else {
levelName = '严重';
}
} }
return { return {
'name': item['name'] ?? '未知指标', 'name': item['name'] ?? '未知指标',
'color': colorStr != null && colorStr.isNotEmpty 'color': colorStr != null && colorStr.isNotEmpty
? stringToColor(colorStr) ? _getColorFromString(colorStr)
: stringToColor("#00C1AA"), // 默认颜色 : _getColorFromString("#00C1AA"), // 默认颜色
'percent': value, 'percent': value,
'explain': level, // 使用计算出的level 'explain': levelName, // 使用从配置获取的levelName或默认级别
"bottomColor": stringToColor("#393D49"), 'level': level, // 保留level信息
"bottomColor": _getColorFromString("#393D49"),
}; };
}).toList(); }).toList();
} }

View File

@@ -276,10 +276,14 @@ class _QcHeartRateStandardWidgetState extends State<QcHeartRateStandardWidget> {
0.rpx, 0.rpx, 0.rpx, 0.rpx), 0.rpx, 0.rpx, 0.rpx, 0.rpx),
child: Row( child: Row(
children: [ children: [
_buildHeartRateItem(avgHeartRate), _buildHeartRateItem(avgHeartRate,
_buildHeartRateItem(baseHeartRate), valueColor: stringToColor("#00C1AA")),
_buildHeartRateItem(minHeartRate), _buildHeartRateItem(baseHeartRate,
_buildHeartRateItem(maxHeartRate), valueColor: stringToColor("#FF7159")),
_buildHeartRateItem(minHeartRate,
valueColor: stringToColor("#E3AFDD")),
_buildHeartRateItem(maxHeartRate,
valueColor: stringToColor("#FF9F66")),
], ],
), ),
), ),
@@ -298,7 +302,7 @@ class _QcHeartRateStandardWidgetState extends State<QcHeartRateStandardWidget> {
} }
} }
Widget _buildHeartRateItem(Map<String, dynamic> data) { Widget _buildHeartRateItem(Map<String, dynamic> data, {Color? valueColor}) {
return Expanded( return Expanded(
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(horizontal: 4.rpx, vertical: 4.rpx), padding: EdgeInsets.symmetric(horizontal: 4.rpx, vertical: 4.rpx),
@@ -331,7 +335,7 @@ class _QcHeartRateStandardWidgetState extends State<QcHeartRateStandardWidget> {
child: Text( child: Text(
"${data['value']}", "${data['value']}",
style: TextStyle( style: TextStyle(
color: themeController.currentColor.sc2, color: valueColor ?? themeController.currentColor.sc2,
fontSize: AppConstants().normal_text_fontSize, fontSize: AppConstants().normal_text_fontSize,
), ),
maxLines: 2, maxLines: 2,

View File

@@ -1,3 +1,243 @@
// import 'package:ef/ef.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_svg/svg.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/component/tool/ClickableContainer.dart';
// import 'package:vbvs_app/enum/APPPackageType.dart';
// import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
// import 'package:vbvs_app/pages/sleep_report/chart/StatusBarWithIndicator.dart';
// import 'package:EasyDartModule/EasyDartModule.dart' as es;
// class QcPiLaoZhiShuPercentWidget extends StatefulWidget {
// var reportData; // 改为更通用的名称
// QcPiLaoZhiShuPercentWidget({super.key, required this.reportData});
// @override
// State<QcPiLaoZhiShuPercentWidget> createState() =>
// _PiLaoZhiShuPercentWidgetState();
// }
// class _PiLaoZhiShuPercentWidgetState extends State<QcPiLaoZhiShuPercentWidget> {
// @override
// void setState(VoidCallback callback) {
// super.setState(callback);
// }
// @override
// void initState() {
// super.initState();
// }
// @override
// void dispose() {
// super.dispose();
// }
// @override
// Widget build(BuildContext context) {
// try {
// if (widget.reportData == null) {
// return Container();
// }
// // 从reportData中获取plzs数据
// Map<String, dynamic> plzsData = widget.reportData['plzs'] ?? {};
// if (plzsData.isEmpty) {
// return Container();
// }
// int level = plzsData['level'] ?? 0;
// // 根据level值确定显示内容和颜色
// String levelText = '';
// Color levelColor = themeController.currentColor.sc3;
// switch (level) {
// case 0:
// levelText = '正常';
// levelColor = Colors.green;
// break;
// case 1:
// levelText = '轻度疲劳';
// levelColor = Colors.orange;
// break;
// case 2:
// levelText = '中度疲劳';
// levelColor = Colors.red;
// break;
// case 3:
// levelText = '重度疲劳';
// levelColor = Colors.red;
// break;
// default:
// levelText = '未知';
// levelColor = Colors.grey;
// }
// // 构建StatusBarWithIndicator需要的数据格式
// List<Map<String, dynamic>> showLabel = [
// {
// 'key': 0,
// 'name': '正常',
// 'color': Colors.green,
// },
// {
// 'key': 1,
// 'name': '轻度疲劳',
// 'color': Colors.orange,
// },
// {
// 'key': 2,
// 'name': '中度疲劳',
// 'color': Colors.red,
// },
// {
// 'key': 3,
// 'name': '重度疲劳',
// 'color': Colors.red,
// },
// ];
// return Container(
// width: double.infinity,
// decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
// borderRadius:
// BorderRadius.circular(AppConstants().normal_container_radius),
// ),
// child: Padding(
// padding:
// EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 45.rpx),
// child: Column(
// mainAxisSize: MainAxisSize.max,
// children: [
// Container(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Expanded(
// child: Text(
// "疲劳指数".tr,
// style: TextStyle(
// color: themeController.currentColor.sc3,
// fontSize: AppConstants().title_text_fontSize),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
// ),
// ),
// ClickableContainer(
// backgroundColor: Colors.transparent,
// highlightColor: Colors.white,
// padding: EdgeInsetsDirectional.fromSTEB(
// 14.rpx, 10.rpx, 14.rpx, 10.rpx),
// borderRadius: 0.rpx,
// onTap: () {
// if (AppConstants().ent_type ==
// APPPackageType.MHT.code) {
// showTipDialog(
// context,
// Container(
// child: Text(
// "疲劳指数是评估人体疲劳程度的重要指标,反映身体和精神状态的疲劳水平。".tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: Colors.black,
// ),
// ),
// ),
// backgroundColor: Color(0xFFFFFFFF),
// colors: [
// Color(0XFF1592AA),
// Color(0xFF0C83A7),
// Color(0xFF006FA3)
// ],
// );
// } else {
// showTipDialog(
// context,
// Container(
// child: Text(
// "疲劳指数是评估人体疲劳程度的重要指标,反映身体和精神状态的疲劳水平。".tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// backgroundColor: themeController.currentColor.sc17,
// colors: AppConstants().thNormalButton,
// );
// }
// },
// child: Container(
// padding:
// EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0.rpx, 0),
// width: 28.rpx,
// height: 28.rpx,
// child: SvgPicture.asset(
// 'assets/img/icon/explain.svg',
// fit: BoxFit.cover,
// color: themeController.currentColor.sc4,
// ),
// ),
// ),
// ],
// ),
// ),
// SizedBox(
// height: 83.rpx,
// ),
// // 显示level值的文本
// // Padding(
// // padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 30.rpx),
// // child: Row(
// // mainAxisAlignment: MainAxisAlignment.center,
// // children: [
// // Text(
// // '当前状态:',
// // style: TextStyle(
// // fontSize: 30.rpx,
// // color: themeController.currentColor.sc4,
// // ),
// // ),
// // Text(
// // levelText,
// // style: TextStyle(
// // fontSize: 36.rpx,
// // fontWeight: FontWeight.bold,
// // color: levelColor,
// // ),
// // ),
// // ],
// // ),
// // ),
// Padding(
// padding: EdgeInsetsDirectional.fromSTEB(
// 30.rpx, 0.rpx, 30.rpx, 0.rpx),
// child: StatusBarWithIndicator(
// selectKey: level, // 使用level值作为选中的key
// showLabel: showLabel,
// currentValueText: "当前属于".tr,
// showCurrentValue: true,
// ),
// ),
// SizedBox(
// height: 56.rpx,
// ),
// ],
// ),
// ),
// );
// } catch (e) {
// es.EasyDartModule.logger.error("疲劳指数绘制异常${e}");
// return Container();
// }
// }
// }
import 'package:ef/ef.dart'; import 'package:ef/ef.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
@@ -35,6 +275,24 @@ class _PiLaoZhiShuPercentWidgetState extends State<QcPiLaoZhiShuPercentWidget> {
super.dispose(); super.dispose();
} }
// 辅助方法将颜色字符串转换为Color对象
Color _getColorFromString(String colorStr) {
try {
// 如果颜色字符串以#开头,直接使用
if (colorStr.startsWith('#')) {
return Color(int.parse('0xFF${colorStr.substring(1)}'));
}
// 如果是6位十六进制颜色码不带#
else if (colorStr.length == 6) {
return Color(int.parse('0xFF$colorStr'));
}
} catch (e) {
es.EasyDartModule.logger.error("颜色转换异常:$e");
}
// 默认返回主题色
return themeController.currentColor.sc3;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
try { try {
@@ -50,34 +308,29 @@ class _PiLaoZhiShuPercentWidgetState extends State<QcPiLaoZhiShuPercentWidget> {
int level = plzsData['level'] ?? 0; int level = plzsData['level'] ?? 0;
// 根据level值确定显示内容和颜色 // 从reportData中获取type和zs数据
String levelText = ''; Map<String, dynamic> typeData = widget.reportData['type'] ?? {};
Color levelColor = themeController.currentColor.sc3; List<dynamic> zsList = typeData['zs'] ?? [];
switch (level) {
case 0:
levelText = '正常';
levelColor = Colors.green;
break;
case 1:
levelText = '轻度疲劳';
levelColor = Colors.orange;
break;
case 2:
levelText = '中度疲劳';
levelColor = Colors.red;
break;
case 3:
levelText = '重度疲劳';
levelColor = Colors.red;
break;
default:
levelText = '未知';
levelColor = Colors.grey;
}
// 构建StatusBarWithIndicator需要的数据格式 // 构建StatusBarWithIndicator需要的数据格式
List<Map<String, dynamic>> showLabel = [ List<Map<String, dynamic>> showLabel = [];
if (zsList.isNotEmpty) {
// 从zs数据动态构建showLabel
showLabel = zsList.map((item) {
return {
'key': item['level'] ?? 0,
'name': item['name'] ?? '未知',
'color': _getColorFromString(item['color'] ?? ''),
};
}).toList();
// 按level排序确保顺序正确
showLabel.sort((a, b) => (a['key'] as int).compareTo(b['key'] as int));
} else {
// 如果zs数据为空使用默认数据作为后备方案
es.EasyDartModule.logger.warning("zs数据为空使用默认配置");
showLabel = [
{ {
'key': 0, 'key': 0,
'name': '正常', 'name': '正常',
@@ -99,6 +352,7 @@ class _PiLaoZhiShuPercentWidgetState extends State<QcPiLaoZhiShuPercentWidget> {
'color': Colors.red, 'color': Colors.red,
}, },
]; ];
}
return Container( return Container(
width: double.infinity, width: double.infinity,
@@ -189,30 +443,6 @@ class _PiLaoZhiShuPercentWidgetState extends State<QcPiLaoZhiShuPercentWidget> {
SizedBox( SizedBox(
height: 83.rpx, height: 83.rpx,
), ),
// 显示level值的文本
// Padding(
// padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 30.rpx),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Text(
// '当前状态:',
// style: TextStyle(
// fontSize: 30.rpx,
// color: themeController.currentColor.sc4,
// ),
// ),
// Text(
// levelText,
// style: TextStyle(
// fontSize: 36.rpx,
// fontWeight: FontWeight.bold,
// color: levelColor,
// ),
// ),
// ],
// ),
// ),
Padding( Padding(
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 0.rpx, 30.rpx, 0.rpx), 30.rpx, 0.rpx, 30.rpx, 0.rpx),

View File

@@ -1,3 +1,246 @@
// import 'package:ef/ef.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_svg/svg.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/component/tool/ClickableContainer.dart';
// import 'package:vbvs_app/enum/APPPackageType.dart';
// import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
// import 'package:vbvs_app/pages/sleep_report/chart/StatusBarWithIndicator.dart';
// import 'package:EasyDartModule/EasyDartModule.dart' as es;
// class QcZiZhuShenJingPercentWidget extends StatefulWidget {
// var reportData; // 改为更通用的名称
// QcZiZhuShenJingPercentWidget({super.key, required this.reportData});
// @override
// State<QcZiZhuShenJingPercentWidget> createState() =>
// _ZiZhuShenJingPercentWidgetState();
// }
// class _ZiZhuShenJingPercentWidgetState
// extends State<QcZiZhuShenJingPercentWidget> {
// @override
// void setState(VoidCallback callback) {
// super.setState(callback);
// }
// @override
// void initState() {
// super.initState();
// }
// @override
// void dispose() {
// super.dispose();
// }
// @override
// Widget build(BuildContext context) {
// try {
// if (widget.reportData == null) {
// return Container();
// }
// // 从reportData中获取zzsjphzs数据
// Map<String, dynamic> zzsjphzsData = widget.reportData['zzsjphzs'] ?? {};
// if (zzsjphzsData.isEmpty) {
// return Container();
// }
// int level = zzsjphzsData['level'] ?? 0;
// // 根据level值确定显示内容和颜色
// String levelText = '';
// Color levelColor = themeController.currentColor.sc3;
// switch (level) {
// case 0:
// levelText = '正常';
// levelColor = Colors.green;
// break;
// case 1:
// levelText = '轻度失衡';
// levelColor = Colors.orange;
// break;
// case 2:
// levelText = '中度失衡';
// levelColor = Colors.red;
// break;
// case 3:
// levelText = '重度失衡';
// levelColor = Colors.red;
// break;
// default:
// levelText = '未知';
// levelColor = Colors.grey;
// }
// // 构建StatusBarWithIndicator需要的数据格式
// List<Map<String, dynamic>> showLabel = [
// {
// 'key': 0,
// 'name': '正常',
// 'color': Colors.green,
// },
// {
// 'key': 1,
// 'name': '轻度失衡',
// 'color': Colors.orange,
// },
// {
// 'key': 2,
// 'name': '中度失衡',
// 'color': Colors.red,
// },
// {
// 'key': 3,
// 'name': '重度失衡',
// 'color': Colors.red,
// },
// ];
// return Container(
// width: double.infinity,
// decoration: BoxDecoration(
// color: themeController.currentColor.sc5,
// borderRadius: BorderRadius.circular(
// AppConstants().normal_container_radius), // 你可以按需调整圆角半径
// ),
// child: Padding(
// padding:
// EdgeInsetsDirectional.fromSTEB(26.rpx, 29.rpx, 26.rpx, 45.rpx),
// child: Column(
// mainAxisSize: MainAxisSize.max,
// children: [
// Container(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Expanded(
// child: Text(
// "自主神经平衡指数".tr,
// style: TextStyle(
// color: themeController.currentColor.sc3,
// fontSize: AppConstants().title_text_fontSize),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
// ),
// ),
// ClickableContainer(
// backgroundColor: Colors.transparent,
// highlightColor: Colors.white, // 或设置为你需要的水波纹颜色
// padding: EdgeInsetsDirectional.fromSTEB(
// 14.rpx, 10.rpx, 14.rpx, 10.rpx), //
// borderRadius: 0.rpx, // 圆形点击区域
// onTap: () {
// if (AppConstants().ent_type ==
// APPPackageType.MHT.code) {
// showTipDialog(
// context,
// Container(
// child: Text(
// // "心理健康评估介绍".tr,
// "自主神经平衡指数 是评估人体自主神经系统ANS功能状态的重要指标主要反映交感神经和副交感神经的活性平衡关系。"
// .tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: Colors.black,
// ),
// ),
// ),
// backgroundColor: Color(0xFFFFFFFF),
// colors: [
// Color(0XFF1592AA),
// Color(0xFF0C83A7),
// Color(0xFF006FA3)
// ],
// );
// } else {
// showTipDialog(
// context,
// Container(
// child: Text(
// "自主神经平衡指数 是评估人体自主神经系统ANS功能状态的重要指标主要反映交感神经和副交感神经的活性平衡关系。"
// .tr,
// style: TextStyle(
// fontSize: 26.rpx,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// backgroundColor: themeController.currentColor.sc17,
// colors: AppConstants().thNormalButton,
// );
// }
// },
// child: Container(
// padding: EdgeInsetsDirectional.fromSTEB(
// 0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部
// width: 28.rpx,
// height: 28.rpx,
// child: SvgPicture.asset(
// 'assets/img/icon/explain.svg',
// fit: BoxFit.cover,
// color: themeController.currentColor.sc4,
// ),
// ),
// ),
// ],
// ),
// ),
// SizedBox(
// height: 83.rpx,
// ),
// // 显示level值的文本
// // Padding(
// // padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 30.rpx),
// // child: Row(
// // mainAxisAlignment: MainAxisAlignment.center,
// // children: [
// // Text(
// // '当前状态:',
// // style: TextStyle(
// // fontSize: 30.rpx,
// // color: themeController.currentColor.sc4,
// // ),
// // ),
// // Text(
// // levelText,
// // style: TextStyle(
// // fontSize: 36.rpx,
// // fontWeight: FontWeight.bold,
// // color: levelColor,
// // ),
// // ),
// // ],
// // ),
// // ),
// Padding(
// padding: EdgeInsetsDirectional.fromSTEB(
// 30.rpx, 0.rpx, 30.rpx, 0.rpx),
// child: StatusBarWithIndicator(
// selectKey: level, // 使用level值作为选中的key
// showLabel: showLabel,
// currentValueText: "当前属于".tr,
// showCurrentValue: true,
// ),
// ),
// SizedBox(
// height: 56.rpx,
// ),
// ],
// ),
// ),
// );
// } catch (e) {
// es.EasyDartModule.logger.error("自主神经平衡指数绘制异常${e}");
// return Container();
// }
// }
// }
import 'package:ef/ef.dart'; import 'package:ef/ef.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
@@ -36,6 +279,24 @@ class _ZiZhuShenJingPercentWidgetState
super.dispose(); super.dispose();
} }
// 辅助方法将颜色字符串转换为Color对象
Color _getColorFromString(String colorStr) {
try {
// 如果颜色字符串以#开头,直接使用
if (colorStr.startsWith('#')) {
return Color(int.parse('0xFF${colorStr.substring(1)}'));
}
// 如果是6位十六进制颜色码不带#
else if (colorStr.length == 6) {
return Color(int.parse('0xFF$colorStr'));
}
} catch (e) {
es.EasyDartModule.logger.error("颜色转换异常:$e");
}
// 默认返回主题色
return themeController.currentColor.sc3;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
try { try {
@@ -51,34 +312,29 @@ class _ZiZhuShenJingPercentWidgetState
int level = zzsjphzsData['level'] ?? 0; int level = zzsjphzsData['level'] ?? 0;
// 根据level值确定显示内容和颜色 // 从reportData中获取type和zs数据
String levelText = ''; Map<String, dynamic> typeData = widget.reportData['type'] ?? {};
Color levelColor = themeController.currentColor.sc3; List<dynamic> zsList = typeData['zs'] ?? [];
switch (level) {
case 0:
levelText = '正常';
levelColor = Colors.green;
break;
case 1:
levelText = '轻度失衡';
levelColor = Colors.orange;
break;
case 2:
levelText = '中度失衡';
levelColor = Colors.red;
break;
case 3:
levelText = '重度失衡';
levelColor = Colors.red;
break;
default:
levelText = '未知';
levelColor = Colors.grey;
}
// 构建StatusBarWithIndicator需要的数据格式 // 构建StatusBarWithIndicator需要的数据格式
List<Map<String, dynamic>> showLabel = [ List<Map<String, dynamic>> showLabel = [];
if (zsList.isNotEmpty) {
// 从zs数据动态构建showLabel
showLabel = zsList.map((item) {
return {
'key': item['level'] ?? 0,
'name': item['name'] ?? '未知',
'color': _getColorFromString(item['color'] ?? ''),
};
}).toList();
// 按level排序确保顺序正确
showLabel.sort((a, b) => (a['key'] as int).compareTo(b['key'] as int));
} else {
// 如果zs数据为空使用默认数据作为后备方案
es.EasyDartModule.logger.warning("自主神经平衡指数zs数据为空使用默认配置");
showLabel = [
{ {
'key': 0, 'key': 0,
'name': '正常', 'name': '正常',
@@ -100,6 +356,7 @@ class _ZiZhuShenJingPercentWidgetState
'color': Colors.red, 'color': Colors.red,
}, },
]; ];
}
return Container( return Container(
width: double.infinity, width: double.infinity,
@@ -193,30 +450,6 @@ class _ZiZhuShenJingPercentWidgetState
SizedBox( SizedBox(
height: 83.rpx, height: 83.rpx,
), ),
// 显示level值的文本
// Padding(
// padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0.rpx, 30.rpx, 30.rpx),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Text(
// '当前状态:',
// style: TextStyle(
// fontSize: 30.rpx,
// color: themeController.currentColor.sc4,
// ),
// ),
// Text(
// levelText,
// style: TextStyle(
// fontSize: 36.rpx,
// fontWeight: FontWeight.bold,
// color: levelColor,
// ),
// ),
// ],
// ),
// ),
Padding( Padding(
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 0.rpx, 30.rpx, 0.rpx), 30.rpx, 0.rpx, 30.rpx, 0.rpx),

View File

@@ -3,6 +3,7 @@ import 'package:ef/ef.dart';
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart';
@@ -50,21 +51,50 @@ class _QcHeartPointWidgetState extends State<QcHeartPointWidget> {
double maxX = 0; double maxX = 0;
double maxY = 0; double maxY = 0;
double minX = double.infinity; // 初始化为无穷大
double minY = double.infinity; // 初始化为无穷大
List<ScatterSpot> data = []; List<ScatterSpot> data = [];
// try {
// data = hrsData.map<ScatterSpot>((item) {
// double x = (item['x'] ?? 0).toDouble(); // 注意这里从x取值
// double y = (item['y'] ?? 0).toDouble(); // 注意这里从y取值
// if (x > maxX) maxX = x;
// if (y > maxY) maxY = y;
// return ScatterSpot(x, y);
// }).toList();
// } catch (e) {
// print(e);
// }
try { try {
data = hrsData.map<ScatterSpot>((item) { data = hrsData.map<ScatterSpot>((item) {
double x = (item['x'] ?? 0).toDouble(); // 注意这里从x取值 double x = (item['x'] ?? 0).toDouble();
double y = (item['y'] ?? 0).toDouble(); // 注意这里从y取值 double y = (item['y'] ?? 0).toDouble();
// 更新最大值
if (x > maxX) maxX = x; if (x > maxX) maxX = x;
if (y > maxY) maxY = y; if (y > maxY) maxY = y;
// 更新最小值
if (x < minX) minX = x;
if (y < minY) minY = y;
return ScatterSpot(x, y); return ScatterSpot(x, y);
}).toList(); }).toList();
// 如果没有数据将minX和minY设为0
if (data.isEmpty) {
minX = 0;
minY = 0;
}
} catch (e) { } catch (e) {
print(e); print(e);
// 发生异常时将minX和minY设为0
minX = 0;
minY = 0;
} }
return Container( return Container(
width: double.infinity, width: double.infinity,
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -124,6 +154,9 @@ class _QcHeartPointWidgetState extends State<QcHeartPointWidget> {
} else { } else {
showTipDialog( showTipDialog(
context, context,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container( Container(
child: Text( child: Text(
"心电散点图是用非线性的图形方法描记的连续心冲击图的RR间期图因图形由散点组成又称散点图。" "心电散点图是用非线性的图形方法描记的连续心冲击图的RR间期图因图形由散点组成又称散点图。"
@@ -134,6 +167,22 @@ class _QcHeartPointWidgetState extends State<QcHeartPointWidget> {
), ),
), ),
), ),
SizedBox(
height: 20.rpx,
),
Container(
// color: Colors.red,
width: MediaQuery.of(context)
.size
.width, // 宽度为屏幕宽度
// height: 200.rpx,
child: Image.asset(
'assets/img/heartpointEx.png', // 请根据实际图片路径修改
fit: BoxFit.cover, // 图片填充方式,可以根据需要调整
),
),
],
),
backgroundColor: themeController.currentColor.sc17, backgroundColor: themeController.currentColor.sc17,
colors: AppConstants().thNormalButton, colors: AppConstants().thNormalButton,
); );
@@ -172,6 +221,8 @@ class _QcHeartPointWidgetState extends State<QcHeartPointWidget> {
// 根据实际数据动态设置最大最小值 // 根据实际数据动态设置最大最小值
xMax: maxX > 0 ? maxX.toInt() + 100 : 3000, xMax: maxX > 0 ? maxX.toInt() + 100 : 3000,
yMax: maxY > 0 ? maxY.toInt() + 100 : 3000, yMax: maxY > 0 ? maxY.toInt() + 100 : 3000,
// xMin: minX > 0 ? minX.toInt() - 100 : 0,
// yMin: minY > 0 ? minY.toInt() - 100 : 0,
xMin: 0, xMin: 0,
yMin: 0, yMin: 0,
pointColor: stringToColor("#00C1AA"), // 点的颜色 pointColor: stringToColor("#00C1AA"), // 点的颜色
@@ -182,135 +233,6 @@ class _QcHeartPointWidgetState extends State<QcHeartPointWidget> {
SizedBox( SizedBox(
height: 31.rpx, height: 31.rpx,
), ),
// Row(
// children: [
// Text(
// "图形参考".tr,
// style: TextStyle(
// color: themeController.currentColor.sc3,
// fontSize: AppConstants().middler_text_fontSize),
// ),
// ],
// ),
// SizedBox(
// height: 31.rpx,
// ),
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// // 第 1 个
// SizedBox(
// width: (MediaQuery.sizeOf(context).width - 60.rpx * 3) / 4,
// child: Column(
// children: [
// Image.asset(
// "assets/img/heartPic1.png",
// width: 120.rpx,
// height: 120.rpx,
// ),
// SizedBox(height: 10),
// SizedBox(
// height: 60.rpx, // 👈 固定说明文字高度
// child: Text(
// '正常心率窦性图'.tr,
// maxLines: 2,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// style: TextStyle(
// fontSize: AppConstants().small_text_fontSize,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// ],
// ),
// ),
// // 第 2 个
// SizedBox(
// width: (MediaQuery.sizeOf(context).width - 60.rpx * 3) / 4,
// child: Column(
// children: [
// Image.asset(
// "assets/img/heartPic2.png",
// width: 120.rpx,
// height: 120.rpx,
// ),
// SizedBox(height: 10),
// SizedBox(
// height: 60.rpx,
// child: Text(
// '窦性心律不齐图'.tr,
// maxLines: 2,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// style: TextStyle(
// fontSize: AppConstants().small_text_fontSize,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// ],
// ),
// ),
// // 第 3 个
// SizedBox(
// width: (MediaQuery.sizeOf(context).width - 60.rpx * 3) / 4,
// child: Column(
// children: [
// Image.asset(
// "assets/img/heartPic3.png",
// width: 120.rpx,
// height: 120.rpx,
// ),
// SizedBox(height: 10),
// SizedBox(
// height: 60.rpx,
// child: Text(
// '持续性房颤图'.tr,
// maxLines: 2,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// style: TextStyle(
// fontSize: AppConstants().small_text_fontSize,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// ],
// ),
// ),
// // 第 4 个
// SizedBox(
// width: (MediaQuery.sizeOf(context).width - 60.rpx * 3) / 4,
// child: Column(
// children: [
// Image.asset(
// "assets/img/heartPic4.png",
// width: 120.rpx,
// height: 120.rpx,
// ),
// SizedBox(height: 10),
// SizedBox(
// height: 60.rpx,
// child: Text(
// '阵法性房颤图'.tr,
// maxLines: 2,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// style: TextStyle(
// fontSize: AppConstants().small_text_fontSize,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// ],
// ),
// ),
// ].divide(SizedBox(width: 20.rpx)),
// ),
], ],
), ),
), ),

View File

@@ -7,6 +7,7 @@ import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.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/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/date/CalendarController.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_report_controller.dart';
@@ -71,6 +72,7 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
final healthLevelInfo = getHealthLevelInfo(widget.data); final healthLevelInfo = getHealthLevelInfo(widget.data);
double lineWidth = 150.rpx; double lineWidth = 150.rpx;
try {
return LayoutBuilder( return LayoutBuilder(
builder: (context, bodySize) => GestureDetector( builder: (context, bodySize) => GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),, // onTap: () => FocusScope.of(context).unfocus(),,
@@ -81,7 +83,9 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
? null // ✅ 不要背景图 ? null // ✅ 不要背景图
: DecorationImage( : DecorationImage(
image: (widget.data['backgroundImg'] != null && image: (widget.data['backgroundImg'] != null &&
widget.data['backgroundImg'].toString().isNotEmpty) widget.data['backgroundImg']
.toString()
.isNotEmpty)
? AssetImage(widget.data['backgroundImg']) ? AssetImage(widget.data['backgroundImg'])
: AssetImage(getBackgroundImageNoImage()) : AssetImage(getBackgroundImageNoImage())
as ImageProvider, as ImageProvider,
@@ -98,8 +102,8 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
? widget.data['backgroundColor'].withOpacity(0.8) ? widget.data['backgroundColor'].withOpacity(0.8)
: themeController.currentColor.sc5, : themeController.currentColor.sc5,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
iconTheme: iconTheme: IconThemeData(
IconThemeData(color: themeController.currentColor.sc3), color: themeController.currentColor.sc3),
titleSpacing: 0, titleSpacing: 0,
title: Container( title: Container(
width: double.infinity, width: double.infinity,
@@ -153,7 +157,8 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 0.rpx, 0.rpx, 0.rpx), 0.rpx, 0.rpx, 0.rpx, 0.rpx),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment:
CrossAxisAlignment.center,
children: [ children: [
// 左侧图标 // 左侧图标
Container( Container(
@@ -161,14 +166,16 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
child: Icon( child: Icon(
Icons.info_outline, Icons.info_outline,
size: 26.rpx, size: 26.rpx,
color: themeController.currentColor.sc8, color:
themeController.currentColor.sc8,
), ),
), ),
// 中间可换行文字 // 中间可换行文字
Expanded( Expanded(
child: Container( child: Container(
margin: EdgeInsets.only(right: 69.rpx), margin:
EdgeInsets.only(right: 69.rpx),
child: Text( child: Text(
'5分钟快速检测可能受到用户当前状态、过程中说话动作、精神紧张等情况影响数据仅供参考。' '5分钟快速检测可能受到用户当前状态、过程中说话动作、精神紧张等情况影响数据仅供参考。'
.tr, .tr,
@@ -190,7 +197,8 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
), ),
), ),
Padding( Padding(
padding: EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0), padding:
EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: themeController.currentColor.sc5, color: themeController.currentColor.sc5,
@@ -321,11 +329,13 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 20.rpx, 30.rpx, 20.rpx), 30.rpx, 20.rpx, 30.rpx, 20.rpx),
child: StatusBarWithIndicator( child: StatusBarWithIndicator(
selectKey: widget.data['score']['level'] selectKey: widget.data['score']
['level']
.toInt(), // 这里传入对应的 level 值 .toInt(), // 这里传入对应的 level 值
showLabel: (widget.data['type']['score'] showLabel: (widget.data['type']
as List) ['score'] as List)
.map<Map<String, dynamic>>((item) { .map<Map<String, dynamic>>(
(item) {
return { return {
'key': item['level']?.toInt() ?? 'key': item['level']?.toInt() ??
0, // 使用 level 作为 key 0, // 使用 level 作为 key
@@ -351,7 +361,8 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
), ),
), ),
Padding( Padding(
padding: EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0), padding:
EdgeInsets.fromLTRB(30.rpx, 0, 30.rpx, 0),
child: Container( child: Container(
width: double.infinity, width: double.infinity,
// padding: EdgeInsets.all(30.rpx), // padding: EdgeInsets.all(30.rpx),
@@ -363,7 +374,8 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
), ),
), ),
Padding( Padding(
padding: EdgeInsets.fromLTRB(46.rpx, 0, 46.rpx, 0), padding:
EdgeInsets.fromLTRB(46.rpx, 0, 46.rpx, 0),
child: Column( child: Column(
children: [ children: [
// Text( // Text(
@@ -413,6 +425,13 @@ class _QuickHealthReportPageState extends State<QuickHealthReportPage> {
), ),
), ),
); );
} catch (e) {
NewTopSlideNotification.show(
text: '页面渲染失败:${e.toString()}'.tr,
textColor: themeController.currentColor.sc9,
);
return Container();
}
} }
Future<void> loadSleepReport(int type) async { Future<void> loadSleepReport(int type) async {