新闻中心

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

2025-12-12
浏览次数:
返回列表

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

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

在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);
}

代码解析:

Ghiblio Ghiblio

专业AI吉卜力风格转换平台,将生活照变身吉卜力风格照

Ghiblio 157 查看详情 Ghiblio
  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前端开发中,理解和检查J*aScript对象的结构至关重要。当遇到“似乎找到了对象,但属性名称不对”的问题时,浏览器开发者工具是解决此类问题的最佳途径。

使用步骤:

  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; 和控制台是你的最佳伙伴。

以上就是Odoo 14 POS会话中准确读取现金支付总额的教程与调试指南的详细内容,更多请关注其它相关文章!


# java  # javascript  # 后端  # 工具  # 浏览器  # 前端  # js  # 关键词优化排名快速查询  # 南京网站推广威杏hfqjwl  # 南京网站营销推广外包  # 宁波临期商品网站建设  # 象中  # 是怎样  # 中文网  # 两位  # 是一个  # 支付方式  # 数据结构  # 你可以  # 遍历  #   # 作用域  # 数据访问  # ai  # 前端开发  # mac  # 泰兴抖音seo系统价格  # 优化网站需火19星服务  # 谷歌seo就是竞价么  # seo推广都有哪些渠道  # 肇庆大型网站建设  # 洛阳抖音营销推广排名 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Lar*el DB::listen 事件中的查询执行时间单位解析  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  浏览器打开即用 美图秀秀网页版入口  AO3官方在线访问地址 Archive of Our Own最新镜像合集  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  百度网盘网页版入口 百度网盘网页版官方登录网址  Python模块化编程:有效管理依赖与避免循环引用  ArrayList与LinkedList操作复杂度详解:遍历与修改  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  Lar*el 8 多关键词数据库搜索优化实践  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  如何将HTML表格多行数据保存到Google Sheets  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  字由网在线版登录地址 字由网网页版安全入口  Go语言JSON解析深度指南:动态访问与结构体映射实践  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  多闪网页版在线观看免费入口_多闪官网访问入口  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  jQuery Mask 插件中实现电话号码固定前导零的教程  谷歌google账号注册详细步骤 谷歌账号注册官方教程  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  AO3最新官网入口公告_2025AO3镜像站实时查询方法  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  新手怎么开始学化妆 零基础化妆入门教程  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Win11怎么关闭快速启动_Win11彻底关机设置教程  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  mc.js免安装版 mc.js一键畅玩入口  iCloud登录入口网页版 苹果iCloud官网登录  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  Angular响应式表单:实现提交后表单及按钮的禁用与只读化 

搜索