view.dart 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. import 'package:fis_jsonrpc/rpc.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/consts/styles.dart';
  7. import 'package:vitalapp/pages/check/health_check_record/controller.dart';
  8. import 'package:vitalapp/pages/patient/list/widgets/status.dart';
  9. import 'package:vitalapp/pages/widgets/record_common_item.dart';
  10. class HealthCheckRecordPage extends GetView<HealthCheckRecordController> {
  11. const HealthCheckRecordPage({Key? key}) : super(key: key);
  12. @override
  13. Widget build(BuildContext context) {
  14. return GetBuilder(
  15. init: HealthCheckRecordController(),
  16. id: "HealCheckRecord",
  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. Widget _buildDiagram() {
  39. return Expanded(
  40. flex: 1,
  41. child: Padding(
  42. padding: const EdgeInsets.all(16.0).copyWith(right: 0),
  43. child: Container(
  44. // color: Colors.white,
  45. padding: const EdgeInsets.all(16),
  46. decoration: BoxDecoration(
  47. color: Colors.white,
  48. border: Border.all(
  49. color: Colors.white,
  50. ),
  51. borderRadius: GlobalStyles.borderRadius,
  52. ),
  53. child: Image.asset(
  54. 'assets/images/exam/normalMeasurementChart.png',
  55. height: double.infinity,
  56. fit: BoxFit.fitWidth,
  57. ),
  58. ),
  59. ),
  60. );
  61. }
  62. Widget _buildListView() {
  63. return Expanded(
  64. flex: 2,
  65. child: Padding(
  66. padding: const EdgeInsets.all(16),
  67. child: RefreshIndicator(
  68. child: Obx(
  69. () {
  70. final list = controller.state.examRecordDTOList;
  71. final children = <Widget>[];
  72. for (var examRecordDTO in list) {
  73. var index = list.indexOf(examRecordDTO);
  74. children.add(_ExamRecordCard(
  75. dto: examRecordDTO,
  76. dataDto: examRecordDTO.examRecordDatas,
  77. index: index,
  78. ));
  79. }
  80. return list.isEmpty
  81. ? Container(
  82. margin: const EdgeInsets.only(top: 80),
  83. child: Column(
  84. children: [
  85. Center(
  86. child: Image.asset(
  87. "assets/images/no_data.png",
  88. width: 300,
  89. height: 300,
  90. fit: BoxFit.cover,
  91. ),
  92. ),
  93. const Text(
  94. "暂无数据,先看看别的吧",
  95. style: TextStyle(fontSize: 18),
  96. ),
  97. ],
  98. ),
  99. )
  100. : GridView(
  101. gridDelegate:
  102. const SliverGridDelegateWithFixedCrossAxisCount(
  103. crossAxisCount: 1,
  104. mainAxisSpacing: 16,
  105. crossAxisSpacing: 20,
  106. childAspectRatio: 900 / 180,
  107. ),
  108. children: children,
  109. );
  110. },
  111. ),
  112. onRefresh: () async {}),
  113. ));
  114. }
  115. }
  116. class _ExamRecordCard extends StatelessWidget {
  117. final ExamRecordDTO dto;
  118. final List<ExamRecordDataDTO>? dataDto;
  119. final int index;
  120. _ExamRecordCard({
  121. required this.dto,
  122. this.dataDto,
  123. required this.index,
  124. });
  125. final controller = Get.find<HealthCheckRecordController>();
  126. @override
  127. Widget build(BuildContext context) {
  128. final body = Stack(
  129. children: [
  130. Row(
  131. children: [
  132. Expanded(
  133. flex: 10,
  134. child: Container(
  135. padding: const EdgeInsets.symmetric(
  136. horizontal: 30,
  137. vertical: 12,
  138. ),
  139. child: Column(
  140. crossAxisAlignment: CrossAxisAlignment.start,
  141. children: [
  142. const SizedBox(
  143. height: 8,
  144. ),
  145. const SizedBox(
  146. height: 20,
  147. ),
  148. Wrap(
  149. alignment: WrapAlignment.start,
  150. spacing: 20,
  151. runSpacing: 8,
  152. children: [
  153. SizedBox(
  154. width: 200,
  155. child: RecordCommonItem(
  156. itemName: '姓名',
  157. itemValue: dto.patientName ?? "",
  158. fontSize: 18,
  159. ),
  160. ),
  161. const SizedBox(
  162. width: 20,
  163. ),
  164. RecordCommonItem(
  165. itemName: '签约医生',
  166. itemValue: dto.contractedDoctor ?? "",
  167. fontSize: 18,
  168. ),
  169. ],
  170. ),
  171. const SizedBox(
  172. height: 20,
  173. ),
  174. Wrap(
  175. children: [
  176. RecordCommonItem(
  177. itemName: '开始体检日期',
  178. itemValue: DateFormat("yyyy-MM-dd")
  179. .format(dto.examTime!.toLocal()),
  180. fontSize: 18,
  181. ),
  182. ],
  183. )
  184. ],
  185. ),
  186. ),
  187. ),
  188. Expanded(
  189. child: Icon(
  190. Icons.keyboard_arrow_right,
  191. size: 64,
  192. color: Colors.grey.shade400,
  193. ),
  194. )
  195. ],
  196. ),
  197. Positioned(
  198. top: 16,
  199. right: 0,
  200. child: _CheckRecordSignStatusTag(
  201. dto: dto,
  202. ),
  203. ),
  204. Positioned(
  205. bottom: 16,
  206. right: 12,
  207. child: IconButton(
  208. icon: Icon(
  209. Icons.edit,
  210. size: 26,
  211. color: Theme.of(context).primaryColor,
  212. ),
  213. onPressed: () {
  214. controller.toCheckPage(dto, dataDto, index); //跳转到体检
  215. },
  216. ),
  217. ),
  218. ],
  219. );
  220. return Material(
  221. borderRadius: GlobalStyles.borderRadius,
  222. child: Ink(
  223. decoration: BoxDecoration(
  224. color: Colors.white,
  225. borderRadius: GlobalStyles.borderRadius,
  226. ),
  227. child: InkWell(
  228. borderRadius: GlobalStyles.borderRadius,
  229. onTap: () {
  230. /// TODO 编辑
  231. controller.toExamDetailPage(index, dto); //跳转到检查页面
  232. },
  233. child: body,
  234. ),
  235. ),
  236. );
  237. }
  238. }
  239. // ignore: camel_case_types
  240. class _CheckRecordSignStatusTag extends StatelessWidget {
  241. final ExamRecordDTO dto;
  242. _CheckRecordSignStatusTag({required this.dto});
  243. final healthCheckRecordController = Get.find<HealthCheckRecordController>();
  244. @override
  245. Widget build(BuildContext context) {
  246. return Container(
  247. alignment: Alignment.centerRight,
  248. width: 120,
  249. child: StatusLabel(
  250. title: healthCheckRecordController.examStateTransition(dto.examState),
  251. color: healthCheckRecordController.examStateColors(dto.examState),
  252. ),
  253. );
  254. }
  255. }