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

Odoo16中如何修补StockForecasted组件?求技术支援

Odoo16 StockForecasted 组件 _getReportValues 方法补丁失效解决

问题背景

需要在Odoo16中修补StockForecasted组件的_getReportValues方法,但尝试的补丁代码未生效,浏览器打印StockForecasted显示undefined,推测组件未被模块显式导出,无法修改源码的情况下寻求解决办法。

原组件代码

class StockForecasted extends Component{
    async _getReportValues(){
        this.resModel = this.context.active_model || (this.context.params && this.context.params.active_model);
        // 其他原有逻辑
        ....
    }
}

尝试的补丁代码(未生效)

/** @odoo-module **/
import { patch } from '@web/core/utils/patch';
import { StockForecasted } from "@stock/stock_forecasted/stock_forecasted";
console.log(StockForecasted)
patch(StockForecasted.prototype, 'test_my_stock.StockForecasted', {
    async _getReportValues(){
        console.log('_getReportValuesInherit')
        this.resModel = this.context.active_model || (this.context.params && this.context.params.active_model);
        if (!this.resModel) {
            if (this.props.action.res_model) {
                const actionModel = await this.orm.read('ir.model', [Number(this.props.action.res_model)], ['model']);
                if (actionModel.length && actionModel[0].model) {
                    this.resModel = actionModel[0].model
                }
            } else if (this.props.action._originalAction) {
                const originalContextAction = JSON.parse(this.props.action._originalAction).context;
                if (originalContextAction) {
                    this.resModel = originalContextAction.active_model
                }
            }
        }
    }
});

问题原因

StockForecasted组件未被@stock/stock_forecasted/stock_forecasted模块显式导出,直接通过import无法获取到该类,导致patch无法生效。

解决方案

通过Odoo的组件注册表获取StockForecasted组件的注册实例,使用patchComponent进行修补,同时注意调用原方法逻辑避免功能丢失:

/** @odoo-module **/
import { patchComponent } from '@web/core/utils/patch';
import { registry } from '@web/core/registry';

// 从actions注册表中获取StockForecasted组件
const StockForecastedAction = registry.category('actions').get('stock_forecasted');

if (StockForecastedAction) {
    patchComponent(StockForecastedAction, {
        async _getReportValues() {
            // 先执行原方法逻辑
            await this._super(...arguments);
            console.log('_getReportValuesInherit');
            
            // 自定义补充逻辑
            if (!this.resModel) {
                if (this.props.action.res_model) {
                    const actionModel = await this.orm.read('ir.model', [Number(this.props.action.res_model)], ['model']);
                    if (actionModel.length && actionModel[0].model) {
                        this.resModel = actionModel[0].model;
                    }
                } else if (this.props.action._originalAction) {
                    const originalContextAction = JSON.parse(this.props.action._originalAction).context;
                    if (originalContextAction) {
                        this.resModel = originalContextAction.active_model;
                    }
                }
            }
        }
    });
}

关键说明

  1. StockForecasted作为action组件注册在actions分类下,注册key为stock_forecasted,通过registry.category('actions').get('stock_forecasted')可获取到组件实例。
  2. 使用patchComponent替代patch来修补组件,无需直接访问类的原型。
  3. 必须调用this._super(...arguments)执行原方法的逻辑,避免覆盖原有功能。

内容的提问来源于stack exchange,提问作者Duc Trong Pham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:17:25