index.dart 7.0 KB

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