更新睡眠报告页面和控制页面无设备的显示

This commit is contained in:
wyf
2025-08-01 14:04:19 +08:00
parent 12a53ac36c
commit 31e823eb16
8 changed files with 420 additions and 207 deletions

View File

@@ -1,3 +1,3 @@
[ [
"assets/miniapp/mhtControl_1.0.35.zip" "assets/miniapp/mhtControl_1.0.40.zip"
] ]

Binary file not shown.

View File

@@ -16,6 +16,7 @@ import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart'; import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/model/api_response.dart'; import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/model/user_data.dart'; import 'package:vbvs_app/model/user_data.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
part 'user_info_controller.g.dart'; part 'user_info_controller.g.dart';
@@ -224,6 +225,7 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
} }
ApiResponse logOut() { ApiResponse logOut() {
MHTHomeController mhtHomeController = Get.find();
ApiResponse apiResponse = ApiResponse(code: 1, msg: "退出成功".tr); ApiResponse apiResponse = ApiResponse(code: 1, msg: "退出成功".tr);
EasyDartModule.logger.info("退出登录"); EasyDartModule.logger.info("退出登录");
DailyLogUtils.writeLog("退出登录"); DailyLogUtils.writeLog("退出登录");
@@ -244,6 +246,7 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
messageController.model.system_message_read = 0; messageController.model.system_message_read = 0;
CountdownController countdownController = Get.find(); CountdownController countdownController = Get.find();
countdownController.countdown.value = 0; countdownController.countdown.value = 0;
mhtHomeController.personnelList.value = [];
return apiResponse; return apiResponse;
} }
} }

View File

@@ -6,6 +6,7 @@ import 'package:flutter_svg/svg.dart';
import 'package:flutter_switch/flutter_switch.dart'; import 'package:flutter_switch/flutter_switch.dart';
import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart'; import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart';
class MattressControlPage extends StatefulWidget { class MattressControlPage extends StatefulWidget {
@@ -18,50 +19,56 @@ class MattressControlPage extends StatefulWidget {
class _MattressControlPageState extends State<MattressControlPage> { class _MattressControlPageState extends State<MattressControlPage> {
final controller = Get.put(ControlCardController()); final controller = Get.put(ControlCardController());
UserInfoController userInfoController = Get.find(); UserInfoController userInfoController = Get.find();
MHTHomeController deviceController = Get.find();
int selectedIndex = 1; // 当前选中的tab索引 int selectedIndex = 1; // 当前选中的tab索引
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isLoggedIn = userInfoController.model.login == 1;
final backgroundImage = isLoggedIn
? 'assets/images/new_background.png'
: 'assets/images/noLoginControl.png';
return LayoutBuilder( return LayoutBuilder(
builder: (context, bodySize) => GestureDetector( builder: (context, bodySize) => GestureDetector(
child: Stack( child: Obx(() {
children: [ final isLoggedIn = userInfoController.model.login == 1;
// Background Image final hasDevice = deviceController.deviceList.values.isNotEmpty;
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(backgroundImage),
fit: BoxFit.fill,
),
),
),
// Blur overlay when not logged in final showNoLoginView = !isLoggedIn || !hasDevice;
if (!isLoggedIn)
Positioned.fill( final backgroundImage = showNoLoginView
child: BackdropFilter( ? 'assets/images/noLoginControl.png'
filter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0), : 'assets/images/new_background.png';
child: Container(
color: Colors.black.withOpacity(0.5), return Stack(
children: [
// 背景图片
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(backgroundImage),
fit: BoxFit.fill,
), ),
), ),
), ),
// 遮罩层:未登录或无设备时显示
if (showNoLoginView)
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
child: Container(
color: Colors.black.withOpacity(0.5),
),
),
),
// Main Content // 主内容
Scaffold( Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: SafeArea( body: SafeArea(
child: WebviewTestView(), child: WebviewTestView(),
),
), ),
), ],
], );
), }),
), ),
); );
} }

View File

