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
相关产品推荐
相关产品推荐

