新闻中心
Odoo 14 POS:深入理解订单与现金支付明细并高效调试

本教程旨在指导odoo 14 pos开发者如何准确读取销售会话中的订单及其现金支付明细,并计算总现金支付金额。文章将详细介绍odoo前端数据模型的访问方法,并着重强调利用浏览器开发者工具和`debugger`关键字进行运行时对象结构检查与调试的最佳实践,帮助开发者高效解决数据访问中的常见问题。
Odoo POS前端数据模型概述
在Odoo 14的销售点 (POS) 模块前端,所有活动会话中的订单数据都通过J*aScript对象进行管理。this.env.pos对象是访问当前POS环境和数据模型的核心入口。要获取当前会话中的所有订单,我们通常使用this.env.pos.get_order_list()方法。这个方法返回一个包含所有订单模型的数组。
每个订单模型 (order) 都包含其相关的支付信息,这些信息存储在order.paymentlines中。order.paymentlines是一个集合对象,其具体的支付行模型可以通过order.paymentlines.models属性访问。每一条支付行 (paymentLine) 模型则包含了支付金额、支付方式(如现金、银行卡等)的详细信息。
计算POS会话中的现金支付总额
我们的目标是遍历所有订单,找出其中的现金支付行,并累加其金额。以下是一个基本的实现思路:
- 获取所有订单列表:使用this.env.pos.get_order_list()。
- 遍历每个订单:对获取到的订单列表进行迭代。
- 遍历订单的支付行:对于每个订单,访问其paymentlines.models属性,并遍历其中的每一条支付行。
- 识别现金支付:检查支付行的支付方式是否为现金。在Odoo POS中,支付方式的类型通常通过paymentLine.cashregister.journal.type来判断。当其值为'cash'时,表示这是一笔现金支付。
- 累加金额:将符合条件的支付行的amount属性累加到总金额中。
以下是实现上述逻辑的J*aScript代码示例:
get totalCash() {
// 获取当前POS会话中的所有订单列表
const orders = this.env.pos.get_order_list();
let totalCash = 0;
console.log("订单列表: ", orders);
// 遍历每个订单
for (const order of orders) {
console.log("当前订单: ", 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);
}高效调试:深入理解对象结构
在开发过程中,尤其是在处理复杂的J*aScript对象模型时,我们可能会遇到无法正确访问对象属性的情况,或者console.log的输出未能完全展示对象的所有嵌套结构,导致对数据路径产生疑问。例如,console.log一个Backbone模型对象时,可能只会显示其顶层属性和内部的attributes对象,而非所有可直接访问的属性。
解决这类问题的最有效方法是使用浏览器开发者工具进行运行时调试。
Lateral App
整理归类论文
85
查看详情
使用 debugger; 关键字
在你的J*aScript代码中,可以在任何你想要暂停执行并检查变量状态的位置插入debugger;关键字。当代码执行到这一行时,如果你的浏览器开发者工具是打开的,它会自动暂停,并进入调试模式。
get totalCash() {
debugger; // 在此处设置断点,代码执行到此将暂停
const orders = this.env.pos.get_order
_list();
let totalCash = 0;
// ... 后续代码 ...
}利用浏览器开发者工具进行检查
- 打开开发者工具:在浏览器中,右键点击网页并选择“检查”(Inspect),或使用快捷键 Ctrl+Shift+I (Windows/Linux) / Cmd+Option+I (Mac)。
- 导航到“Sources”(源代码)标签页:在这里你可以看到你的J*aScript文件。
- 触发代码执行:执行POS操作,使totalCash方法被调用。
-
检查作用域和变量:当代码因debugger;暂停时,在开发者工具的右侧面板中,你会看到“Scope”(作用域)或“Variables”(变量)区域。这里会列出当前作用域内的所有变量及其值。
- 你可以展开orders、order、paymentLine等变量,层层深入地查看它们的内部结构和属性。
- 例如,对于paymentLine对象,你可以观察它是否有一个cashregister属性,cashregister下是否有journal,以及journal下是否有type。这能帮助你确认paymentLine.cashregister.journal.type这样的访问路径是否正确。
- 在“Console”(控制台)标签页中,你也可以直接输入变量名(例如paymentLine)并按回车,来交互式地检查其属性。
通过这种方式,你可以清晰地看到每个对象的真实结构,包括其嵌套属性,从而准确地确定正确的属性访问路径。在确认了paymentLine.cashregister.journal.type和paymentLine.amount是正确的访问路径后,上述代码即可正常工作。
注意事项与最佳实践
- 数据可用性检查:在访问嵌套属性时,最好进行空值或未定义检查,以防止运行时错误。例如,if (paymentLine.cashregister && paymentLine.cashregister.journal && paymentLine.cashregister.journal.type === 'cash') 比 if (paymentLine.cashregister.journal.type === 'cash') 更健壮。
- 性能考量:对于大型POS会话,订单和支付行数量可能很多。虽然上述遍历方法通常足够高效,但在极端情况下,考虑是否有更优化的数据查询或聚合方式。
- Odoo版本兼容性:Odoo前端的数据模型和API在不同版本之间可能存在细微差异。本教程基于Odoo 14,在升级或降级时请注意验证相关API。
- 代码可读性:使用有意义的变量名和适当的注释,提高代码的可读性和可维护性。
总结
在Odoo 14 POS中读取订单和支付明细,特别是计算现金支付总额,是常见的开发需求。通过this.env.pos.get_order_list()获取订单,并迭代order.paymentlines.models来访问支付行,结合paymentLine.cashregister.journal.type判断支付方式,可以有效地实现这一功能。
更重要的是,当遇到数据模型访问问题时,应充分利用浏览器开发者工具的debugger;功能。它能提供运行时对象结构的清晰视图,帮助开发者快速定位并解决属性访问路径不准确的问题,从而提高开发效率和代码质量。掌握这些调试技巧是Odoo前端开发不可或缺的一部分。
以上就是Odoo 14 POS:深入理解订单与现金支付明细并高效调试的详细内容,更多请关注其它相关文章!
# 这一
# pagerank 和seo的区别
# 东阳关键词排名优化软件
# 天津网站竞价优化
# 厦门网站核心词优化
# 网页被动seo
# 网站建设模版社区
# 雾霾网站建设
# 成都营销型网站推广服务
# 产科推广营销创意
# 药店营销推广策略分析
# 构建一个
# 这是
# 的是
# 执行情况
# 用在
# linux
# 是一个
# 你可以
# 支付方式
# 遍历
# 数据
# 常见问题
# win
# 前端开发
# mac
# 工具
# 浏览器
# windows
# 前端
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
yy漫画网页版官方入口_yy漫画官网登录页面链接
VS Code远程开发时如何处理文件权限问题
星露谷物语官网入口 星露谷物语游戏官网入口
C#中解析不规范的HTML为XML 常见的坑与解决办法
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】
微信商城在哪里打开【步骤】
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
深入理解J*a合成构造器:何时以及为何阻止其生成
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
解决移动端滚动问题的overflow属性应用指南
J*a中实现Go语言select通道多路复用机制
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
PySpark中从现有列右侧提取可变长度字符创建新列的教程
高德地图沿途添加点失败如何解决 高德多点规划方法
支付宝如何设置安全保护_支付宝安全设置的全面教程
AO3最新入口2025公告_AO3中文官网合集
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
4399免费游戏网址入口 4399小游戏免费入口点开即玩
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
在React函数组件中利用原生HTML5进行邮箱地址验证
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
uc浏览器网页版入口 uc浏览器网页版最新网址
Golang如何使用context实现超时取消_Golang context超时取消模式实践


2025-12-05
浏览次数:次
返回列表
_list();
let totalCash = 0;
// ... 后续代码 ...
}