import 'package:json_annotation/json_annotation.dart'; part 'printer_device_models.g.dart'; /// Android USB Host 实际枚举到的一台标准 Printer Class 设备。 class PrinterUsbDeviceInfo { /// 创建一次只读的 USB 打印机发现快照。 const PrinterUsbDeviceInfo({ required this.manufacturerName, required this.productName, required this.deviceId, required this.vendorId, required this.productId, }); /// USB 描述符中的厂商名称;读取不到时为空。 final String? manufacturerName; /// USB 描述符中的产品名称;读取不到时为空。 final String? productName; /// Android 在本次连接期间分配的 USB 设备编号;重新插拔后可能变化。 final int? deviceId; /// USB Vendor ID 十进制值,范围为 0 到 65535。 final int vendorId; /// USB Product ID 十进制值,范围为 0 到 65535。 final int productId; /// 页面列表选择使用的进程内稳定键,不作为服务端或数据库主键。 String get selectionKey => '$vendorId:$productId:${deviceId ?? -1}'; /// 优先组合厂商和产品描述,缺少描述符时回退为通用打印机名称。 String get displayName { final parts = [ if (manufacturerName?.trim().isNotEmpty == true) manufacturerName!.trim(), if (productName?.trim().isNotEmpty == true) productName!.trim(), ]; return parts.isEmpty ? 'USB Printer' : parts.toSet().join(' / '); } /// 将 USB 编号格式化为四位大写十六进制,便于与设备文档交叉核对。 String get hexadecimalIdentity => '0x${vendorId.toRadixString(16).padLeft(4, '0').toUpperCase()} / ' '0x${productId.toRadixString(16).padLeft(4, '0').toUpperCase()}'; /// 生成只包含服务端允许字段的打印机信息上报请求。 PrinterInfoReportRequest toReportRequest() => PrinterInfoReportRequest( printerModel: displayName, usbVendorId: vendorId, usbProductId: productId, ); } /// 终端向服务端上报实际连接打印机型号与 USB 标识的请求。 @JsonSerializable(createFactory: false) class PrinterInfoReportRequest { /// 创建一份不包含设备路径、序列号等敏感信息的上报请求。 const PrinterInfoReportRequest({ required this.printerModel, required this.usbVendorId, required this.usbProductId, }); /// 由 USB 厂商和产品描述组合的打印机型号,服务端最长保存 128 个字符。 final String printerModel; /// USB Vendor ID 十进制值。 final int usbVendorId; /// USB Product ID 十进制值。 final int usbProductId; /// 转换为终端打印机信息上报接口使用的 JSON 对象。 Map toJson() => _$PrinterInfoReportRequestToJson(this); }