controller.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import 'dart:convert';
  2. import 'package:fis_jsonrpc/services/exam.m.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/services.dart';
  5. import 'package:flutter_inappwebview/flutter_inappwebview.dart';
  6. import 'package:get/get.dart';
  7. import 'package:vitalapp/architecture/defines.dart';
  8. import 'package:vitalapp/architecture/storage/text_storage.dart';
  9. import 'package:vitalapp/architecture/utils/datetime.dart';
  10. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  11. import 'package:vitalapp/global.dart';
  12. import 'package:vitalapp/managers/interfaces/exam.dart';
  13. import 'package:vitalapp/managers/interfaces/health_check_record.dart';
  14. import 'package:vitalapp/pages/check/health_check_record/components/health_check.dart';
  15. import 'package:vitalapp/pages/check/health_check_record/state.dart';
  16. import 'package:vitalapp/pages/check/models/form.dart';
  17. import 'package:vitalapp/store/store.dart';
  18. class HealthCheckRecordController extends FControllerBase {
  19. HealthCheckRecordController();
  20. final state = HealthCheckRecordState();
  21. final _healthCheckRecordManager = Get.find<IHealthCehckRecordManager>();
  22. final _examManager = Get.find<IExamManager>();
  23. late String patientCode;
  24. List<MenuItem> menuList = [
  25. MenuItem(label: "一般状况", value: 'ZZYBZK'),
  26. MenuItem(label: "辅助检查", value: 'FZJC'),
  27. MenuItem(label: "生活方式", value: 'SHFS'),
  28. MenuItem(label: "脏器及查体", value: 'ZQCT'),
  29. MenuItem(label: "现存主要健康问题", value: 'XCZYWT'),
  30. MenuItem(label: "住院及用药情况", value: 'ZYYYFMYGHYFJZS'),
  31. MenuItem(label: "健康评价及指导", value: 'JKPJJZD'),
  32. ];
  33. @override
  34. void onReady() {
  35. super.onReady();
  36. _initData();
  37. }
  38. _initData() {
  39. update(["contract_records"]);
  40. patientCode = Store.user.currentSelectPatientInfo?.code ?? '';
  41. _getExamRecordList();
  42. }
  43. Future<void> _getExamRecordList() async {
  44. try {
  45. var result =
  46. await _healthCheckRecordManager.getExamRecordList(patientCode);
  47. if (result != null) {
  48. state.examRecordDTOList = result;
  49. }
  50. } catch (e) {
  51. print(e);
  52. return;
  53. }
  54. }
  55. Future<void> updateExamByBatchNumberAsync(key, batchNumber, data) async {
  56. if (!kIsOnline) {
  57. // TODO: 暂不支持离线体检
  58. PromptBox.toast("请检查网络连接");
  59. return;
  60. }
  61. TextStorage template = TextStorage(
  62. fileName: key,
  63. directory: "patient/$patientCode/exam",
  64. );
  65. final result = await _examManager
  66. .updateExamByBatchNumberAsync(UpdateExamByBatchNumberRequest(
  67. key: key,
  68. batchNumber: batchNumber,
  69. examData: data,
  70. patientCode: patientCode,
  71. ));
  72. if (result ?? false) {
  73. try {
  74. template.save(data);
  75. PromptBox.toast('保存成功');
  76. await _getExamRecordList();
  77. } catch (err) {
  78. PromptBox.toast('保存失败');
  79. }
  80. }
  81. }
  82. ///读取静态Html
  83. Future<String> loadingLocalAsset() async {
  84. ///加载
  85. String htmlData = await rootBundle.loadString('assets/docs/examTable.html');
  86. print("加载数据完成 $htmlData");
  87. return htmlData;
  88. }
  89. Future<void> toExamDetailPage(int index, ExamRecordDTO dto) async {
  90. var initialData = await loadingLocalAsset();
  91. var examRecordDatas = state.examRecordDTOList[index].examRecordDatas;
  92. Map<String, dynamic> examData = {};
  93. examRecordDatas?.forEach((element) {
  94. examData.addAll(jsonDecode(element.examData ?? '{}'));
  95. });
  96. // 将数据转换为 JSON 字符串
  97. var jsonData = jsonEncode({
  98. "patientInfo": {
  99. "patientName": dto.patientName,
  100. },
  101. "examData": examData,
  102. "docterName": dto.examDoctor,
  103. "examTime":
  104. DataTimeUtils.formatDateString(dto.examTime ?? DateTime.now()),
  105. });
  106. _openExamDetail(initialData, jsonData);
  107. }
  108. Future<void> toCheckPage(
  109. ExamRecordDTO dto,
  110. List<ExamRecordDataDTO>? dataDTO,
  111. int index,
  112. ) async {
  113. Get.dialog(
  114. HealthCheckDialog(
  115. examRecord: dto,
  116. examRecordDatas: dataDTO,
  117. index: index,
  118. ),
  119. );
  120. }
  121. String getHealthCheckRecordType(String key) {
  122. switch (key) {
  123. case 'ZZYBZK':
  124. return '症状、一般状况';
  125. case 'SHFS':
  126. return '生活方式';
  127. case 'ZQCT':
  128. return '脏器、查体';
  129. case 'FZJC':
  130. return '辅助检查';
  131. case 'XCZYWT':
  132. return '现存主要问题';
  133. case 'ZYYYFMYGHYFJZS':
  134. return '住院、用药、非免疫规划预防接种史';
  135. case 'JKPJJZD':
  136. return '健康评价及指导';
  137. default:
  138. return "";
  139. }
  140. }
  141. String examStateTransition(ExamStateEnum state) {
  142. switch (state) {
  143. case ExamStateEnum.Unchecked:
  144. return "未体检";
  145. case ExamStateEnum.Invalid:
  146. return "已作废";
  147. case ExamStateEnum.Inspected:
  148. return "已体检";
  149. default:
  150. return "";
  151. }
  152. }
  153. MaterialColor examStateColors(ExamStateEnum state) {
  154. switch (state) {
  155. case ExamStateEnum.Unchecked:
  156. return Colors.grey;
  157. case ExamStateEnum.Invalid:
  158. return Colors.red;
  159. case ExamStateEnum.Inspected:
  160. return Colors.green;
  161. default:
  162. return Colors.blue;
  163. }
  164. }
  165. void _openExamDetail(
  166. String initialData,
  167. String jsonData,
  168. ) {
  169. // 将 JSON 字符串作为参数传递给 evaluateJavascript 方法
  170. Get.dialog(Column(
  171. children: [
  172. Container(
  173. width: 900,
  174. alignment: Alignment.centerRight,
  175. padding: const EdgeInsets.only(right: 20, top: 10),
  176. color: Colors.white,
  177. child: IconButton(
  178. onPressed: () {
  179. Get.back();
  180. },
  181. icon: const Icon(
  182. Icons.close,
  183. ),
  184. ),
  185. ),
  186. Expanded(
  187. child: SizedBox(
  188. width: 900,
  189. height: double.maxFinite,
  190. child: InAppWebView(
  191. initialData: InAppWebViewInitialData(
  192. data: '<body style="padding:30px 100px;">$initialData </body>',
  193. mimeType: 'text/html',
  194. encoding: 'utf-8',
  195. ),
  196. onWebViewCreated: (controller) {
  197. controller.evaluateJavascript(
  198. source: "window.globalData = $jsonData;");
  199. },
  200. onConsoleMessage: (controller, consoleMessage) {
  201. // print(consoleMessage);
  202. },
  203. ),
  204. ),
  205. ),
  206. ],
  207. ));
  208. }
  209. }