@@ -213,8 +213,8 @@ class _BluetoothPageState extends State<BluetoothPage> {
"/mhtCalibrationAfterPage", "/mhtCalibrationAfterPage",
arguments: obsData, arguments: obsData,
), ),
_buildMenuButton( _buildMenuButton(context, '体征传感器'.tr,
context, '体征传感器'.tr, "/vitalSignsSensorPage", "/vitalSignsSensorPage",
arguments: obsData), arguments: obsData),
_buildMenuButton( _buildMenuButton(
context, context,
@@ -231,7 +231,9 @@ class _BluetoothPageState extends State<BluetoothPage> {
if (!isBind) ...[ if (!isBind) ...[
_buildMenuButton( _buildMenuButton(
context, context,
obsData['bind_type'] == 1 ? '解绑'.tr : '删除'.tr, obsData['bind_type'] == 1
? '解绑'.tr
: '删除'.tr,
"", "",
onTap: () async { onTap: () async {
// await deviceListController // await deviceListController
@@ -251,7 +253,7 @@ class _BluetoothPageState extends State<BluetoothPage> {
// ef.log("[h5]通知列表更新报错:$e"); // ef.log("[h5]通知列表更新报错:$e");
// } // }
// Get.toNamed("/mianPageBottomChange"); // Get.toNamed("/mianPageBottomChange");
if (obsData['bind_type'] == 1) { if (obsData['bind_type'] == 1) {
// 解绑弹窗 // 解绑弹窗
showUnbindConfirmDialog( showUnbindConfirmDialog(
context: context, context: context,
@@ -266,6 +268,8 @@ class _BluetoothPageState extends State<BluetoothPage> {
Get.find(); Get.find();
homeController.selectDevcie.value = homeController.selectDevcie.value =
""; "";
await homeController
.getPersonList();
try { try {
WebviewTestController WebviewTestController
webviewTestController = webviewTestController =
@@ -313,7 +317,9 @@ class _BluetoothPageState extends State<BluetoothPage> {
if (isBind) ...[ if (isBind) ...[
_buildMenuButton( _buildMenuButton(
context, context,
obsData['bind_type'] == 1 ? '解绑'.tr : '删除'.tr, obsData['bind_type'] == 1
? '解绑'.tr
: '删除'.tr,
"", "",
onTap: () { onTap: () {
if (obsData['bind_type'] == 1) { if (obsData['bind_type'] == 1) {

View File

@@ -6,7 +6,6 @@ import 'package:flutterflow_ui/flutterflow_ui.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/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/NullDataComponentWidget.dart';
import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.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/new_sleep_report_page.dart'; import 'package:vbvs_app/pages/sleep_report/new_sleep_report_page.dart';
@@ -56,28 +55,38 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
child: Stack( child: Stack(
children: [ children: [
// Background Container // Background Container
Container( Obx(() {
decoration: BoxDecoration( return Container(
image: DecorationImage( decoration: BoxDecoration(
image: AssetImage((userInfoController.model.login! != null && image: DecorationImage(
userInfoController.model.login! == 1) image: AssetImage((userInfoController.model.login! != null &&
? 'assets/images/new_background.png' userInfoController.model.login! == 1 &&
: "assets/images/noLoginSleep.jpg"), deviceController.personnelList.value.isNotEmpty)
fit: BoxFit.fill, ? 'assets/images/new_background.png'
), : "assets/images/noLoginSleep.jpg"),
), fit: BoxFit.fill,
),
// Blur overlay when not logged in
if (userInfoController.model.login == null ||
userInfoController.model.login != 1)
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
child: Container(
color: Colors.black.withOpacity(0.5),
), ),
), ),
), );
}),
Obx(() {
bool showBlur = userInfoController.model.login == null ||
userInfoController.model.login != 1 ||
(userInfoController.model.login == 1 &&
deviceController.personnelList.isEmpty);
return showBlur
? Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
child: Container(
color: Colors.black.withOpacity(0.5),
),
),
)
: const SizedBox.shrink(); // 不显示时返回空组件
}),
// Main content // Main content
Scaffold( Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -85,84 +94,137 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
child: Container( child: Container(
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height, height: MediaQuery.sizeOf(context).height,
child: Column( child: Obx(() {
mainAxisSize: MainAxisSize.max, return Column(
mainAxisAlignment: (userInfoController.model.login! != null && mainAxisSize: MainAxisSize.max,
userInfoController.model.login! == 1) mainAxisAlignment:
? MainAxisAlignment.start (userInfoController.model.login! != null &&
: MainAxisAlignment.center, userInfoController.model.login! == 1 &&
children: [ deviceController.personnelList.value.isNotEmpty)
//未登录 ? MainAxisAlignment.start
Obx(() { : MainAxisAlignment.center,
if (userInfoController.model.login! == null || children: [
userInfoController.model.login! == 0) { //未登录或已登录但未绑定设备
return Center( Obx(() {
child: InkWell( if (userInfoController.model.login! == null ||
onTap: () => Get.toNamed("/loginPage"), userInfoController.model.login! == 0) {
child: RichText( return Center(
text: TextSpan( child: InkWell(
children: [ onTap: () => Get.toNamed("/loginPage"),
TextSpan( child: RichText(
text: "请先".tr, text: TextSpan(
style: TextStyle( children: [
color: Colors.white, TextSpan(
fontSize: 30.rpx, text: "请先".tr,
style: TextStyle(
color: Colors.white,
fontSize: 30.rpx,
),
), ),
), WidgetSpan(
WidgetSpan( child: Stack(
child: Stack( children: [
children: [ Text(
Text( "登录".tr,
"登录".tr, style: TextStyle(
style: TextStyle( color: stringToColor("#84F5FF"),
color: stringToColor("#84F5FF"), fontSize: 30.rpx,
fontSize: 30.rpx, ),
), ),
), Positioned(
Positioned( bottom: 0,
bottom: 0, left: 0,
left: 0, right: 0,
right: 0, child: Container(
child: Container( height: 1,
height: 1, color: stringToColor("#84F5FF"),
color: stringToColor("#84F5FF"), ),
), ),
), ],
], ),
), ),
), TextSpan(
TextSpan( text: "后,再查看睡眠报告".tr,
text: "后,再查看睡眠报告".tr, style: TextStyle(
style: TextStyle( color: Colors.white,
color: Colors.white, fontSize: 30.rpx,
fontSize: 30.rpx, ),
), ),
), ],
], ),
), ),
), ),
), );
); } else if (userInfoController.model.login == 1 &&
} deviceController.personnelList.value.isEmpty) {
return Container(); return Center(
}), child: InkWell(
//已登录 onTap: () => Get.toNamed("/mHTDeviceTypePage"),
Obx(() { child: RichText(
if (userInfoController.model.login! != null && text: TextSpan(
userInfoController.model.login! == 1) { children: [
final list = deviceController.personnelList.value; TextSpan(
if (list.isNotEmpty) { text: "请先".tr,
WidgetsBinding.instance.addPostFrameCallback((_) { style: TextStyle(
formFieldController.value = list[0]["mac".tr]; color: Colors.white,
personInfo.value = list[0]; fontSize: 30.rpx,
homeController.selectPerson.value = list[0]; ),
homeController.selectDevcie.value = list[0]["mac".tr]; ),
deviceController WidgetSpan(
.getSleeps(formFieldController.value); child: Stack(
homeController.updateAll(); children: [
}); Text(
"绑定设备".tr,
style: TextStyle(
color: stringToColor("#84F5FF"),
fontSize: 30.rpx,
),
),
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Container(
height: 1,
color: stringToColor("#84F5FF"),
),
),
],
),
),
TextSpan(
text: "后,再查看睡眠报告".tr,
style: TextStyle(
color: Colors.white,
fontSize: 30.rpx,
),
),
],
),
),
),
);
} }
if (homeController.personnelList.value.length != 0) return Container();
}),
//已登录且已绑定设备
Obx(() {
if (userInfoController.model.login! != null &&
userInfoController.model.login! == 1 &&
deviceController.personnelList.value.isNotEmpty) {
final list = deviceController.personnelList.value;
if (list.isNotEmpty) {
WidgetsBinding.instance.addPostFrameCallback((_) {
formFieldController.value = list[0]["mac".tr];
personInfo.value = list[0];
homeController.selectPerson.value = list[0];
homeController.selectDevcie.value =
list[0]["mac".tr];
deviceController
.getSleeps(formFieldController.value);
homeController.updateAll();
});
}
return Padding( return Padding(
padding: EdgeInsetsDirectional.fromSTEB( padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 40.rpx, 30.rpx, 10.rpx), 0.rpx, 40.rpx, 30.rpx, 10.rpx),
@@ -235,8 +297,8 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
deviceController deviceController
.personnelList.value .personnelList.value
.map<String>((d) { .map<String>((d) {
var s = var s = d["name"] ??
d["name"] ?? d["mac".tr]; d["mac".tr];
if (s == null) { if (s == null) {
return ""; return "";
} else { } else {
@@ -326,36 +388,34 @@ class _MhtSleepReportPageState extends State<MhtSleepReportPage> {
), ),
), ),
); );
} }
if (userInfoController.model.login != null && return Container();
userInfoController.model.login == 1) }),
return Expanded(child: NullDataWidget());
return Container();
}),
Obx(() { Obx(() {
if (homeController.selectDevcie.value != null && if (homeController.selectDevcie.value != null &&
homeController.selectDevcie.value!.isNotEmpty && homeController.selectDevcie.value!.isNotEmpty &&
deviceController.personnelList.value.isNotEmpty) deviceController.personnelList.value.isNotEmpty)
return Expanded( return Expanded(
child: NewSleepReportPage( child: NewSleepReportPage(
data: { data: {
"tag": "123", "tag": "123",
'date': DateTime.now().millisecondsSinceEpoch, 'date': DateTime.now().millisecondsSinceEpoch,
'mac'.tr: homeController.selectDevcie.value, 'mac'.tr: homeController.selectDevcie.value,
'person': homeController.selectPerson.value, 'person': homeController.selectPerson.value,
'backgroundImg': 'backgroundImg':
'assets/images/new_background.png', 'assets/images/new_background.png',
'arrow': false, 'arrow': false,
'noBackImg': true, 'noBackImg': true,
'person_show': false, 'person_show': false,
}, },
), ),
); );
return Container(); return Container();
}), }),
], ],
), );
}),
), ),
), ),
), ),

View File

@@ -178,7 +178,8 @@ class WebviewTestController extends GetControllerEx<WebviewTestModel> {
ef.log('查询睡眠习惯: $args[0]'); ef.log('查询睡眠习惯: $args[0]');
try { try {
MHTBlueToothController blueToothController = Get.find(); MHTBlueToothController blueToothController = Get.find();
var sleepData = await blueToothController.loadMattressTimeData(args[0]); var sleepData =
await blueToothController.loadMattressTimeData(args[0]);
return sleepData['data']; return sleepData['data'];
} catch (e) { } catch (e) {
ef.log("[查询睡眠习惯失败]:$e"); ef.log("[查询睡眠习惯失败]:$e");
@@ -373,44 +374,133 @@ class WebviewTestView extends GetComponent<WebviewTestController> {
@override @override
WebviewTestController newinstance() { WebviewTestController newinstance() {
if (ef.kvRoot.WebviewTestController == null) { if (ef.kvRoot.WebviewTestController == null) {
ef.kvRoot.WebviewTestController = WebviewTestController(); ef.kvRoot.WebviewTestController = WebviewTestController();
if (Get.isRegistered<WebviewTestController>() == false) { if (Get.isRegistered<WebviewTestController>() == false) {
Get.put<WebviewTestController>(ef.kvRoot.WebviewTestController); Get.put<WebviewTestController>(ef.kvRoot.WebviewTestController);
WebviewTestController webviewTestController = Get.find(); WebviewTestController webviewTestController = Get.find();
webviewTestController.global=true; webviewTestController.global = true;
return webviewTestController; return webviewTestController;
} }
} }
return ef.kvRoot.WebviewTestController; return ef.kvRoot.WebviewTestController;
} }
// @override
// Widget build(BuildContext context) {
// UserInfoController userInfoController = Get.find();
// MHTHomeController deviceController = Get.find();
// deviceController.getDeviceList().then((x) {
// if (controller.web.jsbridge!.inited) {
// //发送测试消息给webview
// // controller.web.jsbridge!.dart
// // .updateDeviceList(deviceController.deviceList.values);
// }
// });
// return Scaffold(
// backgroundColor: Colors.transparent,
// body: Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisSize: MainAxisSize.max,
// mainAxisAlignment: (userInfoController.model.login! != null &&
// userInfoController.model.login! == 1)
// ? MainAxisAlignment.start
// : MainAxisAlignment.center,
// children: [
// Obx(() {
// return Visibility(
// visible: userInfoController.model.login! == null ||
// userInfoController.model.login! == 0,
// child: Center(
// child: InkWell(
// onTap: () => Get.toNamed("/loginPage"),
// child: RichText(
// text: TextSpan(
// children: [
// TextSpan(
// text: "请先".tr,
// style: TextStyle(
// color: Colors.white,
// fontSize: 30.rpx,
// ),
// ),
// WidgetSpan(
// child: Stack(
// children: [
// Text(
// "登录".tr,
// style: TextStyle(
// color: stringToColor("#84F5FF"),
// fontSize: 30.rpx,
// ),
// ),
// Positioned(
// bottom: 0, // 控制下划线与文字的间距
// left: 0,
// right: 0,
// child: Container(
// height: 1, // 下划线粗细
// color: stringToColor("#84F5FF"),
// ),
// ),
// ],
// ),
// ),
// TextSpan(
// text: "后,再进行设备控制".tr,
// style: TextStyle(
// color: Colors.white,
// fontSize: 30.rpx,
// ),
// ),
// ],
// ),
// ),
// ),
// ),
// );
// }),
// Obx(() {
// return Visibility(
// visible: userInfoController.model.login! != null &&
// userInfoController.model.login! == 1,
// child: Expanded(
// child: Align(
// alignment: Alignment.topLeft,
// child: Obx(() {
// return controller.ready.value
// ? controller.web.build()
// : Container();
// }),
// ),
// ));
// }),
// ],
// ),
// );
// }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserInfoController userInfoController = Get.find(); return Obx(() {
MHTHomeController deviceController = Get.find(); UserInfoController userInfoController = Get.find();
deviceController.getDeviceList().then((x) { MHTHomeController deviceController = Get.find();
if (controller.web.jsbridge!.inited) { final isLoggedIn = userInfoController.model.login == 1;
//发送测试消息给webview final hasDevice = deviceController.deviceList.values.isNotEmpty;
// controller.web.jsbridge!.dart
// .updateDeviceList(deviceController.deviceList.values); final showWeb = isLoggedIn && hasDevice;
} final mainAxisAlignment =
}); showWeb ? MainAxisAlignment.start : MainAxisAlignment.center;
return Scaffold(
backgroundColor: Colors.transparent, return Scaffold(
body: Column( backgroundColor: Colors.transparent,
crossAxisAlignment: CrossAxisAlignment.center, body: Column(
mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: (userInfoController.model.login! != null && mainAxisSize: MainAxisSize.max,
userInfoController.model.login! == 1) mainAxisAlignment: mainAxisAlignment,
? MainAxisAlignment.start children: [
: MainAxisAlignment.center, // 未登录提示
children: [ if (!isLoggedIn)
Obx(() { Center(
return Visibility(
visible: userInfoController.model.login! == null ||
userInfoController.model.login! == 0,
child: Center(
child: InkWell( child: InkWell(
onTap: () => Get.toNamed("/loginPage"), onTap: () => Get.toNamed("/loginPage"),
child: RichText( child: RichText(
@@ -434,11 +524,11 @@ class WebviewTestView extends GetComponent<WebviewTestController> {
), ),
), ),
Positioned( Positioned(
bottom: 0, // 控制下划线与文字的间距 bottom: 0,
left: 0, left: 0,
right: 0, right: 0,
child: Container( child: Container(
height: 1, // 下划线粗细 height: 1,
color: stringToColor("#84F5FF"), color: stringToColor("#84F5FF"),
), ),
), ),
@@ -457,25 +547,72 @@ class WebviewTestView extends GetComponent<WebviewTestController> {
), ),
), ),
), ),
);
}), // 已登录但无设备提示
Obx(() { if (isLoggedIn && !hasDevice)
return Visibility( Center(
visible: userInfoController.model.login! != null && child: InkWell(
userInfoController.model.login! == 1, onTap: () => Get.toNamed("/mHTDeviceTypePage"),
child: Expanded( child: RichText(
child: Align( text: TextSpan(
alignment: Alignment.topLeft, children: [
child: Obx(() { TextSpan(
return controller.ready.value text: "请先".tr,
? controller.web.build() style: TextStyle(
: Container(); color: Colors.white,
}), fontSize: 30.rpx,
),
),
WidgetSpan(
child: Stack(
children: [
Text(
"绑定设备".tr,
style: TextStyle(
color: stringToColor("#84F5FF"),
fontSize: 30.rpx,
),
),
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Container(
height: 1,
color: stringToColor("#84F5FF"),
),
),
],
),
),
TextSpan(
text: "后,再进行设备控制".tr,
style: TextStyle(
color: Colors.white,
fontSize: 30.rpx,
),
),
],
),
), ),
)); ),
}), ),
],
), // 显示 WebView
); if (showWeb)
Expanded(
child: Align(
alignment: Alignment.topLeft,
child: Obx(() {
return controller.ready.value
? controller.web.build()
: Container();
}),
),
),
],
),
);
});
} }
} }