import 'dart:convert'; import 'dart:ui'; import 'package:fis_i18n/i18n.dart'; import 'package:fis_ui/index.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_printer_plus/flutter_printer_plus.dart' if (dart.library.html) "package:vitalapp/pages/medical_checkup_station/usb_print/web/flutter_printer_plus.dart"; import 'package:get/get.dart'; import 'package:print_image_generate_tool/print_image_generate_tool.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/controller.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/filter/index.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/floating_action_button/index.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/table/index.dart'; import 'package:vitalapp/pages/medical_checkup_station/usb_print/module/printer_info.dart'; class RegistrationList extends GetView { RegistrationList({super.key}); @override Widget build(BuildContext context) { Widget table; if (kIsWeb) { table = _buildWeb(); } else { table = PrintImageGenerateWidget( contentBuilder: (context) { return _buildWeb(); }, onPictureGenerated: _onPictureGenerated, ); } return Scaffold( body: table, floatingActionButton: const RegistrationActionButton(), ); } /// TODO BAKA 需要演示 Widget _buildWeb() { return Row( children: [ Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ const RegistrationFilter(), GetBuilder( id: "registration_table", builder: (_) { return Expanded( child: RegistrationTable( residentList: controller.residentList, ), ); }, ), _buildTablePagination(), ], ), ), Container( width: 160, decoration: BoxDecoration( border: Border( left: BorderSide( color: Colors.grey[300]!, width: 1, ), ), ), child: GetBuilder( id: "registration_table_detail", builder: (_) { return Container( child: Column( children: [ if (controller.listController.examList().length != 0) _buildTitle("未做体检项"), Column( children: controller.listController .examList() .map((e) => ListTile( title: Text(_currentExam[e] ?? ''), onTap: () {}, )) .toList(), ), if ((controller.listController.currentResident .finishedExamKeys ?? []) .length != 0) _buildTitle("已做体检项"), Column( children: (controller.listController.currentResident .finishedExamKeys ?? []) .map((e) => ListTile( title: Text(_currentExam[e] ?? ''), onTap: () {}, )) .toList(), ), ], ), ); }), ), ], ); } Widget _buildTitle(String titleName) { return Container( alignment: Alignment.centerLeft, padding: EdgeInsets.only(left: 8), child: Text( titleName, style: TextStyle(color: Colors.white, fontSize: 20), ), height: 40, color: Colors.blue, width: double.maxFinite, ); } Map _currentExam = { "HEIBasic": "基础检查", "HEIUrinalysis": "尿常规检查", "HEIUltrasonic": "超声检查", "HEIBiochemical": "生化检查", "HEIBloodRoutine": "血常规检查", "HEIECG": "心电检查", "HEITCMC": "中医体质", }; //打印图层生成成功 Future _onPictureGenerated(PicGenerateResult data) async { final printTask = data.taskItem; //指定的打印机 final printerInfo = printTask.params as PrinterInfo; //打印票据类型(标签、小票) final printTypeEnum = printTask.printTypeEnum; final imageBytes = await data.convertUint8List(imageByteFormat: ImageByteFormat.png); String base64Image = base64Encode(imageBytes!); //也可以使用 ImageByteFormat.png final argbWidth = data.imageWidth; final argbHeight = data.imageHeight; if (imageBytes == null) { return; } //只要 imageBytes 不是使用 ImageByteFormat.rawRgba 格式转换的 unit8List //argbWidthPx、argbHeightPx 不要传值,默认为空就行 var printData = await PrinterCommandTool.generatePrintCmd( imgData: imageBytes, printType: printTypeEnum, argbWidthPx: argbWidth, argbHeightPx: argbHeight, ); if (printerInfo.isUsbPrinter) { // usb 打印 final conn = UsbConn(printerInfo.usbDevice!); conn.writeMultiBytes(printData, 1024 * 3); } else if (printerInfo.isNetPrinter) { // 网络 打印 final conn = NetConn(printerInfo.ip!); conn.writeMultiBytes(printData); } } Widget _buildTablePagination() { return GetBuilder( id: "registration_table_pagination", builder: (_) { return Row( mainAxisAlignment: MainAxisAlignment.end, children: [ FTablePagination( currListLength: controller.appointmentModelListLength, currPageIndex: controller.currPageIndex, pageSize: 10, onChangePage: (pageIndex, listLength) { controller.listController.getRegisterInfoPage( pageIndex: pageIndex, pageSize: listLength, ); // _tableScrollToTop(); }, totalItemNumText: i18nBook.common.ofTerm .translate(['${controller.appointmentModelListLength}']), previousFivePageText: i18nBook.common.previousFivePageText.t, nextFivePageText: i18nBook.common.nextFivePageText.t, ), SizedBox( width: 20, ) ], ); }, ); } }