view.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. import 'package:fis_common/index.dart';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:get/get.dart';
  5. import 'package:intl/intl.dart';
  6. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  7. import 'package:vitalapp/components/appbar.dart';
  8. import 'package:vitalapp/consts/styles.dart';
  9. import 'package:vitalapp/managers/contract/index.dart';
  10. import 'package:vitalapp/pages/patient/list/widgets/status.dart';
  11. import 'package:vitalapp/pages/widgets/record_common_item.dart';
  12. import 'controller.dart';
  13. class ContractRecordsPage extends GetView<ContractRecordsController> {
  14. const ContractRecordsPage({Key? key}) : super(key: key);
  15. @override
  16. Widget build(BuildContext context) {
  17. return GetBuilder(
  18. init: ContractRecordsController(),
  19. id: "ContractRecords",
  20. builder: (_) {
  21. return Scaffold(
  22. backgroundColor: const Color.fromRGBO(238, 238, 238, 1),
  23. appBar: VAppBar(
  24. titleWidget: const Text('签约记录'),
  25. actions: [
  26. IconButton(
  27. onPressed: () {
  28. controller.gotoNewContact();
  29. },
  30. icon: Icon(Icons.add, size: 48),
  31. ),
  32. const SizedBox(width: 8),
  33. ],
  34. ),
  35. body: Stack(
  36. children: [
  37. Row(
  38. mainAxisAlignment: MainAxisAlignment.start,
  39. crossAxisAlignment: CrossAxisAlignment.start,
  40. children: [
  41. _buildDiagram(),
  42. _buildListView(),
  43. ],
  44. )
  45. ],
  46. ),
  47. );
  48. });
  49. }
  50. Widget _buildListView() {
  51. return Expanded(
  52. flex: 2,
  53. child: Padding(
  54. padding: const EdgeInsets.all(16.0),
  55. child: RefreshIndicator(
  56. child: Obx(() {
  57. final list = controller.state.contractRecordDTOList;
  58. final children = <Widget>[];
  59. for (var contractRecordDTO in list) {
  60. children.add(_ContractRecordCard(dto: contractRecordDTO));
  61. }
  62. return list.isEmpty
  63. ? Container(
  64. margin: const EdgeInsets.only(top: 80),
  65. child: Column(
  66. children: [
  67. Center(
  68. child: Image.asset(
  69. "assets/images/no_data.png",
  70. width: 300,
  71. height: 300,
  72. fit: BoxFit.cover,
  73. ),
  74. ),
  75. const Text(
  76. "暂无数据,先看看别的吧",
  77. style: TextStyle(fontSize: 18),
  78. ),
  79. ],
  80. ),
  81. )
  82. : GridView(
  83. shrinkWrap: true,
  84. gridDelegate:
  85. const SliverGridDelegateWithFixedCrossAxisCount(
  86. crossAxisCount: 1,
  87. mainAxisSpacing: 16,
  88. crossAxisSpacing: 20,
  89. childAspectRatio: 900 / 220,
  90. ),
  91. children: children,
  92. );
  93. }),
  94. onRefresh: () async {}),
  95. ),
  96. );
  97. }
  98. Widget _buildDiagram() {
  99. return Expanded(
  100. flex: 1,
  101. child: Padding(
  102. padding: const EdgeInsets.all(16.0).copyWith(right: 0),
  103. child: Container(
  104. // color: Colors.white,
  105. padding: const EdgeInsets.all(16),
  106. decoration: BoxDecoration(
  107. color: Colors.white,
  108. border: Border.all(
  109. color: Colors.white,
  110. ),
  111. borderRadius: GlobalStyles.borderRadius,
  112. ),
  113. child: Image.asset(
  114. 'assets/images/exam/normalMeasurementChart.png',
  115. height: double.infinity,
  116. fit: BoxFit.fitWidth,
  117. ),
  118. ),
  119. ),
  120. );
  121. }
  122. }
  123. // ignore: unused_element
  124. class _ContractRecordCard extends StatelessWidget {
  125. final ContractRecordDTO dto;
  126. _ContractRecordCard({required this.dto});
  127. final controller = Get.find<ContractRecordsController>();
  128. @override
  129. Widget build(BuildContext context) {
  130. final body = Stack(
  131. children: [
  132. Row(
  133. children: [
  134. Expanded(
  135. flex: 10,
  136. child: Container(
  137. padding: const EdgeInsets.symmetric(
  138. horizontal: 30,
  139. vertical: 12,
  140. ),
  141. child: Column(
  142. crossAxisAlignment: CrossAxisAlignment.start,
  143. children: [
  144. const SizedBox(height: 8),
  145. Wrap(
  146. alignment: WrapAlignment.start,
  147. spacing: 20,
  148. runSpacing: 8,
  149. children: [
  150. RecordCommonItem(
  151. itemName: '服务包',
  152. itemValue: controller.getServicePackNames(dto),
  153. fontSize: 20,
  154. ),
  155. ],
  156. ),
  157. const SizedBox(
  158. height: 20,
  159. ),
  160. Wrap(
  161. alignment: WrapAlignment.start,
  162. spacing: 20,
  163. runSpacing: 8,
  164. children: [
  165. SizedBox(
  166. width: 250,
  167. child: RecordCommonItem(
  168. itemName: '姓名',
  169. itemValue: dto.patientName ?? '',
  170. fontSize: 18,
  171. ),
  172. ),
  173. const SizedBox(
  174. width: 20,
  175. ),
  176. RecordCommonItem(
  177. itemName: '协议编号',
  178. itemValue: dto.contractRecordNo ?? '',
  179. fontSize: 18,
  180. ),
  181. ],
  182. ),
  183. const SizedBox(
  184. height: 20,
  185. ),
  186. Wrap(
  187. alignment: WrapAlignment.start,
  188. spacing: 20,
  189. runSpacing: 8,
  190. children: [
  191. SizedBox(
  192. width: 250,
  193. child: RecordCommonItem(
  194. itemName: '签约团队',
  195. itemValue: dto.contractedTeam ?? '',
  196. fontSize: 18),
  197. ),
  198. const SizedBox(
  199. width: 20,
  200. ),
  201. RecordCommonItem(
  202. itemName: '签约时间',
  203. itemValue: DateFormat("yyyy-MM-dd")
  204. .format(dto.contractedTime!.toLocal()),
  205. fontSize: 18),
  206. ],
  207. ),
  208. const SizedBox(
  209. height: 20,
  210. ),
  211. if (dto.contractState == ContractStateEnum.Refused)
  212. Wrap(
  213. alignment: WrapAlignment.start,
  214. spacing: 20,
  215. runSpacing: 8,
  216. children: [
  217. SizedBox(
  218. width: 600,
  219. child: RecordCommonItem(
  220. itemName: '拒签原因',
  221. itemValue: "${dto.reason?.split(":")[1]}",
  222. fontSize: 18),
  223. ),
  224. const SizedBox(
  225. width: 20,
  226. ),
  227. ],
  228. ),
  229. ],
  230. ),
  231. ),
  232. ),
  233. if (dto.contractState != ContractStateEnum.Refused)
  234. Expanded(
  235. flex: 1,
  236. child: Icon(
  237. Icons.keyboard_arrow_right,
  238. size: 64,
  239. color: Colors.grey.shade400,
  240. ),
  241. ),
  242. ],
  243. ),
  244. Positioned(
  245. top: 16,
  246. right: 0,
  247. child: _contractSignStatusTag(
  248. dto: dto,
  249. ),
  250. ),
  251. // Positioned(
  252. // top: 100,
  253. // right: 0,
  254. // child: TextButton(
  255. // onPressed: () {
  256. // controller.removeContractRecordAsync(dto.code ?? '');
  257. // },
  258. // child: const Text('删除')),
  259. // )
  260. ],
  261. );
  262. return Material(
  263. borderRadius: GlobalStyles.borderRadius,
  264. child: Ink(
  265. decoration: BoxDecoration(
  266. color: Colors.white,
  267. borderRadius: GlobalStyles.borderRadius,
  268. ),
  269. child: InkWell(
  270. borderRadius: GlobalStyles.borderRadius,
  271. onTap: () async {
  272. if (dto.contractState == ContractStateEnum.Refused) {
  273. return;
  274. }
  275. var result = await Get.toNamed(
  276. "/contract/contract_record_html",
  277. parameters: {"contractCode": dto.code!},
  278. );
  279. if (result == null) {
  280. controller.getContractRecordPageByPatientCodeAsync();
  281. }
  282. },
  283. child: body,
  284. )),
  285. );
  286. }
  287. }
  288. // ignore: camel_case_types
  289. class _contractSignStatusTag extends StatelessWidget {
  290. final ContractRecordDTO dto;
  291. _contractSignStatusTag({required this.dto});
  292. final ContractUtils _contractUtils = ContractUtils();
  293. @override
  294. Widget build(BuildContext context) {
  295. return Container(
  296. alignment: Alignment.centerRight,
  297. width: 120,
  298. child: StatusLabel(
  299. title: _contractUtils.contractStateTransition(dto.contractState),
  300. color: _contractUtils.contractStateColors(dto.contractState),
  301. ),
  302. );
  303. }
  304. }