diff --git a/assets/mhlangs/zh_CN.json b/assets/mhlangs/zh_CN.json index 25d1928..00f6324 100644 --- a/assets/mhlangs/zh_CN.json +++ b/assets/mhlangs/zh_CN.json @@ -68,7 +68,7 @@ "检索设备": "检索设备", "搜索": "搜索", "匹配出的外围设备": "匹配出的外围设备", - "知道了": "知道了", + "知道了": "返回", "蓝牙未开启": "蓝牙未开启", "请先打开蓝牙在进行设备扫描": "请先打开蓝牙在进行设备扫描", "等待扫描": "等待扫描", @@ -111,7 +111,7 @@ "无法绑定1": "检测到该设备", "无法绑定2": "已被绑定", "无法绑定3": ",绑定前请先进行解绑,有疑问请联系客服", - "知道了": "知道了", + "知道了": "返回", "是": "是", "否": "否", "确定绑定提示": "确定绑定该设备吗?", @@ -208,9 +208,9 @@ "解除分享": "解除分享", "最高分": "最高分", "最低分": "最低分", - "本周平均分":"本周平均分", - "本月平均分":"本月平均分", - "每日得分":"每日得分", - "每日得分介绍":"每日得分介绍", - "与上月对比":"与上月对比" + "本周平均分": "本周平均分", + "本月平均分": "本月平均分", + "每日得分": "每日得分", + "每日得分介绍": "每日得分介绍", + "与上月对比": "与上月对比" } \ No newline at end of file diff --git a/lib/common/util/CheckNetwork.dart b/lib/common/util/CheckNetwork.dart index 06d52df..f87058b 100644 --- a/lib/common/util/CheckNetwork.dart +++ b/lib/common/util/CheckNetwork.dart @@ -7,7 +7,6 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:vbvs_app/common/util/CommonVariables.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; -import 'package:vbvs_app/pages/common/selectDialog.dart'; import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart'; class Checknetwork { diff --git a/lib/controller/mh_controller/device_list_controller.dart b/lib/controller/mh_controller/device_list_controller.dart index d9ada96..45eb2df 100644 --- a/lib/controller/mh_controller/device_list_controller.dart +++ b/lib/controller/mh_controller/device_list_controller.dart @@ -19,6 +19,7 @@ part 'device_list_controller.g.dart'; class DeviceListModel { //设备列表 List deviceList = []; + ListvitalList=[]; @JsonKey(ignore: true) String? keyword; @@ -35,7 +36,7 @@ class DeviceListController extends GetControllerEx { DeviceListController() { attr = GetModel(DeviceListModel()).obs; } - +//床和床垫 getDeviceList() async { try { String search = (model.keyword != null && model.keyword!.isNotEmpty) @@ -70,6 +71,37 @@ class DeviceListController extends GetControllerEx { } return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement } +//体征传感器 + getVitalList(String mac) async { + try { + ApiResponse apiResponse = ApiResponse(code: -1, msg: "设备.设备列表请求失败".tr); + String serviceAddress = ServiceConstant.service_address; + String serviceName = ServiceConstant.server_service; + String serviceApi = ServiceConstant.device_list; + String queryUrl = + "${serviceAddress}${serviceName}${serviceApi}?bindType=1&mac=$mac"; + var response = await EasyDartModule.dio.get(queryUrl); + if (response != null) { + var responseData = + response.data is String ? jsonDecode(response.data) : response.data; + ApiResponse res = + ApiResponse.fromJson(responseData, (object) => object); + MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr); + if (res.code == HttpStatusCodes.ok) { + // bindDeviceNum.value = res.total!; + model.vitalList = res.data; + updateAll(); + } + } else { + return ApiResponse(code: -1, msg: "服务器.失败".tr); + } + return apiResponse; + } catch (e) { + EasyDartModule.logger.info("体征传感器请求列表: $e"); + DailyLogUtils.writeLog("体征传感器请求列表: $e"); + } + return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement + } //主动解绑设备 Future unbindDevice(Map device) async { diff --git a/lib/controller/mh_controller/device_list_controller.g.dart b/lib/controller/mh_controller/device_list_controller.g.dart index 9cb69ac..11a4164 100644 --- a/lib/controller/mh_controller/device_list_controller.g.dart +++ b/lib/controller/mh_controller/device_list_controller.g.dart @@ -7,9 +7,12 @@ part of 'device_list_controller.dart'; // ************************************************************************** DeviceListModel _$DeviceListModelFromJson(Map json) => - DeviceListModel()..deviceList = json['deviceList'] as List; + DeviceListModel() + ..deviceList = json['deviceList'] as List + ..vitalList = json['vitalList'] as List; Map _$DeviceListModelToJson(DeviceListModel instance) => { 'deviceList': instance.deviceList, + 'vitalList': instance.vitalList, }; diff --git a/lib/controller/sleep/sleep_report_controller.dart b/lib/controller/sleep/sleep_report_controller.dart index 150b5a6..77da6c2 100644 --- a/lib/controller/sleep/sleep_report_controller.dart +++ b/lib/controller/sleep/sleep_report_controller.dart @@ -25,10 +25,14 @@ class SleepReportModel { } class SleepReportController extends GetControllerEx { - Rx selectedDate = Rx(null); - RxMap sleepReport = RxMap(); + RxMap sleepReport = {}.obs; + + var isLoading = false.obs; + + // 每种类型对应一份数据 + SleepReportController() { attr = GetModel(SleepReportModel()).obs; - } + } } diff --git a/lib/pages/device/component/DeviceDataComponentWidget.dart b/lib/pages/device/component/DeviceDataComponentWidget.dart index 2f5aab7..fc51c83 100644 --- a/lib/pages/device/component/DeviceDataComponentWidget.dart +++ b/lib/pages/device/component/DeviceDataComponentWidget.dart @@ -1017,6 +1017,7 @@ class _DeviceDataComponentWidgetState extends State { ), ].divide(SizedBox(width: 50.rpx)), ), + ].divide(SizedBox(width: 34.rpx)), ), SizedBox(height: 20.rpx), diff --git a/lib/pages/device_bind/componnet/bind_dialog.dart b/lib/pages/device_bind/componnet/bind_dialog.dart index 8d7ce1b..c0a1148 100644 --- a/lib/pages/device_bind/componnet/bind_dialog.dart +++ b/lib/pages/device_bind/componnet/bind_dialog.dart @@ -920,6 +920,7 @@ Future showTipDialog( BuildContext context, Widget widget, { Color? backgroundColor, + Co }) { ThemeController themeController = Get.find(); // BlueteethBindController blueteethBindController = Get.find(); @@ -998,6 +999,9 @@ Future showTipDialog( ); } + + + Future showUnBindTipDialog( BuildContext context, Widget widget, { diff --git a/lib/pages/main_bottom/component/main_page_b_bottom_change.dart b/lib/pages/main_bottom/component/main_page_b_bottom_change.dart index 1b1a9de..207390f 100644 --- a/lib/pages/main_bottom/component/main_page_b_bottom_change.dart +++ b/lib/pages/main_bottom/component/main_page_b_bottom_change.dart @@ -110,34 +110,33 @@ class _HomePageState extends State return Center(child: Text('页面 ${titles[selectedIndex]}')); } - DateTime? _lastBackPressedTime; // 记录上一次返回的时间 @override Widget build(BuildContext context) { return PopScope( - canPop: false, - onPopInvokedWithResult: (disposition, result) async { - if (Platform.isAndroid) { - var flag = await _handleBackPressed(context); // 自定义返回逻辑 - if (flag) { - SystemNavigator.pop(); + canPop: false, + onPopInvokedWithResult: (disposition, result) async { + if (Platform.isAndroid) { + var flag = await _handleBackPressed(context); // 自定义返回逻辑 + if (flag) { + SystemNavigator.pop(); + } } - } - }, + }, child: Scaffold( - backgroundColor: const Color(0xFF011C33), - body: IndexedStack( - index: selectedIndex, - children: pages, - ), - bottomNavigationBar: BezierBottomNavigationBar( - selectedIndex: selectedIndex, - animatedPosition: _positionAnimation.value, - onTap: _onTabTapped, - path: path, - titles: titles, - ), - )); + backgroundColor: const Color(0xFF011C33), + body: IndexedStack( + index: selectedIndex, + children: pages, + ), + bottomNavigationBar: BezierBottomNavigationBar( + selectedIndex: selectedIndex, + animatedPosition: _positionAnimation.value, + onTap: _onTabTapped, + path: path, + titles: titles, + ), + )); } void switchTab(int index) { @@ -243,8 +242,8 @@ class _HomePageState extends State ef.log("[激活控制页面报错]:$e"); } } - - Future _handleBackPressed(BuildContext context) async { + + Future _handleBackPressed(BuildContext context) async { final currentTime = DateTime.now(); // 如果上次点击返回键时间为空,或者间隔超过 1 秒 diff --git a/lib/pages/mh_page/LanguagePage.dart b/lib/pages/mh_page/LanguagePage.dart index bb458a4..2ed9759 100644 --- a/lib/pages/mh_page/LanguagePage.dart +++ b/lib/pages/mh_page/LanguagePage.dart @@ -110,51 +110,60 @@ class LanguagePage extends GetView { } Widget _buildItem(BuildContext context, int index, MHLanguageModel model) { - return Container( - // width: bodysize!.maxWidth * 1, - height: bodysize!.maxHeight * 0.055, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - model.language_name ?? "", - style: TextStyle(color: Colors.white, fontSize: 30.rpx), - ), - Theme( - data: ThemeData( - checkboxTheme: CheckboxThemeData( - visualDensity: VisualDensity.compact, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4), - ), - ), + return GestureDetector( + onTap: () { + controller.selectLanguage.value = model; + }, + child: Container( + height: bodysize!.maxHeight * 0.055, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + model.language_name ?? "", + style: TextStyle(color: Colors.white, fontSize: 30.rpx), ), - child: Obx(() { - return Checkbox( - value: controller.selectLanguage.value?.language_code == - model.language_code, - onChanged: (newValue) async { - controller.selectLanguage.value = model; - // if (newValue!) { - // selectLanguage!.value = languageMap[ - // text]!; // Set selectLanguage to the current text value - // } else { - // selectLanguage!.value = - // ''; // Clear selection if unchecked - // } - }, - shape: CircleBorder(), - side: BorderSide( - width: 2, - // color: FlutterFlowTheme.of(context).alternate, + Obx(() { + double h = 33.rpx; + bool check = controller.selectLanguage.value?.language_code == + model.language_code; + + return Container( + height: 33.rpx, + child: AspectRatio( + aspectRatio: 1, + child: Center( + child: Container( + height: h, + width: h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(h / 2), + border: Border.all( + width: check ? 1 : 0.5, + color: Color(0xFFC8CBD2), + ), + ), + child: check + ? Center( + child: ClipOval( + child: Container( + width: h * 0.6, + height: h * 0.6, + color: const Color(0xFF6BFDAC), + ), + ), + ) + : null, + ), + ), ), - activeColor: Color(0XFF6BFDAC), - // checkColor: FlutterFlowTheme.of(context).info, ); - })), - ], - ), - ); + }), + ], + ), + ) + // width: bodysize!.maxWidth * 1, + + ); } } diff --git a/lib/pages/mh_page/Vital_signs_sensor.dart b/lib/pages/mh_page/Vital_signs_sensor.dart new file mode 100644 index 0000000..2a4b944 --- /dev/null +++ b/lib/pages/mh_page/Vital_signs_sensor.dart @@ -0,0 +1,487 @@ +import 'dart:async'; + +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/NullDataComponentWidget.dart'; +import 'package:vbvs_app/component/tool/ClickableContainer.dart'; +import 'package:vbvs_app/controller/mh_controller/device_list_controller.dart'; +import 'package:vbvs_app/pages/device_bind/componnet/bind_dialog.dart'; + +class VitalSignsSensorPage extends StatefulWidget { + Map data; + VitalSignsSensorPage({required this.data}); + @override + _VitalSignsSensorState createState() => _VitalSignsSensorState(); +} + +class _VitalSignsSensorState extends State { + BoxConstraints? bodysize; + DeviceListController controller = Get.find(); + Timer? _timer; + @override + void initState() { + super.initState(); + _fetchDeviceList(); + _timer = Timer.periodic(Duration(seconds: 5), (timer) { + _fetchDeviceList(); + }); + } + + _fetchDeviceList() async { + await controller.getVitalList(widget.data['mac']); + } + + @override + void dispose() { + _timer?.cancel(); // 页面销毁时取消定时器 + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return LayoutBuilder(builder: (context, cc) { + bodysize = cc; + return GestureDetector( + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/new_background.png'), // 本地图片 + fit: BoxFit.fill, // 填满整个 Container + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + backgroundColor: Colors.transparent, + iconTheme: const IconThemeData(color: Colors.white), + automaticallyImplyLeading: false, + titleSpacing: 0, + title: SizedBox( + width: double.infinity, + height: 180.rpx, + child: Stack( + alignment: Alignment.center, + children: [ + // 中间居中的标题 + Text( + "体征传感器", + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 30.rpx, + ), + ), + // 左侧图标 + Positioned( + left: 0.rpx, + child: returnIconButtomNew, + ), + ], + ), + ), + centerTitle: false, + ), + body: SafeArea( + child: Obx(() { + var list = controller.model.vitalList; + return list.isEmpty + ? const NullDataWidget() + : _buildVitalListView(list); + }), + ), + ))); + }); + } + + Widget _buildVitalListView(List dataList) { + return Container( + width: double.infinity, + padding: EdgeInsets.symmetric(horizontal: 30.rpx), + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 30.rpx), + ...List.generate(dataList.length, (index) { + final item = dataList[index]; + final title = "体征传感器${index == 0 ? "A" : "B"}"; // ✅ 只处理 A/B 场景 + return VitalWidget(title: title, data: item); + }).divide(SizedBox(height: 30.rpx)), + SizedBox(height: 30.rpx), + ], + ), + ), + ); + } +} + +class VitalWidget extends StatelessWidget { + final String title; + final Map data; + + const VitalWidget({super.key, required this.title, required this.data}); + + @override + Widget build(BuildContext context) { + final String id = data['mac'] ?? '--'; + final int? timestamp = data['create_time']; + final String time = (timestamp != null) + ? DateFormat('yyyy-MM-dd HH:mm') + .format(DateTime.fromMillisecondsSinceEpoch(timestamp)) + : '--'; + final List icons = data['icons'] ?? []; + + return ClickableContainer( + backgroundColor: Color(0xFF003058), + highlightColor: Color(0xFF055466), + borderRadius: 20.rpx, + padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 30.rpx, 30.rpx, 40.rpx), + onTap: () {}, + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + width: double.infinity, + // constraints: BoxConstraints( + // minHeight: 60.rpx, + // ), + child: Align( + alignment: AlignmentDirectional(-1, 0), + child: Text( + // '实时监测结果通知'.tr, + title, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 30.rpx, + letterSpacing: 0.0, + color: themeController.currentColor.sc3, + ), + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: MediaQuery.sizeOf(context).width * 0.14, + constraints: BoxConstraints(minWidth: 106.rpx), + child: Text( + "设备ID", + style: TextStyle( + color: stringToColor("#929699"), + fontSize: 26.rpx, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + id, + style: TextStyle(fontSize: 26.rpx, color: Color(0xFFFFFFFF)), + ), + ].divide(SizedBox(width: 33.rpx)), + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: MediaQuery.sizeOf(context).width * 0.14, + constraints: BoxConstraints(minWidth: 106.rpx), + child: Text( + "更新时间", + style: TextStyle( + color: stringToColor("#929699"), + fontSize: 26.rpx, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + time, + style: TextStyle(fontSize: 26.rpx, color: Color(0xFFFFFFFF)), + ), + ].divide(SizedBox(width: 33.rpx)), + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + width: MediaQuery.sizeOf(context).width * 0.14, + constraints: BoxConstraints(minWidth: 106.rpx), + child: Text( + "设备状态", + style: TextStyle( + color: stringToColor("#929699"), + fontSize: 26.rpx, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + if (data['status']['signal'] != null && + data['status']['signal'] != -1 && + data['status']['status'] != null && + data['status']['status'] == 1) + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.grey, // 或根据你主题定制颜色 + padding: EdgeInsets.zero, + borderRadius: 0, + onTap: () { + // 点击事件 + showTipDialog( + context, + Container( + child: RichText( + text: TextSpan( + text: "信号强度".tr, // 文本前缀部分 + style: TextStyle( + color: themeController.currentColor.sc3, + fontSize: + AppConstants().title_text_fontSize, + ), + children: [ + TextSpan( + text: getBedSignal( + data['status']['signal']), // 状态部分 + style: TextStyle( + color: themeController + .currentColor.sc2, // 同样颜色,也可改成其他颜色 + fontSize: + AppConstants().title_text_fontSize, + ), + ), + ], + ), + ), + ), + ); + }, + + child: Container( + width: 30.rpx, + height: 24.rpx, + child: Image.asset( + 'assets/img/signal${_getSignalLevel(data['status']['signal'])}.png'), + ), + ), + if (data['status']['inBed'] != null && + data['status']['status'] != null && + data['status']['status'] == 1) + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.grey, + padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0), + borderRadius: 0, + onTap: () { + showTipDialog( + context, + Container( + child: RichText( + text: TextSpan( + text: "是否在床".tr, // 文本前缀部分 + style: TextStyle( + color: themeController.currentColor.sc3, + fontSize: + AppConstants().title_text_fontSize, + ), + children: [ + TextSpan( + text: getBedStatus( + data['status']['inBed']), // 状态部分 + style: TextStyle( + color: themeController + .currentColor.sc2, // 同样颜色,也可改成其他颜色 + fontSize: + AppConstants().title_text_fontSize, + ), + ), + ], + ), + ), + ), + ); + }, + child: SizedBox( + width: 16.rpx, + height: 36.rpx, + child: SvgPicture.asset( + data['status']['inBed'] == 0 + ? 'assets/img/icon/not_bed.svg' + : 'assets/img/icon/in_bed.svg', + fit: BoxFit.fill, + ), + ), + ), + if (data['status']['failure'] != 0 && + data['status']['status'] != null && + data['status']['status'] == 1) + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.grey, // 可自定义点击水波纹颜色 + padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0), + borderRadius: 0, + onTap: () { + showTipDialog( + context, + Container( + child: RichText( + text: TextSpan( + text: "设备故障".tr, // 文本前缀部分 + style: TextStyle( + color: themeController.currentColor.sc9, + fontSize: + AppConstants().title_text_fontSize, + ), + children: [ + // TextSpan( + // text:widget + // .device['status']['status'] == 1?"在线".tr:"离线".tr, // 状态部分 + // style: TextStyle( + // color: themeController.currentColor + // .sc2, // 同样颜色,也可改成其他颜色 + // fontSize: AppConstants() + // .title_text_fontSize, + // ), + // ), + ], + ), + ), + ), + ); + }, + child: SizedBox( + width: 27.rpx, + height: 27.rpx, + child: SvgPicture.asset( + 'assets/img/icon/device_issue.svg', + fit: BoxFit.cover, + ), + ), + ), + if (data['status']['upgrade'] != 0 && + data['status']['status'] != null && + data['status']['status'] == 1) + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.grey, // 可自定义点击效果颜色 + padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0), + borderRadius: 0, + onTap: () { + //todo 升级 + }, + child: SizedBox( + width: 34.rpx, + height: 24.rpx, + child: SvgPicture.asset( + 'assets/img/icon/upgrade.svg', + fit: BoxFit.cover, + // color: themeController.currentColor.sc3, // 若你想加颜色控制可取消注释 + ), + ), + ), + if (data['status']['status'] != null && + data['status']['status'] == 0) + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: Colors.grey, // 可替换为点击高亮色 + padding: EdgeInsetsDirectional.fromSTEB(0, 0.rpx, 0, 0), + borderRadius: 0, + onTap: () { + showTipDialog( + context, + Container( + child: RichText( + text: TextSpan( + text: "网络状态".tr, // 文本前缀部分 + style: TextStyle( + color: themeController.currentColor.sc3, + fontSize: + AppConstants().title_text_fontSize, + ), + children: [ + TextSpan( + text: data['status']['status'] == 1 + ? "在线".tr + : "离线".tr, // 状态部分 + style: TextStyle( + color: themeController + .currentColor.sc2, // 同样颜色,也可改成其他颜色 + fontSize: + AppConstants().title_text_fontSize, + ), + ), + ], + ), + ), + ), + ); + }, + child: SizedBox( + width: 27.rpx, + height: 27.rpx, + child: SvgPicture.asset( + // data['status']['status'] == 1 + // ? 'assets/img/icon/device_online.svg' + // : 'assets/img/icon/device_offline.svg', + 'assets/img/icon/device_issue.svg', + fit: BoxFit.cover, + ), + ), + ), + ].divide(SizedBox(width: 50.rpx)), + ), + ].divide(SizedBox(width: 34.rpx)), + ), + ].divide( + SizedBox(height: 20.rpx), + )), + ); + } + + getBedSignal(signal) { + if (signal <= 1) { + return "较弱".tr; + } + if (signal > 1 && signal <= 2) { + return "弱".tr; + } + if (signal > 2 && signal <= 3) { + return "一般".tr; + } + if (signal > 3) { + return "强".tr; + } + return "未知数据".tr; + } + + String getBedStatus(int status) { + if (status == 0) { + return "离床".tr; + } else if (status == 1) { + return "在床".tr; + } + return ""; + } + + int _getSignalLevel(int signal) { + if (signal <= 25) { + return 1; + } else if (signal <= 50) { + return 2; + } else if (signal <= 75) { + return 3; + } else { + return 4; + } + } +} diff --git a/lib/pages/mh_page/bluetooth.dart b/lib/pages/mh_page/bluetooth.dart index 89a30dc..f884cac 100644 --- a/lib/pages/mh_page/bluetooth.dart +++ b/lib/pages/mh_page/bluetooth.dart @@ -237,7 +237,9 @@ class _BluetoothPageState extends State { } }), _buildMenuButton(context, '设备校准', ""), - _buildMenuButton(context, '体征传感器', ""), + _buildMenuButton( + context, '体征传感器', "/vitalSignsSensorPage", + arguments: obsData), _buildMenuButton(context, 'WIFI配置', ""), _buildMenuButton( context, '睡眠习惯', "/sleepHabitPage"), diff --git a/lib/pages/mh_page/component/easychart.dart b/lib/pages/mh_page/component/easychart.dart index f4173e7..3825e45 100644 --- a/lib/pages/mh_page/component/easychart.dart +++ b/lib/pages/mh_page/component/easychart.dart @@ -197,7 +197,7 @@ class LineView extends StatelessWidget { tips, style: TextStyle( color: Color(0XFFFFFFFF), // 多了一个 F,建议改成正确格式 - fontSize: 26.rpx, + fontSize: 20.rpx, ), ), ))); diff --git a/lib/pages/mh_page/smys.dart b/lib/pages/mh_page/smys.dart index 19c7ba5..55105e8 100644 --- a/lib/pages/mh_page/smys.dart +++ b/lib/pages/mh_page/smys.dart @@ -131,25 +131,7 @@ class Smys extends GetView { letterSpacing: 0, ), ), - Container( - - // height: - // MediaQuery.sizeOf(context).height * - // 0.04, - child: FlutterSwitch( - width: 70.rpx, - height: 36.rpx, - toggleSize: 30.rpx, - activeColor: Color(0XFF6BFDAC), - inactiveColor: Color(0XFF003058), - toggleColor: Color(0xFF011D33), - value: controller.model.smysIsStart, - onToggle: (val) { - controller.attr.update((getmodel) { - getmodel.model.smysIsStart = val; - }); - }, - )), + ], ), )), diff --git a/lib/pages/sleep_report/component/HeartRateCard.dart b/lib/pages/sleep_report/component/HeartRateCard.dart index 2da6d13..68fb00d 100644 --- a/lib/pages/sleep_report/component/HeartRateCard.dart +++ b/lib/pages/sleep_report/component/HeartRateCard.dart @@ -1,3 +1,4 @@ +import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; diff --git a/lib/pages/sleep_report/component/WeekDataWidget.dart b/lib/pages/sleep_report/component/WeekDataWidget.dart index 681a224..2f715ce 100644 --- a/lib/pages/sleep_report/component/WeekDataWidget.dart +++ b/lib/pages/sleep_report/component/WeekDataWidget.dart @@ -20,7 +20,7 @@ Widget WeekDataWidget( return [ AvgSleepScoreWidget( sleepReport: sleepReport, - ), //睡眠评分 + ), SleepChartContainer( title: "每日得分", tipText: "用户本周睡眠分数的汇总。", @@ -100,7 +100,6 @@ Widget WeekDataWidget( ), showLabel: sleepReport['scoreList']['type'], ), - SleepCard( sleepReport: sleepReport, highlightItem: data['itemName'], @@ -368,7 +367,7 @@ Widget WeekDataWidget( padding: 45.rpx), TrendDataTablePage( title: sleepReport['dysp'][2]['name'], - tipText:sleepReport['dysp'][2]['tips'], + tipText: sleepReport['dysp'][2]['tips'], chartContent: LineView( xLabels: [ ChartLables( @@ -600,7 +599,6 @@ Widget WeekDataWidget( bottomPadding: 50, ), padding: 45.rpx), - Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/pages/sleep_report/new_sleep_report_page.dart b/lib/pages/sleep_report/new_sleep_report_page.dart index 033f4a4..62173bb 100644 --- a/lib/pages/sleep_report/new_sleep_report_page.dart +++ b/lib/pages/sleep_report/new_sleep_report_page.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -245,535 +247,10 @@ class _NewSleepReportPageState extends State { body: SafeArea( top: true, child: Obx(() { - var sleepReport = sleepReportController.sleepReport; - print(sleepReport); - if (sleepReport.isEmpty || sleepReport.isEmpty) { - return Column( - children: [ - Padding( - padding: - EdgeInsetsDirectional.fromSTEB(0, 30.rpx, 0, 0), - child: Container( - width: double.infinity, - constraints: BoxConstraints( - minHeight: 90.rpx, - ), - decoration: BoxDecoration( - color: widget.data['backgroundColor'] != null - ? widget.data['backgroundColor'] - : themeController.currentColor.sc5, - ), - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 30.rpx, 15.rpx, 30.rpx, 15.rpx), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Stack( - alignment: Alignment.bottomLeft, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - children: [ - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: - themeController.currentColor.sc3, - borderRadius: 8.rpx, - padding: EdgeInsets.all(0), - onTap: () async { - sleepReportController.model.type = - 1; - - String data = MyUtils.formatDate( - calendarController - .selectedDate.value!); - await requestWithLog( - logTitle: "查询睡眠报告", - method: MyHttpMethod.get, - queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}", - onSuccess: (res) { - print(res); - sleepReportController - .sleepReport - .value = res.data; - sleepReportController - .updateAll(); - }, - onFailure: (res) { - if (MainPageBBottomChange - .getCurrentIndex() != - null) { - if (MainPageBBottomChange - .getCurrentIndex() == - 1) { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - } else { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - sleepReportController - .sleepReport.value = {}; - sleepReportController - .updateAll(); - print(res); - }); - sleepReportController.updateAll(); - }, - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - width: 115.rpx, // 固定宽度为 160.rpx - alignment: - Alignment.center, // 文字居中 - child: Text( - '日报'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: AppConstants() - .title_text_fontSize, - letterSpacing: 0.0, - color: sleepReportController - .model.type == - 1 - ? themeController - .currentColor.sc2 - : themeController - .currentColor.sc3, - ), - ), - ), - SizedBox(height: 10.rpx), - ], - ), - ), - Obx(() { - return ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: themeController - .currentColor.sc3, - borderRadius: 8.rpx, - padding: EdgeInsets.all(0), - onTap: () async { - sleepReportController.model.type = - 2; - String data = MyUtils.formatDate( - calendarController - .selectedDate.value!); - await requestWithLog( - logTitle: "查询睡眠报告", - method: MyHttpMethod.get, - queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}", - onSuccess: (res) { - print(res); - sleepReportController - .sleepReport - .value = res.data; - sleepReportController - .updateAll(); - }, - onFailure: (res) { - if (MainPageBBottomChange - .getCurrentIndex() != - null) { - if (MainPageBBottomChange - .getCurrentIndex() == - 1) { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - } else { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - sleepReportController - .sleepReport.value = {}; - sleepReportController - .updateAll(); - print(res); - }); - sleepReportController.updateAll(); - }, - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - width: - 115.rpx, // 固定宽度为 160.rpx - alignment: - Alignment.center, // 文字居中 - child: Text('周报'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: AppConstants() - .title_text_fontSize, - letterSpacing: 0.0, - color: - sleepReportController - .model - .type == - 2 - ? themeController - .currentColor - .sc2 - : themeController - .currentColor - .sc3, - )), - ), - SizedBox(height: 10.rpx), - ], - ), - ); - }), - Obx(() { - return ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: themeController - .currentColor.sc3, - borderRadius: 8.rpx, - padding: EdgeInsets.all(0), - onTap: () async { - sleepReportController.model.type = - 3; - String data = MyUtils.formatDate( - calendarController - .selectedDate.value!); - await requestWithLog( - logTitle: "查询睡眠报告", - method: MyHttpMethod.get, - queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}", - onSuccess: (res) { - print(res); - sleepReportController - .sleepReport - .value = res.data; - sleepReportController - .updateAll(); - }, - onFailure: (res) { - if (MainPageBBottomChange - .getCurrentIndex() != - null) { - if (MainPageBBottomChange - .getCurrentIndex() == - 1) { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - } else { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - sleepReportController - .sleepReport.value = {}; - sleepReportController - .updateAll(); - print(res); - }); - - sleepReportController.updateAll(); - }, - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - width: - 115.rpx, // 固定宽度为 160.rpx - alignment: - Alignment.center, // 文字居中 - child: Text( - '月报'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: AppConstants() - .title_text_fontSize, - letterSpacing: 0.0, - color: sleepReportController - .model.type == - 3 - ? themeController - .currentColor.sc2 - : themeController - .currentColor.sc3, - ), - ), - ), - SizedBox(height: 10.rpx), - ], - ), - ); - }), - ], - ), - AnimatedPositioned( - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - bottom: 0, - left: sleepReportController.model.type == - 1 - ? 0 - : sleepReportController.model.type == - 2 - ? 115.rpx - : 230.rpx, - child: Container( - width: lineWidth, - height: 4.rpx, - decoration: BoxDecoration( - color: - themeController.currentColor.sc2, - borderRadius: - BorderRadius.circular(2.rpx), - ), - ), - ), - ], - ), - ], - ), - ), - ), - ), - Container( - width: double.infinity, - child: Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 30.rpx, 32.rpx, 30.rpx, 32.rpx), - child: getTimeWidget(), - ), - ), - if (widget.data['person_show'] == null || - widget.data['person_show'] != false) - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 30.rpx, 0.rpx, 30.rpx, 51.rpx), - child: ClickableContainer( - backgroundColor: - widget.data['backgroundColor'] != null - ? widget.data['backgroundColor'] - : themeController.currentColor.sc5, - highlightColor: themeController - .currentColor.sc5, // 或你希望的点击水波纹颜色 - borderRadius: AppConstants() - .normal_container_radius, // 如果你想加圆角可以设置 eg. 12.rpx - padding: EdgeInsets.zero, - onTap: () {}, - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Flexible( - flex: 2, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Text( - '姓名'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc4, - ), - ), - Text( - '年龄'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc4, - ), - ), - ].divide(SizedBox(height: 34.rpx)), - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - (widget.data['person']?['name'] - ?.toString() - .trim() - .isNotEmpty ?? - false) - ? widget - .data['person']!['name'] - .toString() - : '未知数据'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc3, - ), - ), - Text( - '${MyUtils.getAgeByDate(MyUtils.formatBirthdayTime(widget.data['person']?['birthday'])) ?? '未知数据'.tr}', - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc3, - ), - ), - ].divide(SizedBox(height: 34.rpx)), - ), - ] - .divide(SizedBox(width: 33.rpx)) - .addToStart( - SizedBox(width: 37.rpx)), - ), - ] - .addToStart(SizedBox(height: 36.rpx)) - .addToEnd(SizedBox(height: 36.rpx)), - ), - ), - Flexible( - flex: 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Text( - '设备ID'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc4, - ), - ), - Text( - '体重'.tr, - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc4, - ), - ), - ].divide(SizedBox(height: 34.rpx)), - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - '${widget.data['code'] ?? '未知数据'.tr}', - // "D11250300003", - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc3, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text( - '${widget.data['person']?['weight'] ?? '未知数据'.tr}kg', - style: TextStyle( - fontFamily: 'Inter', - fontSize: 26.rpx, - letterSpacing: 0.0, - color: themeController - .currentColor.sc3, - ), - ), - ].divide(SizedBox(height: 34.rpx)), - ), - ] - .divide(SizedBox(width: 33.rpx)) - .addToStart( - SizedBox(width: 37.rpx)), - ), - ] - .addToStart(SizedBox(height: 36.rpx)) - .addToEnd(SizedBox(height: 36.rpx)), - ), - ), - ], - ), - ), - ), - (sleepReport.value == null || sleepReport.value.isEmpty) - ? Container( - child: Expanded(child: NullDataWidget()), - ) - : (sleepReportController.model.type == 1 - ? DailyDataWidget(sleepReport, sleepCardKey, - heartRateCardKey, breatheCardKey, widget.data) - : sleepReportController.model.type == 2 - ? WeekDataWidget(sleepReport, widget.data) - : sleepReportController.model.type == 3 - ? MonthDataWidget( - sleepReport, widget.data) - : NullDataWidget()), - ].divide(SizedBox( - height: 25.rpx, - )), - ); - } else { - return SingleChildScrollView( - child: Column( + try { + var sleepReport = sleepReportController.sleepReport.value; + if (sleepReport == null || sleepReport.isEmpty) { + return Column( children: [ Padding( padding: @@ -809,56 +286,7 @@ class _NewSleepReportPageState extends State { borderRadius: 8.rpx, padding: EdgeInsets.all(0), onTap: () async { - sleepReportController.model.type = - 1; - - String data = MyUtils.formatDate( - calendarController - .selectedDate.value!); - await requestWithLog( - logTitle: "查询睡眠报告", - method: MyHttpMethod.get, - queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}", - onSuccess: (res) { - print(res); - sleepReportController - .sleepReport - .value = res.data; - sleepReportController - .updateAll(); - }, - onFailure: (res) { - if (MainPageBBottomChange - .getCurrentIndex() != - null) { - if (MainPageBBottomChange - .getCurrentIndex() == - 1) { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - } else { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - sleepReportController - .sleepReport.value = {}; - sleepReportController - .updateAll(); - print(res); - }); - sleepReportController.updateAll(); + loadSleepReport(1); }, child: Column( mainAxisSize: MainAxisSize.max, @@ -898,59 +326,7 @@ class _NewSleepReportPageState extends State { borderRadius: 8.rpx, padding: EdgeInsets.all(0), onTap: () async { - sleepReportController - .model.type = 2; - String data = - MyUtils.formatDate( - calendarController - .selectedDate - .value!); - await requestWithLog( - logTitle: "查询睡眠报告", - method: MyHttpMethod.get, - queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}", - onSuccess: (res) { - print(res); - sleepReportController - .sleepReport - .value = res.data; - sleepReportController - .updateAll(); - }, - onFailure: (res) { - if (MainPageBBottomChange - .getCurrentIndex() != - null) { - if (MainPageBBottomChange - .getCurrentIndex() == - 1) { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - } else { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - sleepReportController - .sleepReport - .value = {}; - sleepReportController - .updateAll(); - print(res); - }); - sleepReportController - .updateAll(); + loadSleepReport(2); }, child: Column( mainAxisSize: MainAxisSize.max, @@ -992,60 +368,7 @@ class _NewSleepReportPageState extends State { borderRadius: 8.rpx, padding: EdgeInsets.all(0), onTap: () async { - sleepReportController - .model.type = 3; - String data = - MyUtils.formatDate( - calendarController - .selectedDate - .value!); - await requestWithLog( - logTitle: "查询睡眠报告", - method: MyHttpMethod.get, - queryUrl: - "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}", - onSuccess: (res) { - print(res); - sleepReportController - .sleepReport - .value = res.data; - sleepReportController - .updateAll(); - }, - onFailure: (res) { - if (MainPageBBottomChange - .getCurrentIndex() != - null) { - if (MainPageBBottomChange - .getCurrentIndex() == - 1) { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - } else { - TopSlideNotification.show( - context, - text: res.msg!, - textColor: - themeController - .currentColor - .sc9); - } - sleepReportController - .sleepReport - .value = {}; - sleepReportController - .updateAll(); - print(res); - }); - - sleepReportController - .updateAll(); + loadSleepReport(3); }, child: Column( mainAxisSize: MainAxisSize.max, @@ -1302,9 +625,9 @@ class _NewSleepReportPageState extends State { ), ), ), - (sleepReport.value == null || sleepReport.value.isEmpty) + (sleepReport == null || sleepReport.isEmpty) ? Container( - child: NullDataWidget(), + child: Expanded(child: NullDataWidget()), ) : (sleepReportController.model.type == 1 ? DailyDataWidget( @@ -1322,9 +645,435 @@ class _NewSleepReportPageState extends State { ].divide(SizedBox( height: 25.rpx, )), - ), - ); + ); + } else { + return SingleChildScrollView( + child: Column( + children: [ + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0, 30.rpx, 0, 0), + child: Container( + width: double.infinity, + constraints: BoxConstraints( + minHeight: 90.rpx, + ), + decoration: BoxDecoration( + color: widget.data['backgroundColor'] != null + ? widget.data['backgroundColor'] + : themeController.currentColor.sc5, + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 30.rpx, 15.rpx, 30.rpx, 15.rpx), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Stack( + alignment: Alignment.bottomLeft, + children: [ + // Row( + // mainAxisSize: MainAxisSize.max, + // children: [ + // Obx(() { + // return ClickableContainer( + // backgroundColor: + // Colors.transparent, + // highlightColor: themeController + // .currentColor.sc3, + // borderRadius: 8.rpx, + // padding: EdgeInsets.all(0), + // onTap: () async { + // loadSleepReport(1); + // }, + // child: Column( + // mainAxisSize: + // MainAxisSize.max, + // children: [ + // Container( + // width: 115 + // .rpx, // 固定宽度为 160.rpx + // alignment: Alignment + // .center, // 文字居中 + // child: Text( + // '日报'.tr, + // style: TextStyle( + // fontFamily: 'Inter', + // fontSize: AppConstants() + // .title_text_fontSize, + // letterSpacing: 0.0, + // color: sleepReportController + // .model + // .type == + // 1 + // ? themeController + // .currentColor + // .sc2 + // : themeController + // .currentColor + // .sc3, + // ), + // ), + // ), + // SizedBox(height: 10.rpx), + // ], + // ), + // ); + // }), + // Obx(() { + // return ClickableContainer( + // backgroundColor: + // Colors.transparent, + // highlightColor: themeController + // .currentColor.sc3, + // borderRadius: 8.rpx, + // padding: EdgeInsets.all(0), + // onTap: () async { + // loadSleepReport(2); + // }, + // child: Column( + // mainAxisSize: + // MainAxisSize.max, + // children: [ + // Container( + // width: 115 + // .rpx, // 固定宽度为 160.rpx + // alignment: Alignment + // .center, // 文字居中 + // child: Text('周报'.tr, + // style: TextStyle( + // fontFamily: 'Inter', + // fontSize: AppConstants() + // .title_text_fontSize, + // letterSpacing: 0.0, + // color: sleepReportController + // .model + // .type == + // 2 + // ? themeController + // .currentColor + // .sc2 + // : themeController + // .currentColor + // .sc3, + // )), + // ), + // SizedBox(height: 10.rpx), + // ], + // ), + // ); + // }), + // Obx(() { + // return ClickableContainer( + // backgroundColor: + // Colors.transparent, + // highlightColor: themeController + // .currentColor.sc3, + // borderRadius: 8.rpx, + // padding: EdgeInsets.all(0), + // onTap: () async { + // loadSleepReport(3); + // }, + // child: Column( + // mainAxisSize: + // MainAxisSize.max, + // children: [ + // Container( + // width: 115 + // .rpx, // 固定宽度为 160.rpx + // alignment: Alignment + // .center, // 文字居中 + // child: Text( + // '月报'.tr, + // style: TextStyle( + // fontFamily: 'Inter', + // fontSize: AppConstants() + // .title_text_fontSize, + // letterSpacing: 0.0, + // color: sleepReportController + // .model + // .type == + // 3 + // ? themeController + // .currentColor + // .sc2 + // : themeController + // .currentColor + // .sc3, + // ), + // ), + // ), + // SizedBox(height: 10.rpx), + // ], + // ), + // ); + // }), + // ], + // ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + buildReportTab('日报', 1), + buildReportTab('周报', 2), + buildReportTab('月报', 3), + ], + ), + AnimatedPositioned( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + bottom: 0, + left: sleepReportController + .model.type == + 1 + ? 0 + : sleepReportController + .model.type == + 2 + ? 115.rpx + : 230.rpx, + child: Container( + width: lineWidth, + height: 4.rpx, + decoration: BoxDecoration( + color: themeController + .currentColor.sc2, + borderRadius: + BorderRadius.circular(2.rpx), + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + Container( + width: double.infinity, + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 30.rpx, 32.rpx, 30.rpx, 32.rpx), + child: getTimeWidget(), + ), + ), + if (widget.data['person_show'] == null || + widget.data['person_show'] != false) + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 30.rpx, 0.rpx, 30.rpx, 51.rpx), + child: ClickableContainer( + backgroundColor: + widget.data['backgroundColor'] != null + ? widget.data['backgroundColor'] + : themeController.currentColor.sc5, + highlightColor: themeController + .currentColor.sc5, // 或你希望的点击水波纹颜色 + borderRadius: AppConstants() + .normal_container_radius, // 如果你想加圆角可以设置 eg. 12.rpx + padding: EdgeInsets.zero, + onTap: () {}, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Flexible( + flex: 2, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Text( + '姓名'.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc4, + ), + ), + Text( + '年龄'.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc4, + ), + ), + ].divide( + SizedBox(height: 34.rpx)), + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + (widget.data['person'] + ?['name'] + ?.toString() + .trim() + .isNotEmpty ?? + false) + ? widget + .data['person']![ + 'name'] + .toString() + : '未知数据'.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc3, + ), + ), + Text( + '${MyUtils.getAgeByDate(MyUtils.formatBirthdayTime(widget.data['person']?['birthday'])) ?? '未知数据'.tr}', + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc3, + ), + ), + ].divide( + SizedBox(height: 34.rpx)), + ), + ] + .divide(SizedBox(width: 33.rpx)) + .addToStart( + SizedBox(width: 37.rpx)), + ), + ] + .addToStart( + SizedBox(height: 36.rpx)) + .addToEnd(SizedBox(height: 36.rpx)), + ), + ), + Flexible( + flex: 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Text( + '设备ID'.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc4, + ), + ), + Text( + '体重'.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc4, + ), + ), + ].divide( + SizedBox(height: 34.rpx)), + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + '${widget.data['code'] ?? '未知数据'.tr}', + // "D11250300003", + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc3, + ), + maxLines: 1, + overflow: + TextOverflow.ellipsis, + ), + Text( + '${widget.data['person']?['weight'] ?? '未知数据'.tr}kg', + style: TextStyle( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc3, + ), + ), + ].divide( + SizedBox(height: 34.rpx)), + ), + ] + .divide(SizedBox(width: 33.rpx)) + .addToStart( + SizedBox(width: 37.rpx)), + ), + ] + .addToStart( + SizedBox(height: 36.rpx)) + .addToEnd(SizedBox(height: 36.rpx)), + ), + ), + ], + ), + ), + ), + Obx(() { + if (sleepReportController.isLoading.value) { + return Center(child: CircularProgressIndicator()); + } + switch (sleepReportController.model.type) { + case 1: + return DailyDataWidget( + sleepReport, + sleepCardKey, + heartRateCardKey, + breatheCardKey, + widget.data); + case 2: + return WeekDataWidget(sleepReport, widget.data); + case 3: + return MonthDataWidget( + sleepReport, widget.data); + default: + return NullDataWidget(); + } + }) + ].divide(SizedBox( + height: 25.rpx, + )), + ), + ); + } + } catch (e, s) { + ef.log('ERROR:$e$s'); } + return NullDataWidget(); }), ), ), @@ -1774,4 +1523,65 @@ class _NewSleepReportPageState extends State { } }); } + + Future loadSleepReport(int type) async { + if (sleepReportController.isLoading.value) return; + sleepReportController.model.type = type; + sleepReportController.isLoading.value = true; + String data = MyUtils.formatDate(calendarController.selectedDate.value!); + + await requestWithLog( + logTitle: "查询睡眠报告", + method: MyHttpMethod.get, + queryUrl: + "https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=$data&type=$type", + onSuccess: (res) { + sleepReportController.sleepReport.value = res.data; + }, + onFailure: (res) { + TopSlideNotification.show( + context, + text: res.msg!, + textColor: themeController.currentColor.sc9, + ); + sleepReportController.sleepReport.value = {}; + }, + ); + sleepReportController.isLoading.value = false; + sleepReportController.updateAll(); + } + + Widget buildReportTab(String title, int type) { + return Obx(() { + bool isSelected = sleepReportController.model.type == type; + return ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: themeController.currentColor.sc3, + borderRadius: 8.rpx, + padding: EdgeInsets.all(0), + onTap: () => loadSleepReport(type), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + width: 115.rpx, + alignment: Alignment.center, + child: Text( + title.tr, + style: TextStyle( + fontFamily: 'Inter', + fontSize: AppConstants().title_text_fontSize, + letterSpacing: 0.0, + color: isSelected + ? themeController.currentColor.sc2 + : themeController.currentColor.sc3, + ), + ), + ), + SizedBox(height: 10.rpx), + ], + ), + ); + }); + } } diff --git a/lib/routers/mh_routers.dart b/lib/routers/mh_routers.dart index 6128bdf..a3bd205 100644 --- a/lib/routers/mh_routers.dart +++ b/lib/routers/mh_routers.dart @@ -10,6 +10,7 @@ import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.d import 'package:vbvs_app/pages/mh_page/HomeDeviceType.dart'; import 'package:vbvs_app/pages/mh_page/LanguagePage.dart'; import 'package:vbvs_app/pages/mh_page/ShareDeviceDetailWidget.dart'; +import 'package:vbvs_app/pages/mh_page/Vital_signs_sensor.dart'; import 'package:vbvs_app/pages/mh_page/about_us.dart'; import 'package:vbvs_app/pages/mh_page/address_list_page.dart'; import 'package:vbvs_app/pages/mh_page/applyRepair/apply_repair_success.dart'; @@ -115,6 +116,9 @@ var mhroutes = { "/mhtSleepReportReturnPage": (context, {arguments}) => MhtSleepReportReturnPage(data: arguments), "/xiaoEPage": (contxt, {arguments}) => XiaoEPage(sleepUri: arguments), + "/vitalSignsSensorPage": (context, {arguments}) => VitalSignsSensorPage( + data: arguments, + ), }; var mhonGenerateRoute = (RouteSettings settings) { final String? name = settings.name; // 获取路由名称,如 /news 或 /search