Odoo 14的POS模块中,支付明细是记录每一笔POS交易支付信息的重要数据,包含支付方式、支付金额、支付状态等核心内容,无论是做业务对账还是排查支付异常,都需要掌握获取和调试这些明细的方法。

Odoo 14 POS支付明细的存储逻辑
POS会话的支付明细主要存储在两个核心模型中,分别是pos_payment和pos_payment_method。pos_payment记录单笔支付的具体信息,pos_payment_method记录支付方式的基础配置。两者的关联字段为payment_method_id,同时pos_payment通过pos_session_id字段关联到对应的POS会话。
支付明细的核心字段包括:
- pos_session_id:所属POS会话的ID
- payment_method_id:支付方式ID
- amount:支付金额
- state:支付状态,可选值为draft、done、cancel
- transaction_id:第三方支付的交易流水号
获取POS会话支付明细的方法
后端模型查询方式
在Odoo 14的后端代码中,可以直接通过ORM查询pos_payment模型获取指定会话的支付明细。以下是查询指定会话ID为1的所有支付明细的示例代码:
# 查询POS会话ID为1的所有支付明细
from odoo import api, models
class PosPaymentQuery(models.Model):
_name = 'pos.payment.query'
_description = 'POS支付明细查询'
def get_payment_details(self, session_id):
# 搜索对应会话的支付记录
payment_records = self.env['pos.payment'].search([
('pos_session_id', '=', session_id)
])
# 整理返回数据
result = []
for record in payment_records:
result.append({
'payment_id': record.id,
'payment_method': record.payment_method_id.name,
'amount': record.amount,
'state': record.state,
'transaction_id': record.transaction_id
})
return result
# 调用示例,查询会话ID为1的支付明细
query_obj = self.env['pos.payment.query'].create({})
details = query_obj.get_payment_details(1)
print(details)
前端接口调用方式
在POS前端界面中,可以通过调用Odoo的JSON-RPC接口获取当前会话的支付明细。以下是前端获取当前会话支付明细的示例代码:
// 获取当前POS会话的支付明细
function getPosSessionPayments() {
// 获取当前会话ID,从POS的session对象中获取
const sessionId = window.posmodel.get('session_id');
// 调用后端接口查询支付明细
return window.odoo.rpc({
model: 'pos.payment',
method: 'search_read',
args: [
[['pos_session_id', '=', sessionId]],
['payment_method_id', 'amount', 'state', 'transaction_id']
]
}).then((payments) => {
console.log('当前会话支付明细:', payments);
return payments;
}).catch((error) => {
console.error('获取支付明细失败:', error);
});
}
// 调用函数
getPosSessionPayments();
支付明细调试的常见场景与方法
支付金额与实际不符
当支付明细中的金额和实际收款金额不一致时,可以先检查pos_payment的amount字段是否正确,再排查是否存在支付记录重复创建的情况。可以通过后端查询该会话下所有支付记录的创建时间,确认是否有重复提交的问题。
支付状态异常
如果支付状态一直停留在draft状态,没有变为done,需要检查支付流程中是否调用了pos_payment的action_done方法。以下是手动将支付记录状态改为done的调试代码:
# 手动修改支付记录状态为done,仅用于调试
def fix_payment_state(self, payment_id):
payment = self.env['pos.payment'].browse(payment_id)
if payment.state == 'draft':
payment.action_done()
return f'支付记录{payment_id}状态已更新为done'
return f'支付记录{payment_id}当前状态为{payment.state},无需修改'
支付明细缺失
如果某个会话的支付明细查询不到,先确认该会话是否已经关闭,未关闭的会话支付记录可能还未完全写入数据库。如果会话已经关闭但明细缺失,需要检查POS前端的支付提交逻辑,确认支付数据是否成功调用后端接口写入pos_payment模型。
注意事项
调试过程中不要直接修改生产环境的支付记录,建议先在测试环境复现问题后再进行操作。如果需要查看支付明细的原始数据,可以通过Odoo的开发者模式,直接查看pos_payment模型的数据列表,快速定位字段异常问题。