new_configurable_card.dart 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. import 'dart:convert';
  2. import 'package:fis_common/event/event_type.dart';
  3. import 'package:fis_jsonrpc/rpc.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:get/get.dart';
  6. import 'package:vitalapp/components/dialog_input.dart';
  7. import 'package:vitalapp/components/dialog_number.dart';
  8. import 'package:vitalapp/components/dynamic_drawer.dart';
  9. import 'package:vitalapp/managers/interfaces/cachedRecord.dart';
  10. import 'package:vitalapp/managers/interfaces/template.dart';
  11. import 'package:vitalapp/pages/check/models/form.dart';
  12. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_blood_pressure.dart';
  13. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_blood_sugar.dart';
  14. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_body_temperature.dart';
  15. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_body_weight.dart';
  16. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_boold_oxygen.dart';
  17. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_check_box.dart';
  18. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_health_guidance_check_box.dart';
  19. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_input.dart';
  20. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_number_input.dart';
  21. import 'dart:math' as math;
  22. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_radio.dart';
  23. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_radio_score.dart';
  24. import 'package:vitalapp/pages/check/widgets/device_controller.dart';
  25. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_table.dart';
  26. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_toxic_substance.dart';
  27. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_urinalys.dart';
  28. import 'package:vitalapp/pages/check/widgets/exam_table/homecare_bed_history_from.dart';
  29. import 'package:vitalapp/pages/check/widgets/exam_table/hospitalization_history_from.dart';
  30. import 'package:vitalapp/pages/check/widgets/exam_table/inoculate_history_from.dart';
  31. import 'package:vitalapp/pages/check/widgets/exam_table/main_medication_status_from.dart';
  32. class NewConfigurableCard extends StatefulWidget {
  33. final String cardKey;
  34. final Future<bool> Function(String, String, dynamic) callBack;
  35. final Widget? followUpWidget;
  36. final String? patientCode;
  37. final String? examData;
  38. final FEventHandler<bool>? onSubmitEvent;
  39. const NewConfigurableCard({
  40. super.key,
  41. required this.cardKey,
  42. required this.callBack,
  43. this.followUpWidget,
  44. this.patientCode,
  45. this.examData,
  46. this.onSubmitEvent,
  47. });
  48. @override
  49. State<NewConfigurableCard> createState() => NewConfigurableFormState();
  50. }
  51. class NewConfigurableFormState extends State<NewConfigurableCard> {
  52. /// 当前最新的模板的键值对
  53. Map<String, dynamic> templateRelation = {};
  54. /// 当前模板数据
  55. List<FormObject> currentTemplate = [];
  56. /// 当前title的下标
  57. // int currentTitleIndex = 0;
  58. Map<String, dynamic> formValue = {};
  59. var scaffoldKey = GlobalKey<ScaffoldState>();
  60. final _templateManager = Get.find<ITemplateManager>();
  61. final _cachedRecordManager = Get.find<ICachedRecordManager>();
  62. final arrowHeight = math.tan(120 / 180) * 19;
  63. List<String> deviceList = ['Temp', 'GLU', 'NIBP', 'SpO2', 'BMI'];
  64. Map<String, dynamic> deviceCached = {};
  65. Map currentTable = {};
  66. List<String> storeTypeList = [
  67. 'Qi_Score',
  68. 'Yang_Score',
  69. 'Yin_Score',
  70. 'Tan_Score',
  71. 'Shi_Score',
  72. 'Xue_Score',
  73. 'Qiyu_Score',
  74. 'Te_Score',
  75. 'Ping_Score'
  76. ];
  77. @override
  78. void initState() {
  79. Get.put(DeviceController());
  80. super.initState();
  81. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  82. if (mounted) {
  83. initTemplate();
  84. }
  85. });
  86. widget.onSubmitEvent?.addListener(submitEvent);
  87. }
  88. @override
  89. void dispose() {
  90. super.dispose();
  91. widget.onSubmitEvent?.removeListener(submitEvent);
  92. }
  93. void submitEvent(sender, e) {
  94. if (e) {
  95. if (formValue.isNotEmpty) {
  96. submit();
  97. }
  98. }
  99. }
  100. Future<void> submit() async {
  101. final result = await widget.callBack(
  102. widget.cardKey,
  103. templateRelation[widget.cardKey]!,
  104. jsonEncode(formValue),
  105. );
  106. // if (result) {
  107. // Get.back();
  108. // }
  109. }
  110. Future<void> initTemplate() async {
  111. Get.find<DeviceController>().busy = true;
  112. await fetchTemplateIndex();
  113. await fetchTemplate(widget.cardKey);
  114. await fetchTemplateData();
  115. Get.find<DeviceController>().busy = false;
  116. }
  117. /// 读取健康检测的缓存
  118. Future<String?> readCachedRecord(String currentDevice) async {
  119. if (widget.patientCode == null) {
  120. return null;
  121. }
  122. String? value = await _cachedRecordManager.readCachedRecord(
  123. currentDevice,
  124. widget.patientCode!,
  125. 'ZLZS',
  126. );
  127. return value;
  128. }
  129. /// 读取体检的缓存
  130. Future<String?> readCachedCheck() async {
  131. if (widget.patientCode == null) {
  132. return null;
  133. }
  134. String? value = await _cachedRecordManager.readCachedRecord(
  135. widget.cardKey,
  136. widget.patientCode!,
  137. 'exam',
  138. );
  139. return value;
  140. }
  141. Future<void> readCached() async {
  142. for (var element in deviceList) {
  143. String? value = await readCachedRecord(element);
  144. if (value?.isNotEmpty ?? false) {
  145. deviceCached.addAll(jsonDecode(value!));
  146. }
  147. }
  148. }
  149. Future<void> fetchTemplateIndex() async {
  150. try {
  151. /// 获取模板的键值对
  152. String? templates;
  153. templates =
  154. await _templateManager.readTemplateRelation('templateRelation');
  155. templateRelation = jsonDecode(templates!);
  156. setState(() {});
  157. } catch (error) {
  158. print('发生错误: $error');
  159. }
  160. }
  161. Future<void> fetchTemplateData() async {
  162. // / 这逻辑需要优化
  163. if (widget.examData?.isNotEmpty ?? false) {
  164. formValue = jsonDecode(widget.examData!);
  165. return;
  166. }
  167. String? value = await readCachedCheck();
  168. await readCached();
  169. if (deviceCached.isNotEmpty) {
  170. formValue = deviceCached;
  171. setState(() {});
  172. return;
  173. }
  174. if (value?.isNotEmpty ?? false) {
  175. formValue = jsonDecode(value!);
  176. }
  177. formValue.forEach(
  178. (key, value) {
  179. if (value is List<String>) {
  180. formValue[key] = List<String>.from(formValue[key]);
  181. } else if (value is List<Map>) {
  182. formValue[key] = List<Map>.from(formValue[key]);
  183. }
  184. },
  185. );
  186. setState(() {});
  187. }
  188. Future<void> fetchTemplate(String key) async {
  189. try {
  190. if (templateRelation[key] == null) {
  191. currentTemplate = [];
  192. setState(() {});
  193. return;
  194. }
  195. var template =
  196. await _templateManager.readTemplate(templateRelation[key]!);
  197. String templateContent =
  198. TemplateDTO.fromJson(jsonDecode(template!)).templateContent!;
  199. List<Map<String, dynamic>> list =
  200. jsonDecode(templateContent).cast<Map<String, dynamic>>();
  201. for (var i in list) {
  202. if (i['children'] != null) {
  203. List<FormObject> currentChildren = [];
  204. for (var j in i['children']) {
  205. currentChildren.add(FormObject.fromJson(j));
  206. }
  207. i['children'] = currentChildren;
  208. }
  209. var item = FormObject.fromJson(i);
  210. currentTemplate.add(item);
  211. }
  212. if (widget.cardKey == 'LNRZYYJKGLFWJL') {
  213. for (var element in storeTypeList) {
  214. formValue[element] =
  215. calculatePhysicalFitnessScore(element, element == 'Ping_Score');
  216. }
  217. }
  218. setState(() {});
  219. } catch (error) {
  220. print('发生错误: $error');
  221. }
  222. }
  223. @override
  224. Widget build(BuildContext context) {
  225. return Scaffold(
  226. key: scaffoldKey,
  227. endDrawer: VDynamicDrawerWrapper(scaffoldKey: scaffoldKey),
  228. resizeToAvoidBottomInset: false,
  229. body: Column(
  230. children: [
  231. // Row(
  232. // children: [
  233. // Container(
  234. // margin: const EdgeInsets.only(top: 8, right: 16),
  235. // width: 130,
  236. // height: 54,
  237. // child: VButton(
  238. // onTap: () async {
  239. // final result = await widget.callBack(
  240. // widget.cardKey,
  241. // templateRelation[widget.cardKey]!,
  242. // jsonEncode(formValue),
  243. // );
  244. // if (result) {
  245. // Get.back();
  246. // }
  247. // },
  248. // child: Row(
  249. // mainAxisAlignment: MainAxisAlignment.center,
  250. // children: const [
  251. // Icon(Icons.save, size: 24),
  252. // SizedBox(
  253. // width: 8,
  254. // ),
  255. // Text("保存", style: TextStyle(fontSize: 20)),
  256. // ],
  257. // ),
  258. // ),
  259. // ),
  260. // ],
  261. // ),
  262. Expanded(
  263. child: Stack(
  264. children: [
  265. Row(
  266. mainAxisAlignment: MainAxisAlignment.start,
  267. crossAxisAlignment: CrossAxisAlignment.start,
  268. children: [
  269. // _buildDiagram(),
  270. _buildContent(),
  271. ],
  272. ),
  273. ],
  274. ),
  275. )
  276. ],
  277. ),
  278. );
  279. }
  280. Widget buildSingleItem(Widget item, int span) {
  281. return FractionallySizedBox(
  282. widthFactor: span == 24 ? 1 : 0.5,
  283. child: item,
  284. );
  285. }
  286. Widget buildWidget(FormObject? currentFormObject) {
  287. Map<String, Widget Function(FormObject)> widgetMap = {
  288. 'checkbox': _buildCheckBox,
  289. 'numberInput': _buildNumberInput,
  290. 'input': _buildInput,
  291. 'radio': _buildRadio,
  292. 'radioScore': _buildRadioScore,
  293. 'bloodPressure': _buildBloodPressure,
  294. 'bodyTemperature': _buildBodyTemperature,
  295. 'weight': _buildBodyWeight,
  296. 'sugar': _buildBodySugar,
  297. 'bloodOxygen': _buildBloodOxygen,
  298. 'healthGuidanceCheckBox': _buildHealthGuidanceCheckBox,
  299. 'medicalHistory': _buildMedicalHistory,
  300. 'homecareBedHistor': _buildHomecareBedHistory,
  301. 'table': _buildMainMedicationHistory,
  302. 'inoculateHistory': _buildInoculateHistory,
  303. 'safetyPrecautions': _buildToxicSubstance,
  304. 'urinalys': _buildUrinalysis,
  305. };
  306. Widget Function(FormObject) builder =
  307. widgetMap[currentFormObject?.type] ?? _buildInput;
  308. return builder(currentFormObject!);
  309. }
  310. Widget flowCardList() {
  311. int itemCount = 0;
  312. List<Widget> _cardList = [];
  313. bool currentTemplateOptionsIsNotEmpty = false;
  314. if (currentTemplate.isNotEmpty) {
  315. for (int i = 0; i < currentTemplate.length; i++) {
  316. itemCount = currentTemplate[i].children?.length ?? 0;
  317. currentTemplateOptionsIsNotEmpty =
  318. currentTemplate[i].options?.isNotEmpty ?? false;
  319. List<Widget> items = List.generate(itemCount, (index) {
  320. FormObject? currentFormObject = currentTemplate[i].children?[index];
  321. int span = currentFormObject?.span ?? 12;
  322. //父结构的options不等于空或null
  323. if (true) {
  324. //子结构的options若是无值则取父类的options值
  325. if (currentTemplateOptionsIsNotEmpty) {
  326. currentFormObject!.options = currentTemplate[i].options;
  327. }
  328. }
  329. return buildSingleItem(buildWidget(currentFormObject), span);
  330. });
  331. _cardList.addAll(items);
  332. }
  333. }
  334. return Scrollbar(
  335. thumbVisibility: true,
  336. child: SingleChildScrollView(
  337. child: Container(
  338. alignment: Alignment.topCenter,
  339. padding: const EdgeInsets.all(15),
  340. child: Wrap(
  341. runSpacing: 20, // 纵向元素间距
  342. alignment: WrapAlignment.start,
  343. children: _cardList,
  344. ),
  345. ),
  346. ),
  347. );
  348. }
  349. /// 主页面
  350. Widget _buildContent() {
  351. return Expanded(
  352. flex: 2,
  353. child: flowCardList(),
  354. );
  355. }
  356. /// 多选框组件
  357. Widget _buildCheckBox(FormObject currentFormObject) {
  358. List<Option> options = currentFormObject.options ?? [];
  359. List<dynamic> currentSelectedCheckBox =
  360. formValue[currentFormObject.key!] ?? [];
  361. dynamic disabledValue = currentFormObject.disabledValue;
  362. void selectCheckBoxChange(Option e) {
  363. if (currentSelectedCheckBox.contains(e.value)) {
  364. currentSelectedCheckBox.remove(e.value);
  365. } else {
  366. if (disabledValue == e.value) {
  367. currentSelectedCheckBox = [disabledValue];
  368. } else {
  369. if (currentSelectedCheckBox.contains(disabledValue)) {
  370. // PromptBox.toast('选项冲突');
  371. } else {
  372. currentSelectedCheckBox.add(e.value ?? '');
  373. }
  374. }
  375. }
  376. formValue[currentFormObject.key!] = currentSelectedCheckBox;
  377. setState(() {});
  378. }
  379. return ExamCheckBox(
  380. options: options,
  381. currentSelectedCheckBox: currentSelectedCheckBox,
  382. currentFormObject: currentFormObject,
  383. selectCheckBoxChange: selectCheckBoxChange,
  384. disbaleOthers: currentSelectedCheckBox.contains(disabledValue),
  385. );
  386. }
  387. ///中医药健康指导多选框组件
  388. Widget _buildHealthGuidanceCheckBox(FormObject currentFormObject) {
  389. List<Option> options = currentFormObject.options ?? [];
  390. List<dynamic> currentSelectedCheckBox =
  391. formValue[currentFormObject.key!] ?? [];
  392. // var templateFromObj = currentTemplate.firstWhere(
  393. // (element) => element.label!.contains());
  394. var currentScoreKey = currentFormObject.groupKeys != null
  395. ? currentFormObject.groupKeys![0]
  396. : '';
  397. int score = formValue[currentScoreKey] ?? 0;
  398. String judgmentResult = getJudgmentResult(currentScoreKey);
  399. void selectCheckBoxChange(Option e) {
  400. if (currentSelectedCheckBox.contains(e.value)) {
  401. currentSelectedCheckBox.remove(e.value);
  402. } else {
  403. currentSelectedCheckBox.add(e.value ?? '');
  404. }
  405. formValue[currentFormObject.key!] = currentSelectedCheckBox;
  406. setState(() {});
  407. }
  408. return ExamHealthGuidanceCheckBox(
  409. options: options,
  410. currentSelectedCheckBox: currentSelectedCheckBox,
  411. currentFormObject: currentFormObject,
  412. selectCheckBoxChange: selectCheckBoxChange,
  413. score: score,
  414. judgmentResult: judgmentResult,
  415. );
  416. }
  417. String getJudgmentResult(String storeKey) {
  418. var score = formValue[storeKey] ?? 0;
  419. if (storeKey == 'Ping_Score') {
  420. if (score >= 17) {
  421. bool is8 = true;
  422. bool is10 = true;
  423. for (var e in storeTypeList) {
  424. if (formValue[e] != null && e != 'Ping_Score') {
  425. var otherScore = formValue[e];
  426. if (otherScore > 8) {
  427. if (is8) {
  428. is8 = false;
  429. }
  430. if (otherScore > 10) {
  431. is10 = false;
  432. }
  433. }
  434. if (!is10) {
  435. break;
  436. }
  437. }
  438. }
  439. if (is8) {
  440. return '是';
  441. } else if (is10) {
  442. return '基本是';
  443. }
  444. }
  445. return '否';
  446. } else {
  447. if (score >= 11) {
  448. return '是';
  449. } else if (9 == score && score == 10) {
  450. return '倾向是';
  451. } else {
  452. return '否';
  453. }
  454. }
  455. }
  456. /// 数字输入框组件
  457. Widget _buildNumberInput(FormObject currentFormObject) {
  458. String currentInputValue = formValue[currentFormObject.key!] ?? '';
  459. if ((formValue['Height']?.isNotEmpty ?? false) &&
  460. (formValue['Weight']?.isNotEmpty ?? false)) {
  461. formValue['Bmi'] = (double.parse(formValue['Weight']) /
  462. ((double.parse(formValue['Height']) / 100) *
  463. (double.parse(formValue['Height']) / 100)))
  464. .toStringAsFixed(2);
  465. }
  466. Future<void> commonInput() async {
  467. String? result = await VDialogNumber(
  468. title: currentFormObject.label,
  469. initialValue: formValue[currentFormObject.key],
  470. ).show();
  471. if (result?.isNotEmpty ?? false) {
  472. formValue[currentFormObject.key!] = result;
  473. currentInputValue = formValue[currentFormObject.key!];
  474. setState(() {});
  475. }
  476. }
  477. void specialInput(String value) {
  478. formValue[currentFormObject.key!] = value;
  479. currentInputValue = formValue[currentFormObject.key!];
  480. setState(() {});
  481. }
  482. return ExamNumberInput(
  483. currentInputValue: currentInputValue,
  484. commonInput: commonInput,
  485. specialInput: specialInput,
  486. currentFormObject: currentFormObject,
  487. );
  488. }
  489. Widget _buildInput(FormObject currentFormObject) {
  490. String currentInputValue = formValue[currentFormObject.key!] ?? '';
  491. Future<void> commonInput() async {
  492. String? result = await VDialogInput(
  493. title: currentFormObject.label,
  494. initialValue: formValue[currentFormObject.key],
  495. ).show();
  496. if (result?.isNotEmpty ?? false) {
  497. formValue[currentFormObject.key!] = result;
  498. currentInputValue = formValue[currentFormObject.key!];
  499. setState(() {});
  500. }
  501. }
  502. return ExamInput(
  503. currentInputValue: currentInputValue,
  504. commonInput: commonInput,
  505. currentFormObject: currentFormObject,
  506. );
  507. }
  508. /// 血压组件
  509. Widget _buildBloodPressure(FormObject currentFormObject) {
  510. Map currentValue = formValue[currentFormObject.key!] ?? {};
  511. print(currentFormObject.key!);
  512. void bloodPressure(Map value) {
  513. currentValue = value;
  514. formValue[currentFormObject.key!] = currentValue;
  515. // setState(() {});
  516. }
  517. return ExamBloodPressure(
  518. currentValue: currentValue,
  519. bloodPressure: bloodPressure,
  520. );
  521. }
  522. Widget _buildUrinalysis(FormObject currentFormObject) {
  523. Map currentValue = formValue[currentFormObject.key!] ?? {};
  524. void urinalysis(Map value) {
  525. currentValue = value;
  526. formValue[currentFormObject.key!] = currentValue;
  527. setState(() {});
  528. }
  529. return ExamUrinalysis(
  530. currentValue: currentValue,
  531. urinalysis: urinalysis,
  532. );
  533. }
  534. /// 单选框组件
  535. Widget _buildRadio(FormObject currentFormObject) {
  536. List<Option> options = currentFormObject.options ?? [];
  537. String currentSelected = formValue[currentFormObject.key!] ?? "";
  538. void selectRaidoChange(Option e) {
  539. currentSelected = e.value ?? '';
  540. formValue[currentFormObject.key!] = currentSelected;
  541. if (widget.cardKey == 'LNRZYYJKGLFWJL') {
  542. var pingScore = [
  543. 'qusition1',
  544. 'qusition2',
  545. 'qusition4',
  546. 'qusition5',
  547. 'qusition13'
  548. ];
  549. var isPingScore = pingScore.contains(currentFormObject.key);
  550. formValue[currentFormObject.groupKeys?[0]] =
  551. calculatePhysicalFitnessScore(
  552. currentFormObject.groupKeys?[0], false);
  553. if (isPingScore) {
  554. formValue['Ping_Score'] =
  555. calculatePhysicalFitnessScore('Ping_Score', isPingScore);
  556. }
  557. }
  558. setState(() {});
  559. }
  560. return ExamRadio(
  561. options: options,
  562. currentFormObject: currentFormObject,
  563. selectRaidoChange: selectRaidoChange,
  564. currentSelected: currentSelected,
  565. );
  566. }
  567. int calculatePhysicalFitnessScore(String currentScoreKey, bool isPingScore) {
  568. int score = 0;
  569. var currentTemplateStoreList = currentTemplate[0].children?.where(
  570. (element) =>
  571. element.groupKeys != null &&
  572. element.groupKeys!.contains(currentScoreKey));
  573. if (!isPingScore) {
  574. for (var element in currentTemplateStoreList!) {
  575. if (formValue[element.key!] != null) {
  576. score += int.parse(formValue[element.key!]!);
  577. }
  578. }
  579. } else {
  580. int index = 0;
  581. for (var element in currentTemplateStoreList!) {
  582. if (index == 0) {
  583. if (formValue[element.key!] != null) {
  584. score += int.parse(formValue[element.key!]!);
  585. }
  586. } else {
  587. score += formValue[element.key!] != null
  588. ? (6 - int.parse(formValue[element.key!]!))
  589. : 0;
  590. }
  591. index++;
  592. }
  593. }
  594. return score;
  595. }
  596. Widget _buildRadioScore(FormObject currentFormObject) {
  597. print(currentFormObject.toJson());
  598. List<Option> options = currentFormObject.options ?? [];
  599. String currentSelected =
  600. formValue[currentFormObject.childrenKey!.first] ?? "";
  601. String currentScore = formValue[currentFormObject.childrenKey!.last] ?? "";
  602. void selectRaidoChange(Option e) {
  603. currentSelected = e.value ?? '';
  604. formValue[currentFormObject.childrenKey!.first] = currentSelected;
  605. setState(() {});
  606. }
  607. void changeScore(String? score) {
  608. currentScore = score ?? '';
  609. formValue[currentFormObject.childrenKey!.last] = currentScore;
  610. setState(() {});
  611. }
  612. return ExamRadioScore(
  613. options: options,
  614. currentFormObject: currentFormObject,
  615. selectRaidoChange: selectRaidoChange,
  616. currentSelected: currentSelected,
  617. changeScore: changeScore,
  618. currentScore: currentScore,
  619. );
  620. }
  621. /// 体温组件
  622. Widget _buildBodyTemperature(FormObject currentFormObject) {
  623. String currentInputValue = formValue[currentFormObject.key!] ?? '';
  624. void bodyTemperatureInput(String value) {
  625. formValue[currentFormObject.key!] = value;
  626. currentInputValue = formValue[currentFormObject.key!];
  627. setState(() {});
  628. }
  629. return ExamBodyTemperature(
  630. currentInputValue: currentInputValue,
  631. bodyTemperatureInput: bodyTemperatureInput,
  632. currentFormObject: currentFormObject,
  633. );
  634. }
  635. Widget _buildToxicSubstance(FormObject currentFormObject) {
  636. List<Option> options = currentFormObject.options ?? [];
  637. String currentValue = formValue[currentFormObject.childrenKey!.first] ?? "";
  638. Map? currentSelectedToxicSubstance =
  639. formValue[currentFormObject.childrenKey!.last];
  640. void selectRaidoChange(Map e) {
  641. currentSelectedToxicSubstance = e;
  642. formValue[currentFormObject.childrenKey!.last] =
  643. currentSelectedToxicSubstance;
  644. setState(() {});
  645. }
  646. void selectValueChange(String e) {
  647. currentValue = e;
  648. formValue[currentFormObject.childrenKey!.first] = currentValue;
  649. setState(() {});
  650. }
  651. return ExamToxicSubstance(
  652. currentFormObject: currentFormObject,
  653. currentSelectedToxicSubstance: currentSelectedToxicSubstance,
  654. currentValue: currentValue,
  655. options: options,
  656. selectRadioChange: selectRaidoChange,
  657. selectValueChange: selectValueChange,
  658. );
  659. }
  660. /// 血氧
  661. Widget _buildBloodOxygen(FormObject currentFormObject) {
  662. Map<String, dynamic> currentValue = formValue;
  663. void bloodOxygenInput(Map<String, dynamic> bloodOxygen) {
  664. formValue['Pulse_Frequency'] = bloodOxygen['Pulse_Frequency'];
  665. formValue['Spo2'] = bloodOxygen['Spo2'];
  666. currentValue = bloodOxygen;
  667. setState(() {});
  668. }
  669. return ExamBloodOxygen(
  670. currentValue: currentValue,
  671. bloodOxygenInput: bloodOxygenInput,
  672. );
  673. }
  674. /// 住院史
  675. Widget _buildMedicalHistory(FormObject currentFormObject) {
  676. List<dynamic> currentValue = formValue[currentFormObject.key!] ?? [];
  677. int currentId = currentValue.length + 1;
  678. void resultChange(Map result) {
  679. currentValue.add(result);
  680. formValue[currentFormObject.key!] = currentValue;
  681. setState(() {});
  682. }
  683. void editResult(EditTableValue result) {
  684. currentValue[result.id! - 1] = result.value;
  685. formValue[currentFormObject.key!] = currentValue;
  686. setState(() {});
  687. }
  688. Future<void> addTableData() async {
  689. Get.dialog(
  690. HospitalizationHistoryForm(
  691. fromResult: (result) => resultChange(result),
  692. currentId: currentId,
  693. ),
  694. );
  695. }
  696. Future<void> editTableData(EditTableValue editTableValue) async {
  697. Get.dialog(
  698. HospitalizationHistoryForm(
  699. fromResult: (result) => editResult(result),
  700. currentId: editTableValue.id!,
  701. admissionJson: editTableValue.value,
  702. ),
  703. );
  704. }
  705. return ExamTable(
  706. tableThList: const ['序号', '入院日期', '出院日期', '原因', '医疗机构名称', '病案号', '操作'],
  707. currentFormObject: currentFormObject,
  708. currentValue: currentValue,
  709. addTableData: addTableData,
  710. editTableData: (value) => editTableData(value),
  711. );
  712. }
  713. /// 家庭病床史
  714. Widget _buildHomecareBedHistory(FormObject currentFormObject) {
  715. List<dynamic> currentValue = formValue[currentFormObject.key!] ?? [];
  716. int currentId = currentValue.length + 1;
  717. void resultChange(Map result) {
  718. for (var i in result.keys) {
  719. if (result[i] == "") {
  720. return;
  721. }
  722. }
  723. currentValue.add(result);
  724. formValue[currentFormObject.key!] = currentValue;
  725. setState(() {});
  726. }
  727. void editResult(EditTableValue result) {
  728. currentValue[result.id! - 1] = result.value;
  729. formValue[currentFormObject.key!] = currentValue;
  730. setState(() {});
  731. }
  732. Future<void> addTableData() async {
  733. Get.dialog(
  734. HomecareBedHistoryFrom(
  735. fromResult: (result) => resultChange(result),
  736. currentId: currentId,
  737. ),
  738. );
  739. }
  740. Future<void> editTableData(EditTableValue editTableValue) async {
  741. Get.dialog(
  742. HomecareBedHistoryFrom(
  743. fromResult: (result) => editResult(result),
  744. currentId: editTableValue.id!,
  745. admissionJson: editTableValue.value,
  746. ),
  747. );
  748. }
  749. return ExamTable(
  750. tableThList: const ['序号', '建床日期', '撤床日期', '原因', '医疗机构名称', '病案号', '操作'],
  751. currentFormObject: currentFormObject,
  752. currentValue: currentValue,
  753. addTableData: addTableData,
  754. editTableData: (value) => editTableData(value),
  755. );
  756. }
  757. Widget _buildMainMedicationHistory(FormObject currentFormObject) {
  758. List<dynamic> currentValue = formValue[currentFormObject.key!] ?? [];
  759. int currentId = currentValue.length + 1;
  760. void resultChange(Map result) {
  761. currentValue.add(result);
  762. formValue[currentFormObject.key!] = currentValue;
  763. setState(() {});
  764. }
  765. void editResult(EditTableValue result) {
  766. currentValue[result.id! - 1] = result.value;
  767. formValue[currentFormObject.key!] = currentValue;
  768. setState(() {});
  769. }
  770. Future<void> addTableData() async {
  771. Get.dialog(
  772. MainMedicationStatusFrom(
  773. fromResult: (result) => resultChange(result),
  774. currentId: currentId,
  775. ),
  776. );
  777. }
  778. Future<void> editTableData(EditTableValue editTableValue) async {
  779. Get.dialog(
  780. MainMedicationStatusFrom(
  781. fromResult: (result) => editResult(result),
  782. currentId: editTableValue.id!,
  783. admissionJson: editTableValue.value,
  784. ),
  785. );
  786. }
  787. return ExamTable(
  788. tableThList: const ['序号', '药物名称', '用法', '用量', '用药时间', '服药依从性', '操作'],
  789. currentFormObject: currentFormObject,
  790. currentValue: currentValue,
  791. addTableData: addTableData,
  792. editTableData: (value) => editTableData(value),
  793. );
  794. }
  795. Widget _buildInoculateHistory(FormObject currentFormObject) {
  796. List<dynamic> currentValue = formValue[currentFormObject.key!] ?? [];
  797. int currentId = currentValue.length + 1;
  798. void resultChange(Map result) {
  799. currentValue.add(result);
  800. formValue[currentFormObject.key!] = currentValue;
  801. setState(() {});
  802. }
  803. void editResult(EditTableValue result) {
  804. currentValue[result.id! - 1] = result.value;
  805. formValue[currentFormObject.key!] = currentValue;
  806. setState(() {});
  807. }
  808. Future<void> addTableData() async {
  809. Get.dialog(
  810. InoculateHistoryFrom(
  811. fromResult: (result) => resultChange(result),
  812. currentId: currentId,
  813. ),
  814. );
  815. }
  816. Future<void> editTableData(EditTableValue editTableValue) async {
  817. Get.dialog(
  818. InoculateHistoryFrom(
  819. fromResult: (result) => editResult(result),
  820. currentId: editTableValue.id!,
  821. admissionJson: editTableValue.value,
  822. ),
  823. );
  824. }
  825. return ExamTable(
  826. tableThList: const ['序号', '疫苗名称', '接种日期', '接种机构', '操作'],
  827. currentFormObject: currentFormObject,
  828. currentValue: currentValue,
  829. addTableData: addTableData,
  830. editTableData: (value) => editTableData(value),
  831. );
  832. }
  833. /// 体重
  834. Widget _buildBodyWeight(FormObject currentFormObject) {
  835. String currentInputValue = formValue[currentFormObject.key!] ?? '';
  836. void bodyWeightInput(String value) {
  837. formValue[currentFormObject.key!] = value;
  838. currentInputValue = formValue[currentFormObject.key!];
  839. setState(() {});
  840. }
  841. return ExamBodyWeight(
  842. currentInputValue: currentInputValue,
  843. bodyWeightInput: bodyWeightInput,
  844. currentFormObject: currentFormObject,
  845. );
  846. }
  847. /// 血糖
  848. Widget _buildBodySugar(FormObject currentFormObject) {
  849. String currentInputValue = formValue[currentFormObject.key!] ?? '';
  850. void bloodSugarInput(String value) {
  851. formValue[currentFormObject.key!] = value;
  852. currentInputValue = formValue[currentFormObject.key!];
  853. setState(() {});
  854. }
  855. return ExamBloodSugar(
  856. currentInputValue: currentInputValue,
  857. bloodSugarInput: bloodSugarInput,
  858. currentFormObject: currentFormObject,
  859. );
  860. }
  861. }