123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- 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<IAppointmentManager>();
- final registrationManager = Get.find<IRegistrationManager>();
- final state = ListState();
- RegistrationController() {
- listController = RegistrationListController(this);
- formController = RegistrationFormController(this);
- }
- /// 登记
- ResidentModel resident = ResidentModel(
- idNumber: '',
- );
- /// 手动填写的病人名字
- PatientDTO? patientInfo = PatientDTO();
- /// 预约列表
- List<ResidentModel> residentList = [];
- /// 预约列表的总数
- int appointmentModelListLength = 0;
- /// 表格loading
- bool tableLoading = true;
- /// 当前表格页数
- int currPageIndex = 1;
- PrinterInfo? printInfo;
- List<Uint8List> barCodeList = [];
- //查询本地USB打印机列表
- Future<List<PrinterInfo>> 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<PrinterInfo>? printerInfoList = await queryLocalUSBPrinter();
- if (printerInfoList.length == 0) {
- return;
- }
- printInfo = printerInfoList.first;
- }
- }
- Future<void> 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<Uint8List> 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<Uint8List?> _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;
- }
- }
|