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

Odoo 15中重写pos_coupon模块已注入的Order模型_getLinesToAdd函数失效及功能实现咨询

Odoo 15中重写pos_coupon模块已注入的Order模型_getLinesToAdd函数失效及功能实现咨询

嗨,我来帮你一步步解决这个问题,先搞定重写失效的问题,再实现你需要的后端校验逻辑:

一、解决重写函数不生效的核心问题

你的自定义模块appointment_discount_card没有覆盖到目标函数,大概率是模块加载顺序出了问题。你需要确保自己的模块在pos_coupon之后加载,否则你的重写会被pos_coupon的实现覆盖掉。

修改你的模块根目录下的__manifest__.py文件,添加依赖配置:

{
    # 其他原有配置项
    'depends': ['point_of_sale', 'pos_coupon'],
    # 其他原有配置项
}

这样Odoo会优先加载pos_coupon,再加载你的模块,你的重写逻辑才能生效。

二、实现带异步后端校验的重写逻辑

因为你要调用的_checkValidityWithBackend是异步函数,所以需要把_getLinesToAdd改成异步函数(好在原调用它的_getNewRewardLines已经是async的,完全兼容)。同时建议复用原函数的逻辑再做过滤,避免丢失pos_coupon原有的功能:

odoo.define('appointment_discount_card.models', function (require) {
    'use strict';

    const models = require('point_of_sale.models');
    const rpc = require('web.rpc');
    const session = require('web.session');

    var _super_order = models.Order.prototype;

    models.Order = models.Order.extend({
        // 定义你的异步后端校验函数
        async _checkValidityWithBackend(origin, productId) {
            try {
                const payload = await rpc.query({
                    model: 'my.model.name',  // 替换成你的实际模型名称
                    method: 'check_validity',
                    args: [origin, productId],
                    kwargs: { context: session.user_context },
                });
                // 假设后端返回的结果中包含valid字段,根据实际返回结构调整
                return payload.valid;
            } catch (error) {
                console.error('后端校验请求失败:', error);
                // 出错时可默认返回false,或根据业务需求调整
                return false;
            }
        },

        // 重写目标函数,改为异步实现
        async _getLinesToAdd(rewardsContainer) {
            console.log('进入自定义的_getLinesToAdd逻辑!');
            this.assert_editable();
            
            // 先调用原函数获取所有奖励行
            const originalRewardLines = await _super_order._getLinesToAdd.call(this, rewardsContainer);
            
            // 对每一行进行后端校验,过滤掉不通过的行
            const validRewardLines = [];
            for (const line of originalRewardLines) {
                // 根据你的业务需求传参,这里示例用产品ID和标识来源的参数
                const isValid = await this._checkValidityWithBackend('reward_line', line.product.id);
                if (isValid) {
                    validRewardLines.push(line);
                }
            }
            
            // 只返回校验通过的奖励行
            return validRewardLines;
        },
    });
});

三、额外注意事项

  1. 确保后端的check_validity方法能正确接收参数,并返回包含校验结果的结构(比如示例中的valid布尔字段)。
  2. 测试时打开浏览器控制台,查看进入自定义的_getLinesToAdd逻辑!是否打印,以此确认重写是否生效。
  3. 因为我们改成了异步函数,原调用处_getNewRewardLines已经使用了await,所以不需要修改pos_coupon的源码,完全兼容原有逻辑。

备注:内容来源于stack exchange,提问作者DZEUF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 09:09:38