如何在Odoo的Qweb销售订单报表中按页打印订单行商品小计金额
Odoo销售订单Qweb报表分页小计实现方案
核心逻辑
Qweb报表的分页由wkhtmltopdf工具控制,原生遍历订单行时无法直接感知分页边界,我们可以通过固定单页行数累计(适合行高固定的场景)或者页脚JS动态计算(适合行高动态的场景)实现每页末尾打印当前页subtotal。
具体实现步骤(固定行高场景,适配你给出的12行/页示例)
- 第一步:继承销售订单报表模板,声明临时变量
你需要在自定义模块的Qweb模板中,继承原有销售订单报表,在订单行遍历前新增两个变量:<!-- 累计当前页总金额,初始值为0 --> <t t-set="current_page_subtotal" t-value="0"/> <!-- 单页最大显示订单行数量,你示例单页显示12个产品所以填12 --> <t t-set="single_page_line_limit" t-value="12"/> - 第二步:遍历订单行时同步累计金额,达到阈值输出小计并分页
原有订单行渲染逻辑保持不变,每渲染一行就将该行金额累加到当前页小计变量,累计到单页上限时先输出当前页subtotal,再插入分页符并重置累计变量:<t t-foreach="doc.order_line" t-as="line"> <!-- 原有订单行的渲染代码,保持不变 --> <tr> <td><span t-field="line.product_id.name"/></td> <td class="text-right"><span t-field="line.price_subtotal"/></td> </tr> <!-- 累加当前行金额到页小计 --> <t t-set="current_page_subtotal" t-value="current_page_subtotal + line.price_subtotal"/> <!-- 判断是否触达单页行数上限,且不是最后一行 --> <t t-if="(line_index + 1) % single_page_line_limit == 0 and not line_last"> <!-- 输出当前页小计 --> <tr class="border-top fw-bold"> <td>当前页小计</td> <td class="text-right" t-esc="current_page_subtotal"/> </tr> <!-- 插入强制分页符 --> <div style="page-break-after: always;"/> <!-- 重置累计变量,用于下一页计算 --> <t t-set="current_page_subtotal" t-value="0"/> </t> </t> - 第三步:输出最后一页的小计
遍历完全部订单行后,输出最后不足12行的页面的小计金额:<t t-if="current_page_subtotal > 0"> <tr class="border-top fw-bold"> <td>当前页小计</td> <td class="text-right" t-esc="current_page_subtotal"/> </tr> </t>
动态行高场景适配方案
如果你的订单行存在产品名称换行、多行描述的情况,无法固定单页行数,可以改用页脚JS动态计算方案:
给所有订单行的金额单元格添加统一的类名比如
order-line-subtotal,在报表的页脚模板中嵌入JS代码,渲染时遍历当前页所有带该类名的元素,求和后写入页脚的subtotal展示位即可,该方案不需要提前预设单页行数。
内容的提问来源于stack exchange,提问作者Sakthi Priya
相关产品推荐
相关产品推荐

