import 'package:fis_common/env/env.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vitalapp/architecture/utils/advance_debounce.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/architecture/values/features.dart'; import 'package:vitalapp/components/alert_dialog.dart'; import 'package:vitalapp/components/button.dart'; import 'package:vitalapp/components/side_nav/defines.dart'; import 'package:vitalapp/components/side_nav/side_nav.dart'; import 'package:vitalapp/global.dart'; import 'package:vitalapp/pages/patient/create/controller.dart'; import 'package:vitalapp/pages/patient/create/widgets/area.dart'; import 'package:vitalapp/pages/patient/create/widgets/crowd_label.dart'; import 'package:vitalapp/pages/patient/create/widgets/patient_info.dart'; import 'package:vitalapp/store/store.dart'; class QuickCreatePatientPage extends GetView { const QuickCreatePatientPage({super.key}); @override Widget build(BuildContext context) { return Stack( children: [ VSideNavView( items: _buildItems(), ), Positioned( bottom: 8, left: 200, right: 200, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ VButton( label: "清空", onTap: () { Debouncer.run( () async { await Get.dialog( VAlertDialog( title: "提示", width: 320, content: Container( height: 32, padding: const EdgeInsets.symmetric(horizontal: 24), alignment: Alignment.center, child: const Text( "是否确认清空当前页面信息?", style: TextStyle(fontSize: 20), ), ), onConfirm: () { controller.state.reset(); Get.back(); }, ), barrierDismissible: false, barrierColor: Colors.black.withOpacity(.4), ); }, ); }, ), VButton( label: "保存", onTap: () { Debouncer.run( () { controller.saveAndBack(); }, ); }, ), ], ), ), ], ); } VSideNavMenuItem _buildCreateManualRecord() { return VSideNavMenuItem( title: "手动录入", icon: Icon(Icons.edit_document, color: Colors.grey.shade700), pageBuilder: (_) => _buildInterval( PatientInfo(), ), ); } VSideNavMenuItem _buildIDReaderRecord() { return VSideNavMenuItem( title: "读卡器录入", icon: Icon(Icons.chrome_reader_mode, color: Colors.grey.shade700), onTap: () { controller.onReadCardClicked(); }, ); } VSideNavMenuItem _buildScanIdCardRecord() { return VSideNavMenuItem( title: "身份证识别录入", icon: Icon(Icons.perm_contact_cal_rounded, color: Colors.grey.shade700), onTap: () { if (!Store.user.hasFeature(FeatureKeys.IdCardOfflineRecognition)) { if (!kIsOnline) { PromptBox.toast("当前为离线模式,不支持此功能"); return; } } controller.onIdCardScanClicked(); }, ); } VSideNavMenuItem _buildFaceIdLogin() { return VSideNavMenuItem( title: "人脸识别", icon: Icon(Icons.sensor_occupied, color: Colors.grey.shade700), onTap: () { if (!kIsOnline) { PromptBox.toast("当前为离线模式,不支持此功能"); return; } controller.onFaceIdLoginClicked(); }, ); } List _buildItems() { final items = []; items.add(_buildCreateManualRecord()); if (Store.user.hasFeature(FeatureKeys.IDCardReader)) { items.add(_buildIDReaderRecord()); } if (!FPlatform.isWindows && !FPlatform.isWindows) { if (Store.user.hasFeature(FeatureKeys.IdCardPhotoOCR)) { items.add(_buildScanIdCardRecord()); } if (Store.user.hasFeature(FeatureKeys.FaceRecognition)) { items.add(_buildFaceIdLogin()); } } return items; } VSideNavMenuItem _buildSignatureItem() { return VSideNavMenuItem( title: "服务信息", icon: Icon(Icons.edit_document, color: Colors.grey.shade700), pageBuilder: (_) => _buildInterval( const Area(), ), ); } VSideNavMenuItem _buildAboutItem() { return VSideNavMenuItem( title: "人群分类", isRequired: true, icon: Icon(Icons.info_outline, color: Colors.grey.shade700), pageBuilder: (_) => _buildInterval( const CrowdLabelView(), ), ); } VSideNavMenuItem _buildLogOutItem() { return VSideNavMenuItem( title: "个人信息", icon: Icon(Icons.medical_information_outlined, color: Colors.grey.shade700), pageBuilder: (_) => _buildInterval( PatientInfo(), ), // route: VRouteSetting( // "/patient_info_panel", // () => const PatientInfo(), // binding: BindingsBuilder( // () { // Get.lazyPut(() => CreatePatientController()); // }, // ), // ), // shouldRearrage: true, // TODO: 调整样式后启用 ); } Widget _buildInterval(Widget child) { return Padding( padding: const EdgeInsets.symmetric( horizontal: 16, ), child: child, ); } }