更新一级睡眠报告页面

This commit is contained in:
wyf
2025-08-07 08:53:26 +08:00
parent d5f8efb79e
commit 88a03a361c
11 changed files with 416 additions and 140 deletions

View File

@@ -1,3 +1,3 @@
[ [
"assets/miniapp/mhtControl_1.0.44.zip" "assets/miniapp/mhtControl_1.0.49.zip"
] ]

View File

@@ -0,0 +1,20 @@
<svg viewBox="0 0 42 42" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="42.000000" height="42.000000" fill="none" customFrame="#000000">
<g id="组 5419">
<g style="mix-blend-mode:normal">
<rect id="矩形 2563" width="42.000000" height="42.000000" x="0.000000" y="0.000000" />
</g>
<g id="组 5418">
<g id="组 5417">
<g style="mix-blend-mode:normal">
<path id="路径 1222" d="M5.41016 11.3242C5.41016 11.3242 13.5293 3.85352 21 11.3242C28.4707 18.7969 36.5898 11.3242 36.5898 11.3242" stroke="rgb(133,245,255)" stroke-width="2" />
</g>
<g style="mix-blend-mode:normal">
<path id="路径 1223" d="M5.41016 21C5.41016 21 13.5293 13.5283 21 21C28.4707 28.4707 36.5898 21 36.5898 21" stroke="rgb(133,245,255)" stroke-width="2" />
</g>
<g style="mix-blend-mode:normal">
<path id="路径 1224" d="M5.41016 30.6758C5.41016 30.6758 13.5293 23.2051 21 30.6758C28.4707 38.1465 36.5898 30.6758 36.5898 30.6758" stroke="rgb(133,245,255)" stroke-width="2" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,10 @@
<svg viewBox="0 0 42 42" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="42.000000" height="42.000000" fill="none" customFrame="#000000">
<g id="组 5411">
<g style="mix-blend-mode:normal">
<rect id="矩形 2559" width="42.000000" height="42.000000" x="0.000000" y="0.000000" />
</g>
<g style="mix-blend-mode:normal">
<path id="路径 1218" d="M20.9824 11.8867L21.1338 11.7412C25.9473 7.18457 31.4785 7.06543 35.3154 10.8096L35.4414 10.9346C39.3301 14.8535 39.6895 21.209 35.5557 25.3008L21.9736 37.9102C21.4141 38.4297 20.5488 38.4297 19.9893 37.9102L6.40723 25.3008C2.3623 21.2227 2.69336 14.8223 6.55762 10.9121C10.3857 7.03711 15.9678 7.11816 20.8311 11.7393L20.9824 11.8867Z" fill-rule="nonzero" stroke="rgb(255,113,89)" stroke-width="2.29999995" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 825 B

View File

