Automating Odoo ERP Operations with OpenClaw AI

Connect OpenClaw AI agents to Odoo ERP to automate purchase orders, inventory replenishment, vendor reconciliation, sales workflows, and financial operations.

E
ECOSIRE Research and Development Team
|2026年3月19日4 分钟阅读856 字数|

使用 OpenClaw AI 自动化 Odoo ERP 运营

Odoo 是一个综合性 ERP 平台,其模块涵盖从会计到制造再到人力资源的每个业务职能。但即使使用 Odoo 的内置自动化规则,大多数组织也只使用了可能的一小部分。 Odoo 附带的自动化规则是基于触发器和规则的,它们缺乏处理异常、适应上下文和做出多步骤决策的推理能力。 OpenClaw 填补了这一空白。

OpenClaw AI 代理与 Odoo 一起作为自主操作层。它们通过 Webhooks 使用 Odoo 事件,对数据执行多步推理,与 Odoo 的 JSON-RPC API 交互以创建、更新和查询记录,并以 Odoo 原生自动化无法做到的方式跨模块进行协调。其结果是 ERP 的运行方式更接近熟练的运营团队的运作方式:预测问题、解决异常情况并持续优化流程。

要点

  • OpenClaw 通过 JSON-RPC API 和 webhook 触发器与 Odoo 集成,无需修改 Odoo 源代码。
  • 采购自动化代理监控再订购点、生成询价、选择供应商并根据可配置规则和人工智能推理创建采购订单。
  • 供应商调节代理将供应商发票与采购订单和收据进行匹配,过帐匹配的发票并路由例外情况。
  • 库存优化代理分析需求模式并建议安全库存调整、重新订购数量和到期管理操作。
  • 销售管道代理监控机会、发送后续任务、更新预测类别并识别有风险的交易。
  • 所有代理操作在设计上都是可逆的 - 代理会记录它创建或修改的每个 Odoo 记录,并且能够撤消。
  • 多模块协调(例如,将销售订单短缺链接到采购订单和生产工作订单)由代理层本地处理。
  • ECOSIRE 的 OpenClaw Odoo 集成服务提供根据您的 Odoo 配置进行校准的预构建代理。

集成架构:OpenClaw 如何连接到 Odoo

OpenClaw 通过两种机制与 Odoo 集成:

Webhook 事件:Odoo 的自动操作可以在记录创建/更新/删除事件上触发 HTTP webhook。 OpenClaw 的事件监听器订阅这些 webhook 并将事件路由到适当的代理。这是实时的、事件驱动的路径。

JSON-RPC 轮询:对于指标、仪表板和计划的自动化,OpenClaw 直接轮询 Odoo JSON-RPC API。这是预定的、读取量很大的路径。

// Odoo tool definition for OpenClaw
export const OdooTool = defineTool({
  name: "odoo",
  type: "json-rpc",
  endpoints: {
    authenticate: "/web/session/authenticate",
    call: "/web/dataset/call_kw",
    search: "/web/dataset/call_kw/search_read",
  },
  auth: {
    type: "session",
    database: process.env.ODOO_DB,
    username: process.env.ODOO_USERNAME,
    apiKey: "${ODOO_API_KEY}", // Secrets manager reference
  },
});

// Generic Odoo search_read wrapper
async function odooSearchRead(tool, model: string, domain: any[], fields: string[], limit = 100) {
  return tool.call({
    model,
    method: "search_read",
    args: [domain],
    kwargs: { fields, limit },
  });
}

Odoo API 密钥(在“设置”>“技术”>“允许的 API 密钥”中生成)存储在 Vault 中,并且永远不会出现在代码或配置文件中。


采购自动化代理:智能采购

手动采购速度慢且容易出错。再订购点发出一封电子邮件,买家三天后查看,向三个供应商发送报价请求,等待一周的回复,手动创建采购订单,工厂在这期间缺货。采购自动化代理将其压缩到几分钟。

