fix(client): 修复标签打印预览三个问题

- 打印完成后自动关闭预览弹窗
- 打印机列表改为仅显示热敏打印机,无热敏打印机时显示"无打印机可用"并禁用打印按钮
- 库存列表表格行"打标签"按钮改为调用预览弹窗(之前仍走旧直接打印逻辑)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-15 12:04:03 +08:00
parent d26a64f149
commit 0779bf57e3
3 changed files with 15 additions and 26 deletions
+5 -2
View File
@@ -501,7 +501,7 @@ Future<List<String>> listLabelPrintersImpl() async {
return (r.stdout as String) return (r.stdout as String)
.split('\n') .split('\n')
.map((s) => s.trim()) .map((s) => s.trim())
.where((s) => s.isNotEmpty) .where((s) => s.isNotEmpty && _isThermalName(s))
.toList(); .toList();
} }
} catch (e) { } catch (e) {
@@ -511,7 +511,10 @@ Future<List<String>> listLabelPrintersImpl() async {
} }
if (Platform.isWindows) { if (Platform.isWindows) {
try { try {
return (await Printing.listPrinters()).map((p) => p.name).toList(); return (await Printing.listPrinters())
.map((p) => p.name)
.where((n) => _isThermalName(n))
.toList();
} catch (e) { } catch (e) {
debugPrint('[label] listPrinters 失败: $e'); debugPrint('[label] listPrinters 失败: $e');
} }
@@ -668,27 +668,7 @@ class _InventoryListScreenState extends ConsumerState<InventoryListScreen> {
DataCell( DataCell(
item.productId != null item.productId != null
? TextButton( ? TextButton(
onPressed: () async { onPressed: () => _printLabel(context, item),
final qrBytes = await ref
.read(productRepositoryProvider)
.getQRCodeBytes(item.productId!);
final shopInfo = ref.read(shopInfoProvider).valueOrNull;
if (context.mounted) {
await safePrint(context, () => printProductLabel(
qrBytes: qrBytes,
name: item.productName,
code: item.productCode,
series: item.series.isEmpty ? null : item.series,
spec: item.spec.isEmpty ? null : item.spec,
batchNo: item.batchNo.isEmpty ? null : item.batchNo,
productionDate: item.productionDate,
remark: item.remark.isEmpty ? null : item.remark,
shopName: shopInfo?.name ?? '',
shopAddress: shopInfo?.address ?? '',
shopPhone: shopInfo?.phone ?? '',
));
}
},
child: const Text('打标签', child: const Text('打标签',
style: TextStyle(fontSize: 12, color: AppTheme.primary)), style: TextStyle(fontSize: 12, color: AppTheme.primary)),
) )
+9 -3
View File
@@ -36,6 +36,7 @@ class _LabelPreviewDialogState extends State<LabelPreviewDialog> {
List<String> _printers = []; List<String> _printers = [];
String? _printer; String? _printer;
bool _printing = false; bool _printing = false;
bool _printersChecked = false;
String _status = ''; String _status = '';
@override @override
@@ -63,6 +64,7 @@ class _LabelPreviewDialogState extends State<LabelPreviewDialog> {
setState(() { setState(() {
_printers = printers; _printers = printers;
_printer = selected; _printer = selected;
_printersChecked = true;
}); });
} }
@@ -147,6 +149,7 @@ class _LabelPreviewDialogState extends State<LabelPreviewDialog> {
_printing = false; _printing = false;
_status = '完成,共打印 $done'; _status = '完成,共打印 $done';
}); });
Navigator.of(context).pop();
} }
} }
@@ -329,8 +332,9 @@ class _LabelPreviewDialogState extends State<LabelPreviewDialog> {
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded( Expanded(
child: _printers.isEmpty child: _printers.isEmpty
? const Text('检测中或未检测到打印机...', ? Text(
style: TextStyle( _printersChecked ? '无打印机可用' : '正在检测打印机...',
style: const TextStyle(
fontSize: 13, fontSize: 13,
color: AppTheme.textSecondary)) color: AppTheme.textSecondary))
: DropdownButtonHideUnderline( : DropdownButtonHideUnderline(
@@ -419,7 +423,9 @@ class _LabelPreviewDialogState extends State<LabelPreviewDialog> {
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
FilledButton( FilledButton(
onPressed: (_printing || totalCount == 0) ? null : _doPrint, onPressed: (_printing || totalCount == 0 || _printer == null)
? null
: _doPrint,
child: Text( child: Text(
_printing ? '打印中...' : '打印 $totalCount'), _printing ? '打印中...' : '打印 $totalCount'),
), ),