You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 15 如何在送货单报表中显示产品价格及计价单位

Odoo 15 送货单(Delivery Slip)展示产品价格、计价单位实现方案

按实现成本从低到高分三种方案,适配不同场景需求:

一、原生系统配置(零代码,仅需开放权限)

  • 原生送货单对应的库存调拨行(stock.move)本身已经自带price_unit(单价)、product_uom(计价单位)字段,默认仅对库存管理员组可见,普通用户打印时看不到是因为字段加了组权限限制
  • 进入「设置-用户与公司-用户」,找到需要打印送货单的账号,给其分配「库存/管理员」权限组,或者在开发者模式下找到stock.move模型的对应字段,移除字段上的组限制,所有用户即可在报表上看到对应字段
  • 注意字段默认取值逻辑:销售出库场景下price_unit自动带出对应销售订单行的成交单价,采购入库场景带采购订单行的进货单价,内部调拨场景默认取产品的成本价,不需要额外做值映射。

二、Studio低代码定制(无代码侵入,适合快速调整)

  • 激活开发者模式:点击右上角头像→关于Odoo→点击激活开发者模式
  • 打开任意一张已确认的送货单,点击右上角Studio编辑按钮,左侧切换到「报表」分类,找到系统自带的Delivery Slip报表进入编辑
  • 在送货单的产品明细表格区域,新增两列表头,分别命名为「单价」「计价单位」,再从左侧字段面板把price_unit、product_uom字段拖拽到对应列的行位置
  • 右侧属性栏可调整字段格式:单价字段选择货币组件,绑定对应币种,设置小数位数;计价单位字段可设置居中显示
  • 如果需要做权限控制,选中价格列,在右侧可见性设置里勾选允许查看的用户组即可,保存后立即生效,不需要重启服务或升级模块。

三、自定义模块二次开发(适合多环境部署、长期迭代场景)

如果需要在多个环境同步配置、或者要自定义价格取值逻辑,用自定义模块实现更稳妥:

  • 模块基础配置:新建自定义模块,依赖添加stock,如果需要对接销售业务场景额外加sale_stock依赖
  • 继承原生送货单QWeb模板(原生模板外部ID:stock.report_delivery_document),插入价格、计价单位列,参考代码:
<odoo>
    <template id="report_delivery_slip_add_price_uom" inherit_id="stock.report_delivery_document">
        <!-- 表头插入列 -->
        <xpath expr="//table[contains(@class, 'o_main_table')]/thead/tr/th[last()]" position="after">
            <th class="text-end">单价</th>
            <th class="text-center">计价单位</th>
        </xpath>
        <!-- 表体插入字段值 -->
        <xpath expr="//table[contains(@class, 'o_main_table')]/tbody/tr/td[last()]" position="after">
            <td class="text-end">
                <span t-field="line.price_unit" 
                      t-options='{"widget": "monetary", "display_currency": o.currency_id or o.company_id.currency_id}'
                      t-groups="stock.group_stock_user"/>
            </td>
            <td class="text-center">
                <span t-field="line.product_uom"/>
            </td>
        </xpath>
    </template>
</odoo>
  • 自定义取值逻辑(可选):如果原生price_unit的取值不符合业务需求,比如要固定显示产品公开售价、或者指定价目表价格,可以在stock.move模型里新增计算字段重写取值,参考:
from odoo import models, fields, api

class StockMove(models.Model):
    _inherit = 'stock.move'

    custom_price = fields.Monetary(string='自定义单价', compute='_compute_custom_price', currency_field='currency_id')

    def _compute_custom_price(self):
        for move in self:
            # 替换为实际业务逻辑,示例为取产品公开售价
            move.custom_price = move.product_id.list_price

写完把模板里的line.price_unit换成line.custom_price即可。

  • 避坑提示:
    • 多单位场景不要直接取产品主数据上的默认单位,必须取调拨行上的product_uom字段,否则会出现交易单位和显示单位不一致的问题
    • 多币种场景不要固定绑定公司本位币,优先取调拨单上的币种字段,否则跨境交易的价格显示会出错
    • 权限控制建议直接在模板层加t-groups属性判断,不需要额外写后端权限逻辑,升级后不会被系统更新覆盖。

内容的提问来源于stack exchange,提问作者Fojja Bilel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:45:38