quick_create.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import 'package:fis_common/env/env.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'package:vitalapp/architecture/utils/advance_debounce.dart';
  5. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  6. import 'package:vitalapp/architecture/values/features.dart';
  7. import 'package:vitalapp/components/alert_dialog.dart';
  8. import 'package:vitalapp/components/button.dart';
  9. import 'package:vitalapp/components/side_nav/defines.dart';
  10. import 'package:vitalapp/components/side_nav/side_nav.dart';
  11. import 'package:vitalapp/global.dart';
  12. import 'package:vitalapp/pages/patient/create/controller.dart';
  13. import 'package:vitalapp/pages/patient/create/widgets/area.dart';
  14. import 'package:vitalapp/pages/patient/create/widgets/crowd_label.dart';
  15. import 'package:vitalapp/pages/patient/create/widgets/patient_info.dart';
  16. import 'package:vitalapp/store/store.dart';
  17. class QuickCreatePatientPage extends GetView<CreatePatientController> {
  18. const QuickCreatePatientPage({super.key});
  19. @override
  20. Widget build(BuildContext context) {
  21. return Stack(
  22. children: [
  23. VSideNavView(
  24. items: _buildItems(),
  25. ),
  26. Positioned(
  27. bottom: 8,
  28. left: 200,
  29. right: 200,
  30. child: Row(
  31. mainAxisAlignment: MainAxisAlignment.spaceAround,
  32. children: [
  33. VButton(
  34. label: "清空",
  35. onTap: () {
  36. Debouncer.run(
  37. () async {
  38. await Get.dialog(
  39. VAlertDialog(
  40. title: "提示",
  41. width: 320,
  42. content: Container(
  43. height: 32,
  44. padding: const EdgeInsets.symmetric(horizontal: 24),
  45. alignment: Alignment.center,
  46. child: const Text(
  47. "是否确认清空当前页面信息?",
  48. style: TextStyle(fontSize: 20),
  49. ),
  50. ),
  51. onConfirm: () {
  52. controller.state.reset();
  53. Get.back();
  54. },
  55. ),
  56. barrierDismissible: false,
  57. barrierColor: Colors.black.withOpacity(.4),
  58. );
  59. },
  60. );
  61. },
  62. ),
  63. VButton(
  64. label: "保存",
  65. onTap: () {
  66. Debouncer.run(
  67. () {
  68. controller.saveAndBack();
  69. },
  70. );
  71. },
  72. ),
  73. ],
  74. ),
  75. ),
  76. ],
  77. );
  78. }
  79. VSideNavMenuItem _buildCreateManualRecord() {
  80. return VSideNavMenuItem(
  81. title: "手动录入",
  82. icon: Icon(Icons.edit_document, color: Colors.grey.shade700),
  83. pageBuilder: (_) => _buildInterval(
  84. PatientInfo(),
  85. ),
  86. );
  87. }
  88. VSideNavMenuItem _buildIDReaderRecord() {
  89. return VSideNavMenuItem(
  90. title: "读卡器录入",
  91. icon: Icon(Icons.chrome_reader_mode, color: Colors.grey.shade700),
  92. onTap: () {
  93. controller.onReadCardClicked();
  94. },
  95. );
  96. }
  97. VSideNavMenuItem _buildScanIdCardRecord() {
  98. return VSideNavMenuItem(
  99. title: "身份证识别录入",
  100. icon: Icon(Icons.perm_contact_cal_rounded, color: Colors.grey.shade700),
  101. onTap: () {
  102. if (!Store.user.hasFeature(FeatureKeys.IdCardOfflineRecognition)) {
  103. if (!kIsOnline) {
  104. PromptBox.toast("当前为离线模式,不支持此功能");
  105. return;
  106. }
  107. }
  108. controller.onIdCardScanClicked();
  109. },
  110. );
  111. }
  112. VSideNavMenuItem _buildFaceIdLogin() {
  113. return VSideNavMenuItem(
  114. title: "人脸识别",
  115. icon: Icon(Icons.sensor_occupied, color: Colors.grey.shade700),
  116. onTap: () {
  117. if (!kIsOnline) {
  118. PromptBox.toast("当前为离线模式,不支持此功能");
  119. return;
  120. }
  121. controller.onFaceIdLoginClicked();
  122. },
  123. );
  124. }
  125. List<VSideNavMenuItem> _buildItems() {
  126. final items = <VSideNavMenuItem>[];
  127. items.add(_buildCreateManualRecord());
  128. if (Store.user.hasFeature(FeatureKeys.IDCardReader)) {
  129. items.add(_buildIDReaderRecord());
  130. }
  131. if (!FPlatform.isWindows && !FPlatform.isWindows) {
  132. if (Store.user.hasFeature(FeatureKeys.IdCardPhotoOCR)) {
  133. items.add(_buildScanIdCardRecord());
  134. }
  135. if (Store.user.hasFeature(FeatureKeys.FaceRecognition)) {
  136. items.add(_buildFaceIdLogin());
  137. }
  138. }
  139. return items;
  140. }
  141. VSideNavMenuItem _buildSignatureItem() {
  142. return VSideNavMenuItem(
  143. title: "服务信息",
  144. icon: Icon(Icons.edit_document, color: Colors.grey.shade700),
  145. pageBuilder: (_) => _buildInterval(
  146. const Area(),
  147. ),
  148. );
  149. }
  150. VSideNavMenuItem _buildAboutItem() {
  151. return VSideNavMenuItem(
  152. title: "人群分类",
  153. isRequired: true,
  154. icon: Icon(Icons.info_outline, color: Colors.grey.shade700),
  155. pageBuilder: (_) => _buildInterval(
  156. const CrowdLabelView(),
  157. ),
  158. );
  159. }
  160. VSideNavMenuItem _buildLogOutItem() {
  161. return VSideNavMenuItem(
  162. title: "个人信息",
  163. icon:
  164. Icon(Icons.medical_information_outlined, color: Colors.grey.shade700),
  165. pageBuilder: (_) => _buildInterval(
  166. PatientInfo(),
  167. ),
  168. // route: VRouteSetting(
  169. // "/patient_info_panel",
  170. // () => const PatientInfo(),
  171. // binding: BindingsBuilder(
  172. // () {
  173. // Get.lazyPut(() => CreatePatientController());
  174. // },
  175. // ),
  176. // ),
  177. // shouldRearrage: true, // TODO: 调整样式后启用
  178. );
  179. }
  180. Widget _buildInterval(Widget child) {
  181. return Padding(
  182. padding: const EdgeInsets.symmetric(
  183. horizontal: 16,
  184. ),
  185. child: child,
  186. );
  187. }
  188. }