controller.dart 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import 'dart:convert';
  2. import 'package:fis_common/extensions/string.dart';
  3. import 'package:fis_jsonrpc/rpc.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:get/get.dart';
  6. import 'package:vitalapp/architecture/utils/datetime.dart';
  7. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  8. import 'package:vitalapp/managers/interfaces/follow_up.dart';
  9. import 'package:vitalapp/managers/interfaces/prescription.dart';
  10. import 'package:vitalapp/pages/check/follow_up/state.dart';
  11. import 'package:vitalapp/pages/check/models/form.dart';
  12. import 'package:vitalapp/pages/form/form_info.dart';
  13. import 'package:vitalapp/store/store.dart';
  14. class FollowUpController extends GetxController {
  15. FollowUpController();
  16. final state = FollowUpState();
  17. final _followUpManager = Get.find<IFollowUpManager>();
  18. final _prescriptionManager = Get.find<IPrescriptionManager>();
  19. late String patientCode = "";
  20. late String patientName = "";
  21. String recordCode = '';
  22. _initData() {
  23. update(["follow_up"]);
  24. // final p = Get.parameters;
  25. patientCode = Store.user.currentSelectPatientInfo?.code ?? '';
  26. patientName = Store.user.currentSelectPatientInfo?.patientName ?? '';
  27. }
  28. void onTap() {}
  29. List<MenuItem> menuList = [
  30. // MenuItem(label: "肺结核随访服务", value: 'FJHSFFW'),
  31. // MenuItem(label: "肺结核入户随访", value: 'FJHRHSF'),
  32. // MenuItem(label: "冠心病", value: 'GXB'),
  33. // MenuItem(label: "脑卒中", value: 'NCZ'),
  34. // MenuItem(label: "严重精神障碍随访服务", value: 'YZJSZASFFW'),
  35. // MenuItem(label: "严重精神障碍个人信息补充", value: 'YZJSZAGRXXBC'),
  36. MenuItem(label: "2 型糖尿病", value: 'TNB'),
  37. MenuItem(label: "高血压", value: 'GXY'),
  38. MenuItem(label: "老年人中医药健康管理服务记录表", value: 'LNRZYYJKGLFWJL'),
  39. // MenuItem(label: "老年人生活自理能力评估表", value: 'LNRSHZLNLPGB'),
  40. // MenuItem(label: "产后42天健康检查列表", value: 'YCF_CH42TJKJCLB'),
  41. // MenuItem(label: "产后访视列表", value: 'YCF_CHFSLB'),
  42. // MenuItem(label: "2~5次产前随访列表", value: 'YCF_2_5CCQSFLB'),
  43. // MenuItem(label: "第一次产前检查列表", value: 'YCF_DYCCQJCLB'),
  44. // MenuItem(label: "基本信息", value: 'YCF_JBXX'),
  45. // MenuItem(label: "儿童中医药健康管理列表", value: 'ET_ZYYJKGLLB'),
  46. MenuItem(label: "满月儿童健康检查", value: 'ET_1MSETJKJCLB'),
  47. MenuItem(label: "3月龄儿童健康检查", value: 'ET_3MSETJKJCLB'),
  48. MenuItem(label: "6月龄儿童健康检查", value: 'ET_6MSETJKJCLB'),
  49. MenuItem(label: "8月龄儿童健康检查", value: 'ET_8MSETJKJCLB'),
  50. MenuItem(label: "12月儿童健康检查", value: 'ET_12MSETJKJCLB'),
  51. MenuItem(label: "18月儿童健康检查", value: 'ET_18MSETJKJCLB'),
  52. MenuItem(label: "24月儿童健康检查", value: 'ET_24MSETJKJCLB'),
  53. MenuItem(label: "30月儿童健康检查", value: 'ET_30MSETJKJCLB'),
  54. MenuItem(label: "3岁儿童健康检查", value: 'ET_3SETJKJCLB'),
  55. MenuItem(label: "4岁儿童健康检查", value: 'ET_4SETJKJCLB'),
  56. MenuItem(label: "5岁儿童健康检查", value: 'ET_5SETJKJCLB'),
  57. MenuItem(label: "6岁儿童健康检查", value: 'ET_6SETJKJCLB'),
  58. // MenuItem(label: "1~2岁儿童健康检查列表", value: 'ET_1_2SETJKJCLB'),
  59. // MenuItem(label: "1岁内儿童健康检查列表", value: 'ET_1SNETJKJCLB'),
  60. // MenuItem(label: "新生儿访视列表", value: 'ET_XSEFSLB'),
  61. ];
  62. // @override
  63. // void onInit() {
  64. // super.onInit();
  65. // }
  66. ///校验严重精神障碍、糖尿病、高血压、肺结核等处方是否有填充数据
  67. Future<bool> _checkPrecription(Map<String, dynamic> value) async {
  68. var keys = FormInfo.instance.formValue.keys.toList();
  69. int targetLength = 3;
  70. if (Store.user.signature.isNotNullOrEmpty) {
  71. targetLength = 4;
  72. }
  73. if (value.length == targetLength &&
  74. keys.contains("PatientName") &&
  75. keys.contains("PatientGender") &&
  76. keys.contains("PatientAge")) {
  77. var age = DataTimeUtils.calculateAge(
  78. Store.user.currentSelectPatientInfo!.birthday!);
  79. var currentPatient = Store.user.currentSelectPatientInfo;
  80. String patientGender = "";
  81. if (currentPatient?.patientGender == GenderEnum.Male) {
  82. patientGender = "1";
  83. } else if (currentPatient?.patientGender == GenderEnum.Female) {
  84. patientGender = "2";
  85. }
  86. if (value["PatientName"] == currentPatient?.patientName &&
  87. value["PatientAge"] == age &&
  88. value["PatientGender"] == patientGender) {
  89. ///经和测试讨论,如果一个表格只存在默认填充的数据,则不提交
  90. return true;
  91. }
  92. }
  93. return false;
  94. }
  95. Future<bool> createFollowUp(
  96. key, templateCode, data, String prescriptionKey) async {
  97. bool isCalibrationPrescriptions = [
  98. "YZJSZASFFW",
  99. "FollowUpTuberculosisRecord",
  100. "GXY",
  101. "TNB"
  102. ].contains(key);
  103. if (["GXY", "TNB"].contains(key)) {
  104. if (state.followUpTime == null ||
  105. state.nextFollowUpTime == null ||
  106. state.followUpMode == null) {
  107. PromptBox.snackbar("",
  108. messageText: RichText(
  109. text: TextSpan(
  110. children: [
  111. TextSpan(
  112. text: "带",
  113. style: const TextStyle(
  114. color: Colors.black,
  115. fontSize: 30,
  116. fontFamily: "NotoSansSC",
  117. fontFamilyFallback: const ["NotoSansSC"],
  118. ),
  119. ),
  120. TextSpan(
  121. text: " * ",
  122. style: const TextStyle(color: Colors.red, fontSize: 35),
  123. ),
  124. TextSpan(
  125. text: "为必填项,不能为空",
  126. style: const TextStyle(
  127. color: Colors.black,
  128. fontSize: 30,
  129. fontFamily: "NotoSansSC",
  130. fontFamilyFallback: const ["NotoSansSC"],
  131. ),
  132. ),
  133. ],
  134. ),
  135. ));
  136. return false;
  137. }
  138. }
  139. ///校验随访和处方数据
  140. if (data.length < 7) {
  141. if (!isCalibrationPrescriptions ||
  142. (await _checkPrecription(FormInfo.instance.formValue))) {
  143. PromptBox.toast('不能提交空数据');
  144. return false;
  145. }
  146. }
  147. /// 校验本次随访时间不能晚于下次随访时间
  148. if (state.followUpTime != null &&
  149. state.nextFollowUpTime != null &&
  150. state.followUpTime!.isAfter(state.nextFollowUpTime!)) {
  151. PromptBox.toast('本次随访时间不能晚于下次随访时间');
  152. return false;
  153. }
  154. List<String> followUpPhotos = [];
  155. if (state.followUpPhoto?.isNotEmpty ?? false) {
  156. followUpPhotos = [state.followUpPhoto!];
  157. }
  158. var request = CreateFollowUpRequest(
  159. key: key,
  160. patientCode: patientCode,
  161. templateCode: templateCode,
  162. followUpData: data,
  163. followUpTime: state.followUpTime,
  164. nextFollowUpTime: state.nextFollowUpTime,
  165. followUpMode: state.followUpMode ?? FollowUpModeEnum.Outpatient,
  166. followUpPhotos: followUpPhotos,
  167. );
  168. print(jsonEncode(request.toJson()));
  169. final result = await _followUpManager.createFollowUp(request);
  170. recordCode = result;
  171. if (result.isNotEmpty && prescriptionKey.isNotEmpty) {
  172. await createPrescription(result, prescriptionKey);
  173. PromptBox.toast('保存成功');
  174. }
  175. return true;
  176. }
  177. Future<String> createFollowUpOnly(
  178. String key, String templateCode, String data) async {
  179. List<String> followUpPhotos = [];
  180. if (state.followUpPhoto?.isNotEmpty ?? false) {
  181. followUpPhotos = [state.followUpPhoto!];
  182. }
  183. var request = CreateFollowUpRequest(
  184. key: key,
  185. patientCode: patientCode,
  186. templateCode: templateCode,
  187. followUpData: data,
  188. followUpTime: state.followUpTime,
  189. nextFollowUpTime: state.nextFollowUpTime,
  190. followUpMode: state.followUpMode ?? FollowUpModeEnum.Outpatient,
  191. followUpPhotos: followUpPhotos,
  192. );
  193. print(jsonEncode(request.toJson()));
  194. final result = await _followUpManager.createFollowUp(request);
  195. return result;
  196. }
  197. Future<String?> createPrescription(
  198. String followUpCode, String prescriptionKey) async {
  199. if (FormInfo.instance.formValue.isEmpty) {
  200. return null;
  201. }
  202. /// 创建处方
  203. String? prescriptionCode = await _prescriptionManager.createPrescription(
  204. patientCode: patientCode,
  205. followUpCode: followUpCode,
  206. prescriptionKey: prescriptionKey,
  207. prescriptionData: jsonEncode(FormInfo.instance.formValue),
  208. );
  209. FormInfo.instance.formValue.clear();
  210. return prescriptionCode;
  211. }
  212. @override
  213. void onReady() {
  214. super.onReady();
  215. _initData();
  216. }
  217. // @override
  218. // void onClose() {
  219. // super.onClose();
  220. // }
  221. }