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; }, }); });
三、额外注意事项
- 确保后端的
check_validity方法能正确接收参数,并返回包含校验结果的结构(比如示例中的valid布尔字段)。 - 测试时打开浏览器控制台,查看
进入自定义的_getLinesToAdd逻辑!是否打印,以此确认重写是否生效。 - 因为我们改成了异步函数,原调用处
_getNewRewardLines已经使用了await,所以不需要修改pos_coupon的源码,完全兼容原有逻辑。
备注:内容来源于stack exchange,提问作者DZEUF
相关产品推荐
相关产品推荐

