Files
tuiche/lib/pages/device/component/HealthReportCard.dart
2026-03-14 10:44:28 +08:00

235 lines
8.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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/component/tool/NewTopSlideNotification.dart';
import 'package:vbvs_app/controller/device/device_share_controller.dart';
import 'package:vbvs_app/controller/device/device_type_controller.dart';
import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
class HealthReportCardWidget extends StatefulWidget {
final data;
const HealthReportCardWidget({super.key, required this.data});
@override
State<HealthReportCardWidget> createState() => _HealthReportCardWidgetState();
}
class _HealthReportCardWidgetState extends State<HealthReportCardWidget> {
ThemeController themeController = Get.find();
MessageController messageController = Get.find();
DeviceShareController deviceShareController = Get.find();
@override
Widget build(BuildContext context) {
var reportData = widget.data;
return ClickableContainer(
backgroundColor: themeController.currentColor.sc5,
highlightColor: themeController.currentColor.sc21,
borderRadius: 20.rpx,
padding: EdgeInsetsDirectional.fromSTEB(31.rpx, 30.rpx, 31.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(
// reportData['name'] ?? '健康报告',
// style: TextStyle(
// fontFamily: 'Inter',
// fontSize: 30.rpx,
// letterSpacing: 0.0,
// color: themeController.currentColor.sc3,
// ),
// ),
// ),
// ),
Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 左侧标签列
Container(
constraints: BoxConstraints(
minWidth: 30.rpx,
maxWidth: 140.rpx,
),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoItem(context, '姓名'.tr),
_buildInfoItem(context, '设备ID'.tr),
_buildInfoItem(context, '快检得分'.tr),
_buildInfoItem(context, '创建时间'.tr),
],
),
),
// 右侧数值列
Expanded(
child: Container(
constraints: BoxConstraints(
minWidth: 30.rpx,
),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildValueItem(context, reportData['name'] ?? '--'),
_buildValueItem(context, reportData['mac'] ?? '--'),
_buildValueItem(
context, '${reportData['score'] ?? '--'}'),
_buildValueRowWithButton(
context,
_formatTime(reportData['create_time']),
onViewTap: () async {
// 查看按钮点击事件
String ID = reportData['id'];
DeviceTypeController deviceTypeController =
Get.find();
await deviceTypeController.getCheckHistory(id: ID,mac: reportData['mac']);
if (deviceTypeController.currentCq.value == null ||
deviceTypeController.currentCq.value.isEmpty) {
NewTopSlideNotification.show(
text: "未找到快检报告".tr,
textColor: themeController.currentColor.sc9);
return;
}
_onViewReport(deviceTypeController.currentCq.value);
},
),
],
),
),
),
].divide(SizedBox(width: 35.rpx)),
),
],
),
);
}
Widget _buildInfoItem(BuildContext context, label) {
return Container(
constraints: BoxConstraints(
minHeight: 62.rpx,
),
child: Align(
alignment: AlignmentDirectional(-1, 0),
child: Text(
overflow: TextOverflow.ellipsis,
maxLines: 1,
"$label",
style: TextStyle(
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController.currentColor.sc4,
),
),
),
);
}
Widget _buildValueItem(BuildContext context, value) {
return Container(
constraints: BoxConstraints(
minHeight: 62.rpx,
),
child: Align(
alignment: AlignmentDirectional(-1, 0),
child: Text(
overflow: TextOverflow.ellipsis,
maxLines: 1,
"$value",
style: TextStyle(
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController.currentColor.sc3,
),
),
),
);
}
// 创建时间行,包含时间和查看按钮
Widget _buildValueRowWithButton(BuildContext context, String value,
{required VoidCallback onViewTap}) {
return Container(
constraints: BoxConstraints(
minHeight: 62.rpx,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
overflow: TextOverflow.ellipsis,
maxLines: 1,
value,
style: TextStyle(
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController.currentColor.sc3,
),
),
),
// 查看按钮
ClickableContainer(
onTap: onViewTap,
borderRadius: 50.rpx,
padding: EdgeInsets.symmetric(
horizontal: 26.rpx,
vertical: 6.rpx,
),
backgroundColor: themeController.currentColor.sc2,
highlightColor: Colors.transparent,
child: Text(
'查看',
style: TextStyle(
fontFamily: 'Inter',
fontSize: 24.rpx,
color: Colors.white,
),
),
),
],
),
);
}
// 查看报告的方法
void _onViewReport(Map reportData) {
// TODO: 实现查看报告详情的逻辑
// 可以根据需要跳转到报告详情页面
print('查看报告: ${reportData['_id']}');
// 示例Get.to(() => ReportDetailPage(reportId: reportData['_id']));
Get.toNamed('/healthQuickCheckReportPage', arguments: reportData);
}
// 格式化时间戳
String _formatTime(dynamic timestamp) {
if (timestamp == null) return '--';
try {
// 假设时间戳是毫秒级
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
// 格式化为:年/月/日 时:分
return "${dateTime.year}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.day.toString().padLeft(2, '0')} ${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}";
} catch (e) {
return '--';
}
}
}