controller.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import 'dart:convert';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:get/get.dart';
  4. import 'package:vitalapp/architecture/defines.dart';
  5. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  6. import 'package:vitalapp/architecture/values/features.dart';
  7. import 'package:vitalapp/global.dart';
  8. import 'package:vitalapp/managers/interfaces/patient.dart';
  9. import 'package:vitalapp/managers/interfaces/service_pack.dart';
  10. import 'package:vitalapp/pages/patient/detail/controller.dart';
  11. import 'package:vitalapp/pages/patient_info/controller.dart';
  12. import 'package:vitalapp/pages/patient_info/state.dart';
  13. import 'package:vitalapp/store/store.dart';
  14. import 'state.dart';
  15. import 'widgets/ext_model.dart';
  16. class PatientInfoController extends FControllerBase {
  17. final state = PatientInfoState();
  18. final _patientManager = Get.find<IPatientManager>();
  19. final patientInfomation = Get.find<PatientInfomationController>();
  20. PatientInfomationState get patientInfomationState => patientInfomation.state;
  21. String get cardNo => Store.user.currentSelectPatientInfo?.cardNo ?? '';
  22. @override
  23. void onInit() {
  24. // final p = Get.parameters;
  25. // state.code = p["code"]!;
  26. super.onInit();
  27. }
  28. @override
  29. void onReady() {
  30. super.onReady();
  31. patientInfomationState.code = cardNo;
  32. Get.find<IServicePackManager>().getServicePackList(ServicePackPageRequest(
  33. pageIndex: 1,
  34. pageSize: 20,
  35. ));
  36. _loadData();
  37. }
  38. Future<void> _loadData() async {
  39. final dto = await _patientManager.getDetail(cardNo);
  40. if (dto != null) {
  41. dto.birthday = dto.birthday!.toLocal();
  42. patientInfomationState.updateDto(dto);
  43. }
  44. try {
  45. getPatientExtensionDetailAsync();
  46. } catch (e) {
  47. PromptBox.toast("加载详细信息错误");
  48. }
  49. }
  50. Future<bool> updatePatientAsync() async {
  51. await createPatientExtensionAsync();
  52. var message = await _validateForm();
  53. if (message != null) {
  54. PromptBox.toast(message);
  55. return false;
  56. }
  57. UpdatePatientRequest2 request = UpdatePatientRequest2(
  58. token: Store.user.token,
  59. code: patientInfomationState.code,
  60. patientName: patientInfomationState.name,
  61. phone: patientInfomationState.phoneNo,
  62. emergencyName: patientInfomationState.emergencyName,
  63. emergencyPhone: patientInfomationState.emergencyPhone,
  64. cardNo: patientInfomationState.cardNo,
  65. nationality: patientInfomationState.nation,
  66. birthday: patientInfomationState.birthday,
  67. cardType: patientInfomationState.cardType,
  68. patientGender: patientInfomationState.gender ?? GenderEnum.Unspecified,
  69. patientAddress: patientInfomationState.address,
  70. crowdLabels:
  71. _patientManager.crowdLabelsConvert(patientInfomationState.labels),
  72. permanentResidenceAddress:
  73. patientInfomationState.permanentResidenceAddress,
  74. );
  75. bool result = await _patientManager.updatePatientAsync(request);
  76. if (!result) {
  77. return false;
  78. }
  79. if (Store.user.hasFeature(FeatureKeys.HealthInformation)) {
  80. result = await createPatientExtensionAsync();
  81. }
  82. // TODO: 更新离线状态
  83. if (!kIsOnline) {
  84. // _patientManager.create(request)
  85. }
  86. return result;
  87. }
  88. bool isNumeric(String str) {
  89. if (str.isEmpty) {
  90. return false;
  91. }
  92. return double.tryParse(str) != null;
  93. }
  94. Future<String?> _validateForm() async {
  95. if (patientInfomationState.name.isEmpty) {
  96. return "请填写姓名";
  97. }
  98. if (patientInfomationState.phoneNo.isNotEmpty) {
  99. if (patientInfomationState.phoneNo.length != 11 ||
  100. !isNumeric(patientInfomationState.phoneNo)) {
  101. return "请填写正确的联系电话";
  102. }
  103. }
  104. if (patientInfomationState.emergencyPhone.isNotEmpty) {
  105. if (patientInfomationState.emergencyPhone.length != 11 ||
  106. !isNumeric(patientInfomationState.emergencyPhone)) {
  107. return "请填写正确的联系人电话";
  108. }
  109. }
  110. return null;
  111. }
  112. Future<bool> createPatientExtensionAsync() async {
  113. final jsonMap = <String, dynamic>{};
  114. final detailJsonMap = patientInfomationState.detailInfo.toJson();
  115. final healthJsonMap = patientInfomationState.healthInfo.toJson();
  116. jsonMap.addAll(detailJsonMap);
  117. jsonMap.addAll(healthJsonMap);
  118. jsonMap.removeWhere((key, value) => value == null);
  119. if (!kIsOnline) {
  120. if (state.healthCode.startsWith("mock")) {
  121. state.healthCode = ""; // TODO:update from server
  122. }
  123. }
  124. if (state.healthCode.isNotEmpty) {
  125. var request = UpdatePatientExtensionRequest(
  126. code: state.healthCode,
  127. token: Store.user.token,
  128. patientCode: cardNo,
  129. key: "PatientHealthInfo",
  130. extensionData: jsonEncode(jsonMap),
  131. );
  132. var result = await _patientManager.updatePatientExtensionAsync(request);
  133. if (result) {}
  134. } else {
  135. var request = CreatePatientExtensionRequest(
  136. token: Store.user.token,
  137. patientCode: cardNo,
  138. key: "PatientHealthInfo",
  139. extensionData: jsonEncode(jsonMap),
  140. );
  141. var result = await _patientManager.createPatientExtensionAsync(request);
  142. if (result.isNotEmpty) {
  143. state.healthCode = result;
  144. }
  145. }
  146. ///更新
  147. return true;
  148. }
  149. Future<void> getPatientExtensionDetailAsync() async {
  150. var request = GetPatientExtensionByCodeAndKeyRequest(
  151. token: Store.user.token,
  152. patientCode: cardNo,
  153. key: "PatientHealthInfo",
  154. );
  155. var result = await _patientManager
  156. .getPatientExtensionDetailByCodeAndKeyAsync(request);
  157. if (result != null && result.code != null) {
  158. state.healthCode = result.code!;
  159. String jsonText = result.extensionData ?? "";
  160. if (jsonText.isEmpty) {
  161. jsonText = "{}";
  162. }
  163. var jsonMap = jsonDecode(jsonText);
  164. patientInfomationState.detailInfo =
  165. PatientDetailInfoModel.fromJson(jsonMap);
  166. patientInfomationState.healthInfo =
  167. PatientHealthInfoModel.fromJson(jsonMap);
  168. }
  169. }
  170. Future<void> changePatient() async {
  171. PatientDTO? patientInfoDto = await _patientManager
  172. .getDetail(Store.user.currentSelectPatientInfo!.cardNo!);
  173. if (patientInfoDto != null) {
  174. // 更新最新信息
  175. await _patientManager.switchCurrentPatient(patientInfoDto);
  176. }
  177. patientInfomationState.updateDto(patientInfoDto!);
  178. Get.find<PatientDetailController>().loadData();
  179. }
  180. /// 切换导航锚点
  181. void switchAnchor(NavAnchorType anchor) {
  182. state.anchor = anchor;
  183. }
  184. }