view.dart 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // ignore_for_file: must_be_immutable
  2. import 'dart:convert';
  3. import 'package:fis_jsonrpc/rpc.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:get/get.dart';
  6. import 'package:vitalapp/architecture/types/index.dart';
  7. import 'package:vitalapp/components/no_data_view.dart';
  8. import 'package:vitalapp/managers/interfaces/data_convert.dart';
  9. import 'package:vitalapp/managers/interfaces/dictionary.dart';
  10. import 'package:vitalapp/managers/interfaces/models/exce_keys.dart';
  11. import 'package:vitalapp/pages/medical/controller.dart';
  12. import 'package:vitalapp/pages/medical/widgets/health_check/health_check_left/index.dart';
  13. import 'package:vitalapp/pages/medical/widgets/health_check/health_check_list/controller.dart';
  14. import 'package:vitalapp/pages/medical_checkup_station/registration/state/list.dart';
  15. import 'package:vitalapp/pages/patient/detail/widgets/last_record.dart';
  16. class HealthCheck extends StatefulWidget {
  17. HealthCheck({
  18. super.key,
  19. this.checkDialog,
  20. required this.checkKey,
  21. this.isBiochemOrBlood = false,
  22. this.editBiochemOrBlood,
  23. });
  24. final String checkKey;
  25. Widget? checkDialog;
  26. ValueCallback? editBiochemOrBlood;
  27. /// 生化或者血常规
  28. bool? isBiochemOrBlood;
  29. @override
  30. State<HealthCheck> createState() => _HealthCheckState();
  31. }
  32. class _HealthCheckState extends State<HealthCheck> {
  33. final controller = Get.find<HealthCheckListController>();
  34. final medicalController = Get.put(MedicalController());
  35. ResidentModel currentResident = ResidentModel(idNumber: "");
  36. @override
  37. void initState() {
  38. medicalController.onSelectExam.addListener(selectExamEvent);
  39. super.initState();
  40. }
  41. @override
  42. void dispose() {
  43. medicalController.onSelectExam.removeListener(selectExamEvent);
  44. Get.delete<MedicalController>();
  45. super.dispose();
  46. }
  47. void selectExamEvent(sender, e) async {
  48. if (e) {
  49. await _onResponseClick(currentResident, false);
  50. }
  51. }
  52. @override
  53. Widget build(BuildContext context) {
  54. return Row(
  55. children: [
  56. Expanded(
  57. child: HealthCheckLeft(
  58. onRowTap: (value) async {
  59. currentResident = value;
  60. await _onResponseClick(value, false);
  61. },
  62. onCheckTap: (value) async {
  63. /// 这是表格选中
  64. controller.currectSelected =
  65. controller.residentList.indexOf(value);
  66. currentResident = value;
  67. controller.update(["healthCheck_table"]);
  68. await _onResponseClick(value, true);
  69. },
  70. ),
  71. ),
  72. Container(
  73. width: 320,
  74. decoration: BoxDecoration(
  75. border: Border(
  76. left: BorderSide(
  77. color: Colors.grey[300]!,
  78. width: 1,
  79. ),
  80. ),
  81. ),
  82. child: _buildDetail(),
  83. )
  84. ],
  85. );
  86. }
  87. Future<void> _onResponseClick(ResidentModel value, bool isBtn) async {
  88. // medicalController.diagnosisDataValue.clear();
  89. controller.tableData == null;
  90. controller.update(['health_detail']);
  91. if (value.physicalExamNumber?.isEmpty ?? true) {
  92. return;
  93. }
  94. List<ExamDTO>? examList = await controller.registrationManager
  95. .getExamListByPhysicalExamNumberAsync(
  96. physicalExamNumber: value.physicalExamNumber ?? '');
  97. List<String> sourceKeys = [widget.checkKey];
  98. if (widget.checkKey == "HEIBiochemical") {
  99. sourceKeys.addAll(ExcelTemplateKeys.AllBiochemicalKeys);
  100. } else if (widget.checkKey == "HEIBloodRoutine") {
  101. sourceKeys.addAll(ExcelTemplateKeys.AllBloodRoutineKeys);
  102. }
  103. ExamDTO? currentExam = examList
  104. ?.firstWhereOrNull((element) => sourceKeys.contains(element.key));
  105. if (currentExam?.examData != null) {
  106. medicalController.diagnosisDataValue =
  107. jsonDecode(currentExam?.examData ?? '');
  108. } else {
  109. medicalController.diagnosisDataValue = {};
  110. }
  111. /// 生化或者血常规暂时的特殊处理
  112. if ((widget.isBiochemOrBlood ?? false) && currentExam != null && isBtn) {
  113. widget.editBiochemOrBlood!.call(currentExam);
  114. return;
  115. }
  116. if (isBtn) {
  117. Get.dialog(
  118. widget.checkDialog ?? Container(),
  119. arguments: {
  120. "name": value.name,
  121. "examData": currentExam?.examData ?? '',
  122. },
  123. );
  124. }
  125. controller.tableData = await Get.find<IDataConvertManager>().getTableData(
  126. currentExam?.examData ?? '',
  127. );
  128. controller.update(['health_detail']);
  129. // Get.dialog(checkDialog ?? Container());
  130. controller.healthGuidance = null;
  131. if (widget.checkKey == "HEITCMC") {
  132. controller.healthGuidance = _getHealthGuidance(
  133. currentExam?.examData ?? '',
  134. );
  135. }
  136. }
  137. MapEntry<String, dynamic>? _getHealthGuidance(String data) {
  138. MapEntry<String, dynamic>? currentDiagnosis;
  139. var jsonData = json.decode(data);
  140. currentDiagnosis =
  141. MapEntry<String, dynamic>("HealthGuidance", jsonData["HealthGuidance"]);
  142. controller.CurrentConstitution = jsonData["PhysicalConclusion"];
  143. return currentDiagnosis;
  144. }
  145. String _getHealthGuidanceResult(dynamic data) {
  146. String result = "";
  147. if (data != null) {
  148. var jsonData = json.decode(data.toString());
  149. for (var element in jsonData) {
  150. result += (healthGuidanceType[element] ?? '') + " ";
  151. }
  152. }
  153. return result;
  154. }
  155. Map<String, String> typeMap = {
  156. 'Peaceful_Quality': "Ping_Score",
  157. "Yang_Deficiency_Substance": "Yang_Score",
  158. "Idiosyncratic_Quality": "Te_Score",
  159. "Qi_Stagnation_Constitution": "Qiyu_Score",
  160. "Blood_Stasis_Substance": "Xue_Score",
  161. "Damp-heat_constitution": "Shi_Score",
  162. "Phlegm-dampness_constitution": "Tan_Score",
  163. "Yin_Deficiency_Substance": "Yin_Score",
  164. "Qi_Deficiency_Constitution": "Qi_Score",
  165. };
  166. Map<String, dynamic> storeTypeMap = {
  167. "Qi_Score": '气虚质',
  168. "Yang_Score": '阳虚质',
  169. "Yin_Score": '阴虚质',
  170. "Tan_Score": '痰虚质',
  171. "Shi_Score": '湿热质',
  172. "Xue_Score": '血瘀质',
  173. "Qiyu_Score": '气郁质',
  174. "Te_Score": '特禀质',
  175. "Ping_Score": '平和质',
  176. };
  177. Map<int, dynamic> healthGuidanceType = {
  178. 1: '情志调摄',
  179. 2: '饮食调养',
  180. 3: '起居调摄',
  181. 4: '运动保健',
  182. 5: '穴位保健',
  183. 6: '其他',
  184. };
  185. Widget _buildDetail() {
  186. return GetBuilder<HealthCheckListController>(
  187. id: "health_detail",
  188. builder: (_) {
  189. if (controller.tableData == null || controller.tableData?.length == 0)
  190. return VNoDataView();
  191. return Column(
  192. children: [
  193. LastRecordTable(
  194. columnNames: const ['检测项目', '检测结果', '单位'],
  195. tableData: controller.tableData ?? [[]],
  196. checkKey: controller.checkKey,
  197. ),
  198. if (controller.healthGuidance != null)
  199. Column(
  200. crossAxisAlignment: CrossAxisAlignment.start,
  201. children: [
  202. Text(
  203. "体质结果:${storeTypeMap[controller.CurrentConstitution] ?? ''}",
  204. style: TextStyle(fontSize: 20),
  205. ),
  206. if (controller.healthGuidance?.value != null)
  207. Text(
  208. "中医保健指导:${_getHealthGuidanceResult(controller.healthGuidance?.value)}",
  209. style: TextStyle(fontSize: 20),
  210. softWrap: true,
  211. ),
  212. SizedBox(
  213. height: 200,
  214. ),
  215. ],
  216. ),
  217. ],
  218. );
  219. },
  220. );
  221. }
  222. }