view.dart 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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: value.name,
  120. );
  121. }
  122. controller.tableData = await Get.find<IDataConvertManager>().getTableData(
  123. currentExam?.examData ?? '',
  124. );
  125. controller.update(['health_detail']);
  126. // Get.dialog(checkDialog ?? Container());
  127. controller.healthGuidance = null;
  128. if (widget.checkKey == "HEITCMC") {
  129. controller.healthGuidance = _getHealthGuidance(
  130. currentExam?.examData ?? '',
  131. );
  132. }
  133. }
  134. MapEntry<String, dynamic>? _getHealthGuidance(String data) {
  135. MapEntry<String, dynamic>? currentDiagnosis;
  136. var jsonData = json.decode(data);
  137. currentDiagnosis =
  138. MapEntry<String, dynamic>("HealthGuidance", jsonData["HealthGuidance"]);
  139. controller.CurrentConstitution = jsonData["PhysicalConclusion"];
  140. return currentDiagnosis;
  141. }
  142. String _getHealthGuidanceResult(dynamic data) {
  143. String result = "";
  144. if (data != null) {
  145. var jsonData = json.decode(data.toString());
  146. for (var element in jsonData) {
  147. result += (healthGuidanceType[element] ?? '') + " ";
  148. }
  149. }
  150. return result;
  151. }
  152. Map<String, String> typeMap = {
  153. 'Peaceful_Quality': "Ping_Score",
  154. "Yang_Deficiency_Substance": "Yang_Score",
  155. "Idiosyncratic_Quality": "Te_Score",
  156. "Qi_Stagnation_Constitution": "Qiyu_Score",
  157. "Blood_Stasis_Substance": "Xue_Score",
  158. "Damp-heat_constitution": "Shi_Score",
  159. "Phlegm-dampness_constitution": "Tan_Score",
  160. "Yin_Deficiency_Substance": "Yin_Score",
  161. "Qi_Deficiency_Constitution": "Qi_Score",
  162. };
  163. Map<String, dynamic> storeTypeMap = {
  164. "Qi_Score": '气虚质',
  165. "Yang_Score": '阳虚质',
  166. "Yin_Score": '阴虚质',
  167. "Tan_Score": '痰虚质',
  168. "Shi_Score": '湿热质',
  169. "Xue_Score": '血瘀质',
  170. "Qiyu_Score": '气郁质',
  171. "Te_Score": '特禀质',
  172. "Ping_Score": '平和质',
  173. };
  174. Map<int, dynamic> healthGuidanceType = {
  175. 1: '情志调摄',
  176. 2: '饮食调养',
  177. 3: '起居调摄',
  178. 4: '运动保健',
  179. 5: '穴位保健',
  180. 6: '其他',
  181. };
  182. Widget _buildDetail() {
  183. return GetBuilder<HealthCheckListController>(
  184. id: "health_detail",
  185. builder: (_) {
  186. if (controller.tableData == null || controller.tableData?.length == 0)
  187. return VNoDataView();
  188. return Column(
  189. children: [
  190. LastRecordTable(
  191. columnNames: const ['检测项目', '检测结果', '单位'],
  192. tableData: controller.tableData ?? [[]],
  193. checkKey: controller.checkKey,
  194. ),
  195. if (controller.healthGuidance != null)
  196. Column(
  197. crossAxisAlignment: CrossAxisAlignment.start,
  198. children: [
  199. Text(
  200. "体质结果:${storeTypeMap[controller.CurrentConstitution] ?? ''}",
  201. style: TextStyle(fontSize: 20),
  202. ),
  203. if (controller.healthGuidance?.value != null)
  204. Text(
  205. "中医保健指导:${_getHealthGuidanceResult(controller.healthGuidance?.value)}",
  206. style: TextStyle(fontSize: 20),
  207. softWrap: true,
  208. ),
  209. SizedBox(
  210. height: 200,
  211. ),
  212. ],
  213. ),
  214. ],
  215. );
  216. },
  217. );
  218. }
  219. }