From 47cf0ae547f24c324e4124882b574f077f77f54e Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Fri, 26 Jun 2026 22:28:00 +0800 Subject: [PATCH] chore: release client-v1.0.84 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复出库单/入库单打印时单据明细超过一页导致 MultiPage 分页死循环卡死的回归 (_buildOrderDoc 改返回可拆分子组件列表,左侧竖线点缀改由 pageTheme 背景每页绘制)。 Co-Authored-By: Claude Opus 4.8 --- CHANGELOG-client.md | 5 ++ client/lib/core/utils/print_util_stub.dart | 66 ++++++++++++++-------- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/CHANGELOG-client.md b/CHANGELOG-client.md index 5e9b295..8bb2863 100644 --- a/CHANGELOG-client.md +++ b/CHANGELOG-client.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.84] - 2026-06-26 + +### 修复 +- 修复出库单 / 入库单打印时,单据明细超过一页会导致程序卡死无响应的问题(新版打印版式引入的回归)。 + ## [1.0.83] - 2026-06-26 ### 改进 diff --git a/client/lib/core/utils/print_util_stub.dart b/client/lib/core/utils/print_util_stub.dart index f98e1d6..9938185 100644 --- a/client/lib/core/utils/print_util_stub.dart +++ b/client/lib/core/utils/print_util_stub.dart @@ -686,7 +686,7 @@ pw.TextAlign _colAlign(int i) { /// 构建入库单/出库单 A4 版式(参照「锐浪报表」单据:公司抬头 + 两行三列表头 /// + 明细表 + 单据总计 + 温馨提示 + 签字行)。入库/出库仅称谓不同。 -pw.Widget _buildOrderDoc({ +List _buildOrderDoc({ required pw.Font font, required pw.Font bold, required String shopName, // 公司名称(顶部抬头) @@ -724,15 +724,12 @@ pw.Widget _buildOrderDoc({ pw.Widget metaText(String label, String value, pw.TextAlign align) => pw.Text('$label:$value', style: metaStyle, textAlign: align); - return pw.Container( - // 左侧竖线点缀 - decoration: const pw.BoxDecoration( - border: pw.Border(left: pw.BorderSide(color: PdfColors.black, width: 3)), - ), - padding: const pw.EdgeInsets.only(left: 14), - child: pw.Column( - crossAxisAlignment: pw.CrossAxisAlignment.stretch, - children: [ + // 返回明细块的「子组件列表」而非单个 Container:作为 MultiPage 的顶层 + // children,明细表可跨页拆分。左侧竖线点缀改由 pageTheme 背景每页绘制 + // (见 _orderPageTheme)——原先用非可拆分的 pw.Container 包裹整块内容, + // 当内容超过一页时 MultiPage 无法拆分,分页算法不前进→无限加页、内存暴涨 + // →打印卡死(根因)。 + return [ // ── 抬头:公司名 + 单据类型,左对齐内联 ────────────────────────── pw.Row( crossAxisAlignment: pw.CrossAxisAlignment.end, @@ -887,11 +884,40 @@ pw.Widget _buildOrderDoc({ pw.SizedBox(height: 10), pw.Text('备注:$remark', style: metaStyle), ], - ], - ), - ); + ]; } +/// 出/入库单 MultiPage 页面主题:内容区左缩进 + 全页高左侧竖线点缀(每页都画)。 +/// 用 pageTheme 背景绘制竖线,让明细内容(含表格)可跨页拆分,避免非可拆分 +/// Container 在内容超一页时触发 MultiPage 分页死循环。 +pw.PageTheme _orderPageTheme() => pw.PageTheme( + pageFormat: PdfPageFormat.a4, + // 左边距 = 原始外边距 15mm + (竖线宽 3 + 内缩 14),与旧版视觉缩进一致。 + margin: const pw.EdgeInsets.fromLTRB( + 15 * PdfPageFormat.mm + 17, + 12 * PdfPageFormat.mm, + 15 * PdfPageFormat.mm, + 12 * PdfPageFormat.mm, + ), + buildBackground: (ctx) => pw.FullPage( + ignoreMargins: true, + child: pw.Padding( + padding: const pw.EdgeInsets.fromLTRB( + 15 * PdfPageFormat.mm, + 12 * PdfPageFormat.mm, + 0, + 12 * PdfPageFormat.mm, + ), + child: pw.Container( + decoration: const pw.BoxDecoration( + border: pw.Border( + left: pw.BorderSide(color: PdfColors.black, width: 3)), + ), + ), + ), + ), + ); + /// 生成入库单 A4 PDF 字节(与实际打印同一套排版,供预览光栅化 + 打印共用)。 Future buildStockInOrderPdfImpl( StockInOrder order, OrderPrintMeta meta) async { @@ -919,10 +945,8 @@ Future buildStockInOrderPdfImpl( final doc = pw.Document(); doc.addPage(pw.MultiPage( - pageFormat: PdfPageFormat.a4, - margin: const pw.EdgeInsets.symmetric(horizontal: 15 * PdfPageFormat.mm, vertical: 12 * PdfPageFormat.mm), - build: (_) => [ - _buildOrderDoc( + pageTheme: _orderPageTheme(), + build: (_) => _buildOrderDoc( font: font, bold: bold, shopName: meta.shopName, title: '入 库 单', @@ -944,7 +968,6 @@ Future buildStockInOrderPdfImpl( totalQty: totalQty, totalAmt: totalAmt, ), - ], )); return doc.save(); } @@ -997,10 +1020,8 @@ Future buildStockOutOrderPdfImpl( final doc = pw.Document(); doc.addPage(pw.MultiPage( - pageFormat: PdfPageFormat.a4, - margin: const pw.EdgeInsets.symmetric(horizontal: 15 * PdfPageFormat.mm, vertical: 12 * PdfPageFormat.mm), - build: (_) => [ - _buildOrderDoc( + pageTheme: _orderPageTheme(), + build: (_) => _buildOrderDoc( font: font, bold: bold, shopName: meta.shopName, title: '出 库 单', @@ -1022,7 +1043,6 @@ Future buildStockOutOrderPdfImpl( totalQty: totalQty, totalAmt: totalAmt, ), - ], )); return doc.save(); }