You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 16社区版sale.order的action_cancel调用无效求助

Odoo 16社区版取消销售订单状态未变更问题解决

问题场景

  • 调用sale.order的action_cancel方法后,仅返回打开取消确认窗口的动作,订单状态未变更:
    models.execute_kw(db, uid, password, 'sale.order', 'action_cancel', ['id'])
    
    返回响应:
    {
    "name": "Cancel Sales Order",
    "view_mode": "form",
    "res_model": "sale.order.cancel",
    "view_id": 1725,
    "type": "ir.actions.act_window",
    "context": {
    "default_use_template": true,
    "default_template_id": 29,
    "default_order_id": 14,
    "mark_so_as_canceled": true,
    "default_email_layout_xmlid": "mail.mail_notification_layout_with_responsible_signature",
    "model_description": "Sales Order"
    },
    "target": "new"
    }
    
  • 尝试调用sale.order.cancel的action_cancel方法时,报错'Record does not exist or has been deleted.':
    models.execute_kw(db, uid, password, 'sale.order.cancel', 'action_cancel', ['id'])
    

原因分析

Odoo 16社区版中,sale.order的action_cancel默认会触发取消确认向导(sale.order.cancel模型的弹窗),而非直接执行取消逻辑。直接调用该方法仅返回打开弹窗的动作,不会修改订单状态。而sale.order.cancel是临时模型,无预创建记录,直接调用其action_cancel必然报错。

解决方法

方式一:跳过确认向导直接取消

通过上下文参数跳过弹窗,直接执行取消逻辑:

models.execute_kw(db, uid, password, 'sale.order', 'action_cancel', [['实际订单ID']], {'context': {'skip_cancel_wizard': True}})

注意:将实际订单ID替换为目标销售订单的真实ID(如示例响应中的14),且ID需以列表形式传入。

方式二:直接更新订单状态

若订单满足取消条件(如未确认、未发货),可直接修改state字段:

models.execute_kw(db, uid, password, 'sale.order', 'write', [['实际订单ID'], {'state': 'cancel'}])

此方式更直接,但需确保订单当前状态允许取消(如不能是已完成状态),否则会触发Odoo状态校验报错。

补充注意事项

  • 确认订单ID准确性:避免使用占位符'id',替换为真实订单ID。
  • 权限检查:执行操作的用户需拥有销售订单的取消权限,否则会被Odoo拦截。

内容的提问来源于stack exchange,提问作者Tri Pandita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:45:24