controller.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. import 'dart:convert';
  2. import 'package:fis_common/index.dart';
  3. import 'package:fis_common/logger/logger.dart';
  4. import 'package:fis_jsonrpc/rpc.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:flutter/services.dart';
  7. import 'package:get/get.dart';
  8. import 'package:vitalapp/managers/interfaces/follow_up.dart';
  9. import 'package:vitalapp/managers/interfaces/prescription.dart';
  10. import 'package:vitalapp/managers/interfaces/template.dart';
  11. import 'package:vitalapp/pages/check/prescription/pediatric_prescription_collection.dart';
  12. import 'package:vitalapp/pages/form/form_info.dart';
  13. import 'package:vitalapp/store/store.dart';
  14. import 'forms/antenatal_visit.dart';
  15. import 'forms/checkup_42_days.dart';
  16. import 'forms/first_form.dart';
  17. import 'forms/postpartum_follow_up.dart';
  18. import 'state.dart';
  19. class MaternalHealthManagementController extends GetxController {
  20. MaternalHealthManagementController();
  21. //第 1 次产前检查
  22. final String firstFollowUpkey = "MaternalHealthManagement";
  23. //第 2~5 次产前随访
  24. final String prenatalFollowupKey = "PrenatalFollowupServiceRecord";
  25. //产后访视
  26. final String postnatalVisitKey = "PostnatalVisitRecord";
  27. //产后42天随访
  28. final String postpartumHealthCheckup42DaysKey =
  29. "PostpartumHealthCheckup42Days";
  30. final _followUpManager = Get.find<IFollowUpManager>();
  31. final _templateManager = Get.find<ITemplateManager>();
  32. final _prescriptionManager = Get.find<IPrescriptionManager>();
  33. final state = MaternalHealthManagementState();
  34. List<List> offlineSyncTemp = [];
  35. ///是否处于编辑模式
  36. bool isEdit = false;
  37. ///当前选中的记录Code
  38. String recordCode = "";
  39. ///当前使用的模板Code
  40. String templateCode = "";
  41. FollowUpModeEnum followUpMode = FollowUpModeEnum.Outpatient;
  42. Map<String, dynamic> maternalFormValue = FormInfo.instance.formValue;
  43. @override
  44. void onReady() {
  45. super.onReady();
  46. _initData();
  47. }
  48. Future<bool> save(String key, String followUpCode) async {
  49. List<String> followUpPhotos = [];
  50. DateTime followUpTime = DateTime.now();
  51. String? followUpData;
  52. // if (FormInfo.instance.formValue.isEmpty) {
  53. // PromptBox.toast('不能提交空数据');
  54. // return false;
  55. // }
  56. followUpData = jsonEncode(FormInfo.instance.formValue);
  57. if (FormInfo.instance.formValue.containsKey("Form_Date")) {
  58. followUpTime = DateTime.parse(FormInfo.instance.formValue["Form_Date"]);
  59. }
  60. DateTime? nextFollowUpTime;
  61. if (FormInfo.instance.formValue.containsKey("Next_Follow_Up_Date")) {
  62. nextFollowUpTime =
  63. DateTime.parse(FormInfo.instance.formValue["Next_Follow_Up_Date"]);
  64. }
  65. String patientCode = Store.user.currentSelectPatientInfo?.code ?? '';
  66. bool result = false;
  67. if (isEdit) {
  68. result = await _followUpManager.updateFollowUp(
  69. UpdateFollowUpRequest(
  70. key: key,
  71. followUpData: followUpData,
  72. followUpTime: followUpTime,
  73. nextFollowUpTime: nextFollowUpTime,
  74. followUpMode: followUpMode,
  75. followUpPhotos: followUpPhotos,
  76. code: recordCode,
  77. ),
  78. ) ??
  79. false;
  80. } else {
  81. if (followUpCode.isEmpty) {
  82. String createResult = await _followUpManager.createFollowUp(
  83. CreateFollowUpRequest(
  84. key: key,
  85. patientCode: patientCode,
  86. templateCode: templateCode,
  87. followUpData: followUpData,
  88. followUpTime: followUpTime,
  89. nextFollowUpTime: nextFollowUpTime,
  90. followUpMode: followUpMode,
  91. followUpPhotos: followUpPhotos,
  92. ),
  93. );
  94. if (createResult.isNotEmpty) {
  95. recordCode = createResult;
  96. result = true;
  97. }
  98. } else {
  99. result = await _followUpManager.updateFollowUp(
  100. UpdateFollowUpRequest(
  101. key: key,
  102. followUpData: followUpData,
  103. followUpTime: followUpTime,
  104. nextFollowUpTime: nextFollowUpTime,
  105. followUpMode: followUpMode,
  106. followUpPhotos: followUpPhotos,
  107. code: followUpCode,
  108. ),
  109. ) ??
  110. false;
  111. }
  112. }
  113. if (result) {
  114. getFollowUpRecordList();
  115. return true;
  116. }
  117. return false;
  118. }
  119. Future<void> getFollowUpRecordList() async {
  120. try {
  121. var patientCode = Store.user.currentSelectPatientInfo?.code ?? '';
  122. var result = await _followUpManager.getFollowUpRecordList(
  123. [
  124. firstFollowUpkey,
  125. prenatalFollowupKey,
  126. postnatalVisitKey,
  127. postpartumHealthCheckup42DaysKey,
  128. ],
  129. patientCode,
  130. );
  131. List<FollowUpRecordDTO> followUpDTOList = [];
  132. followUpDTOList.addAll(result ?? []);
  133. state.followUpDTOList = followUpDTOList;
  134. } catch (e) {
  135. return;
  136. }
  137. }
  138. String getFollowUpValueByKey(FollowUpRecordDataDTO dto) {
  139. var key = dto.key;
  140. if (key == firstFollowUpkey) {
  141. return "第 1 次产前检查";
  142. } else if (key == prenatalFollowupKey) {
  143. Map datas = jsonDecode(dto.followUpData ?? '');
  144. if (datas.containsKey("times")) {
  145. int times = datas["times"] ?? 2;
  146. return "第 ${times} 次产前随访";
  147. }
  148. return "第 2~5 次产前随访";
  149. } else if (key == postnatalVisitKey) {
  150. return "产后访视";
  151. } else if (key == postpartumHealthCheckup42DaysKey) {
  152. return "产后 42 天健康检查";
  153. }
  154. return "";
  155. }
  156. Future<List<Map<String, dynamic>>> sharePrescription(
  157. FollowUpRecordDataDTO dataDTO,
  158. ) async {
  159. List<Map<String, dynamic>> previewList = [];
  160. List<PrescriptionDTO>? prescriptionList =
  161. await getPrescriptionList(dataDTO.code!);
  162. for (PrescriptionDTO prescription in prescriptionList ?? []) {
  163. if (prescription.previewUrl != null) {
  164. previewList.add({
  165. "previewUrl": prescription.previewUrl ?? "",
  166. "key": prescription.prescriptionTemplateKey,
  167. });
  168. }
  169. }
  170. return previewList;
  171. }
  172. Future<List<PrescriptionDTO>?> getPrescriptionList(
  173. String followUpCode) async {
  174. // 获取处方列表
  175. var patientCode = Store.user.currentSelectPatientInfo?.code ?? '';
  176. List<PrescriptionDTO>? prescriptionList =
  177. await _prescriptionManager.getPrescriptionPage(
  178. patientCode: patientCode,
  179. followUpCode: followUpCode,
  180. );
  181. return prescriptionList;
  182. }
  183. ///跳转至随访页面
  184. void toCheckPage(
  185. FollowUpRecordDataDTO dataDto, {
  186. bool isCreateFromOldDto = false,
  187. }) {
  188. if (dataDto.followUpData.isNullOrEmpty) {
  189. return;
  190. }
  191. if (isCreateFromOldDto) {
  192. isEdit = false;
  193. }
  194. var datas = jsonDecode(dataDto.followUpData ?? '');
  195. if (datas is Map<String, dynamic>) {
  196. FormInfo.instance.formValue = datas;
  197. maternalFormValue = datas;
  198. var key = dataDto.key;
  199. if (key == firstFollowUpkey) {
  200. Get.to(FirstMaternalHealthManagementForm(
  201. onClickPrescribe: (followUpCode) async {
  202. maternalFormValue = FormInfo.instance.formValue;
  203. var result = await Get.to(
  204. PrescriptionCollection(
  205. followUpCode.isEmpty ? recordCode : followUpCode,
  206. isChild: false,
  207. isCreateFromOldDto:
  208. followUpCode.isEmpty ? isCreateFromOldDto : false,
  209. createFollowUpOnly: () async {
  210. await save(key!, followUpCode);
  211. if (recordCode.isNotEmpty) {
  212. isEdit = true;
  213. }
  214. return recordCode;
  215. },
  216. ),
  217. );
  218. FormInfo.instance.formValue = maternalFormValue;
  219. return result;
  220. },
  221. ));
  222. } else if (key == prenatalFollowupKey) {
  223. int times = FormInfo.instance.formValue["times"] ?? 2;
  224. Get.to(AntenatalVisitForm(
  225. times,
  226. onClickPrescribe: (followUpCode) async {
  227. maternalFormValue = FormInfo.instance.formValue;
  228. var result = await Get.to(
  229. PrescriptionCollection(
  230. followUpCode.isEmail ? recordCode : followUpCode,
  231. isChild: false,
  232. isCreateFromOldDto:
  233. followUpCode.isEmail ? isCreateFromOldDto : false,
  234. createFollowUpOnly: () async {
  235. await save(key!, followUpCode);
  236. if (recordCode.isNotEmpty) {
  237. isEdit = true;
  238. }
  239. return recordCode;
  240. },
  241. ),
  242. );
  243. FormInfo.instance.formValue = maternalFormValue;
  244. return result;
  245. },
  246. ));
  247. } else if (key == postnatalVisitKey) {
  248. Get.to(PostpartumFormView(
  249. onClickPrescribe: (followUpCode) async {
  250. maternalFormValue = FormInfo.instance.formValue;
  251. var result = await Get.to(
  252. PrescriptionCollection(
  253. recordCode,
  254. isChild: false,
  255. isCreateFromOldDto: isCreateFromOldDto,
  256. createFollowUpOnly: () async {
  257. await save(key!, followUpCode);
  258. if (recordCode.isNotEmpty) {
  259. isEdit = true;
  260. }
  261. return recordCode;
  262. },
  263. ),
  264. );
  265. FormInfo.instance.formValue = maternalFormValue;
  266. return result;
  267. },
  268. ));
  269. } else if (key == postpartumHealthCheckup42DaysKey) {
  270. Get.to(PostpartumHealthCheckup42DaysForm(
  271. onClickPrescribe: (followUpCode) async {
  272. maternalFormValue = FormInfo.instance.formValue;
  273. var result = await Get.to(
  274. PrescriptionCollection(
  275. recordCode,
  276. isChild: false,
  277. isCreateFromOldDto: isCreateFromOldDto,
  278. createFollowUpOnly: () async {
  279. await save(key!, followUpCode);
  280. if (recordCode.isNotEmpty) {
  281. isEdit = true;
  282. }
  283. return recordCode;
  284. },
  285. ),
  286. );
  287. FormInfo.instance.formValue = maternalFormValue;
  288. return result;
  289. },
  290. ));
  291. }
  292. }
  293. }
  294. Future<String> getTemplate(String key) async {
  295. String templateContent = '';
  296. try {
  297. var templates =
  298. await _templateManager.readTemplateRelation('templateRelation');
  299. if (templates != null) {
  300. var templateRelation = jsonDecode(templates!);
  301. templateCode = templateRelation[key] ?? '';
  302. var template = await _templateManager.readTemplate(templateCode) ?? '';
  303. templateContent =
  304. TemplateDTO.fromJson(jsonDecode(template)).templateContent!;
  305. }
  306. } catch (e) {
  307. logger.e("getTemplate ex:", e);
  308. }
  309. if (templateContent.isEmpty) {
  310. final json = await rootBundle.loadString("assets/templates/$key.json");
  311. if (json.isNotEmpty) {
  312. var content = jsonDecode(json);
  313. templateContent = jsonEncode(content["Content"]);
  314. }
  315. }
  316. return templateContent;
  317. }
  318. void _initData() {
  319. getFollowUpRecordList();
  320. }
  321. }