更新消息回看功能

This commit is contained in:
wyf
2025-05-24 18:14:53 +08:00
parent a5582faa79
commit 3a3c01b618
6 changed files with 321 additions and 78 deletions

View File

@@ -166,7 +166,7 @@ class MessageController extends GetControllerEx<MessageModel> {
queryUrl += "?type=$type";
}
String? language = "";
String? language = "";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}

View File

@@ -0,0 +1,35 @@
import 'package:ef/ef.dart';
import 'package:json_annotation/json_annotation.dart';
part 'message_review_controller.g.dart'; // 由json_serializable自动生成的部分
@JsonSerializable()
class MessageReviewModel {
int? type = 1; //设备类型 1:体征消息 2.系统消息
MessageReviewModel();
// 从JSON反序列化时的异常处理
factory MessageReviewModel.fromJson(Map<String, dynamic> json) {
try {
return _$MessageReviewModelFromJson(json);
} catch (e) {
// 在实际应用中,应该有更细致的异常处理策略和错误日志
return MessageReviewModel(); // 或者返回一个带有错误信息的特定DeviceInfoModel实例
}
}
// 序列化为JSON时的异常处理
Map<String, dynamic> toJson() => _$MessageReviewModelToJson(this);
}
class MessageReviewController extends GetControllerEx<MessageReviewModel> {
MessageReviewModel() {
attr = GetModel(MessageReviewModel()).obs;
}
RxList messageList = [].obs;
}

View File

@@ -0,0 +1,15 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'message_review_controller.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
MessageReviewModel _$MessageReviewModelFromJson(Map<String, dynamic> json) =>
MessageReviewModel()..type = (json['type'] as num?)?.toInt();
Map<String, dynamic> _$MessageReviewModelToJson(MessageReviewModel instance) =>
<String, dynamic>{
'type': instance.type,
};

View File

@@ -28,6 +28,7 @@ import 'package:vbvs_app/controller/login/login_controller.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/main_bottom/main_page_controller.dart';
import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/message/message_review_controller.dart';
import 'package:vbvs_app/controller/person/person_controller.dart';
import 'package:vbvs_app/controller/repair/repair_controller.dart';
import 'package:vbvs_app/controller/setting/language/language_controller.dart';
@@ -245,6 +246,7 @@ class MyApp extends StatelessWidget {
Get.lazyPut(() => PrivacyPdfController()),
Get.lazyPut(() => CalendarController()),
Get.lazyPut(() => SleepReportController()),
Get.lazyPut(() => MessageReviewController()),
]));
});
}

View File

@@ -0,0 +1,156 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/controller/device/device_share_controller.dart';
import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/enum/MessageStatus.dart';
class ReviewMessageWidgetWidget extends StatefulWidget {
final data;
const ReviewMessageWidgetWidget({super.key, required this.data});
@override
State<ReviewMessageWidgetWidget> createState() =>
_ReviewMessageWidgetWidgetState();
}
class _ReviewMessageWidgetWidgetState extends State<ReviewMessageWidgetWidget> {
ThemeController themeController = Get.find();
MessageController messageController = Get.find();
DeviceShareController deviceShareController = Get.find();
@override
Widget build(BuildContext context) {
var messageInfo = widget.data;
return ClickableContainer(
backgroundColor: themeController.currentColor.sc5,
highlightColor: themeController.currentColor.sc3,
borderRadius: 20.rpx,
padding: EdgeInsetsDirectional.fromSTEB(31.rpx, 33.rpx, 0.rpx, 33.rpx),
onTap: () {},
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Container(
width: double.infinity,
constraints: BoxConstraints(
minHeight: 66.rpx,
),
child: Align(
alignment: AlignmentDirectional(-1, 0),
child: Text(
// '实时监测结果通知'.tr,
"${messageInfo['data']!['title']}",
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Inter',
fontSize: 30.rpx,
letterSpacing: 0.0,
color: themeController.currentColor.sc3,
),
),
),
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Container(
constraints: BoxConstraints(
minWidth: 30.rpx,
maxWidth: 140.rpx,
),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: messageInfo['data']['val']
.map<Widget>((mapItem) =>
_buildInfoItem(context, mapItem['k'] ?? ''))
.toList(),
),
),
Container(
constraints: BoxConstraints(
minWidth: 30.rpx,
),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: messageInfo['data']['val']
.map<Widget>((mapItem) =>
_buildValueItem(context, mapItem['v'] ?? ''))
.toList(),
),
),
].divide(SizedBox(width: 35.rpx)),
),
],
),
);
}
Widget _buildInfoItem(BuildContext context, String label) {
return Container(
constraints: BoxConstraints(
minHeight: 62.rpx,
),
child: Align(
alignment: AlignmentDirectional(-1, 0),
child: Text(
overflow: TextOverflow.ellipsis,
maxLines: 1,
label.tr,
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController.currentColor.sc4,
),
),
),
);
}
Widget _buildValueItem(BuildContext context, String value) {
return Container(
constraints: BoxConstraints(
minHeight: 62.rpx,
),
child: Align(
alignment: AlignmentDirectional(-1, 0),
child: Text(
overflow: TextOverflow.ellipsis,
maxLines: 1,
value,
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController.currentColor.sc3,
),
),
),
);
}
String getMessageStatus(int status) {
if (status == null) {
return '未知数据'.tr;
}
if (status == MessageStatus.noNeed.code) {
return '无需处理'.tr;
}
if (status == MessageStatus.pending.code) {
return "待处理".tr;
}
if (status == MessageStatus.completed.code) {
return "已处理".tr;
}
if (status == MessageStatus.timeout.code) {
return "已超时".tr;
}
return '未知数据'.tr;
}
}

