quick_create.dart 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  4. import 'package:vitalapp/architecture/values/features.dart';
  5. import 'package:vitalapp/components/button.dart';
  6. import 'package:vitalapp/components/side_nav/defines.dart';
  7. import 'package:vitalapp/global.dart';
  8. import 'package:vitalapp/pages/patient/create/controller.dart';
  9. import 'package:vitalapp/pages/patient/create/widgets/area.dart';
  10. import 'package:vitalapp/pages/patient/create/widgets/crowd_label.dart';
  11. import 'package:vitalapp/pages/patient/create/widgets/patient_info.dart';
  12. import 'package:vitalapp/store/store.dart';
  13. import 'package:fis_common/helpers/color.dart';
  14. class QuickCreatePatientPage extends GetView<CreatePatientController> {
  15. const QuickCreatePatientPage({super.key});
  16. @override
  17. Widget build(BuildContext context) {
  18. return Stack(
  19. children: [
  20. Row(
  21. children: [
  22. if (Store.user.hasFeature(FeatureKeys.IdCardPhotoOCR) ||
  23. Store.user.hasFeature(FeatureKeys.IDCardReader))
  24. Expanded(
  25. flex: 1,
  26. child: Container(
  27. decoration: BoxDecoration(
  28. border: Border(
  29. right: BorderSide(
  30. color: Colors.grey.shade300,
  31. ),
  32. ),
  33. ),
  34. child: Column(
  35. mainAxisAlignment: MainAxisAlignment.center,
  36. children: [
  37. if (Store.user.hasFeature(FeatureKeys.IdCardPhotoOCR))
  38. _buildClickCard(
  39. Icons.perm_contact_cal_rounded,
  40. '拍照识别',
  41. () {
  42. if (!kIsOnline) {
  43. PromptBox.toast("当前为离线模式,不支持此功能");
  44. return;
  45. }
  46. controller.onIdCardScanClicked();
  47. },
  48. ),
  49. const SizedBox(
  50. height: 80,
  51. ),
  52. if (Store.user.hasFeature(FeatureKeys.IDCardReader))
  53. _buildClickCard(
  54. Icons.chrome_reader_mode,
  55. '读卡识别',
  56. () => controller.onReadCardClicked(),
  57. ),
  58. ],
  59. ),
  60. ),
  61. ),
  62. Expanded(
  63. flex: 2,
  64. child: PatientInfo(),
  65. ),
  66. ],
  67. ),
  68. // VSideNavView(
  69. // // navId: NavIds.CREATE,
  70. // items: _buildItems(),
  71. // ),
  72. Positioned(
  73. bottom: 8,
  74. left: 200,
  75. right: 200,
  76. child: Row(
  77. mainAxisAlignment: MainAxisAlignment.spaceAround,
  78. children: [
  79. VButton(
  80. label: "保存",
  81. onTap: () {
  82. controller.saveAndBack();
  83. },
  84. ),
  85. ],
  86. ),
  87. ),
  88. ],
  89. );
  90. }
  91. Widget _buildClickCard(
  92. IconData icon,
  93. String textString,
  94. VoidCallback voidCallback,
  95. ) {
  96. return Material(
  97. // color: Colors.blueAccent,
  98. borderRadius: const BorderRadius.all(
  99. Radius.circular(8),
  100. ),
  101. child: InkWell(
  102. onTap: () => voidCallback.call(),
  103. borderRadius: const BorderRadius.all(
  104. Radius.circular(8),
  105. ),
  106. child: Stack(
  107. children: [
  108. Container(
  109. padding: const EdgeInsets.symmetric(
  110. vertical: 50,
  111. horizontal: 80,
  112. ),
  113. // margin: const EdgeInsets.symmetric(horizontal: 50),
  114. decoration: BoxDecoration(
  115. borderRadius: const BorderRadius.all(
  116. Radius.circular(8),
  117. ),
  118. gradient: LinearGradient(
  119. colors: [
  120. // Color.fromRGBO(59, 188, 255, 1),
  121. // Color.fromRGBO(44, 120, 229, 1),
  122. Colors.blue,
  123. FColorHelper.mixColor(Colors.white, Colors.blue, 50),
  124. ],
  125. begin: Alignment.topLeft,
  126. end: Alignment.bottomRight,
  127. ),
  128. ),
  129. child: Text(
  130. textString,
  131. style: const TextStyle(
  132. fontSize: 20,
  133. color: Colors.white,
  134. ),
  135. ),
  136. ),
  137. Positioned(
  138. top: 10,
  139. left: 10,
  140. child: Icon(
  141. icon,
  142. color: Colors.white,
  143. size: 40,
  144. ),
  145. ),
  146. ],
  147. ),
  148. ),
  149. );
  150. }
  151. VSideNavMenuItem _buildCreateManualRecord() {
  152. return VSideNavMenuItem(
  153. title: "手动建档",
  154. icon: Icon(Icons.edit_document, color: Colors.grey.shade700),
  155. pageBuilder: (_) => _buildInterval(
  156. PatientInfo(),
  157. ),
  158. );
  159. }
  160. VSideNavMenuItem _buildIDReaderRecord() {
  161. return VSideNavMenuItem(
  162. title: "读卡建档",
  163. icon: Icon(Icons.chrome_reader_mode, color: Colors.grey.shade700),
  164. onTap: () {
  165. controller.onReadCardClicked();
  166. },
  167. );
  168. }
  169. VSideNavMenuItem _buildScanIdCardRecord() {
  170. return VSideNavMenuItem(
  171. title: "身份证识别",
  172. icon: Icon(Icons.perm_contact_cal_rounded, color: Colors.grey.shade700),
  173. onTap: () {
  174. if (!kIsOnline) {
  175. PromptBox.toast("当前为离线模式,不支持此功能");
  176. return;
  177. }
  178. controller.onIdCardScanClicked();
  179. },
  180. );
  181. }
  182. VSideNavMenuItem _buildFaceIdLogin() {
  183. return VSideNavMenuItem(
  184. title: "人脸识别",
  185. icon: Icon(Icons.sensor_occupied, color: Colors.grey.shade700),
  186. onTap: () {
  187. if (!kIsOnline) {
  188. PromptBox.toast("当前为离线模式,不支持此功能");
  189. return;
  190. }
  191. controller.onFaceIdLoginClicked();
  192. },
  193. );
  194. }
  195. List<VSideNavMenuItem> _buildItems() {
  196. final items = <VSideNavMenuItem>[];
  197. items.add(_buildCreateManualRecord());
  198. if (Store.user.hasFeature(FeatureKeys.IDCardReader)) {
  199. items.add(_buildIDReaderRecord());
  200. }
  201. if (Store.user.hasFeature(FeatureKeys.FaceRecognition)) {
  202. items.add(_buildScanIdCardRecord());
  203. }
  204. if (Store.user.hasFeature(FeatureKeys.FaceRecognition)) {
  205. items.add(_buildFaceIdLogin());
  206. }
  207. // items.add(_buildLogOutItem());
  208. // items.add(_buildSignatureItem());
  209. // items.add(_buildAboutItem());
  210. return items;
  211. }
  212. VSideNavMenuItem _buildSignatureItem() {
  213. return VSideNavMenuItem(
  214. title: "服务信息",
  215. icon: Icon(Icons.edit_document, color: Colors.grey.shade700),
  216. pageBuilder: (_) => _buildInterval(
  217. const Area(),
  218. ),
  219. );
  220. }
  221. VSideNavMenuItem _buildAboutItem() {
  222. return VSideNavMenuItem(
  223. title: "人群分类",
  224. isRequired: true,
  225. icon: Icon(Icons.info_outline, color: Colors.grey.shade700),
  226. pageBuilder: (_) => _buildInterval(
  227. const CrowdLabelView(),
  228. ),
  229. );
  230. }
  231. VSideNavMenuItem _buildLogOutItem() {
  232. return VSideNavMenuItem(
  233. title: "个人信息",
  234. icon:
  235. Icon(Icons.medical_information_outlined, color: Colors.grey.shade700),
  236. pageBuilder: (_) => _buildInterval(
  237. PatientInfo(),
  238. ),
  239. // route: VRouteSetting(
  240. // "/patient_info_panel",
  241. // () => const PatientInfo(),
  242. // binding: BindingsBuilder(
  243. // () {
  244. // Get.lazyPut(() => CreatePatientController());
  245. // },
  246. // ),
  247. // ),
  248. // shouldRearrage: true, // TODO: 调整样式后启用
  249. );
  250. }
  251. Widget _buildInterval(Widget child) {
  252. return Padding(
  253. padding: const EdgeInsets.symmetric(
  254. horizontal: 16,
  255. ),
  256. child: child,
  257. );
  258. }
  259. }