第三方应用集成Odoo:创建订单成功后create_invoices无响应无报错
问题分析与修复方案
你的代码中订单创建功能正常,但调用sale.advance.payment.inv的create_invoices方法无反馈,主要是以下几个原因导致,对应修复方案如下:
1. 错误的订单确认判断逻辑
action_confirm方法返回的是动作字典而非布尔值,直接用if ($confirmOrder)判断并不准确。正确做法是调用后检查订单状态是否变为sale:
// 执行订单确认 $models->execute_kw($db, $uid, $password, 'sale.order', 'action_confirm', array(array($order_id))); // 检查订单状态 $order_info = $models->execute_kw($db, $uid, $password, 'sale.order', 'read', array($order_id, array('state'))); if ($order_info[0]['state'] !== 'sale') { echo "订单确认失败,当前状态:" . $order_info[0]['state']; exit; }
2. create_invoices方法调用方式错误
sale.advance.payment.inv是向导模型,create_invoices需要先创建向导记录,再针对该记录调用方法,而非直接传入参数:
修复后的发票生成代码:
// 1. 创建预付款向导记录 $wizard_data = array( 'sale_order_ids' => array(6, 0, array($order_id)), // 正确的many2many字段格式 'advance_payment_method' => 'delivered', 'deduct_down_payments' => true, ); $wizard_id = $models->execute_kw($db, $uid, $password, 'sale.advance.payment.inv', 'create', array($wizard_data)); if (!$wizard_id) { echo "创建预付款向导失败!"; exit; } // 2. 调用create_invoices生成发票 $models->execute_kw( $db, $uid, $password, 'sale.advance.payment.inv', 'create_invoices', array(array($wizard_id)), // 传入向导记录ID列表 array( "context" => array( 'active_model' => "sale.order", "allowed_company_ids" => array(1), 'active_ids' => array($order_id) ) ) ); // 3. 验证发票生成结果 $order_invoices = $models->execute_kw($db, $uid, $password, 'sale.order', 'read', array($order_id, array('invoice_ids'))); if (!empty($order_invoices[0]['invoice_ids'])) { echo "订单#$order_id 已成功生成发票,发票ID:" . implode(', ', $order_invoices[0]['invoice_ids']); } else { echo "生成发票失败!"; }
3. 其他排查方向
- 查看Odoo日志:若代码无报错但功能不生效,检查Odoo服务器日志(
odoo.log),可能存在权限不足、产品配置缺失等隐藏问题。 - 权限验证:确保调用接口的用户拥有销售订单确认、发票创建的权限。
- 订单字段完整性:补充
pricelist_id等必要字段,避免默认值缺失导致流程中断。
内容的提问来源于stack exchange,提问作者Ahmed hamuda
相关产品推荐
相关产品推荐

