fix(client): 修复标签打印预览三个问题
- 打印完成后自动关闭预览弹窗 - 打印机列表改为仅显示热敏打印机,无热敏打印机时显示"无打印机可用"并禁用打印按钮 - 库存列表表格行"打标签"按钮改为调用预览弹窗(之前仍走旧直接打印逻辑) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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)),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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 张'),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user