import 'dart:convert'; import 'package:fis_common/event/event_type.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vitalapp/components/dialog_input.dart'; import 'package:vitalapp/components/dialog_number.dart'; import 'package:vitalapp/components/dynamic_drawer.dart'; import 'package:vitalapp/managers/interfaces/cachedRecord.dart'; import 'package:vitalapp/managers/interfaces/template.dart'; import 'package:vitalapp/pages/check/models/form.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_blood_pressure.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_blood_sugar.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_body_temperature.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_body_weight.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_boold_oxygen.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_check_box.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_health_guidance_check_box.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_input.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_number_input.dart'; import 'dart:math' as math; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_radio.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_radio_score.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_table.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_toxic_substance.dart'; import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_urinalys.dart'; import 'package:vitalapp/pages/check/widgets/exam_table/homecare_bed_history_from.dart'; import 'package:vitalapp/pages/check/widgets/exam_table/hospitalization_history_from.dart'; import 'package:vitalapp/pages/check/widgets/exam_table/inoculate_history_from.dart'; import 'package:vitalapp/pages/check/widgets/exam_table/main_medication_status_from.dart'; import 'package:vitalapp/pages/medical/controller.dart'; import 'package:vitalapp/store/store.dart'; class NewConfigurableCard extends StatefulWidget { final String cardKey; final Future Function(String, String, dynamic) callBack; final Widget? followUpWidget; final String? patientCode; final String? examData; final FEventHandler? onChangeCurrentKeyEvent; final FEventHandler? onSubmitEvent; const NewConfigurableCard({ super.key, required this.cardKey, required this.callBack, this.followUpWidget, this.patientCode, this.examData, this.onSubmitEvent, this.onChangeCurrentKeyEvent, }); @override State createState() => NewConfigurableFormState(); } class NewConfigurableFormState extends State { /// 当前最新的模板的键值对 Map templateRelation = {}; /// 当前模板数据 List currentTemplate = []; /// 当前title的下标 // int currentTitleIndex = 0; Map formValue = {}; var scaffoldKey = GlobalKey(); final _templateManager = Get.find(); final _cachedRecordManager = Get.find(); final arrowHeight = math.tan(120 / 180) * 19; List deviceList = ['Temp', 'GLU', 'NIBP', 'SpO2', 'BMI']; Map deviceCached = {}; Map currentTable = {}; ScrollController _examScrollController = ScrollController(); List storeTypeList = [ 'Qi_Score', 'Yang_Score', 'Yin_Score', 'Tan_Score', 'Shi_Score', 'Xue_Score', 'Qiyu_Score', 'Te_Score', 'Ping_Score' ]; @override void initState() { initAddListener(); super.initState(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { if (mounted) { initTemplate(); } }); widget.onSubmitEvent?.addListener(submitEvent); _examScrollController.addListener(_scrollListener); } @override void dispose() { super.dispose(); widget.onSubmitEvent?.removeListener(submitEvent); _examScrollController.removeListener(_scrollListener); _examScrollController.dispose(); } void submitEvent(sender, e) { if (mounted) { if (e) { if (formValue.isNotEmpty) { submit(); } } } } /// 是否有健康检测的页面权限 bool _hasHealthMonitor() { bool hasAuth = false; Store.user.menuPermissionList?.forEach((element) { if (element.code == "JKJC") { hasAuth = true; } }); return hasAuth; } /// 判断是否有健康检测的页面 void initAddListener() { if (_hasHealthMonitor()) { var medicalController = Get.find(); medicalController.setExamData.addListener(onSetExamDataEvent); } } void onSetExamDataEvent(sender, Map e) { if (mounted) { Map examData = {}; setState(() { print(widget.cardKey); e.forEach((key, value) { if (key != "Urine") { examData.addAll(value); } else { examData.addAll({"Urinary_Pro": value}); } }); Map newMap = Map.from(examData); if (examData["sugar"]?.isNotEmpty ?? false) { newMap.remove("sugar"); // 将"sugar"的值作为"Fasting_Glucose_Mmol"键的值添加到新的Map中 newMap["Fasting_Glucose_Mmol"] = examData["sugar"] ?? ''; } formValue.addAll(newMap); }); } } Future submit() async { await widget.callBack( widget.cardKey, templateRelation[widget.cardKey]!, jsonEncode(formValue), ); } Future initTemplate() async { Store.app.busy = true; await fetchTemplateIndex(); await fetchTemplate(widget.cardKey); await fetchTemplateData(); Store.app.busy = false; } /// 读取健康检测的缓存 Future readCachedRecord(String currentDevice) async { if (widget.patientCode == null) { return null; } String? value = await _cachedRecordManager.readCachedRecord( currentDevice, widget.patientCode!, 'ZLZS', ); return value; } /// 读取体检的缓存 Future readCachedCheck() async { if (widget.patientCode == null) { return null; } String? value = await _cachedRecordManager.readCachedRecord( widget.cardKey, widget.patientCode!, 'exam', ); return value; } Future readCached() async { for (var element in deviceList) { String? value = await readCachedRecord(element); if (value?.isNotEmpty ?? false) { deviceCached.addAll(jsonDecode(value!)); } } } Future fetchTemplateIndex() async { try { /// 获取模板的键值对 String? templates; templates = await _templateManager.readTemplateRelation('templateRelation'); templateRelation = jsonDecode(templates!); setState(() {}); } catch (error) { print('发生错误: $error'); } } Future fetchTemplateData() async { // / 这逻辑需要优化 if (widget.examData?.isNotEmpty ?? false) { formValue = jsonDecode(widget.examData!); return; } String? value = await readCachedCheck(); await readCached(); if (deviceCached.isNotEmpty) { formValue = deviceCached; setState(() {}); return; } if (value?.isNotEmpty ?? false) { formValue = jsonDecode(value!); } formValue.forEach( (key, value) { if (value is List) { formValue[key] = List.from(formValue[key]); } else if (value is List) { formValue[key] = List.from(formValue[key]); } }, ); setState(() {}); } Future fetchTemplate(String key) async { try { if (templateRelation[key] == null) { currentTemplate = []; setState(() {}); return; } var template = await _templateManager.readTemplate(templateRelation[key]!); String templateContent = TemplateDTO.fromJson(jsonDecode(template!)).templateContent!; List> list = jsonDecode(templateContent).cast>(); for (var i in list) { if (i['children'] != null) { List currentChildren = []; for (var j in i['children']) { currentChildren.add(FormObject.fromJson(j)); } i['children'] = currentChildren; } var item = FormObject.fromJson(i); currentTemplate.add(item); } if (widget.cardKey == 'LNRZYYJKGLFWJL') { for (var element in storeTypeList) { formValue[element] = calculatePhysicalFitnessScore(element, element == 'Ping_Score'); } } setState(() {}); } catch (error) { print('发生错误: $error'); } } @override Widget build(BuildContext context) { return Scaffold( key: scaffoldKey, endDrawer: VDynamicDrawerWrapper(scaffoldKey: scaffoldKey), resizeToAvoidBottomInset: false, body: Column( children: [ Expanded( child: Stack( children: [ Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ // _buildDiagram(), _buildContent(), ], ), ], ), ) ], ), ); } Widget buildSingleItem(Widget item, int span) { return FractionallySizedBox( widthFactor: span == 24 ? 1 : 0.5, child: item, ); } Widget buildWidget(FormObject? currentFormObject) { Map widgetMap = { 'checkbox': _buildCheckBox, 'numberInput': _buildNumberInput, 'input': _buildInput, 'radio': _buildRadio, 'radioScore': _buildRadioScore, 'bloodPressure': _buildBloodPressure, 'bodyTemperature': _buildBodyTemperature, 'weight': _buildBodyWeight, 'sugar': _buildBodySugar, 'bloodOxygen': _buildBloodOxygen, 'healthGuidanceCheckBox': _buildHealthGuidanceCheckBox, 'medicalHistory': _buildMedicalHistory, 'homecareBedHistor': _buildHomecareBedHistory, 'table': _buildMainMedicationHistory, 'inoculateHistory': _buildInoculateHistory, 'safetyPrecautions': _buildToxicSubstance, 'urinalys': _buildUrinalysis, }; Widget Function(FormObject) builder = widgetMap[currentFormObject?.type] ?? _buildInput; return builder(currentFormObject!); } Widget flowCardList() { int itemCount = 0; List _cardList = []; bool currentTemplateOptionsIsNotEmpty = false; if (currentTemplate.isNotEmpty) { for (int i = 0; i < currentTemplate.length; i++) { itemCount = currentTemplate[i].children?.length ?? 0; currentTemplateOptionsIsNotEmpty = currentTemplate[i].options?.isNotEmpty ?? false; List items = List.generate(itemCount, (index) { FormObject? currentFormObject = currentTemplate[i].children?[index]; int span = currentFormObject?.span ?? 12; //父结构的options不等于空或null if (true) { //子结构的options若是无值则取父类的options值 if (currentTemplateOptionsIsNotEmpty) { currentFormObject!.options = currentTemplate[i].options; } } return buildSingleItem(buildWidget(currentFormObject), span); }); _cardList.addAll(items); } } return Scrollbar( thumbVisibility: true, controller: _examScrollController, child: SingleChildScrollView( controller: _examScrollController, child: Container( alignment: Alignment.topCenter, padding: const EdgeInsets.all(15), child: Wrap( runSpacing: 20, // 纵向元素间距 alignment: WrapAlignment.start, children: _cardList, ), ), ), ); } void _scrollListener() { if (mounted) { if (_examScrollController.position.pixels == _examScrollController.position.maxScrollExtent) { // 滚动到底部 _onScrollEnd(); } } } void _onScrollEnd() { // 在这里触发您想要执行的方法 print('Scroll to the bottom!'); // widget.onChangeCurrentKeyEvent?.emit(this, true); } /// 主页面 Widget _buildContent() { return Expanded( flex: 2, child: flowCardList(), ); } /// 多选框组件 Widget _buildCheckBox(FormObject currentFormObject) { List