import 'dart:ui'; import 'package:fis_jsonrpc/rpc.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:vitalapp/managers/interfaces/appointment.dart'; import 'package:vitalapp/managers/interfaces/registration.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/controller/form.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/controller/list.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/state/list.dart'; import 'package:vitalapp/pages/medical_checkup_station/usb_print/module/printer_info.dart'; import 'package:barcode_image/barcode_image.dart'; import 'package:flutter_svg/flutter_svg.dart'; /// 登记控制器 class RegistrationController extends GetxController { late final RegistrationFormController formController; late final RegistrationListController listController; final appointmentManager = Get.find(); final registrationManager = Get.find(); final state = ListState(); RegistrationController() { listController = RegistrationListController(this); formController = RegistrationFormController(this); } /// 登记 ResidentModel resident = ResidentModel( idNumber: '', ); /// 手动填写的病人名字 PatientDTO? patientInfo = PatientDTO(); /// 预约列表 List residentList = []; /// 预约列表的总数 int appointmentModelListLength = 0; /// 表格loading bool tableLoading = true; /// 当前表格页数 int currPageIndex = 1; PrinterInfo? printInfo; List barCodeList = []; //查询本地USB打印机列表 Future> queryLocalUSBPrinter() { return FlutterPrinterFinder.queryUsbPrinter().then( (value) => value.map((e) => PrinterInfo.fromUsbDevice(e)).toList(), ); } _initData() async { var now = DateTime.now(); listController.state.startTime = new DateTime(now.year, now.month, now.day); listController.state.endTime = listController.state.startTime! .add(Duration(hours: 23, minutes: 59, seconds: 59)); await listController.getRegisterInfoPage(); if (!kIsWeb) { List? printerInfoList = await queryLocalUSBPrinter(); if (printerInfoList.length == 0) { return; } printInfo = printerInfoList.first; } } Future getExamLabelsByExamNoAsync(ResidentModel rowData) async { var labels = await registrationManager.getExamLabelsByExamNoAsync( physicalExamNumber: rowData.physicalExamNumber!); barCodeList.clear(); for (var element in labels.eaxmLabels!) { var barCodeData = await drawRedRect(element, rowData); if (barCodeData.isNotEmpty) { barCodeList.add(barCodeData); } } } Future drawRedRect( HealthExamLabelDTO labelDto, ResidentModel resident) async { const size = Size(360, 240); final svg = Barcode.code128().toSvg(labelDto.uniquedCode!, height: 80); final PictureInfo pictureInfo = await vg.loadPicture(SvgStringLoader(svg), null); var a = await _capturePainterToImage( MyPainter(pictureInfo, labelDto, resident), BgPainter(pictureInfo), size); return a!; } /// 将CustomPainter绘制的内容转换为图片 Future _capturePainterToImage( CustomPainter painter, CustomPainter bgPainter, Size size) async { final bounds = Offset.zero & size; // final bounds2 = Offset.zero & Size(size.width - 20, size.height - 20); final picture = PictureRecorder(); final pictureCanvas = Canvas(picture); // 给Canvas设置绘制范围 pictureCanvas.clipRect(bounds); painter.paint(pictureCanvas, size); // 在Canvas上进行绘制 bgPainter.paint(pictureCanvas, size); // 结束绘制 final recordedPicture = picture.endRecording(); final image = await recordedPicture.toImage(size.width.toInt(), size.height.toInt()); // 转换为字节数组 final byteData = await image.toByteData(format: ImageByteFormat.png); final bytes = byteData?.buffer.asUint8List(); return bytes; } void onTap() {} @override void onReady() { _initData(); super.onReady(); } // void on @override void onClose() {} } class MyPainter extends CustomPainter { PictureInfo pictureInfo; HealthExamLabelDTO labelDto; ResidentModel resident; MyPainter(this.pictureInfo, this.labelDto, this.resident); @override void paint(Canvas canvas, Size size) { Paint backgroundPaint = Paint()..color = Colors.white; canvas.drawRect( Rect.fromLTWH(0, 0, size.width, size.height), backgroundPaint); canvas.drawLine( Offset(0, 85), Offset(360, 85), Paint()..color = Colors.black); // Simulate drawing the content TextSpan titleSpan = TextSpan( text: '${labelDto.title ?? ''}', style: TextStyle(fontSize: 30, height: 1, color: Colors.black), ); TextPainter titleTp = TextPainter( text: titleSpan, textAlign: TextAlign.left, textDirection: TextDirection.ltr, ); titleTp.layout(); titleTp.paint(canvas, Offset(28, 8)); TextSpan subTitleSpanName = TextSpan( text: '${resident.name} ', style: TextStyle(fontSize: 20, height: 1, color: Colors.black), ); TextPainter subTitleTp1 = TextPainter( text: subTitleSpanName, textAlign: TextAlign.left, textDirection: TextDirection.ltr, ); subTitleTp1.layout(); subTitleTp1.paint(canvas, Offset(28, 48)); TextSpan subTitleSpanAge = TextSpan( text: '${resident.age} 岁', style: TextStyle(fontSize: 20, height: 1, color: Colors.black), ); TextPainter subTitleTpAge = TextPainter( text: subTitleSpanAge, textAlign: TextAlign.left, textDirection: TextDirection.ltr, ); subTitleTpAge.layout(); subTitleTpAge.paint(canvas, Offset(168, 48)); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) { return false; } } class BgPainter extends CustomPainter { PictureInfo pictureInfo; BgPainter(this.pictureInfo); @override void paint(Canvas canvas, Size size) { canvas.translate(30, 100); canvas.scale(1.5, 1.5); canvas.drawPicture(pictureInfo.picture); canvas.restore(); // 恢复之前保存的绘制状态 } @override bool shouldRepaint(covariant CustomPainter oldDelegate) { return false; } }