更新快检功能

This commit is contained in:
wyf
2026-03-10 12:01:00 +08:00
parent d0ae2a9f76
commit 6472baf993
48 changed files with 8046 additions and 120 deletions

View File

@@ -99,6 +99,7 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
final allTexts = [
"体征检测设备.首页展示".tr,
"体征检测设备.人员资料".tr,
"体征检测设备.设备详情".tr,
"WIFI配置".tr,
"设备校准".tr,
@@ -286,6 +287,69 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
? themeController.currentColor.sc2
: themeController.currentColor.sc3,
),
_buildMenuItem(
text: "人员资料.标题".tr,
onTap: () async {
setState(() {
_isPopupOpen = false;
});
_popupEntry?.remove();
_popupEntry = null;
if (widget.device['person'] != null) {
personController.currentPersonId.value = widget.device['_id'];
personController.name.value = widget.device['person']['name'];
personController.update_person_mac.value = widget.device['mac'];
personController.gender.value =
widget.device['person']['gender'] ?? 1;
personController.weight?.value =
widget.device['person']['weight'] == null
? ''
: widget.device['person']['weight'].toString();
personController.height.value =
widget.device['person']['height'] == null
? ''
: widget.device['person']['height'].toString();
personController.selectedDiseaseIds.value =
widget.device['person']['disease'] ?? [];
personController.birthday.value =
widget.device['person']['birthday'] ?? '';
personController.dateTime =
MyUtils.formatBirthdayTime(widget.device['person']['birthday']);
personController.timeZone.value =
widget.device['person']['UTC'] ?? '';
if (widget.device['person']['city_id'] != null) {
// 根据city_id查找完整的城市数据
final int cityId = widget.device['person']['city_id'];
await initializeCityData();
final CityModel? completeCityData = _findCityDataById(cityId);
if (completeCityData != null) {
personController.cityModel = completeCityData;
} else {
personController.cityModel = null;
}
} else {
personController.cityModel = null;
}
} else {
personController.update_person_mac.value = widget.device['mac'];
personController.currentPersonId.value = widget.device['_id'];
personController.name.value = "";
personController.gender.value = 1;
personController.dateTime = null;
personController.height.value = "";
personController.weight.value = "";
personController.diseaseList.value = [];
personController.cityModel = null;
personController.timeZone.value = "";
}
await Get.toNamed("/updatePersonPage",
arguments: widget.device['bind_type']);
bodyDeviceController.getDeviceList();
},
),
_buildMenuItem(
text: "体征检测设备.设备详情".tr,
onTap: () {
@@ -1158,69 +1222,8 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
child: CustomCard(
borderRadius: AppConstants().button_container_radius,
onTap: () async {
if (widget.device['person'] != null) {
personController.currentPersonId.value =
widget.device['_id'];
personController.name.value =
widget.device['person']['name'];
personController.update_person_mac.value =
widget.device['mac'];
personController.gender.value =
widget.device['person']['gender'] ?? 1;
personController.weight?.value =
widget.device['person']['weight'] == null
? ''
: widget.device['person']['weight']
.toString();
personController.height.value =
widget.device['person']['height'] == null
? ''
: widget.device['person']['height']
.toString();
personController.selectedDiseaseIds.value =
widget.device['person']['disease'] ?? [];
personController.birthday.value =
widget.device['person']['birthday'] ?? '';
personController.dateTime =
MyUtils.formatBirthdayTime(
widget.device['person']['birthday']);
personController.timeZone.value =
widget.device['person']['UTC'] ?? '';
if (widget.device['person']['city_id'] != null) {
// 根据city_id查找完整的城市数据
final int cityId =
widget.device['person']['city_id'];
await initializeCityData();
final CityModel? completeCityData =
_findCityDataById(cityId);
if (completeCityData != null) {
personController.cityModel = completeCityData;
} else {
personController.cityModel = null;
}
} else {
personController.cityModel = null;
}
} else {
personController.update_person_mac.value =
widget.device['mac'];
personController.currentPersonId.value =
widget.device['_id'];
personController.name.value = "";
personController.gender.value = 1;
personController.dateTime = null;
personController.height.value = "";
personController.weight.value = "";
personController.diseaseList.value = [];
personController.cityModel = null;
personController.timeZone.value = "";
}
await Get.toNamed("/updatePersonPage",
arguments: widget.device['bind_type']);
bodyDeviceController.getDeviceList();
await Get.toNamed("/healthCheckPage",
arguments: widget.device);
},
colors: [
themeController.currentColor.sc1,
@@ -1241,7 +1244,7 @@ class _DeviceDataComponentWidgetState extends State<DeviceDataComponentWidget> {
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"体征检测设备.人员资料".tr,
"健康快检".tr,
style: TextStyle(
color: themeController.currentColor.sc3,
fontFamily: 'Inter',

View File

@@ -0,0 +1,234 @@
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);
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 '--';
}
}
}