view.dart 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import 'package:fis_jsonrpc/services/contractRecord.m.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/managers/contract/index.dart';
  7. import 'package:vnoteapp/pages/patient/list/widgets/status.dart';
  8. import 'package:vnoteapp/pages/widgets/record_common_item.dart';
  9. import 'controller.dart';
  10. class ContractRecordsPage extends GetView<ContractRecordsController> {
  11. const ContractRecordsPage({Key? key}) : super(key: key);
  12. @override
  13. Widget build(BuildContext context) {
  14. return GetBuilder(
  15. init: ContractRecordsController(),
  16. id: "ContractRecords",
  17. builder: (_) {
  18. return Scaffold(
  19. backgroundColor: const Color.fromRGBO(238, 238, 238, 1),
  20. appBar: VAppBar(titleWidget: const Text('签约记录')),
  21. body: Stack(
  22. children: [
  23. Row(
  24. mainAxisAlignment: MainAxisAlignment.start,
  25. crossAxisAlignment: CrossAxisAlignment.start,
  26. children: [
  27. _buildDiagram(),
  28. _buildListView(),
  29. ],
  30. )
  31. ],
  32. ),
  33. );
  34. });
  35. }
  36. Widget _buildListView() {
  37. return Expanded(
  38. flex: 2,
  39. child: Padding(
  40. padding: const EdgeInsets.all(16.0),
  41. child: RefreshIndicator(
  42. child: Obx(() {
  43. final list = controller.state.contractRecordDTOList;
  44. final children = <Widget>[];
  45. for (var contractRecordDTO in list) {
  46. children.add(_ContractRecordCard(dto: contractRecordDTO));
  47. }
  48. return list.isEmpty
  49. ? Container(
  50. margin: const EdgeInsets.only(top: 80),
  51. child: Column(
  52. children: [
  53. Center(
  54. child: Image.asset(
  55. "assets/images/no_data.png",
  56. width: 300,
  57. height: 300,
  58. fit: BoxFit.cover,
  59. ),
  60. ),
  61. const Text(
  62. "暂无数据,先看看别的吧",
  63. style: TextStyle(fontSize: 18),
  64. ),
  65. ],
  66. ),
  67. )
  68. : GridView(
  69. shrinkWrap: true,
  70. gridDelegate:
  71. const SliverGridDelegateWithFixedCrossAxisCount(
  72. crossAxisCount: 1,
  73. mainAxisSpacing: 16,
  74. crossAxisSpacing: 20,
  75. childAspectRatio: 900 / 180,
  76. ),
  77. children: children,
  78. );
  79. }),
  80. onRefresh: () async {}),
  81. ),
  82. );
  83. }
  84. Widget _buildDiagram() {
  85. return Expanded(
  86. flex: 1,
  87. child: Padding(
  88. padding: const EdgeInsets.all(16.0).copyWith(right: 0),
  89. child: Container(
  90. // color: Colors.white,
  91. padding: const EdgeInsets.all(16),
  92. decoration: BoxDecoration(
  93. color: Colors.white,
  94. border: Border.all(
  95. color: Colors.white,
  96. ),
  97. borderRadius: BorderRadius.circular(8),
  98. ),
  99. child: Image.asset(
  100. 'assets/images/exam/normalMeasurementChart.png',
  101. height: double.infinity,
  102. fit: BoxFit.fitWidth,
  103. ),
  104. ),
  105. ),
  106. );
  107. }
  108. }
  109. // ignore: unused_element
  110. class _ContractRecordCard extends StatelessWidget {
  111. final ContractRecordDTO dto;
  112. _ContractRecordCard({required this.dto});
  113. final controller = Get.find<ContractRecordsController>();
  114. @override
  115. Widget build(BuildContext context) {
  116. final body = Stack(
  117. children: [
  118. Row(
  119. children: [
  120. Expanded(
  121. flex: 10,
  122. child: Container(
  123. padding: const EdgeInsets.symmetric(
  124. horizontal: 30,
  125. vertical: 12,
  126. ),
  127. child: Column(
  128. crossAxisAlignment: CrossAxisAlignment.start,
  129. children: [
  130. const SizedBox(height: 8),
  131. Wrap(
  132. alignment: WrapAlignment.start,
  133. spacing: 20,
  134. runSpacing: 8,
  135. children: [
  136. RecordCommonItem(
  137. itemName: '服务包',
  138. itemValue: controller.getServicePackNames(dto),
  139. fontSize: 20,
  140. ),
  141. ],
  142. ),
  143. const SizedBox(
  144. height: 20,
  145. ),
  146. Wrap(
  147. alignment: WrapAlignment.start,
  148. spacing: 20,
  149. runSpacing: 8,
  150. children: [
  151. SizedBox(
  152. width: 250,
  153. child: RecordCommonItem(
  154. itemName: '姓名',
  155. itemValue: dto.patientName!,
  156. fontSize: 18,
  157. ),
  158. ),
  159. const SizedBox(
  160. width: 20,
  161. ),
  162. RecordCommonItem(
  163. itemName: '身份证号',
  164. itemValue: dto.cardNo!,
  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.contractedTeam!,
  182. fontSize: 18),
  183. ),
  184. const SizedBox(
  185. width: 20,
  186. ),
  187. RecordCommonItem(
  188. itemName: '签约时间',
  189. itemValue: DateFormat("yyyy-MM-dd")
  190. .format(dto.contractedTime!.toLocal()),
  191. fontSize: 18),
  192. ],
  193. ),
  194. // const SizedBox(
  195. // height: 20,
  196. // ),
  197. // Wrap(
  198. // alignment: WrapAlignment.start,
  199. // spacing: 20,
  200. // runSpacing: 8,
  201. // children: [
  202. // SizedBox(
  203. // width: 250,
  204. // child: _buildItem('签约医生', dto.contractedDoctor!, 18),
  205. // ),
  206. // const SizedBox(
  207. // width: 20,
  208. // ),
  209. // ],
  210. // ),
  211. ],
  212. ),
  213. ),
  214. ),
  215. Expanded(
  216. flex: 1,
  217. child: Icon(
  218. Icons.keyboard_arrow_right,
  219. size: 64,
  220. color: Colors.grey.shade400,
  221. ))
  222. ],
  223. ),
  224. Positioned(
  225. top: 16,
  226. right: 0,
  227. child: _contractSignStatusTag(
  228. dto: dto,
  229. ),
  230. ),
  231. ],
  232. );
  233. return Material(
  234. borderRadius: BorderRadius.circular(8),
  235. child: Ink(
  236. decoration: BoxDecoration(
  237. color: Colors.white,
  238. borderRadius: BorderRadius.circular(8),
  239. ),
  240. child: InkWell(
  241. borderRadius: BorderRadius.circular(8),
  242. onTap: () {
  243. Get.toNamed(
  244. "/contract/contract_record_html",
  245. parameters: {"patientCode": dto.code!},
  246. );
  247. },
  248. child: body,
  249. )),
  250. );
  251. }
  252. }
  253. // ignore: camel_case_types
  254. class _contractSignStatusTag extends StatelessWidget {
  255. final ContractRecordDTO dto;
  256. _contractSignStatusTag({required this.dto});
  257. final ContractUtils _contractUtils = ContractUtils();
  258. @override
  259. Widget build(BuildContext context) {
  260. return Container(
  261. alignment: Alignment.centerRight,
  262. width: 120,
  263. child: StatusLabel(
  264. title: _contractUtils.contractStateTransition(dto.contractState),
  265. color: _contractUtils.contractStateColors(dto.contractState),
  266. ),
  267. );
  268. }
  269. }