0

0

Odoo 14 POS会话中准确读取现金支付总额的教程与调试指南

霞舞

霞舞

发布时间:2025-12-12 17:01:27

|

857人浏览过

|

来源于php中文网

原创

Odoo 14 POS会话中准确读取现金支付总额的教程与调试指南

本教程详细指导如何在odoo 14的pos会话中,通过javascript代码准确获取所有订单的现金支付总额。文章强调了利用浏览器开发者工具进行对象结构检查和调试的重要性,并提供了具体的代码示例和调试技巧,帮助开发者有效解决前端数据访问问题,确保准确地遍历订单及其支付行,识别并累加现金支付金额。

在Odoo 14的销售点(POS)模块中,开发者经常需要访问当前会话中的订单数据,例如获取特定支付方式(如现金)的总金额。这要求我们深入理解Odoo前端数据模型的结构,并掌握有效的调试方法。

理解Odoo POS会话数据结构

在Odoo POS前端,所有活动订单和其相关的支付信息都存储在 this.env.pos 对象中。要获取当前POS会话中的所有订单,我们通常会使用 this.env.pos.get_order_list() 方法。

每个订单对象内部,其支付行(payment lines)通常存储在一个集合中,在Odoo 14这类版本中,这通常是Backbone.js模型的集合,因此需要通过 .models 属性来访问实际的支付行数组。每个支付行对象又包含了支付方式(cashregister)和金额(amount)等关键信息。

为了准确识别现金支付,我们需要检查支付行关联的日记账类型。现金支付通常对应于类型为 'cash' 的日记账。

核心代码实现:计算现金支付总额

以下代码片段展示了如何正确遍历当前POS会话中的所有订单及其支付行,并计算现金支付的总额:

get totalCash() {
    // 在此处设置断点,以便在浏览器开发者工具中进行详细检查
    debugger; 

    // 获取当前POS会话中的所有订单列表
    const orders = this.env.pos.get_order_list();
    let totalCash = 0;

    console.log("订单列表: ", orders);

    // 遍历每个订单
    for (const order of orders) {
        console.log("当前订单: ", order);

        // 遍历订单中的每个支付行。
        // 注意:order.paymentlines通常是一个集合对象,需要通过.models访问其内部数组。
        for (const paymentLine of order.paymentlines.models) {
            console.log("当前支付行: ", paymentLine);

            // 检查支付方式是否为现金
            // 支付方式的类型信息通常存储在 paymentLine.cashregister.journal.type 中
            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);
            }
        }
    }

    // 返回总现金金额,并保留两位小数
    return totalCash.toFixed(2);
}

代码解析:

Pebblely
Pebblely

AI产品图精美背景添加

下载
  1. const orders = this.env.pos.get_order_list();: 获取当前POS会话中的所有订单对象。
  2. for (const order of orders): 遍历 orders 数组中的每一个订单。
  3. for (const paymentLine of order.paymentlines.models): 这是关键一步。order.paymentlines 是一个集合(Collection)对象,其内部实际的模型数组需要通过 .models 属性来访问。遍历这个数组以获取每个支付行对象。
  4. if (paymentLine.cashregister && paymentLine.cashregister.journal && paymentLine.cashregister.journal.type === 'cash'): 这是一个健壮的检查,确保 cashregister 和 journal 属性存在,然后判断 journal.type 是否为 'cash'。
  5. totalCash += paymentLine.amount;: 如果是现金支付,则将支付行的金额累加到 totalCash 变量中。
  6. return totalCash.toFixed(2);: 返回计算出的总现金金额,并使用 toFixed(2) 方法将其格式化为两位小数的字符串,这对于货金额显示是常见的做法。

强大的调试利器:浏览器开发者工具

在Odoo前端开发中,理解和检查JavaScript对象的结构至关重要。当遇到“似乎找到了对象,但属性名称不对”的问题时,浏览器开发者工具是解决此类问题的最佳途径。

使用步骤:

  1. 插入 debugger; 语句: 在你想要检查代码执行流程和变量状态的位置,例如在 get totalCash() 方法的开头,添加 debugger; 语句。
    get totalCash() {
        debugger; // 在这里设置一个断点
        // ... 你的代码 ...
    }
  2. 打开开发者工具: 在浏览器中,右键点击Odoo页面,选择“检查”(Inspect)或按下 Ctrl+Shift+I(Mac上是 Cmd+Option+I)。
  3. 触发代码执行: 执行会调用你插入 debugger; 语句的代码逻辑(例如,在POS界面中执行一个操作,该操作会调用 totalCash 方法)。
  4. 在断点处暂停: 当代码执行到 debugger; 语句时,浏览器会自动暂停在“Sources”或“源”面板中。
  5. 检查变量和对象:
    • 在“Scope”或“作用域”面板中,你可以查看当前作用域内的所有变量及其值。
    • 在“Console”或“控制台”面板中,你可以手动输入变量名(例如 orders 或 paymentLine),然后按回车键来检查其完整的对象结构和所有可用属性。你可以展开这些对象来层层深入地查看其内容。
    • 通过这种方式,你可以准确地发现 paymentLine 对象中,金额属性是 amount,而支付类型信息位于 cashregister.journal.type。

这种交互式调试方法远比简单的 console.log 更强大和直观,它能让你实时地探索复杂的数据结构,从而快速定位并修正属性访问错误。

注意事项与最佳实践

  • 数据模型变动: Odoo的不同版本或自定义模块可能会对前端数据模型结构进行修改。因此,即使是看似正确的代码,在升级Odoo版本后也可能需要重新检查和调试。
  • 健壮性检查: 在访问嵌套属性(如 paymentLine.cashregister.journal.type)时,最好进行空值或 undefined 检查,例如 if (paymentLine.cashregister && paymentLine.cashregister.journal && ...),以避免运行时错误。
  • 异步操作: 如果你的数据获取涉及异步操作(例如通过RPC调用后端),请确保正确处理Promise,使用 async/await 或 .then() 方法来确保在数据可用时才进行处理。本教程中的 get_order_list() 通常是同步的。
  • 性能考量: 对于非常大量的订单和支付行,频繁的循环和复杂的逻辑可能会影响POS前端的性能。在设计时应考虑优化算法。

总结

在Odoo 14 POS会话中准确获取现金支付总额,需要对前端数据模型有清晰的理解,并熟练运用浏览器开发者工具进行调试。通过本文提供的代码示例和调试指南,开发者可以有效地遍历订单和支付行,准确识别并累加现金支付金额,同时也能掌握解决类似前端数据访问问题的通用方法。始终记住,当不确定对象结构时,debugger; 和控制台是你的最佳伙伴。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

557

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

394

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

754

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

478

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

1031

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

554

2023.09.20

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号