view.dart 8.1 KB

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