View File

@@ -1,16 +1,13 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:vbvs_app/common/color/ServiceConstant.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/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/NullDataComponentWidget.dart';
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/controller/repair/repair_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/pages/repair/component/RepairHistoryInfoWidget.dart';
import 'package:vbvs_app/controller/message/message_review_controller.dart';
import 'package:vbvs_app/pages/device/component/ReviewMessageWidgetWidget.dart';
class MessageReviewPage extends StatefulWidget {
var data; //1.绑定时 2.绑定后
@@ -21,7 +18,7 @@ class MessageReviewPage extends StatefulWidget {
}
class _MessageReviewPageState extends State<MessageReviewPage> {
RepairController repairController = Get.find();
MessageReviewController messageReviewController = Get.find();
@override
void initState() {
@@ -76,21 +73,6 @@ class _MessageReviewPageState extends State<MessageReviewPage> {
// child: returnIconButtom,
child: returnIconButtomAddCallback(() {}),
),
// Positioned(
// right: 20.rpx,
// child: ClickableContainer(
// backgroundColor: Colors.transparent,
// highlightColor: themeController.currentColor.sc16,
// padding: EdgeInsets.all(8.rpx),
// onTap: () {},
// child: SvgPicture.asset(
// 'assets/img/icon/history.svg',
// width: 39.rpx,
// height: 39.rpx,
// color: themeController.currentColor.sc16,
// ),
// ),
// ),
],
),
),
@@ -102,28 +84,11 @@ class _MessageReviewPageState extends State<MessageReviewPage> {
child: Padding(
padding:
EdgeInsetsDirectional.fromSTEB(30.rpx, 29.rpx, 30.rpx, 0),
// child: Obx(() {
// final isEmpty = repairController.repairHistory.value.isEmpty;
// if (isEmpty) {
// return Expanded(child: NullDataWidget());
// }
// return SingleChildScrollView(
// child: Column(
// mainAxisSize: MainAxisSize.max,
// children: repairController.repairHistory.value
// .map((item) => RepairHistoryInfoWidget(
// data: item)) // 假设组件支持传 data
// .toList()
// .divide(SizedBox(height: 25.rpx))
// .addToEnd(SizedBox(height: 25.rpx)),
// ),
// );
// }),
child: Column(
children: [
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0.rpx, 0.rpx, 0.rpx, 120.rpx),
0.rpx, 0.rpx, 0.rpx, 26.rpx),
child: ClickableContainer(
backgroundColor: themeController.currentColor.sc5,
highlightColor:
@@ -294,6 +259,14 @@ class _MessageReviewPageState extends State<MessageReviewPage> {
),
),
),
Expanded(
child: Obx(() {
final list = messageReviewController.messageList.value;
return list.isEmpty
? const NullDataWidget()
: _buildMessageListView(list);
}),
),
],
),
),
@@ -305,14 +278,76 @@ class _MessageReviewPageState extends State<MessageReviewPage> {
}
Future<void> loadData() async {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.submit_repair;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
ApiResponse apiResponse = await requestWithLog(
logTitle: "查询报修数据", method: MyHttpMethod.get, queryUrl: queryUrl);
RepairController repairController = Get.find();
repairController.repairHistory.value = apiResponse.data;
repairController.updateAll();
//todo 请求历史体征数据
// String serviceAddress = ServiceConstant.service_address;
// String serviceName = ServiceConstant.server_service;
// String serviceApi = ServiceConstant.submit_repair;
// String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
// ApiResponse apiResponse = await requestWithLog(
// logTitle: "查询报修数据", method: MyHttpMethod.get, queryUrl: queryUrl);
// RepairController repairController = Get.find();
// repairController.repairHistory.value = apiResponse.data;
// repairController.updateAll();
messageReviewController.messageList.value = [
{
"data": {
"title": "实时监测结果通知",
'val': [
{'k': '消息类型', 'v': '心率异常'},
{'k': '检测数值', 'v': '106'},
{'k': '发生时间', 'v': '2024-07-30 01:15'},
],
}
},
{
"data": {
"title": "实时监测结果通知",
'val': [
{'k': '消息类型', 'v': '心率异常'},
{'k': '检测数值', 'v': '106'},
{'k': '发生时间', 'v': '2024-07-30 01:15'},
],
}
},
{
"data": {
"title": "实时监测结果通知",
'val': [
{'k': '消息类型', 'v': '心率异常'},
{'k': '检测数值', 'v': '106'},
{'k': '发生时间', 'v': '2024-07-30 01:15'},
],
}
},
{
"data": {
"title": "实时监测结果通知",
'val': [
{'k': '消息类型', 'v': '心率异常'},
{'k': '检测数值', 'v': '106'},
{'k': '发生时间', 'v': '2024-07-30 01:15'},
],
}
},
];
}
Widget _buildMessageListView(List dataList) {
return Container(
width: double.infinity,
padding: EdgeInsets.symmetric(horizontal: 0.rpx),
child: SingleChildScrollView(
child: Column(
children: [
SizedBox(height: 30.rpx),
...dataList
.map((item) => ReviewMessageWidgetWidget(data: item))
.toList()
.divide(SizedBox(height: 30.rpx)),
SizedBox(height: 30.rpx),
],
),
),
);
}
}