更新快检功能必传mac参数
This commit is contained in:
BIN
assets/img/heartpointEx.png
Normal file
BIN
assets/img/heartpointEx.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
@@ -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"
|
||||||
|
|||||||
@@ -652,6 +652,8 @@
|
|||||||
"快检时间:": "快检时间:",
|
"快检时间:": "快检时间:",
|
||||||
"快检中...": "快检中...",
|
"快检中...": "快检中...",
|
||||||
"体验异常结束": "体验异常结束",
|
"体验异常结束": "体验异常结束",
|
||||||
|
"当前设备已离线,无法快检!": "当前设备已离线,无法快检!",
|
||||||
|
"设备正在快检中,请稍后再试!": "设备正在快检中,请稍后再试!",
|
||||||
"是否确认结束?": "是否确认结束?",
|
"是否确认结束?": "是否确认结束?",
|
||||||
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。",
|
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。",
|
||||||
"注:本页报告是基于心率、呼吸等体征波形数据,通过AI算法模型分析完成,其结果仅供参考;其中报告未见数据异常部分,并不代表没有潜在性的疾病风险,如有不适请及时就医。":"注:本页报告是基于心率、呼吸等体征波形数据,通过AI算法模型分析完成,其结果仅供参考;其中报告未见数据异常部分,并不代表没有潜在性的疾病风险,如有不适请及时就医。",
|
"注:本页报告是基于心率、呼吸等体征波形数据,通过AI算法模型分析完成,其结果仅供参考;其中报告未见数据异常部分,并不代表没有潜在性的疾病风险,如有不适请及时就医。":"注:本页报告是基于心率、呼吸等体征波形数据,通过AI算法模型分析完成,其结果仅供参考;其中报告未见数据异常部分,并不代表没有潜在性的疾病风险,如有不适请及时就医。",
|
||||||
|
|||||||
@@ -651,6 +651,8 @@
|
|||||||
"快检中...": "快檢中...",
|
"快检中...": "快檢中...",
|
||||||
"体验异常结束": "體驗異常結束",
|
"体验异常结束": "體驗異常結束",
|
||||||
"是否确认结束?": "是否確認結束?",
|
"是否确认结束?": "是否確認結束?",
|
||||||
|
"当前设备已离线,无法快检!": "當前設備已離線,無法快檢! ",
|
||||||
|
"设备正在快检中,请稍后再试!": "當前設備正在快檢中,請稍後再試!",
|
||||||
"注:本页报告是基于心率、呼吸等体征波形数据,通过AI算法模型分析完成,其结果仅供参考;其中报告未见数据异常部分,并不代表没有潜在性的疾病风险,如有不适请及时就医。": "注意:本頁報告基於心率、呼吸等體徵波形數據,通過AI算法模型分析完成,其結果僅供參考;其中報告未見數據異常部分,並不表示沒有潛在的疾病風險,如有不適請即時就医。",
|
"注:本页报告是基于心率、呼吸等体征波形数据,通过AI算法模型分析完成,其结果仅供参考;其中报告未见数据异常部分,并不代表没有潜在性的疾病风险,如有不适请及时就医。": "注意:本頁報告基於心率、呼吸等體徵波形數據,通過AI算法模型分析完成,其結果僅供參考;其中報告未見數據異常部分,並不表示沒有潛在的疾病風險,如有不適請即時就医。",
|
||||||
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能時,只需平躺或坐在正常運行中的體徵传感器传感器上方,保持靜止,然後點擊“啟動快檢”,待進度條完成,即可得出快檢報告。",
|
"使用方式:人员使用健康快检功能时,只需平躺或坐在正常运行中的体征传感器传感器上方,保持静止,然后点击“启动快检”,待进度条完成,即可得出快检报告。": "使用方式:人员使用健康快检功能時,只需平躺或坐在正常運行中的體徵传感器传感器上方,保持靜止,然後點擊“啟動快檢”,待進度條完成,即可得出快檢報告。",
|
||||||
"Copyright © 2020-2030 东华智能睡眠中心 版权所有": " 版權所有©2020-2030 東華智能睡眠中心"
|
"Copyright © 2020-2030 东华智能睡眠中心 版权所有": " 版權所有©2020-2030 東華智能睡眠中心"
|
||||||
|
|||||||
@@ -233,7 +233,7 @@
|
|||||||
"输入wifi密码": "输入wifi密码",
|
"输入wifi密码": "输入wifi密码",
|
||||||
"配网成功": "配网成功",
|
"配网成功": "配网成功",
|
||||||
"配网失败": "配网失败",
|
"配网失败": "配网失败",
|
||||||
"4g设备配置wifi提示": "4g设备配置wifi提示",
|
"4g设备配置wifi提示": "该设备为4G设备,无需配置wifi",
|
||||||
"获取设备网络类型失败": "获取设备网络类型失败",
|
"获取设备网络类型失败": "获取设备网络类型失败",
|
||||||
"刷新": "刷新",
|
"刷新": "刷新",
|
||||||
"获取wifi列表成功": "获取wifi列表成功",
|
"获取wifi列表成功": "获取wifi列表成功",
|
||||||
|
|||||||
Binary file not shown.
@@ -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 = [
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
154
lib/enum/APPQuickCheckStatus.dart
Normal file
154
lib/enum/APPQuickCheckStatus.dart
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|||||||
@@ -393,6 +393,7 @@ class _HeartPointWidgetState extends State<HeartPointWidget> {
|
|||||||
),
|
),
|
||||||
].divide(SizedBox(width: 20.rpx)),
|
].divide(SizedBox(width: 20.rpx)),
|
||||||
),
|
),
|
||||||
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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)),
|
|
||||||
// ),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user