form.dart 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import 'package:fis_common/index.dart';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:get/get.dart';
  4. import 'package:uuid/uuid.dart';
  5. import 'package:vitalapp/architecture/storage/text_storage.dart';
  6. import 'package:vitalapp/architecture/utils/datetime.dart';
  7. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  8. import 'package:vitalapp/managers/interfaces/patient.dart';
  9. import 'package:vitalapp/pages/home/controller.dart';
  10. import 'package:vitalapp/pages/medical_checkup_station/registration/controller.dart';
  11. import 'package:vitalapp/pages/medical_checkup_station/registration/state/list.dart';
  12. import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/form/index.dart';
  13. class RegistrationFormController {
  14. late RegistrationController registrationController;
  15. RegistrationFormController(
  16. RegistrationController controller,
  17. ) {
  18. registrationController = controller;
  19. }
  20. final state = ListState();
  21. final _homeController = Get.find<HomeController>();
  22. List<VSelectGenderEnumModel> selectGenderList = [
  23. VSelectGenderEnumModel(code: GenderEnum.Female, name: "女"),
  24. VSelectGenderEnumModel(code: GenderEnum.Male, name: "男"),
  25. VSelectGenderEnumModel(code: GenderEnum.Unknown, name: "未知的性别"),
  26. VSelectGenderEnumModel(code: GenderEnum.Unspecified, name: "未说明的性别"),
  27. ];
  28. /// 创建登记
  29. Future<void> createResident(
  30. PatientDTO? patient, {
  31. required bool isVital,
  32. }) async {
  33. AddRegiterInfoRequest addRegiterInfo = AddRegiterInfoRequest();
  34. addRegiterInfo.adress = patient?.patientAddress;
  35. addRegiterInfo.age = DataTimeUtils.calculateAge(
  36. patient?.birthday ?? DateTime.now(),
  37. );
  38. addRegiterInfo.iDCardNo = patient?.cardNo;
  39. addRegiterInfo.name = patient?.patientName;
  40. addRegiterInfo.phone = patient?.phone;
  41. addRegiterInfo.nationality = patient?.nationality;
  42. addRegiterInfo.permanentResidenceAddress =
  43. patient?.permanentResidenceAddress;
  44. addRegiterInfo.sex =
  45. RegistrationInfoModel.getGenderString(patient?.patientGender);
  46. addRegiterInfo.birthday = patient?.birthday?.toLocal();
  47. addRegiterInfo.code = await saveCachedBatchNumber(patient?.cardNo);
  48. addRegiterInfo.projectType = isVital
  49. ? VitalProjectTypeEnum.VinnoHealth
  50. : VitalProjectTypeEnum.VitalStation;
  51. AddRegiterInfoResult? infoResult =
  52. await registrationController.registrationManager.addRegiterInfoAsync(
  53. request: addRegiterInfo,
  54. );
  55. // 登记失败
  56. if (infoResult == null) {
  57. return;
  58. }
  59. if (infoResult.isNewPatient) {
  60. await Get.find<IPatientManager>()
  61. .switchCurrentPatientByCode(patient!.cardNo!);
  62. Get.toNamed("/patient/info");
  63. } else {
  64. PromptBox.toast('新建成功');
  65. }
  66. }
  67. /// 创建登记
  68. Future<void> createResidentFromRegistrationInfoModel(
  69. RegistrationInfoModel? patient, {
  70. required bool isVital,
  71. }) async {
  72. AddRegiterInfoRequest addRegiterInfo = AddRegiterInfoRequest();
  73. addRegiterInfo.adress = patient?.patientAddress;
  74. addRegiterInfo.age = DataTimeUtils.calculateAge(
  75. patient?.birthday ?? DateTime.now(),
  76. );
  77. addRegiterInfo.iDCardNo = patient?.cardNo;
  78. addRegiterInfo.name = patient?.patientName;
  79. addRegiterInfo.phone = patient?.phone;
  80. addRegiterInfo.nationality = patient?.nationality;
  81. addRegiterInfo.permanentResidenceAddress =
  82. patient?.permanentResidenceAddress;
  83. addRegiterInfo.sex =
  84. RegistrationInfoModel.getGenderString(patient?.patientGender);
  85. addRegiterInfo.birthday = patient?.birthday?.toLocal();
  86. addRegiterInfo.code = await saveCachedBatchNumber(patient?.cardNo);
  87. addRegiterInfo.projectType = isVital
  88. ? VitalProjectTypeEnum.VinnoHealth
  89. : VitalProjectTypeEnum.VitalStation;
  90. AddRegiterInfoResult? infoResult =
  91. await registrationController.registrationManager.addRegiterInfoAsync(
  92. request: addRegiterInfo,
  93. );
  94. // 登记失败
  95. if (infoResult == null) {
  96. return;
  97. }
  98. if (infoResult.isNewPatient) {
  99. await Get.find<IPatientManager>()
  100. .switchCurrentPatientByCode(patient!.cardNo!);
  101. Get.toNamed("/patient/info");
  102. } else {
  103. PromptBox.toast('新建成功');
  104. }
  105. }
  106. Future<String?> saveCachedBatchNumber(String? cardNo) async {
  107. String batchNumber = const Uuid().v4().replaceAll('-', '');
  108. TextStorage cachedRecord = TextStorage(
  109. fileName: 'batchNumber',
  110. directory: "patient/${cardNo}",
  111. );
  112. await cachedRecord.save(batchNumber);
  113. return batchNumber;
  114. }
  115. /// 编辑登记
  116. Future<void> editResident(RegistrationInfoModel? patient) async {
  117. UpdateRegiterInfoRequest editRegiterInfo = UpdateRegiterInfoRequest();
  118. editRegiterInfo.adress = patient?.patientAddress;
  119. editRegiterInfo.age = DataTimeUtils.calculateAge(
  120. patient?.birthday ?? DateTime.now(),
  121. );
  122. editRegiterInfo.birthday = patient?.birthday;
  123. editRegiterInfo.iDCardNo = patient?.cardNo;
  124. editRegiterInfo.name = patient?.patientName;
  125. editRegiterInfo.phone = patient?.phone;
  126. editRegiterInfo.sex =
  127. RegistrationInfoModel.getGenderString(patient?.patientGender);
  128. editRegiterInfo.code = patient?.code;
  129. final result =
  130. await registrationController.registrationManager.updateRegiterInfoAsync(
  131. request: editRegiterInfo,
  132. );
  133. if (result == true) {
  134. await registrationController.listController.getRegisterInfoPage();
  135. }
  136. }
  137. /// 创建登记之前查看有没有预约
  138. Future<HealthExamPersonDTO?> getExamBookingByIDCard(String idCard) async {
  139. return await registrationController.appointmentManager
  140. .getExamBookingByIDCardAsync(
  141. idCardNo: idCard,
  142. );
  143. }
  144. /// 若未预约则需要补充手机号信息
  145. Future<PatientDTO?> fillInIdentityInfo(PatientDTO? patient) async {
  146. RegistrationInfoModel patientInfo = RegistrationInfoModel();
  147. if (patient != null) {
  148. patientInfo = RegistrationInfoModel.fromPatientDTO(patient);
  149. }
  150. // RegistrationInfoModel from PatientDTO
  151. final RegistrationInfoModel? result =
  152. await Get.dialog<RegistrationInfoModel>(
  153. RegistrationFormDialog(patient: patientInfo),
  154. barrierDismissible: false,
  155. );
  156. if (result == null) {
  157. return null;
  158. }
  159. if (patient != null) {
  160. patient.cardNo = result.cardNo;
  161. patient.patientName = result.patientName;
  162. patient.patientGender = result.patientGender ?? GenderEnum.Unknown;
  163. patient.birthday = result.birthday;
  164. patient.phone = result.phone;
  165. patient.patientAddress = result.patientAddress;
  166. }
  167. return patient;
  168. }
  169. /// 提交
  170. Future<void> confirmSubmit({
  171. required PatientDTO patient,
  172. required bool isVital,
  173. }) async {
  174. if (patient.cardNo == null) {
  175. return;
  176. }
  177. /// 判断是否预约过,若未预约则需要更新手机号信息
  178. HealthExamPersonDTO? healthExamPerson = await getExamBookingByIDCard(
  179. patient.cardNo!,
  180. );
  181. if (healthExamPerson != null) {
  182. patient.cardNo = healthExamPerson.identityCard;
  183. patient.patientGender = healthExamPerson.gender == PatientGenderEnum.Male
  184. ? GenderEnum.Male
  185. : GenderEnum.Female;
  186. patient.patientName = healthExamPerson.name;
  187. patient.phone = healthExamPerson.phone;
  188. if (patient.patientAddress.isNotNullOrEmpty) {
  189. patient.patientAddress = patient.patientAddress;
  190. }
  191. } else {
  192. if (patient.phone.isNullOrEmpty) {
  193. ///判断是否录入过居民信息,若录入过则加载录入时的手机号
  194. final patientDto =
  195. await registrationController.getPatientByID(patient.cardNo!);
  196. if (patientDto != null) {
  197. patient.phone = patientDto.phone;
  198. }
  199. ///若未预约也未录入则需要更新手机号
  200. PatientDTO? currentPatient = await fillInIdentityInfo(patient);
  201. if (currentPatient != null) {
  202. patient = currentPatient;
  203. await createResidentInList(
  204. patient: patient,
  205. isVital: isVital,
  206. );
  207. } else {
  208. return;
  209. }
  210. } else {
  211. PatientDTO? currentPatient = await fillInIdentityInfo(patient);
  212. if (currentPatient != null) {
  213. patient = currentPatient;
  214. await createResidentInList(
  215. patient: patient,
  216. isVital: isVital,
  217. );
  218. }
  219. }
  220. }
  221. }
  222. /// 提交数据给server 生成登记列表
  223. Future<void> createResidentInList({
  224. required PatientDTO patient,
  225. required bool isVital,
  226. }) async {
  227. await createResident(
  228. patient,
  229. isVital: isVital,
  230. );
  231. await registrationController.listController.getRegisterInfoPage();
  232. }
  233. /// 提交数据给server 生成登记列表
  234. Future<void> createResidentInListFromRegistrationInfoModel({
  235. required RegistrationInfoModel patient,
  236. required bool isVital,
  237. }) async {
  238. await createResidentFromRegistrationInfoModel(
  239. patient,
  240. isVital: isVital,
  241. );
  242. await registrationController.listController.getRegisterInfoPage();
  243. }
  244. }