@@ -0,0 +1,16 @@
<svg viewBox="0 0 42 42" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="42.000000" height="42.000000" fill="none" customFrame="#000000">
<g id="组 5414">
<g style="mix-blend-mode:normal">
<rect id="矩形 2561" width="42.000000" height="42.000000" x="0.000000" y="0.000000" />
</g>
<g style="mix-blend-mode:normal">
<path id="路径 1219" d="M4.22168 22.042C2.69141 18.3076 3.60742 13.8965 6.55762 10.9121C10.3857 7.03711 15.9678 7.11816 20.8311 11.7393L20.9824 11.8867L21.1338 11.7412C25.9482 7.18457 31.4785 7.06543 35.3154 10.8096L35.4414 10.9346C37.9629 13.4756 39.001 17.042 38.292 20.3506M25.1484 34.9629L21.9746 37.9102C21.415 38.4297 20.5488 38.4297 19.9893 37.9102L12.6182 31.0664" stroke="rgb(255,113,89)" stroke-width="2.29999995" />
</g>
<g style="mix-blend-mode:normal">
<path id="路径 1220" d="M3.49121 26.6621L13.6572 26.6621L19.2432 19.709L28.083 32.1729L36.7109 24.2383" stroke="rgb(69,217,137)" stroke-width="2.29999995" />
</g>
<g style="mix-blend-mode:normal">
<path id="路径 1221" d="M30.9395 24.2285L36.7109 24.2285L36.7109 30.001" stroke="rgb(69,217,137)" stroke-width="2.29999995" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,10 +1,10 @@
class ServiceConstant { class ServiceConstant {
static const String baseHost = "zhmht.swes.com.cn:27021"; //服务地址 眠花糖测试地址 // static const String baseHost = "zhmht.swes.com.cn:27021"; //服务地址 眠花糖测试地址
// static const String baseHost = "zhmht.swes.com.cn:27020"; //服务地址 眠花糖正式地址 static const String baseHost = "zhmht.swes.com.cn:27020"; //服务地址 眠花糖正式地址
// static const String baseHost = "vsbs-test.he-info.cn"; //服务地址 本地测试地址 // static const String baseHost = "vsbs-test.he-info.cn"; //服务地址 本地测试地址
// static const String baseHost = "vsbst-api.he-info.cn";//服务地址 // static const String baseHost = "vsbst-api.he-info.cn";//服务地址
static const String service_address = "http://$baseHost"; // static const String service_address = "http://$baseHost";
// static const String service_address = "https://$baseHost"; static const String service_address = "https://$baseHost";
static String server_service = "/vsbs_app_server"; //服务名称 static String server_service = "/vsbs_app_server"; //服务名称

View File

@@ -9,6 +9,7 @@ import 'package:vbvs_app/common/color/app_uri_status.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';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.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';
@@ -19,10 +20,8 @@ import 'package:vbvs_app/pages/common/selectDialog.dart';
import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart'; import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
import 'package:vbvs_app/pages/sleep_report/component/SleepScoreWidget.dart'; import 'package:vbvs_app/pages/sleep_report/component/SleepScoreWidget.dart';
import 'package:vbvs_app/pages/sleep_report/component/SleepView.dart';
import 'package:vbvs_app/pages/sleep_report/component/Vital_signs.dart'; import 'package:vbvs_app/pages/sleep_report/component/Vital_signs.dart';
import 'package:vbvs_app/pages/sleep_report/component/new_sleep_view.dart'; import 'package:vbvs_app/pages/sleep_report/component/new_sleep_view.dart';
import 'package:vbvs_app/pages/sleep_report/new_sleep_report_page.dart';
class MhtSleepReportPage extends StatefulWidget { class MhtSleepReportPage extends StatefulWidget {
const MhtSleepReportPage({super.key}); const MhtSleepReportPage({super.key});
@@ -41,6 +40,7 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
final RxBool isRightLimit = false.obs; final RxBool isRightLimit = false.obs;
var formFieldController = FormFieldController<String>(null); var formFieldController = FormFieldController<String>(null);
var personInfo = {}.obs; var personInfo = {}.obs;
Rx<bool> isLoading = false.obs;
@override @override
void initState() { void initState() {
@@ -332,6 +332,9 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
} }
}).toList(), }).toList(),
onChanged: (val) { onChanged: (val) {
sleepReportController
.sleepReport
.value = {};
final list = final list =
deviceController deviceController
.personnelList .personnelList
@@ -363,9 +366,15 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
.value = .value =
formFieldController formFieldController
.value!; .value!;
deviceController.getSleeps( // deviceController.getSleeps(
formFieldController // formFieldController
.value); // .value);
String data =
MyUtils.formatDate(
calendarController
.selectedDate
.value!);
loadSleepReport(data);
homeController homeController
.updateAll(); .updateAll();
} }
@@ -469,45 +478,58 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
}), }),
Obx(() { Obx(() {
if (homeController.selectDevcie.value != null && if (userInfoController.model.login! == null ||
userInfoController.model.login! == 0 ||
deviceController.personnelList.value.isEmpty) {
return Container();
}
final bool hasValidData = homeController
.selectDevcie.value !=
null &&
homeController.selectDevcie.value!.isNotEmpty && homeController.selectDevcie.value!.isNotEmpty &&
deviceController.personnelList.value.isNotEmpty && deviceController.personnelList.value.isNotEmpty &&
sleepReportController.sleepReport.value != null) { sleepReportController.sleepReport.value != null &&
sleepReportController.sleepReport.value.isNotEmpty;
return Expanded( return Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
getTimeWidget(), getTimeWidget(), // 始终显示
isLoading.value
? Padding(
padding: EdgeInsets.fromLTRB(
0, 30.rpx, 0, 0),
child: Center(
child: CircularProgressIndicator()),
)
: hasValidData
? Column(
children: [
SleepScoreWidget( SleepScoreWidget(
sleepReport: sleepReport:
sleepReportController.sleepReport.value, sleepReportController
.sleepReport.value,
showLabelWrap: false, showLabelWrap: false,
), ),
NewSleepViewWidget( NewSleepViewWidget(
sleepReport: sleepReport:
sleepReportController.sleepReport.value), sleepReportController
.sleepReport.value,
),
SizedBox(height: 25.rpx), SizedBox(height: 25.rpx),
VitalSignsWidget( VitalSignsWidget(
sleepReport: sleepReport:
sleepReportController.sleepReport.value) sleepReportController
.sleepReport.value,
),
], ],
)
// child: NewSleepReportPage( : NullDataWidget(), // 无数据时
// data: { ],
// "tag": "123", ),
// 'date': DateTime.now().millisecondsSinceEpoch, ),
// 'mac'.tr: homeController.selectDevcie.value, );
// 'person': homeController.selectPerson.value,
// 'backgroundImg':
// 'assets/images/new_background.png',
// 'arrow': false,
// 'noBackImg': true,
// 'person_show': false,
// },
// ),
)));
}
return Container();
}), }),
], ],
); );
@@ -636,17 +658,20 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
} }
void loadSleepReport(String data) { void loadSleepReport(String data) {
isLoading.value = true;
requestWithLog( requestWithLog(
logTitle: "查询睡眠报告", logTitle: "查询睡眠报告",
method: MyHttpMethod.get, method: MyHttpMethod.get,
queryUrl: queryUrl:
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${homeController.selectDevcie.value}&time=${data}&type=${sleepReportController.model.type}", "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${homeController.selectDevcie.value}&time=${data}&type=${sleepReportController.model.type}",
onSuccess: (res) { onSuccess: (res) {
isLoading.value = false;
print(res); print(res);
sleepReportController.sleepReport.value = res.data; sleepReportController.sleepReport.value = res.data;
sleepReportController.updateAll(); sleepReportController.updateAll();
}, },
onFailure: (res) { onFailure: (res) {
isLoading.value = false;
if (MainPageBBottomChange.getCurrentIndex() != null) { if (MainPageBBottomChange.getCurrentIndex() != null) {
if (MainPageBBottomChange.getCurrentIndex() == 1) { if (MainPageBBottomChange.getCurrentIndex() == 1) {
TopSlideNotification.show(context, TopSlideNotification.show(context,

View File

@@ -633,8 +633,6 @@ class _NewHomePageState extends State<NewHomePage> {
.value, .value,
'backgroundImg': 'backgroundImg':
'assets/images/new_background.png', 'assets/images/new_background.png',
'date':
timeMillis,
// 'backgroundColor':stringToColor("#003058"), // 'backgroundColor':stringToColor("#003058"),
'person_show': 'person_show':
false, false,

View File

@@ -1,15 +1,13 @@
import 'package:EasyDartModule/EasyDartModule.dart' as es;
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';
import 'package:path/path.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';
import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart'; import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
import 'package:vbvs_app/pages/sleep_report/chart/GradientLine.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
import 'package:vbvs_app/pages/sleep_report/chart/SnoreWaveform.dart';
import 'package:EasyDartModule/EasyDartModule.dart' as es;
//睡眠规律性 //睡眠规律性
class VitalSignsWidget extends StatefulWidget { class VitalSignsWidget extends StatefulWidget {
@@ -67,6 +65,38 @@ class _VitalSignsWidgetState extends State<VitalSignsWidget> {
orElse: () => {}, orElse: () => {},
); );
List svgList = [
'assets/img/icon/home_heart.svg',
'assets/img/icon/home_hrv.svg',
'assets/img/icon/home_breath.svg'
];
List nameList = ['平均心率'.tr, '平均hrv'.tr, '平均呼吸'.tr];
// brs 307【平均呼吸】
// hrs 206【平均心率】 203【hrv】
final hrsList = widget.sleepReport['hrs'] ?? [];
final brsList = widget.sleepReport['brs'] ?? [];
// 获取对应 id 的原始 value
final avgHeartRate = hrsList.firstWhere(
(e) => e['id'] == 206,
orElse: () => {},
);
final hrv = hrsList.firstWhere(
(e) => e['id'] == 203,
orElse: () => {},
);
final avgBreath = brsList.firstWhere(
(e) => e['id'] == 307,
orElse: () => {},
);
// 构建 valueList原始数据未格式化
List<dynamic> valueList = [
avgHeartRate['value'],
hrv['value'],
avgBreath['value'],
];
List stages = widget.sleepReport['sleepData']['stages']; List stages = widget.sleepReport['sleepData']['stages'];
return Container( return Container(
width: double.infinity, width: double.infinity,
@@ -102,8 +132,7 @@ class _VitalSignsWidgetState extends State<VitalSignsWidget> {
context, context,
Container( Container(
child: Text( child: Text(
"睡眠规律性是指个体睡眠模式在时间、时长、环境等方面呈现出的稳定性和一致性,是衡量睡眠质量的重要指标之一。" "生命体征指的是睡眠周期的整体数据。".tr,
.tr,
style: TextStyle( style: TextStyle(
fontSize: 26.rpx, fontSize: 26.rpx,
color: Colors.black, color: Colors.black,
@@ -133,43 +162,75 @@ class _VitalSignsWidgetState extends State<VitalSignsWidget> {
], ],
), ),
), ),
SizedBox(
height: 98.rpx,
),
Row( Row(
children: List.generate(3, (index) {
return Expanded(
// 平均宽度
child: SizedBox(
// height: 120.rpx, // 固定高度,例如 120.rpx根据实际调整
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Column( Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container(
padding: EdgeInsetsDirectional.fromSTEB(
0, 0.rpx, 0.rpx, 0), // 外部 padding 移到内部
width: 42.rpx,
height: 42.rpx,
child: SvgPicture.asset(
svgList[index],
fit: BoxFit.cover,
// color: themeController.currentColor.sc4,
),
),
SizedBox(width: 5.rpx),
Text( Text(
"1", valueList[index] == null ||
valueList[index].toString().isEmpty
? "-"
: "${valueList[index]}",
style: TextStyle( style: TextStyle(
color: themeController.currentColor.sc3, color: themeController.currentColor.sc3,
fontSize: AppConstants().title_text_fontSize), fontSize: 60.rpx,
),
), ),
], ],
), ),
Column( SizedBox(height: 42.rpx),
children: [
Text( Text(
"1", "${nameList[index]}",
style: TextStyle( style: TextStyle(
color: themeController.currentColor.sc3, color: stringToColor("#929699"),
fontSize: AppConstants().title_text_fontSize), fontSize: AppConstants().normal_text_fontSize,
) ),
),
], ],
), ),
Column( ),
children: [ );
Text( }),
"1", ),
style: TextStyle( SizedBox(
color: themeController.currentColor.sc3, height: 130.rpx,
fontSize: AppConstants().title_text_fontSize),
)
],
)
],
), ),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [ Row(mainAxisAlignment: MainAxisAlignment.end, children: [
OutlinedButton( OutlinedButton(
onPressed: () {}, onPressed: () {
MHTHomeController homeController = Get.find();
Get.toNamed("/newSleepReportPage", arguments: {
'date': widget.sleepReport['startTime'],
"mac": homeController.selectDevcie.value,
'type': 1,
'backgroundImg': 'assets/images/new_background.png',
'person_show': false,
'itemName': 206,
});
},
style: OutlinedButton.styleFrom( style: OutlinedButton.styleFrom(
side: const BorderSide(color: Color(0XFF85F5FF)), side: const BorderSide(color: Color(0XFF85F5FF)),
foregroundColor: Color(0XFF85F5FF), foregroundColor: Color(0XFF85F5FF),

View File

@@ -1,3 +1,4 @@
import 'package:EasyDartModule/EasyDartModule.dart' as es;
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';
@@ -6,9 +7,8 @@ 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/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart'; import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart';
import 'package:vbvs_app/pages/sleep_report/chart/GradientLine.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
import 'package:vbvs_app/pages/sleep_report/chart/SnoreWaveform.dart'; import 'package:vbvs_app/pages/sleep_report/chart/SnoreWaveform.dart';
import 'package:EasyDartModule/EasyDartModule.dart' as es;
//睡眠规律性 //睡眠规律性
class NewSleepViewWidget extends StatefulWidget { class NewSleepViewWidget extends StatefulWidget {
@@ -48,8 +48,27 @@ class _NewSleepViewWidgetState extends State<NewSleepViewWidget> {
.where((item) => item['show'] != false) .where((item) => item['show'] != false)
.toList(); .toList();
final bsList = widget.sleepReport['bs'] as List; final bsList = widget.sleepReport['bs'] as List;
final deepSleep =
bsList.firstWhere((e) => e['id'] == 111, orElse: () => null);
final lightSleep =
bsList.firstWhere((e) => e['id'] == 117, orElse: () => null);
final snore =
bsList.firstWhere((e) => e['id'] == 116, orElse: () => null);
final movement =
bsList.firstWhere((e) => e['id'] == 108, orElse: () => null);
final leaveBed =
bsList.firstWhere((e) => e['id'] == 114, orElse: () => null);
final Map<int, int> typeIdMap = {
0: 114, // 离床时长
1: 117, // 浅睡时长
2: 111, // 深睡时长
3: 108, // 频繁体动时长
4: 116, // 打鼾时长
};
List snoreValues = []; List snoreValues = [];
List lightSnore = widget.sleepReport['ssp']['data'][0]; List lightSnore = widget.sleepReport['ssp']['data'][0];
List heavySnore = widget.sleepReport['ssp']['data'][1]; List heavySnore = widget.sleepReport['ssp']['data'][1];
snoreValues = [...lightSnore, ...heavySnore]; snoreValues = [...lightSnore, ...heavySnore];
@@ -156,10 +175,53 @@ class _NewSleepViewWidgetState extends State<NewSleepViewWidget> {
SizedBox( SizedBox(
height: 70.rpx, height: 70.rpx,
), ),
// Wrap(
// spacing: 55.rpx,
// runSpacing: 20.rpx,
// children: showLabel.map<Widget>((item) {
// return Container(
// padding: EdgeInsets.all(5.rpx),
// child: Row(
// mainAxisSize: MainAxisSize.min,
// children: [
// Container(
// width: 20.rpx,
// height: 20.rpx,
// decoration: BoxDecoration(
// color: item["color"] == null || item["color"] == ""
// ? Colors.transparent
// : stringToColor(item["color"]),
// borderRadius: BorderRadius.circular(10.rpx),
// ),
// ),
// SizedBox(width: 17.rpx),
// Text(
// item["name"],
// style: TextStyle(
// color: Colors.white,
// fontSize: 24.rpx,
// ),
// ),
// ],
// ),
// );
// }).toList(),
// ),
Wrap( Wrap(
spacing: 55.rpx, spacing: 55.rpx,
runSpacing: 20.rpx, runSpacing: 20.rpx,
children: showLabel.map<Widget>((item) { children: showLabel.map<Widget>((item) {
final int type = item["type"];
final int? targetId = typeIdMap[type];
// 在 bsList 中查找对应 id 的元素
final matchedItem = bsList.firstWhere(
(e) => e["id"] == targetId,
orElse: () => {},
);
final dynamic value = matchedItem?["value"];
final String displayValue = formatHourToHM(value);
return Container( return Container(
padding: EdgeInsets.all(5.rpx), padding: EdgeInsets.all(5.rpx),
child: Row( child: Row(
@@ -177,7 +239,9 @@ class _NewSleepViewWidgetState extends State<NewSleepViewWidget> {
), ),
SizedBox(width: 17.rpx), SizedBox(width: 17.rpx),
Text( Text(
item["name"], value != null
? "${item["name"]} $displayValue"
: "${item["name"]} -",
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 24.rpx, fontSize: 24.rpx,
@@ -188,9 +252,19 @@ class _NewSleepViewWidgetState extends State<NewSleepViewWidget> {
); );
}).toList(), }).toList(),
), ),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [ Row(mainAxisAlignment: MainAxisAlignment.end, children: [
OutlinedButton( OutlinedButton(
onPressed: () {}, onPressed: () {
MHTHomeController homeController = Get.find();
Get.toNamed("/newSleepReportPage", arguments: {
'date': widget.sleepReport['startTime'],
"mac": homeController.selectDevcie.value,
'type': 1,
'backgroundImg': 'assets/images/new_background.png',
'person_show': false,
});
},
style: OutlinedButton.styleFrom( style: OutlinedButton.styleFrom(
side: const BorderSide(color: Color(0XFF85F5FF)), side: const BorderSide(color: Color(0XFF85F5FF)),
foregroundColor: Color(0XFF85F5FF), foregroundColor: Color(0XFF85F5FF),
@@ -255,4 +329,19 @@ class _NewSleepViewWidgetState extends State<NewSleepViewWidget> {
} }
}).toList(); }).toList();
} }
String formatHourToHM(dynamic value) {
if (value == null) return "-";
if (value is num) {
int hours = value.floor();
int minutes = ((value - hours) * 60).round();
if (hours > 0) {
return "${hours}h ${minutes}m";
} else {
return "${minutes}m";
}
}
return "-";
}
} }

View File

@@ -58,7 +58,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
Get.put(tag: widget.data["tag"], SleepReportController()); Get.put(tag: widget.data["tag"], SleepReportController());
} }
sleepReportController = Get.find(tag: widget.data["tag"]); sleepReportController = Get.find(tag: widget.data["tag"]);
sleepReportController.sleepReport.value = {}; // sleepReportController.sleepReport.value = {};
if (widget.data['date'] == null) { if (widget.data['date'] == null) {
widget.data['date'] = DateTime.now().millisecondsSinceEpoch; widget.data['date'] = DateTime.now().millisecondsSinceEpoch;
@@ -109,52 +109,60 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (Get.isRegistered<SleepReportController>(tag: widget.data["tag"]) == Future.microtask(() {
false) { _initSleepReportData();
Get.put(tag: widget.data["tag"], SleepReportController());
}
sleepReportController = Get.find(tag: widget.data["tag"]);
sleepReportController.sleepReport.value = {};
if (widget.data['date'] == null) {
widget.data['date'] = DateTime.now();
}
calendarController.selectedDate.value =
DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
sleepReportController.selectedDate.value =
DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
if (widget.data['type'] != null) {
sleepReportController.model.type = widget.data['type'];
} else {
sleepReportController.model.type = 1;
}
String date = MyUtils.formatToDate(widget.data['date']);
// String date = '2025-5-27';
sleepReportController.isLoading.value = true;
requestWithLog(
logTitle: "查询睡眠报告",
method: MyHttpMethod.get,
queryUrl:
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${date}&type=${sleepReportController.model.type}",
onSuccess: (res) {
print(res);
sleepReportController.isLoading.value = false;
sleepReportController.sleepReport.value = res.data;
sleepReportController.updateAll();
_scrollToTargetComponent(sleepReportController.sleepReport);
},
onFailure: (res) {
if (MainPageBBottomChange.getCurrentIndex() != null) {
if (MainPageBBottomChange.getCurrentIndex() == 1) {
TopSlideNotification.show(context,
text: res.msg!, textColor: themeController.currentColor.sc9);
}
} else {}
sleepReportController.sleepReport.value = {};
sleepReportController.isLoading.value = false;
sleepReportController.updateAll();
print(res);
}); });
// try {
// if (Get.isRegistered<SleepReportController>(tag: widget.data["tag"]) ==
// false) {
// Get.put(tag: widget.data["tag"], SleepReportController());
// }
// sleepReportController = Get.find(tag: widget.data["tag"]);
// // sleepReportController.sleepReport.value = {};
// if (widget.data['date'] == null) {
// widget.data['date'] = DateTime.now();
// }
// calendarController.selectedDate.value =
// DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
// sleepReportController.selectedDate.value =
// DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
// if (widget.data['type'] != null) {
// sleepReportController.model.type = widget.data['type'];
// } else {
// sleepReportController.model.type = 1;
// }
// String date = MyUtils.formatToDate(widget.data['date']);
// // String date = '2025-5-27';
// sleepReportController.isLoading.value = true;
// requestWithLog(
// logTitle: "查询睡眠报告",
// method: MyHttpMethod.get,
// queryUrl:
// "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${date}&type=${sleepReportController.model.type}",
// onSuccess: (res) {
// print(res);
// sleepReportController.isLoading.value = false;
// sleepReportController.sleepReport.value = res.data;
// sleepReportController.updateAll();
// _scrollToTargetComponent(sleepReportController.sleepReport);
// },
// onFailure: (res) {
// if (MainPageBBottomChange.getCurrentIndex() != null) {
// if (MainPageBBottomChange.getCurrentIndex() == 1) {
// TopSlideNotification.show(context,
// text: res.msg!,
// textColor: themeController.currentColor.sc9);
// }
// } else {}
// sleepReportController.sleepReport.value = {};
// sleepReportController.isLoading.value = false;
// sleepReportController.updateAll();
// print(res);
// });
// } catch (e) {
// ef.log("$e");
// }
double lineWidth = 115.rpx; double lineWidth = 115.rpx;
return LayoutBuilder( return LayoutBuilder(
builder: (context, bodySize) => GestureDetector( builder: (context, bodySize) => GestureDetector(
@@ -655,7 +663,6 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
Stack( Stack(
alignment: Alignment.bottomLeft, alignment: Alignment.bottomLeft,
children: [ children: [
Row( Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceAround, MainAxisAlignment.spaceAround,
@@ -1325,7 +1332,6 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
return; return;
} }
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
final targetName = widget.data['name'];
final targetID = widget.data['itemName']; final targetID = widget.data['itemName'];
GlobalKey? targetKey; GlobalKey? targetKey;
@@ -1414,4 +1420,55 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
); );
}); });
} }
void _initSleepReportData() {
try {
if (Get.isRegistered<SleepReportController>(tag: widget.data["tag"]) ==
false) {
Get.put(tag: widget.data["tag"], SleepReportController());
}
sleepReportController = Get.find(tag: widget.data["tag"]);
if (widget.data['date'] == null) {
widget.data['date'] = DateTime.now();
}
final dateTime = DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
calendarController.selectedDate.value = dateTime;
sleepReportController.selectedDate.value = dateTime;
sleepReportController.model.type = widget.data['type'] ?? 1;
String dateStr = MyUtils.formatToDate(widget.data['date']);
sleepReportController.isLoading.value = true;
requestWithLog(
logTitle: "查询睡眠报告",
method: MyHttpMethod.get,
queryUrl:
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=$dateStr&type=${sleepReportController.model.type}",
onSuccess: (res) {
sleepReportController.isLoading.value = false;
sleepReportController.sleepReport.value = res.data;
sleepReportController.updateAll();
_scrollToTargetComponent(sleepReportController.sleepReport);
},
onFailure: (res) {
if (MainPageBBottomChange.getCurrentIndex() == 1) {
TopSlideNotification.show(
context,
text: res.msg!,
textColor: themeController.currentColor.sc9,
);
}
sleepReportController.sleepReport.value = {};
sleepReportController.isLoading.value = false;
sleepReportController.updateAll();
},
);
} catch (e) {
ef.log("$e");
}
}
} }