index.dart 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. // ignore_for_file: must_be_immutable
  2. import 'dart:convert';
  3. import 'dart:ui';
  4. import 'package:fis_i18n/i18n.dart';
  5. import 'package:fis_ui/index.dart';
  6. import 'package:flutter/foundation.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter_printer_plus/flutter_printer_plus.dart'
  9. if (dart.library.html) "package:vitalapp/pages/medical_checkup_station/usb_print/web/flutter_printer_plus.dart";
  10. import 'package:get/get.dart';
  11. import 'package:print_image_generate_tool/print_image_generate_tool.dart';
  12. import 'package:vitalapp/pages/medical_checkup_station/registration/controller.dart';
  13. import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/filter/index.dart';
  14. import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/table/index.dart';
  15. import 'package:vitalapp/pages/medical_checkup_station/usb_print/module/printer_info.dart';
  16. class RegistrationList extends GetView<RegistrationController> {
  17. RegistrationList({
  18. super.key,
  19. this.isVital = false,
  20. });
  21. /// 是否是家医一体机
  22. final bool? isVital;
  23. @override
  24. Widget build(BuildContext context) {
  25. Widget table;
  26. if (kIsWeb) {
  27. table = _buildWeb();
  28. } else {
  29. table = PrintImageGenerateWidget(
  30. contentBuilder: (context) {
  31. return _buildWeb();
  32. },
  33. onPictureGenerated: _onPictureGenerated,
  34. );
  35. }
  36. return Scaffold(
  37. body: table,
  38. );
  39. }
  40. Widget _buildWeb() {
  41. return Row(
  42. children: [
  43. Expanded(
  44. child: Column(
  45. mainAxisAlignment: MainAxisAlignment.start,
  46. crossAxisAlignment: CrossAxisAlignment.start,
  47. children: [
  48. RegistrationFilter(isVital: isVital),
  49. GetBuilder<RegistrationController>(
  50. id: "registration_table",
  51. builder: (_) {
  52. return Expanded(
  53. child: RegistrationTable(
  54. residentList: controller.residentList,
  55. isVital: isVital,
  56. ),
  57. );
  58. },
  59. ),
  60. _buildTablePagination(),
  61. ],
  62. ),
  63. ),
  64. if (!isVital!)
  65. Container(
  66. width: 120,
  67. decoration: BoxDecoration(
  68. border: Border(
  69. left: BorderSide(
  70. color: Colors.grey[300]!,
  71. width: 1,
  72. ),
  73. ),
  74. ),
  75. child: GetBuilder<RegistrationController>(
  76. id: "registration_table_detail",
  77. builder: (_) {
  78. return Container(
  79. child: Column(
  80. children: [
  81. if (controller.listController
  82. .noMedicalCheckUpList()
  83. .length !=
  84. 0)
  85. _buildTitle("未做体检项"),
  86. Column(
  87. children: controller.listController
  88. .noMedicalCheckUpList()
  89. .map((e) => ListTile(
  90. title: Text(_currentExam[e] ?? ''),
  91. onTap: () {},
  92. ))
  93. .toList(),
  94. ),
  95. if ((controller.listController.currentResident
  96. .finishedExamKeys ??
  97. [])
  98. .length !=
  99. 0)
  100. _buildTitle("已做体检项"),
  101. Column(
  102. children: controller.listController
  103. .medicalCheckUpList()
  104. .map((e) => ListTile(
  105. title: Text(_currentExam[e] ?? ''),
  106. onTap: () {},
  107. ))
  108. .toList(),
  109. ),
  110. ],
  111. ),
  112. );
  113. }),
  114. ),
  115. ],
  116. );
  117. }
  118. Widget _buildTitle(String titleName) {
  119. return Container(
  120. alignment: Alignment.centerLeft,
  121. padding: EdgeInsets.only(left: 8),
  122. child: Text(
  123. titleName,
  124. style: TextStyle(color: Colors.white, fontSize: 20),
  125. ),
  126. height: 40,
  127. color: Colors.blue,
  128. width: double.maxFinite,
  129. );
  130. }
  131. Map<String, String> _currentExam = {
  132. "HEIBasic": "基础检查",
  133. "HEIUrinalysis": "尿常规检查",
  134. "HEIUltrasonic": "超声检查",
  135. "HEIBiochemical": "生化检查",
  136. "HEIBloodRoutine": "血常规检查",
  137. "HEIECG": "心电检查",
  138. "HEITCMC": "中医体质",
  139. };
  140. //打印图层生成成功
  141. Future<void> _onPictureGenerated(PicGenerateResult data) async {
  142. final printTask = data.taskItem;
  143. //指定的打印机
  144. final printerInfo = printTask.params as PrinterInfo;
  145. //打印票据类型(标签、小票)
  146. final printTypeEnum = printTask.printTypeEnum;
  147. final imageBytes =
  148. await data.convertUint8List(imageByteFormat: ImageByteFormat.rawRgba);
  149. String base64Image = base64Encode(imageBytes!);
  150. //也可以使用 ImageByteFormat.png
  151. final argbWidth = data.imageWidth;
  152. final argbHeight = data.imageHeight;
  153. if (imageBytes == null) {
  154. return;
  155. }
  156. //只要 imageBytes 不是使用 ImageByteFormat.rawRgba 格式转换的 unit8List
  157. //argbWidthPx、argbHeightPx 不要传值,默认为空就行
  158. var printData = await PrinterCommandTool.generatePrintCmd(
  159. imgData: imageBytes,
  160. printType: printTypeEnum,
  161. argbWidthPx: argbWidth,
  162. argbHeightPx: argbHeight,
  163. );
  164. if (printerInfo.isUsbPrinter) {
  165. // usb 打印
  166. final conn = UsbConn(printerInfo.usbDevice!);
  167. conn.writeMultiBytes(printData, 1024 * 3);
  168. } else if (printerInfo.isNetPrinter) {
  169. // 网络 打印
  170. final conn = NetConn(printerInfo.ip!);
  171. conn.writeMultiBytes(printData);
  172. }
  173. }
  174. Widget _buildTablePagination() {
  175. return GetBuilder<RegistrationController>(
  176. id: "registration_table_pagination",
  177. builder: (_) {
  178. return Row(
  179. mainAxisAlignment: MainAxisAlignment.end,
  180. children: [
  181. FTablePagination(
  182. currListLength: controller.appointmentModelListLength,
  183. currPageIndex: controller.currPageIndex,
  184. pageSize: 10,
  185. onChangePage: (pageIndex, listLength) {
  186. controller.listController.getRegisterInfoPage(
  187. pageIndex: pageIndex,
  188. pageSize: listLength,
  189. );
  190. // _tableScrollToTop();
  191. },
  192. totalItemNumText: i18nBook.common.ofTerm
  193. .translate(['${controller.appointmentModelListLength}']),
  194. previousFivePageText: i18nBook.common.previousFivePageText.t,
  195. nextFivePageText: i18nBook.common.nextFivePageText.t,
  196. ),
  197. SizedBox(
  198. width: 20,
  199. )
  200. ],
  201. );
  202. },
  203. );
  204. }
  205. }