代理工作流程:

  1. 监控再订购点:订阅 Odoo 库存事件。当产品的现有数量低于再订购点(考虑到已订购的在途数量)时,代理将触发采购序列。

  2. 计算最佳订单数量:超越最小-最大计算。考虑当前的需求趋势、即将确认的销售订单、季节性因素和供应商交货时间来确定正确的数量,而不仅仅是最小数量。

  3. 供应商选择:在Odoo中查询供应商价目表和交货时间数据。对于拥有多个批准供应商的产品,请根据当前价格、可用性、交付绩效历史记录(从过去的收据中提取)和最小订购数量进行选择。

  4. 创建 RFQ 或直接 PO:对于具有当前价格协议的已建立供应商,直接创建采购订单。对于没有价格协议的新供应商或产品,创建询价并通过电子邮件发送,然后监控响应。

export const AutomateProcurement = defineSkill({
  name: "automate-procurement",
  tools: ["odoo", "email"],
  async run({ input, tools }) {
    const product = await odooSearchRead(
      tools.odoo, "product.product",
      [["id", "=", input.productId]],
      ["id", "name", "qty_available", "reorder_min_qty", "seller_ids", "route_ids"]
    );

    if (!product.length) throw new SkillError("PRODUCT_NOT_FOUND");

    const p = product[0];
    const transitQty = await getInTransitQty(tools.odoo, input.productId);
    const confirmedDemand = await getConfirmedDemand(tools.odoo, input.productId, { days: 60 });

    const orderQty = calculateOptimalOrderQty({
      currentStock: p.qty_available + transitQty,
      confirmedDemand,
      safetyStock: p.reorder_min_qty,
      vendorLeadTime: await getVendorLeadTime(tools.odoo, input.productId),
    });

    const bestVendor = await selectVendor(tools.odoo, input.productId, orderQty);

    if (!bestVendor) {
      return { action: "RFQ_NEEDED", reason: "No vendor with current price agreement" };
    }

    // Create Purchase Order
    const po = await tools.odoo.call({
      model: "purchase.order",
      method: "create",
      args: [{
        partner_id: bestVendor.partnerId,
        order_line: [[0, 0, {
          product_id: input.productId,
          product_qty: orderQty,
          price_unit: bestVendor.price,
          date_planned: addDays(new Date(), bestVendor.leadTimeDays),
        }]],
      }],
    });

    return { poId: po, orderQty, vendorId: bestVendor.partnerId };
  },
});

供应商发票调节代理

三向匹配(发票与采购订单与收货)是劳动密集型的应付账款流程之一。调节代理会自动处理 85% 以上的完全匹配的发票,将例外情况留给人工审核。

匹配逻辑:

  1. 从文档或 EDI 源中提取发票数据(供应商、发票编号、金额、行项目)。
  2. 使用发票参考号或供应商 + 日期 + 金额启发式在 Odoo 中查找匹配的采购订单。
  3. 查找 PO 的关联收货。
  4. 将发票行项目与采购订单行和收货数量进行比较。
  5. 如果金额在容差范围内匹配(可配置,通常为 2%),则自动过帐供应商账单。
  6. 如果存在差异,请创建草稿状态的账单,并注释不匹配之处以供 AP 团队审核。
