controller.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. import 'dart:convert';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter/services.dart';
  6. import 'package:flutter_inappwebview/flutter_inappwebview.dart';
  7. import 'package:get/get.dart';
  8. import 'package:intl/intl.dart';
  9. import 'package:vitalapp/architecture/defines.dart';
  10. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  11. import 'package:vitalapp/database/db.dart';
  12. import 'package:vitalapp/managers/interfaces/follow_up.dart';
  13. import 'package:vitalapp/pages/check/follow_up/controller.dart';
  14. import 'package:vitalapp/pages/check/follow_up/widgets/follow_up_from.dart';
  15. import 'package:vitalapp/pages/check/follow_up_record/state.dart';
  16. import 'package:vitalapp/pages/check/widgets/configurable_card.dart';
  17. import 'package:vitalapp/pages/medical/controller.dart';
  18. import 'package:vitalapp/store/store.dart';
  19. class FollowUpRecordController extends FControllerBase {
  20. FollowUpRecordController({
  21. required this.followUpType,
  22. });
  23. final String followUpType;
  24. final state = FollowUpRecordState();
  25. final _followUpManager = Get.find<IFollowUpManager>();
  26. final followUpController = Get.put(FollowUpController());
  27. late String patientCode;
  28. late String patientName;
  29. late FollowUpController _followUpController;
  30. List<List> offlineSyncTemp = [];
  31. @override
  32. void onReady() {
  33. super.onReady();
  34. _initData();
  35. }
  36. _initData() {
  37. update(["contract_records"]);
  38. patientCode = Store.user.currentSelectPatientInfo?.code ?? '';
  39. patientName = Store.user.currentSelectPatientInfo?.patientName ?? '';
  40. getFollowUpRecordList();
  41. _followUpController = Get.put(FollowUpController());
  42. }
  43. Future<void> getFollowUpRecordList() async {
  44. try {
  45. var result = await _followUpManager.getFollowUpRecordList(
  46. [followUpType],
  47. patientCode,
  48. );
  49. if (result != null) {
  50. await _loadUnsyncIndexs(result); // TODO temp
  51. state.followUpDTOList = result;
  52. }
  53. } catch (e) {
  54. return;
  55. }
  56. }
  57. Future<void> _loadUnsyncIndexs(List<FollowUpRecordDTO> dtos) async {
  58. offlineSyncTemp = [];
  59. /// web 端没有本地数据库
  60. if (!kIsWeb) {
  61. // TODO 临时打个补丁,后续再优化
  62. final entities = await db.repositories.followUp
  63. .queryAllListByPatient(patientCode, Store.user.userCode!);
  64. for (var i = 0; i < dtos.length; i++) {
  65. offlineSyncTemp.add([]);
  66. final records = dtos[i].followUpRecordDatas;
  67. if (records == null) {
  68. continue;
  69. }
  70. for (var j = 0; j < records.length; j++) {
  71. final data = records[j];
  72. final entity = entities.firstWhereOrNull((e) => e.code == data.code);
  73. if (entity != null) {
  74. offlineSyncTemp[i].add(entity.syncState);
  75. } else {
  76. offlineSyncTemp[i].add(null);
  77. }
  78. }
  79. }
  80. } else {
  81. for (var i = 0; i < dtos.length; i++) {
  82. offlineSyncTemp.add([]);
  83. final records = dtos[i].followUpRecordDatas;
  84. if (records == null) {
  85. continue;
  86. }
  87. for (var j = 0; j < records.length; j++) {
  88. final data = records[j];
  89. offlineSyncTemp[i].add(data);
  90. }
  91. }
  92. }
  93. }
  94. Future<void> updateFollowUp(key, code, data) async {
  95. List<String> followUpPhotos = [];
  96. if (_followUpController.state.followUpPhoto?.isNotEmpty ?? false) {
  97. followUpPhotos = [_followUpController.state.followUpPhoto!];
  98. }
  99. final result = await _followUpManager.updateFollowUp(
  100. UpdateFollowUpRequest(
  101. key: key,
  102. followUpData: data,
  103. followUpTime: _followUpController.state.followUpTime,
  104. nextFollowUpTime: _followUpController.state.nextFollowUpTime,
  105. followUpMode: _followUpController.state.followUpMode ??
  106. FollowUpModeEnum.Outpatient,
  107. code: code,
  108. followUpPhotos: followUpPhotos,
  109. ),
  110. );
  111. if (result ?? false) {
  112. PromptBox.toast('保存成功');
  113. } else {
  114. PromptBox.toast('保存失败');
  115. }
  116. }
  117. ///读取静态Html
  118. Future<String> loadingLocalAsset(String key) async {
  119. String tableName = "";
  120. if (key == 'GXY') {
  121. tableName = 'assets/docs/highBloodPressureTable.html';
  122. } else if (key == 'TNB') {
  123. tableName = 'assets/docs/diabetesTable.html';
  124. }
  125. ///加载
  126. String htmlData = await rootBundle.loadString(tableName);
  127. print("加载数据完成 $htmlData");
  128. return htmlData;
  129. }
  130. Future<List> getFollowUpTableData(FollowUpRecordDTO dto, int index) async {
  131. var currentFollowUp = dto.followUpRecordDatas?[index];
  132. var followUpTableData = await _followUpManager
  133. .getFollowUpRecordListByYearAsync(GetFollowUpRecordListByYearRequest(
  134. year: (currentFollowUp?.followUpTime?.year ?? DateTime.now().year)
  135. .toString(),
  136. keys: [currentFollowUp?.key ?? ''],
  137. patientCode: patientCode,
  138. ));
  139. List tableData = [];
  140. followUpTableData?.first.followUpRecordDatas?.forEach((element) {
  141. Map followUp = {
  142. "Follow_Time": element.followUpTime != null
  143. ? DateFormat("yyyy-MM-dd").format(element.followUpTime!.toLocal())
  144. : "",
  145. "Follow_Type": '${(element.followUpMode?.index ?? 0) + 1} ',
  146. "Next_Follow_Up_Time": element.nextFollowUpTime != null
  147. ? DateFormat("yyyy-MM-dd")
  148. .format(element.nextFollowUpTime!.toLocal())
  149. : "",
  150. };
  151. followUp.addAll(jsonDecode(element.followUpData ?? ''));
  152. tableData.add(followUp);
  153. });
  154. return tableData;
  155. }
  156. Future<String> loadLocalAsset(String key) async {
  157. String tableName = "";
  158. if (key == 'GXY') {
  159. tableName = 'assets/docs/highBloodPressureTable.html';
  160. } else if (key == 'TNB') {
  161. tableName = 'assets/docs/diabetesTable.html';
  162. }
  163. ///加载
  164. String htmlData = await rootBundle.loadString(tableName);
  165. print("加载数据完成 $htmlData");
  166. return htmlData;
  167. }
  168. Future<void> showDialogBox(String initialData, String jsonData) async {
  169. Get.dialog(Column(
  170. children: [
  171. Container(
  172. width: 900,
  173. alignment: Alignment.centerRight,
  174. padding: const EdgeInsets.only(right: 20, top: 10),
  175. color: Colors.white,
  176. child: IconButton(
  177. onPressed: () {
  178. Get.back();
  179. },
  180. icon: const Icon(
  181. Icons.close,
  182. ),
  183. ),
  184. ),
  185. Expanded(
  186. child: SizedBox(
  187. width: 900,
  188. child: InAppWebView(
  189. initialData: InAppWebViewInitialData(
  190. data: '<body style="padding:30px 100px;">$initialData </body>',
  191. mimeType: 'text/html',
  192. encoding: 'utf-8',
  193. ),
  194. onWebViewCreated: (controller) {
  195. controller.evaluateJavascript(
  196. source: "window.tableData = $jsonData;");
  197. },
  198. onConsoleMessage: (controller, consoleMessage) {
  199. // print(consoleMessage);
  200. },
  201. ),
  202. ),
  203. ),
  204. ],
  205. ));
  206. }
  207. Future<void> toFollowUpDetailPage(int index, FollowUpRecordDTO dto) async {
  208. var tableData = await getFollowUpTableData(dto, index);
  209. var initialData =
  210. await loadLocalAsset(dto.followUpRecordDatas?[index].key ?? '');
  211. var jsonData = jsonEncode(tableData);
  212. showDialogBox(initialData, jsonData);
  213. }
  214. toCheckPage(FollowUpRecordDataDTO dataDTO) async {
  215. await Get.put(MedicalController());
  216. _followUpController.state.followUpTime = dataDTO.followUpTime;
  217. _followUpController.state.nextFollowUpTime = dataDTO.nextFollowUpTime;
  218. _followUpController.state.followUpMode = dataDTO.followUpMode;
  219. await Get.to(
  220. ConfigurableCard(
  221. cardKey: dataDTO.key!,
  222. examData: dataDTO.followUpData,
  223. followUpWidget: FollowUpFrom(
  224. cardKey: dataDTO.key!,
  225. ),
  226. patientCode: patientCode,
  227. callBack: (key, code, data) async {
  228. await updateFollowUp(key, dataDTO.code, data);
  229. await getFollowUpRecordList();
  230. return true;
  231. },
  232. ),
  233. transition: Transition.rightToLeft,
  234. );
  235. await Get.find<MedicalController>().initRecordDataState();
  236. await Get.delete<MedicalController>();
  237. }
  238. final Map<String, String> followUpKeyValue = {
  239. 'FJHSFFW': "肺结核随访服务",
  240. 'FJHRHSF': "肺结核入户随访",
  241. 'GXB': "冠心病",
  242. 'NCZ': "脑卒中",
  243. 'YZJSZASFFW': "严重精神障碍随访服务",
  244. 'YZJSZAGRXXBC': "严重精神障碍个人信息补充",
  245. 'TNB': "2型糖尿病",
  246. 'GXY': "高血压",
  247. // 'LNRZYYJKGLFWJL': "老年人中医药健康管理服务记录表",
  248. 'LNRSHZLNLPGB': "老年人生活自理能力评估表",
  249. 'YCF_CH42TJKJCLB': "产后42天健康检查列表",
  250. 'YCF_CHFSLB': "产后访视列表",
  251. 'YCF_2_5CCQSFLB': "2~5次产前随访列表",
  252. 'YCF_DYCCQJCLB': "第一次产前检查列表",
  253. 'YCF_JBXX': "基本信息",
  254. 'ET_ZYYJKGLLB': "儿童中医药健康管理列表",
  255. 'ET_3_6SETJKJCLB': "3~6岁儿童健康检查列表",
  256. 'ET_1_2SETJKJCLB': "1~2岁儿童健康检查列表",
  257. 'ET_1SNETJKJCLB': "1岁内儿童健康检查列表",
  258. 'ET_XSEFSLB': "新生儿访视列表",
  259. };
  260. String getFollowUpValueByKey(String key) {
  261. if (followUpKeyValue[key] != null) {
  262. return followUpKeyValue[key]!;
  263. } else {
  264. return "";
  265. }
  266. }
  267. String followUpStateTransition(FollowUpStateEnum state) {
  268. switch (state) {
  269. case FollowUpStateEnum.NoFollowUp:
  270. return "未随访";
  271. case FollowUpStateEnum.FollowUpVisit:
  272. return "已随访";
  273. case FollowUpStateEnum.Cancelled:
  274. return "已作废";
  275. default:
  276. return "";
  277. }
  278. }
  279. MaterialColor followUpStateColors(FollowUpStateEnum state) {
  280. switch (state) {
  281. case FollowUpStateEnum.NoFollowUp:
  282. return Colors.grey;
  283. case FollowUpStateEnum.Cancelled:
  284. return Colors.red;
  285. case FollowUpStateEnum.FollowUpVisit:
  286. return Colors.green;
  287. default:
  288. return Colors.blue;
  289. }
  290. }
  291. String getFollowUpMode(FollowUpModeEnum? modeEnum) {
  292. switch (modeEnum) {
  293. case FollowUpModeEnum.Outpatient:
  294. return "门诊";
  295. case FollowUpModeEnum.Phone:
  296. return "电话";
  297. case FollowUpModeEnum.Visit:
  298. return "家庭";
  299. default:
  300. return "";
  301. }
  302. }
  303. }