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

Odoo 15中如何为report.pos.order添加margin_percent度量字段

在Odoo 15中为report.pos.order添加margin_percent度量

实现步骤

因为report.pos.order通过拆分_select/_from/_group_by方法构建视图,而非使用_query(),所以你需要通过继承模型并重写对应方法来添加新度量:

  1. 继承模型并添加字段
    首先继承report.pos.order模型,新增margin_percent字段:

    from odoo import models, fields, tools
    
    class PosOrderReport(models.Model):
        _inherit = "report.pos.order"
    
        margin_percent = fields.Float(string='Margin Percentage', readonly=True, group_operator="avg")
    
  2. 重写_select方法,添加计算逻辑
    追加margin_percent的SQL计算语句到原有SELECT部分,注意处理除数为0的情况避免报错:

    def _select(self):
        # 获取父类原有SELECT语句
        base_select = super()._select()
        # 构造margin_percent的SQL计算逻辑
        margin_percent_sql = """
            , CASE
                WHEN SUM(l.qty * l.price_unit / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END) = 0 THEN 0.0
                ELSE (SUM(l.price_subtotal - l.total_cost / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END) / SUM(l.qty * l.price_unit / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END)) * 100
            END AS margin_percent
        """
        # 拼接并返回完整SELECT语句
        return base_select.rstrip() + margin_percent_sql
    
  3. 重写init方法触发视图重建
    调用父类的init方法,确保模块升级时重新创建包含新字段的视图:

    def init(self):
        super().init()
    

注意事项

  • 确保你的模块在__manifest__.py中添加依赖:'depends': ['point_of_sale']
  • 升级模块后,Odoo会自动重新执行视图创建逻辑,新字段将被包含到报表视图中
  • 若要在POS报表的前端界面显示该字段,需要修改对应的看板或列表视图,添加margin_percent字段

内容的提问来源于stack exchange,提问作者odoo newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:01:24