export const ReconcileVendorInvoice = defineSkill({
  name: "reconcile-vendor-invoice",
  tools: ["odoo"],
  async run({ input, tools }) {
    // Find matching PO
    const pos = await odooSearchRead(
      tools.odoo, "purchase.order",
      [["name", "=", input.poReference], ["state", "in", ["purchase", "done"]]],
      ["id", "order_line", "amount_total", "partner_id"]
    );

    if (!pos.length) {
      return { matched: false, reason: "PO_NOT_FOUND", action: "ROUTE_TO_AP_TEAM" };
    }

    const po = pos[0];
    const amountVariance = Math.abs(po.amount_total - input.invoiceTotal);
    const variancePct = amountVariance / po.amount_total;

    if (variancePct > 0.02) {
      // Create draft bill with mismatch annotation
      await tools.odoo.call({
        model: "account.move",
        method: "create",
        args: [{
          move_type: "in_invoice",
          partner_id: po.partner_id[0],
          invoice_origin: po.name,
          ref: input.invoiceNumber,
          state: "draft",
          narration: `RECONCILIATION MISMATCH: Invoice total ${input.invoiceTotal} vs PO total ${po.amount_total} (variance: ${(variancePct * 100).toFixed(1)}%)`,
        }],
      });
      return { matched: false, variancePct, action: "DRAFT_BILL_CREATED_FOR_REVIEW" };
    }

    // Post the bill
    const bill = await tools.odoo.call({
      model: "account.move",
      method: "create",
      args: [{
        move_type: "in_invoice",
        partner_id: po.partner_id[0],
        invoice_origin: po.name,
        ref: input.invoiceNumber,
        invoice_line_ids: buildInvoiceLines(input.lineItems, po.order_line),
      }],
    });

    await tools.odoo.call({ model: "account.move", method: "action_post", args: [[bill]] });

    return { matched: true, billId: bill, variancePct };
  },
});

库存优化代理

当需求模式发生变化时,静态再订购点和安全库存值就会变得错误。库存优化代理持续分析需求数据并提出调整建议。

该代理每周运行并分析库存中的每种产品:

需求预测:根据过去 52 周的销售/消费数据计算平均每周需求和标准差。对具有季节性需求模式的产品应用季节性调整。

安全库存优化:使用服务水平目标(可按产品类别配置)和需求变化来计算统计上的最佳安全库存。需求变化较大的产品需要更多的安全库存;需求稳定、可预测的产品需求较少。

再订购点建议:安全库存加上交货期内的需求等于建议的再订购点。该代理会将建议值与当前 Odoo 值进行比较,并标记显着偏差以供审查。

到期管理:对于易腐烂的产品,识别即将到期的物品并创建操作:转移到移动速度更快的位置、标记降价或创建处置订单。


销售管道自动化代理

销售管道代理是 Odoo CRM 之上的 CRM 自动化层。它监控机会阶段,识别已经平静的交易,向客户经理发送后续任务,根据参与信号调整概率分数,并在预测中标记有风险的机会。

export const MonitorSalesPipeline = defineSkill({
  name: "monitor-sales-pipeline",
  tools: ["odoo"],
  async run({ input, tools }) {
    const staleOpportunities = await odooSearchRead(
      tools.odoo, "crm.lead",
      [
        ["type", "=", "opportunity"],
        ["stage_id.name", "not in", ["Won", "Lost"]],
        ["date_last_stage_update", "<", addDays(new Date(), -14).toISOString()],
        ["probability", ">", 10],
      ],
      ["id", "name", "partner_id", "user_id", "expected_revenue", "probability", "date_last_stage_update"]
    );

    const actions = [];
    for (const opp of staleOpportunities) {
      // Create follow-up activity
      await tools.odoo.call({
        model: "mail.activity",
        method: "create",
        args: [{
          res_model: "crm.lead",
          res_id: opp.id,
          activity_type_id: 4, // Phone call type
          summary: `AI Alert: No activity for ${daysSince(opp.date_last_stage_update)} days`,
          user_id: opp.user_id[0],
          date_deadline: addDays(new Date(), 2).toISOString().split("T")[0],
          note: `This opportunity has had no stage movement or logged activity for ${daysSince(opp.date_last_stage_update)} days. Expected revenue: $${opp.expected_revenue.toLocaleString()}. Please review and update.`,
        }],
      });

      actions.push({ opportunityId: opp.id, action: "FOLLOWUP_ACTIVITY_CREATED" });
    }

    return { processed: staleOpportunities.length, actions };
  },
});

制造工单代理

对于使用 Odoo Manufacturing 的制造商,工单代理可以监控生产订单、检测瓶颈并采取纠正措施。

