import 'package:fis_jsonrpc/services/vitalFollowUp.m.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/components/alert_dialog.dart'; import 'package:vitalapp/components/appbar.dart'; import 'package:vitalapp/components/button.dart'; import 'package:vitalapp/components/no_data_view.dart'; import 'package:vitalapp/components/qr_code_with_logo/qr_code_with_logo.dart'; import 'package:vitalapp/consts/styles.dart'; import 'package:vitalapp/database/entities/defines.dart'; import 'package:vitalapp/managers/interfaces/follow_up.dart'; import 'package:vitalapp/pages/check/prescription/pediatric_prescription_collection.dart'; import 'package:vitalapp/pages/check/prescription/prescription_form_keys.dart'; import 'package:vitalapp/pages/form/form_info.dart'; import 'package:vitalapp/pages/patient/list/widgets/status.dart'; import 'package:vitalapp/pages/widgets/record_common_item.dart'; import 'forms/antenatal_visit.dart'; import 'forms/checkup_42_days.dart'; import 'forms/first_form.dart'; import 'forms/postpartum_follow_up.dart'; import 'widgets/delete_follow_up_record_button.dart'; import 'widgets/form_select_dialog.dart'; import 'controller.dart'; class MaternalHealthManagement extends GetView { MaternalHealthManagement({Key? key}) : super(key: key); final _followUpManager = Get.find(); @override Widget build(BuildContext context) { return GetBuilder( init: MaternalHealthManagementController(), id: "SelfCareAbilityAssessmentRecord", builder: (_) { return Scaffold( backgroundColor: const Color.fromRGBO(238, 238, 238, 1), appBar: VAppBar( titleWidget: const Text("孕产妇健康管理"), actions: [ IconButton( onPressed: () async { FormInfo.instance.formValue.clear(); controller.isEdit = false; Get.dialog(FormSelectDialog( onConfirm: (time, mode, isAfter, isAfterFirst) { Get.back(); controller.recordCode = ""; controller.followUpMode = mode; if (isAfter) { if (isAfterFirst) { Get.to(PostpartumFormView( onClickPrescribe: (followUpCode) async { /// 因为孕产妇使用的是单例和处方是同个数据 controller.maternalFormValue = FormInfo.instance.formValue; var result = await Get.to( PrescriptionCollection( controller.recordCode, isChild: false, createFollowUpOnly: () async { await controller.save( "PostnatalVisitRecord", followUpCode); var recordCode = controller.recordCode; if (recordCode.isNotEmpty) { controller.isEdit = true; } return recordCode; }, ), ); FormInfo.instance.formValue = controller.maternalFormValue; return result; }, )); } else { Get.to(PostpartumHealthCheckup42DaysForm( onClickPrescribe: (followUpCode) async { controller.maternalFormValue = FormInfo.instance.formValue; var result = await Get.to( PrescriptionCollection( controller.recordCode, isChild: false, createFollowUpOnly: () async { await controller.save( "PostpartumHealthCheckup42Days", followUpCode); var recordCode = controller.recordCode; if (recordCode.isNotEmpty) { controller.isEdit = true; } return recordCode; }, ), ); FormInfo.instance.formValue = controller.maternalFormValue; return result; }, )); } return; } if (time == 1) { Get.to(FirstMaternalHealthManagementForm( onClickPrescribe: (followUpCode) async { controller.maternalFormValue = FormInfo.instance.formValue; var result = await Get.to( PrescriptionCollection( controller.recordCode, isChild: false, createFollowUpOnly: () async { await controller.save( "MaternalHealthManagement", followUpCode); var recordCode = controller.recordCode; if (recordCode.isNotEmpty) { controller.isEdit = true; } return recordCode; }, ), ); FormInfo.instance.formValue = controller.maternalFormValue; return result; }, )); } else if (time >= 2 && time <= 5) { Get.to( AntenatalVisitForm( time, onClickPrescribe: (followUpCode) async { controller.maternalFormValue = FormInfo.instance.formValue; var result = await Get.to( PrescriptionCollection( controller.recordCode, isChild: false, createFollowUpOnly: () async { await controller.save( "PrenatalFollowupServiceRecord", followUpCode); var recordCode = controller.recordCode; if (recordCode.isNotEmpty) { controller.isEdit = true; } return recordCode; }, ), ); FormInfo.instance.formValue = controller.maternalFormValue; return result; }, ), ); } }, )); }, icon: Icon(Icons.add, size: 40), ), ], ), body: Stack( children: [ Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildDiagram(), _buildListView(), ], ) ], ), ); }, ); } Widget _buildDiagram() { return Expanded( flex: 1, child: Padding( padding: const EdgeInsets.all(16.0).copyWith(right: 0), child: Container( // color: Colors.white, padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, border: Border.all( color: Colors.white, ), borderRadius: GlobalStyles.borderRadius, ), child: Image.asset( 'assets/images/exam/normalMeasurementChart.png', height: double.infinity, fit: BoxFit.fitWidth, ), ), ), ); } Widget _buildListView() { return Expanded( flex: 2, child: Padding( padding: const EdgeInsets.all(16), child: RefreshIndicator(child: Obx( () { final list = controller.state.followUpDTOList; final children = []; for (var i = 0; i < list.length; i++) { final dto = list[i]; final records = dto.followUpRecordDatas; if (records == null) { continue; } for (var j = 0; j < records.length; j++) { final data = records[j]; OfflineDataSyncState? offlineSyncState; offlineSyncState = null; children.add( followUpRecordCard( index: j, dto: dto, dataDto: data, syncState: offlineSyncState, ), ); } } return list.isEmpty ? VNoDataView() : GridView( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 1, mainAxisSpacing: 16, crossAxisSpacing: 20, childAspectRatio: 900 / 180, ), children: children, ); }, ), onRefresh: () async { controller.getFollowUpRecordList(); }), ), ); } Widget followUpRecordCard({ required int index, required FollowUpRecordDTO dto, required FollowUpRecordDataDTO dataDto, OfflineDataSyncState? syncState, }) { final body = Stack( children: [ Row( children: [ Expanded( flex: 10, child: Container( padding: const EdgeInsets.symmetric( horizontal: 30, vertical: 12, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox( height: 8, ), LayoutBuilder(builder: (context, c) { final width = c.maxWidth - 100; return SizedBox( width: width, child: _buildBaseInfoRow(dataDto), ); }), const SizedBox( height: 20, ), Wrap( alignment: WrapAlignment.start, spacing: 20, runSpacing: 8, children: [ _buildName(dto.patientName ?? ''), _buildFollowUpMode(dataDto.followUpMode), ], ), const SizedBox( height: 20, ), Wrap( alignment: WrapAlignment.start, spacing: 20, runSpacing: 8, children: [ _buildFollowUpDoctor(dataDto.followUpDoctor ?? ""), _buildFollowUpTime(dataDto.followUpTime), ], ) ], ), ), ), // Expanded( // child: IconButton( // onPressed: () { // controller.toCheckPage(dataDto, isCreateFromOldDto: true); // }, // icon: Column( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, // children: [ // Icon( // Icons.add, // size: 42, // color: Colors.grey.shade400, // ), // Text("复制新增") // ], // ), // ), // ) ], ), Positioned( top: 16, right: 0, child: _FollowUpRecordSignStatusTag( dataDto: dataDto, ), ), Positioned( bottom: 16, right: 160, child: _buildShareButton(dataDto), ), Positioned( bottom: 16, right: 40, child: _buildCopyAddButton(dataDto), ), // if(dataDto) Positioned( top: 16, right: 100, child: _OfflineSyncTag(syncState: syncState), ), Positioned( bottom: 0, right: 0, child: DeleteFollowUpRecordButton(dataDto.code!, dataDto.key!, () { controller.getFollowUpRecordList(); }), ), ], ); return Material( borderRadius: GlobalStyles.borderRadius, child: Ink( decoration: BoxDecoration( color: Colors.white, borderRadius: GlobalStyles.borderRadius, ), child: InkWell( borderRadius: GlobalStyles.borderRadius, onTap: () { controller.isEdit = true; controller.recordCode = dataDto.code ?? ''; controller.toCheckPage(dataDto); //跳转到随访页面 }, child: body, ), ), ); } Widget _buildBaseInfoRow(FollowUpRecordDataDTO dto) { return SizedBox( child: RecordCommonItem( itemName: '随访病症', itemValue: controller.getFollowUpValueByKey(dto), fontSize: 20, ), ); } Widget _FollowUpRecordSignStatusTag( {required FollowUpRecordDataDTO dataDto}) { return Container( alignment: Alignment.centerRight, width: 120, child: StatusLabel( title: _followUpManager.followUpStateTransition(dataDto.followUpState), color: _followUpManager.followUpStateColors(dataDto.followUpState), ), ); } Widget _OfflineSyncTag({OfflineDataSyncState? syncState}) { return SizedBox(); } Widget _buildName(String name) { return SizedBox( width: 300, child: RecordCommonItem( itemName: '姓名', itemValue: name, fontSize: 18, ), ); } Widget _buildFollowUpMode(FollowUpModeEnum? followUpMode) { return RecordCommonItem( itemName: '随访类型', itemValue: _followUpManager.getFollowUpMode(followUpMode), fontSize: 18, ); } Widget _buildFollowUpDoctor(String followUpDoctor) { return SizedBox( width: 300, child: RecordCommonItem( itemName: '随访医生', itemValue: followUpDoctor, fontSize: 18, ), ); } Widget _buildFollowUpTime(DateTime? followUpTime) { return RecordCommonItem( itemName: '随访时间', itemValue: followUpTime != null ? DateFormat("yyyy-MM-dd").format(followUpTime.toLocal()) : "", fontSize: 18, ); } Widget _buildShareButton(FollowUpRecordDataDTO dataDto) { return Container( width: 100, height: 50, alignment: Alignment.bottomRight, child: VButton( onTap: () async { List> previewList = await controller.sharePrescription(dataDto); if (previewList.length == 0) { PromptBox.toast("暂无处方"); return; } const designWidth = 1280.0; // 设计尺寸宽度:1280 final width = Get.width; final scale = width / designWidth; // 计算缩放比例 Get.dialog( VAlertDialog( title: "分享处方", width: width * 0.8 / scale, content: _buildQrcode(previewList), ), ); }, label: "分享", ), ); } Widget _buildCopyAddButton(FollowUpRecordDataDTO dataDto) { return Container( width: 100, height: 50, alignment: Alignment.bottomRight, child: VButton( onTap: () { controller.toCheckPage(dataDto, isCreateFromOldDto: true); }, label: "复制新增", ), ); } ///二维码 Widget _buildQrcode(List> qrCodes) { return SingleChildScrollView( child: Align( alignment: Alignment.center, child: Wrap( spacing: 80, runSpacing: 5, children: qrCodes .map( (e) => VQRCodeWithLogo( e["previewUrl"], codeStatement: PrescriptionFormKeys.AllPregnantWomenFormKeys[e["key"]], operationStatement: "复制链接", size: 260, titleWidth: 270, operationSuccessCallback: () { PromptBox.toast("复制成功"); }, ), ) .toList(), ), ), ); } }