view.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import 'package:fis_jsonrpc/services/diagnosis.m.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'package:intl/intl.dart';
  5. import 'package:vitalapp/components/appbar.dart';
  6. import 'package:vitalapp/components/dialog_table.dart';
  7. import 'package:vitalapp/consts/styles.dart';
  8. import 'package:vitalapp/pages/medical/records/controller.dart';
  9. import 'package:vitalapp/pages/widgets/record_common_item.dart';
  10. class MedicalRecordsPage extends GetView<MedicalRecordsController> {
  11. const MedicalRecordsPage({super.key});
  12. @override
  13. Widget build(BuildContext context) {
  14. return GetBuilder(
  15. init: MedicalRecordsController(),
  16. id: "MedicalRecords",
  17. builder: (_) {
  18. return Scaffold(
  19. backgroundColor: const Color.fromRGBO(238, 238, 238, 1),
  20. appBar: VAppBar(
  21. titleWidget: const Text('健康检测记录'),
  22. ),
  23. body: Stack(
  24. children: [
  25. Row(
  26. mainAxisAlignment: MainAxisAlignment.start,
  27. crossAxisAlignment: CrossAxisAlignment.start,
  28. children: [
  29. _buildDiagram(),
  30. _buildListView(),
  31. ],
  32. )
  33. ],
  34. ),
  35. );
  36. },
  37. );
  38. }
  39. Widget _buildDiagram() {
  40. return Expanded(
  41. flex: 1,
  42. child: Padding(
  43. padding: const EdgeInsets.all(16.0).copyWith(right: 0),
  44. child: Container(
  45. // color: Colors.white,
  46. padding: const EdgeInsets.all(16),
  47. decoration: BoxDecoration(
  48. color: Colors.white,
  49. border: Border.all(
  50. color: Colors.white,
  51. ),
  52. borderRadius: GlobalStyles.borderRadius,
  53. ),
  54. child: Image.asset(
  55. 'assets/images/exam/normalMeasurementChart.png',
  56. height: double.infinity,
  57. fit: BoxFit.fitWidth,
  58. ),
  59. ),
  60. ),
  61. );
  62. }
  63. Widget _buildListView() {
  64. return Expanded(
  65. flex: 2,
  66. child: Padding(
  67. padding: const EdgeInsets.all(16.0),
  68. child: RefreshIndicator(
  69. child: Obx(() {
  70. final children = <Widget>[];
  71. for (var element in controller.state.dtoList) {
  72. children.add(_MedicalRecordCard(
  73. dto: element,
  74. ));
  75. }
  76. return controller.state.dtoList.isEmpty
  77. ? Container(
  78. margin: const EdgeInsets.only(top: 80),
  79. child: Column(
  80. children: [
  81. Center(
  82. child: Image.asset(
  83. "assets/images/no_data.png",
  84. width: 300,
  85. height: 300,
  86. fit: BoxFit.cover,
  87. ),
  88. ),
  89. const Text(
  90. "暂无数据,先看看别的吧",
  91. style: TextStyle(fontSize: 18),
  92. ),
  93. ],
  94. ),
  95. )
  96. : GridView(
  97. shrinkWrap: true,
  98. gridDelegate:
  99. const SliverGridDelegateWithFixedCrossAxisCount(
  100. crossAxisCount: 1,
  101. mainAxisSpacing: 16,
  102. crossAxisSpacing: 20,
  103. childAspectRatio: 1080 / 180,
  104. ),
  105. children: children,
  106. );
  107. }),
  108. onRefresh: () async {}),
  109. ),
  110. );
  111. }
  112. }
  113. class _MedicalRecordCard extends GetView<MedicalRecordsController> {
  114. final DiagnosisAggregationRecord dto;
  115. const _MedicalRecordCard({required this.dto});
  116. @override
  117. Widget build(BuildContext context) {
  118. final body = Stack(
  119. children: [
  120. Row(
  121. children: [
  122. Expanded(
  123. flex: 10,
  124. child: Container(
  125. padding: const EdgeInsets.symmetric(
  126. horizontal: 30,
  127. vertical: 12,
  128. ),
  129. child: Column(
  130. crossAxisAlignment: CrossAxisAlignment.start,
  131. children: [
  132. const SizedBox(
  133. height: 8,
  134. ),
  135. Wrap(
  136. alignment: WrapAlignment.start,
  137. spacing: 20,
  138. runSpacing: 8,
  139. children: [
  140. RecordCommonItem(
  141. itemName: '姓名',
  142. itemValue: dto.patientName ?? '',
  143. fontSize: 18,
  144. ),
  145. ],
  146. ),
  147. const SizedBox(
  148. height: 20,
  149. ),
  150. Wrap(
  151. alignment: WrapAlignment.start,
  152. spacing: 20,
  153. runSpacing: 8,
  154. children: [
  155. SizedBox(
  156. width: 250,
  157. child: RecordCommonItem(
  158. itemName: '检查医生',
  159. itemValue: dto.doctorName ?? '',
  160. fontSize: 18,
  161. ),
  162. ),
  163. RecordCommonItem(
  164. itemName: '诊断时间',
  165. itemValue: DateFormat("yyyy-MM-dd")
  166. .format(dto.diagnosisTime!.toLocal()),
  167. fontSize: 18,
  168. ),
  169. ],
  170. )
  171. ],
  172. ),
  173. ),
  174. ),
  175. Expanded(
  176. flex: 1,
  177. child: Icon(
  178. Icons.keyboard_arrow_right,
  179. size: 64,
  180. color: Colors.grey.shade400,
  181. ))
  182. ],
  183. )
  184. ],
  185. );
  186. return Material(
  187. borderRadius: GlobalStyles.borderRadius,
  188. child: Ink(
  189. decoration: BoxDecoration(
  190. color: Colors.white,
  191. borderRadius: GlobalStyles.borderRadius,
  192. ),
  193. child: InkWell(
  194. borderRadius: GlobalStyles.borderRadius,
  195. onTap: () async {
  196. var result = await controller.getTableData(dto);
  197. await VDialogTable(
  198. title: '数据展示',
  199. columnNames: const ['序号', '检测项目', '检测结果', '单位'],
  200. tableData: result,
  201. diagnosisTime:
  202. DateFormat("yyyy-MM-dd").format(dto.diagnosisTime!.toLocal()),
  203. ).show();
  204. },
  205. child: body,
  206. ),
  207. ),
  208. );
  209. }
  210. }