
本教程旨在指导开发者如何在odoo 14的pos会话中,通过javascript代码准确读取并计算所有现金支付的总额。文章将详细介绍如何遍历pos订单及其支付明细,识别现金交易,并着重强调利用浏览器开发者工具进行高效调试,以确保正确访问odoo前端对象属性,从而解决在数据结构复杂性中遇到的挑战。
在Odoo的销售点(POS)模块中,有时我们需要自定义功能来汇总特定类型的支付数据,例如计算一个活动POS会话中的现金支付总额。这通常涉及到访问Odoo前端的JavaScript模型层,遍历订单和其关联的支付明细。
理解Odoo POS会话数据结构
Odoo POS前端的数据模型组织清晰,主要通过this.env.pos对象提供当前POS会话的各种数据。
获取订单列表: 当前POS会话中的所有订单可以通过this.env.pos.get_order_list()方法获取。这个方法返回一个包含所有订单对象的数组。
遍历订单与支付明细: 每个订单对象内部都包含一个paymentlines集合,它存储了该订单的所有支付记录。paymentlines是一个Backbone.js集合,其具体的模型对象可以通过.models属性访问。每个支付明细对象都包含了支付方式、金额等信息。
实现现金支付总额计算
以下是一个JavaScript方法,用于获取当前POS会话中所有订单的现金支付总额。
get totalCash() {
// 1. 设置断点:在浏览器开发者工具中暂停执行,以便检查对象结构。
debugger;
// 2. 获取当前POS会话的所有订单列表
const orders = this.env.pos.get_order_list();
let totalCash = 0;
console.log("订单列表: ", orders);
// 3. 遍历每个订单
for (const order of orders) {
console.log("当前订单: ", order);
// 4. 遍历订单中的每个支付明细
// paymentlines是一个Backbone集合,通过.models访问实际的支付明细模型
for (const paymentLine of order.paymentlines.models) {
console.log("当前支付明细: ", paymentLine);
// 5. 检查支付方式是否为现金
// 注意:'cashregister.journal.type' 路径可能因Odoo版本或自定义而异。
// 如果此路径不正确,请使用调试工具(见下文)查找正确路径。
if (paymentLine.cashregister && paymentLine.cashregister.journal && paymentLine.cashregister.journal.type === 'cash') {
console.log("现金支付类型: ", paymentLine.cashregister.journal.type);
console.log("累计前金额: ", totalCash);
totalCash += paymentLine.amount;
console.log("累计后金额: ", totalCash);
}
// 补充说明:在某些Odoo版本或配置中,支付方式信息可能在 paymentLine.payment_method 对象下
// 例如:if (paymentLine.payment_method && paymentLine.payment_method.journal && paymentLine.payment_method.journal.type === 'cash')
// 调试时应重点关注 paymentLine 对象的结构
}
}
// 6. 返回总现金金额,保留两位小数
return totalCash.toFixed(2);
}代码解析:
- this.env.pos.get_order_list():这是获取所有当前POS会话订单的关键方法。
- order.paymentlines.models:paymentlines是一个Backbone集合,需要通过.models属性来访问集合中的实际模型(即支付明细对象)。
- paymentLine.cashregister.journal.type === 'cash':这是识别现金支付的核心逻辑。请注意,cashregister.journal.type这个属性路径在不同的Odoo版本或自定义模块中可能有所不同。 如果代码无法正确识别现金支付,最常见的原因就是这里的属性路径不准确。
Odoo前端开发调试技巧
当遇到类似“找不到正确属性名”的问题时,有效的调试是解决问题的关键。
-
设置断点 (debugger;): 在你的JavaScript代码中,可以在任何你希望暂停执行并检查变量状态的位置插入debugger;语句。当代码执行到这一行时,如果你的浏览器开发者工具是打开的,代码将自动暂停。
get totalCash() { debugger; // 在这里设置断点 // ... 其他代码 } -
利用浏览器开发者工具:
- 打开开发者工具: 在网页上右键点击,选择“检查”(Inspect),或者使用快捷键Ctrl+Shift+I(Windows/Linux)或Cmd+Option+I(Mac)。
- 切换到“Sources”或“源”面板: 在这里你可以看到你的JavaScript文件,并在代码行上点击设置/取消断点。当代码因debugger;语句或手动设置的断点而暂停时,此面板会高亮显示当前执行的行。
-
检查对象属性: 当代码暂停在断点处时,你可以利用开发者工具的以下功能:
- Scope(作用域)面板: 这个面板会显示当前作用域内的所有变量及其值。你可以展开orders、order、paymentLine等对象,层层深入地查看它们的内部结构和可用属性。
- Console(控制台)面板: 在代码暂停时,你可以在控制台中输入变量名(例如paymentLine),然后回车,即可打印出该对象的完整结构。你可以进一步输入paymentLine.payment_method或paymentLine.cashregister等来探索其子属性。通过这种方式,你可以准确地找到例如paymentLine.payment_method.journal.type或paymentLine.cashregister.journal.type等正确的属性路径。
通过仔细检查paymentLine对象的结构,你就能确定哪一个属性(例如payment_method或cashregister)包含了支付方式的详细信息,进而找到journal.type。
注意事项与最佳实践
- Odoo版本兼容性: Odoo的不同版本(例如Odoo 14、15、16等)在前端模型和API上可能存在细微差异。本教程的代码适用于Odoo 14,但在其他版本中可能需要根据实际情况进行调整。
- 属性路径的动态性: 如前所述,对象属性的路径可能会因Odoo版本、模块定制或特定的POS配置而异。因此,掌握调试技巧比死记硬背属性路径更为重要。
- 性能考量: 对于包含大量订单和支付明细的POS会话,上述循环操作可能会有轻微的性能开销。在大多数POS场景下,这通常不是问题,但如果遇到性能瓶颈,可能需要考虑优化数据获取或处理逻辑。
- 错误处理: 在实际生产代码中,应考虑添加错误处理机制,例如检查paymentLine.cashregister或paymentLine.payment_method是否存在,以避免因属性不存在而导致的运行时错误。
总结
在Odoo 14的POS会话中读取订单和支付明细,尤其是为了计算特定类型的支付总额,是常见的开发需求。通过利用this.env.pos.get_order_list()方法遍历数据,并结合强大的浏览器开发者工具进行运行时调试,开发者可以有效地识别和访问Odoo前端模型的正确属性。掌握这些技能对于Odoo前端的定制化开发至关重要,能够帮助开发者准确、高效地解决数据访问问题。