关键能力:

  • 产能监控:检查工作中心负载与可用时间的关系,并在导致延误之前标记过度分配。
  • 材料短缺检测:检查即将到来的生产订单的组件可用性。如果组件短缺,则自动触发采购订单或仓库间转移。
  • 工作订单排序:对于工作中心队列,建议最佳排序以最小化设置时间并最大化吞吐量。
  • 质量升级:如果质量控制检查失败,代理将暂停工作订单,通知质量团队,并阻止批次进入下一阶段。

会计自动化:期末处理

Odoo Accounting 需要期末处理:银行对账单调节、应计费用、外币重估、折旧条目和期末结账。会计代理自动执行例行步骤。

银行对账:代理处理银行对账单导入,使用金额、日期和参考匹配将交易与 Odoo 日记帐分录进行匹配,并为不匹配的交易创建剩余分录。清洁饲料的匹配率通常超过 95%。

应计分录:根据配置的应计规则(预付费用、应计收入、未实现收入),代理生成下一期间的每月应计日记账分录和冲销分录。

外币重估:代理从外部汇率源检索当前汇率,计算所有未结外币余额的未实现收益/损失,并根据 IFRS/GAAP 规则过账重估分录。


常见问题

OpenClaw 是否需要更改 Odoo 的源代码或自定义 Odoo 模块?

不会。OpenClaw 完全通过 Odoo 的标准 JSON-RPC API 和 webhook 机制进行集成。不需要 Odoo 源修改、自定义模块或 OCA 依赖项。这意味着该集成适用于任何支持 JSON-RPC API (Odoo 14+) 的 Odoo 版本,并且无需修改即可在 Odoo 升级中继续存在。

代理如何处理Odoo访问控制和记录规则?

代理作为专用 Odoo 服务用户进行身份验证,并具有专门针对代理需求配置的角色。 Odoo 的访问控制列表 (ACL) 和记录规则适用于代理用户,就像适用于人类用户一样。如果代理尝试执行它没有权限的操作,Odoo 将返回一个访问错误,代理的错误处理程序会记录并升级该错误。这意味着您的 Odoo 安全模型仍然是访问控制的权威来源。

如果 Odoo 服务器在代理执行期间暂时不可用,会发生什么情况?

Odoo 工具定义具有带指数退避的重试逻辑。对于暂时性错误(HTTP 503、连接超时),代理最多重试 3 次,延迟时间分别为 5 秒、15 秒和 30 秒。对于持续失败,任务将被路由到死信队列,并向运营团队发送警报。进行中的任务数据不会丢失,因为代理的工作内存会在重试尝试中保留任务状态。

代理可以代表特定用户在 Odoo 中创建记录吗?

是的。如果服务帐户具有必要的权限,Odoo JSON-RPC API 通过 uid 参数支持基于上下文的用户模拟。这允许代理创建的采购订单显示为负责该产品类别的买家创建的订单,从而在 Odoo 中保留审核跟踪和通知路由。是否模拟或使用服务帐户身份是 ECOSIRE 帮助客户根据其审核要求做出的政策决策。

集成如何处理 Odoo 多公司配置?

对于多公司 Odoo 实例,代理清单包含公司映射配置。处理事件或进行 API 调用时,代理会在 Odoo 会话中设置适当的公司上下文。跨公司公司间交易(公司间采购、转移)由代理通过在每个公司的上下文中进行单独的 API 调用并链接结果记录来处理。


后续步骤

Odoo 是一个功能强大的平台,但当智能自动化层能够处理本机自动化规则无法处理的操作复杂性时,它就能充分发挥其潜力。 OpenClaw 代理缩小了 Odoo 可以跟踪的内容与您的运营团队需要执行的操作之间的差距。

ECOSIRE 的 OpenClaw Odoo 集成服务 提供针对您的 Odoo 模块进行校准的预构建代理、自定义工作流程自动化和持续优化。我们的团队在 OpenClaw 代理开发和 Odoo 功能配置方面拥有深厚的专业知识 - 我们连接这两个领域。

联系 ECOSIRE 讨论您的 Odoo 自动化需求并接收自定义实施计划。

E

作者

ECOSIRE Research and Development Team

在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。

通过 WhatsApp 聊天