view.dart 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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. final scrollController = ScrollController();
  65. scrollController.addListener(
  66. () {
  67. // 如果滑动到底部
  68. try {
  69. if (scrollController.position.atEdge) {
  70. if (scrollController.position.pixels != 0) {
  71. if (controller.state.hasNextPage) {
  72. controller.loadNextPageList();
  73. }
  74. }
  75. }
  76. } catch (e) {
  77. // logger.e("listViewScrollController exception:", e);
  78. }
  79. },
  80. );
  81. return Expanded(
  82. flex: 2,
  83. child: Padding(
  84. padding: const EdgeInsets.all(16.0),
  85. child: RefreshIndicator(
  86. child: Obx(() {
  87. final children = <Widget>[];
  88. for (var element in controller.state.dataList) {
  89. children.add(_MedicalRecordCard(
  90. dto: element,
  91. ));
  92. }
  93. return controller.state.dataList.isEmpty
  94. ? Container(
  95. margin: const EdgeInsets.only(top: 80),
  96. child: Column(
  97. children: [
  98. Center(
  99. child: Image.asset(
  100. "assets/images/no_data.png",
  101. width: 300,
  102. height: 300,
  103. fit: BoxFit.cover,
  104. ),
  105. ),
  106. const Text(
  107. "暂无数据,先看看别的吧",
  108. style: TextStyle(fontSize: 18),
  109. ),
  110. ],
  111. ),
  112. )
  113. : Scrollbar(
  114. trackVisibility: true,
  115. controller: scrollController,
  116. child: GridView(
  117. shrinkWrap: true,
  118. controller: scrollController,
  119. gridDelegate:
  120. const SliverGridDelegateWithFixedCrossAxisCount(
  121. crossAxisCount: 1,
  122. mainAxisSpacing: 16,
  123. crossAxisSpacing: 20,
  124. childAspectRatio: 1080 / 180,
  125. ),
  126. children: children,
  127. ),
  128. );
  129. }),
  130. onRefresh: () async {}),
  131. ),
  132. );
  133. }
  134. }
  135. class _MedicalRecordCard extends GetView<MedicalRecordsController> {
  136. final DiagnosisAggregationRecord dto;
  137. const _MedicalRecordCard({required this.dto});
  138. @override
  139. Widget build(BuildContext context) {
  140. final body = Stack(
  141. children: [
  142. Row(
  143. children: [
  144. Expanded(
  145. flex: 10,
  146. child: Container(
  147. padding: const EdgeInsets.symmetric(
  148. horizontal: 30,
  149. vertical: 12,
  150. ),
  151. child: Column(
  152. crossAxisAlignment: CrossAxisAlignment.start,
  153. children: [
  154. const SizedBox(
  155. height: 8,
  156. ),
  157. Wrap(
  158. alignment: WrapAlignment.start,
  159. spacing: 20,
  160. runSpacing: 8,
  161. children: [
  162. RecordCommonItem(
  163. itemName: '姓名',
  164. itemValue: dto.patientName ?? '',
  165. fontSize: 18,
  166. ),
  167. ],
  168. ),
  169. const SizedBox(
  170. height: 20,
  171. ),
  172. Wrap(
  173. alignment: WrapAlignment.start,
  174. spacing: 20,
  175. runSpacing: 8,
  176. children: [
  177. SizedBox(
  178. width: 250,
  179. child: RecordCommonItem(
  180. itemName: '检查医生',
  181. itemValue: dto.doctorName ?? '',
  182. fontSize: 18,
  183. ),
  184. ),
  185. RecordCommonItem(
  186. itemName: '诊断时间',
  187. itemValue: DateFormat("yyyy-MM-dd")
  188. .format(dto.diagnosisTime!.toLocal()),
  189. fontSize: 18,
  190. ),
  191. ],
  192. )
  193. ],
  194. ),
  195. ),
  196. ),
  197. Expanded(
  198. flex: 1,
  199. child: Icon(
  200. Icons.keyboard_arrow_right,
  201. size: 64,
  202. color: Colors.grey.shade400,
  203. ))
  204. ],
  205. )
  206. ],
  207. );
  208. return Material(
  209. borderRadius: GlobalStyles.borderRadius,
  210. child: Ink(
  211. decoration: BoxDecoration(
  212. color: Colors.white,
  213. borderRadius: GlobalStyles.borderRadius,
  214. ),
  215. child: InkWell(
  216. borderRadius: GlobalStyles.borderRadius,
  217. onTap: () async {
  218. var result = await controller.getTableData(dto);
  219. await VDialogTable(
  220. title: '数据展示',
  221. columnNames: const ['序号', '检测项目', '检测结果', '单位'],
  222. tableData: result,
  223. diagnosisTime:
  224. DateFormat("yyyy-MM-dd").format(dto.diagnosisTime!.toLocal()),
  225. ).show();
  226. },
  227. child: body,
  228. ),
  229. ),
  230. );
  231. }
  232. }