Odoo 集成指南:连接 SkyPlanner APS 生产排程
本指南面向 Odoo 合作伙伴、开发人员和 IT 负责人,介绍如何将 Odoo Manufacturing 连接到 SkyPlanner APS。如需了解集成的业务价值,以及 Odoo 的 Plan 按钮已有的功能,请阅读 Odoo 生产排程页面和《Odoo 是否支持生产排程?》。
产品、物料清单、工序、制造订单、库存和成本核算仍以 Odoo 中的记录为准。SkyPlanner 使用 Arcturus 引擎,根据这些数据生成排程。它与 Odoo 双向集成:
- 从 Odoo 导入制造订单、工单、BoM 工序、工作中心和采购订单。
- 将计划开始时间、结束时间和工作中心回写到
mrp.workorder。 - 将进度和已记录工时以 Odoo Time Logs 的形式回传。
- 排程一有变化,SkyPlanner webhook 就会推送更新。
在上线准备期间,SkyPlanner 团队会通过 Odoo 的标准外部 API 配置集成,适配您的版本、托管方式和定制内容,并在上线后提供支持。本指南面向希望参与集成的合作伙伴和开发人员,也适用于希望自行基于 SkyPlanner 已公开文档的 REST API 进行开发的团队(API 参考)。产品、物料和采购订单的处理方式见公开的 SkyPlanner 文档。
第零步:确认 Odoo 套餐和托管方式
先确认客户使用的是哪种 Odoo 配置,再据此选择集成路径。
| 部署配置 | 外部 API | 自定义模块 | 可行路径 |
|---|---|---|---|
| Odoo Online,One App Free 或 Standard 套餐 | 不支持 | 不支持 | 使用 CSV/XLSX,或升级到 Custom 套餐 |
| Odoo Online,Custom 套餐 | 支持 | 不支持 | 外部 API |
| Odoo.sh(Custom 套餐) | 支持 | 支持 | 外部 API,可选配模块 |
| 本地部署,Community 或 Enterprise 版 | 支持 | 支持 | 外部 API,可选配模块 |
Odoo 的 API 文档明确说明,外部 API 访问权限“only available on Custom Odoo pricing plans”(仅适用于 Odoo Custom 套餐),One App Free 和 Standard 均不提供。其定价页面说明,Standard 托管于 Odoo Online,“without custom modules”(不支持自定义模块)。这些问题应在需求调研阶段确认,不要等到开发进行了一半才问。
Odoo 的集成选项
| 集成方式 | 版本 | 身份验证 | 在排程集成中的用途 |
|---|---|---|---|
外部 JSON-2 API:POST /json/2/<model>/<method> | 19.0 新增 | 在 Authorization: bearer <key> 中传入 API 密钥,可选用 X-Odoo-Database 请求头 | 新建集成的默认选择:用 search_read 读取数据,用 write 回写日期 |
外部 XML-RPC / JSON-RPC:/xmlrpc/2、/jsonrpc,服务为 common、object | 截至 19.0 仍可用;已计划移除 | 使用登录名及密码或 API 密钥调用 common.authenticate,然后调用 execute_kw | 使用 16.0 至 18.0 的客户必须采用此方式 |
| 模块中的自定义控制器 | 所有版本 | 按路由设置,例如 auth='bearer' | 合并传输数据:一次调用传输生产订单及其工单 |
| 自动化规则:“Send Webhook Notification”(发送 Webhook 通知) | 自 17.0 起在文档中提供说明 | 向外部 URL 发送 POST 请求 | 创建或编辑生产订单和工单时推送 |
| 导入记录(CSV、XLSX)及导出 | 所有版本 | 用户会话 | 试用数据和一次性主数据导入 |
现在就为接口移除做好准备。Odoo 已计划移除 XML-RPC 和 JSON-RPC,涉及 Odoo 22(2028 年秋季)和 Odoo Online 21.1(2027 年冬季)。针对 19.0,应基于 JSON-2 开发;针对旧版数据库,应将 RPC 调用封装在一个适配器中,这样升级时只需改动一处。使用 @route(type='jsonrpc') 的自定义控制器不受此次移除影响。
身份验证
创建专用集成用户,授予 Manufacturing 和 Inventory 的读取权限,以及工单的写入权限。在 Preferences > Account Security > New API Key 下为该用户生成密钥。19.0 版本的密钥有效期最长为三个月,因此中间件需要支持密钥轮换,并在身份验证失败时发出告警。否则,密钥过期会导致同步停止,却无人察觉。SkyPlanner 端的 REST API 使用 JWT,因此中间件需要保管两端的凭据。
每次 JSON-2 调用都在独立的 SQL 事务中运行,因此跨多次调用的写入操作不具备原子性。应按工单逐一写入,并记录每次结果。
事件
Odoo 通过自动化规则推送变更。在 mrp.production 或 mrp.workorder 上设置规则,将触发条件设为创建和编辑时,操作设为“Send Webhook Notification”(发送 Webhook 通知),即可向指定 URL 发送包含所选字段的 POST 请求。可在 Studio 中创建规则,也可在开发者模式下通过自动化规则表单创建。同时应定期使用 search_read 按 write_date 轮询,补齐导入的数据以及规则遗漏的变更。反向传输时,SkyPlanner webhook 会在排程和状态发生变化时即时推送。
不同版本的字段名称有所差异。在 19.0 中,每个数据库都通过 /doc 列出自身的模型、字段和方法;旧版则需调用 fields_get。应以这些信息为依据建立映射,不要凭记忆。
数据映射:从 Odoo 到 SkyPlanner
| Odoo 模型 | SkyPlanner 对象 | 传输方向 | 同步频率 |
|---|---|---|---|
product.product / product.template (default_code, uom_id, qty_available) | 产品或物料 | Odoo → SkyPlanner | 首次导入,之后每天或发生变更时同步 |
mrp.bom (product_tmpl_id, product_qty, produce_delay), mrp.bom.line (product_id, product_qty, operation_id), mrp.bom.byproduct | 多层级产品、各工序的物料需求 | Odoo → SkyPlanner | 发生变更时 |
mrp.routing.workcenter(工序选项卡:workcenter_id、sequence、time_mode、time_cycle_manual、blocked_by_operation_ids) | 工序及其顺序和加工时长 | Odoo → SkyPlanner | 发生变更时 |
mrp.workcenter (resource_calendar_id, time_efficiency, time_start, time_stop, alternative_workcenter_ids) | 工作中心、效率、准备与清理、备选工作中心 | Odoo → SkyPlanner,之后在 SkyPlanner 中维护 | 首次导入 |
mrp.workcenter.capacity (capacity) | 每周期产出件数、各产品的准备和清理时间 | Odoo → SkyPlanner | 首次导入 |
resource.calendar, resource.calendar.attendance, resource.calendar.leaves | 班次和休假 | Odoo → SkyPlanner | 首次导入,休假数据发生变更时同步 |
mrp.production (product_id, product_qty, date_deadline, priority, state, workorder_ids) | 订单及其交期和优先级 | Odoo → SkyPlanner | 确认时通过 Webhook 推送,并配合轮询 |
mrp.workorder (operation_id, workcenter_id, duration_expected, state) | 工作中心上的生产任务 | Odoo → SkyPlanner | Webhook 推送并配合轮询 |
stock.quant、stock.move(组件库存移动) | 现有库存和物料需求,用于物料驱动排程 | Odoo → SkyPlanner | 定时同步,例如每 15 至 60 分钟 |
purchase.order (partner_id, state), purchase.order.line (product_id, product_qty, date_planned, qty_received) | 采购订单和在途物料,按预计交货日期计为可用 | Odoo → SkyPlanner | 采购订单确认或编辑时通过 Webhook 推送,并配合相同的定时轮询 |
| 计划开始时间、结束时间和工作中心 | mrp.workorder.date_start, date_finished, workcenter_id | SkyPlanner → Odoo | 排程发生变更时,通过 SkyPlanner webhook 推送 |
| Mobile Confirmations、工时记录 | mrp.workcenter.productivity(Time Logs:workcenter_id、workorder_id、date_start、date_end、loss_id) | SkyPlanner → Odoo | 每次确认时 |
| 完工数量、工序完工状态 | 设置工单的 qty_producing,然后调用 button_finish;对生产订单调用 button_mark_done | SkyPlanner → Odoo,或在 Odoo Shop Floor 中完成 | 每次确认时 |
集成模式
先导入主数据。
先加载工作中心和日历,再加载产品、BoM 和引用工作中心的工序。在 30 天试用期间,也通过导出的 CSV 文件导入这些列表。Odoo 的导入导出工具可用于任何列表视图。
订单同步。
导入状态为 confirmed 和 progress 的生产订单及其工单。草稿生产订单不导入,或将其视为暂定需求。有独立物料清单的子装配件可作为单独的子生产订单传入,Odoo 会分别为各生产订单制定计划。将这些订单映射到 SkyPlanner 子产品,确保子装配件在上层产品开始生产前完工。
排程回写。
排程发生变化时,SkyPlanner webhook 会触发集成程序,程序随后调用 ORM 的 write 方法,更新每条受影响的 mrp.workorder 记录。在 Odoo 19.0 中,每张工单需要发送一次 JSON-2 请求:
“ POST /json/2/mrp.workorder/write Authorization: bearer <api-key> {"ids": [4711], "vals": {"date_start": "2026-11-03 06:00:00", "date_finished": "2026-11-03 09:30:00", "workcenter_id": 7}} “
JSON-2 按名称接收各个方法参数,以及 ids 和 context,因此 write(vals) 中的参数会作为 vals 键传入。在 16.0 至 18.0 中,同一调用通过 XML-RPC 或 JSON-RPC 执行,形式为 execute_kw(db, uid, key, 'mrp.workorder', 'write', [[4711], vals]);16.0 使用的键名则是 date_planned_start 和 date_planned_finished。日期时间统一使用 UTC。为确保正确写入,请遵守以下规则:
- 在同一次调用中发送两个日期。
- 仅在引擎选择了备选设备时才添加
workcenter_id。 - 只写入排程字段,绝不修改数量或 BoM。
写入日期后,Odoo 自身的工作中心预订时段会随之调整,因此 Odoo 的计划视图会显示 SkyPlanner 的排程。
将车间数据传回 Odoo。操作员在 SkyPlanner Mobile Confirmations 中记录作业。每次确认后,集成程序都会调用 create 方法,在 mrp.workcenter.productivity 中创建记录(JSON-2:向 POST /json/2/mrp.workcenter.productivity/create 传入 vals_list)。程序填入 workorder_id、workcenter_id、date_start、date_end,以及类型为 Productive 的 loss_id,工时和成本核算数据随即记入 Odoo。
工序完成后,集成程序会设置已生产数量,并对工单调用 button_finish。最后一张工单完成后,生产订单即可执行 button_mark_done。每次确认只提交一次,其 Odoo 记录 ID 会随 SkyPlanner 工时记录一同保存,因此 webhook 重试绝不会重复创建 Time Log。
使用 Enterprise Shop Floor 应用的工厂则采用相反的数据流向:SkyPlanner 读取工单状态和 qty_produced,生产发生变化时,Autopilot 会自动重新排程。
数据管理权。上线前应将以下规则明确记录下来:
| 数据 | 管理系统 |
|---|---|
| 产品、BoM、工序、数量、MO 状态 | Odoo |
| 工单顺序、开始和结束时间、工作中心选择 | SkyPlanner |
| 准备及换型时间矩阵、工具和操作人员要求、替代资源 | SkyPlanner |
| 工作中心日历和 Time Off | 由一个系统统一管理,在范围评估时确定 |
| Time Logs、库存和成本核算 | Odoo,接收 SkyPlanner 回传的报工数据 |
对于由 SkyPlanner 排程的 MO,计划员不再在 Odoo 中点击 Plan 和 Unplan。否则,Odoo 会自行预订时段,覆盖 SkyPlanner 的日期安排。
典型项目步骤
实施通常在上线准备启动后的数周内完成。在此之前,您可以将自己的 Odoo 数据导出为 CSV,进行 30 天免费试用。项目本身包括:
- 主数据映射:核对各版本的 Odoo 模型和字段(查看
/doc或调用fields_get)、计量单位,并明确由哪个系统维护日历和 Time Off。 - 数据整理:整理工作中心日历、Setup Time 和 Cleanup Time,并将 BoM 工序的时长设为 Fixed,而非 Computed。
- 首次加载:导入产品、工作中心及其日历、BoM 及其工序。
- 订单和采购订单同步:同步已确认和进行中的生产订单及其工单,以及
purchase.order明细行和相应的预计到货日期。 - 排程回写:将日期和工作中心写入
mrp.workorder,并在 Odoo 端轮换 API 密钥。 - 车间报工:将 Time Logs 和工单完工信息回传到 Odoo。
- 与现行计划并行测试,然后上线。
Odoo 常见陷阱
- 日期字段已更名。截至 16.0,
date_planned_start和date_planned_finished存储计划时间,date_start/date_finished存储实际时间。从 17.0 起,date_start和date_finished改为计划日期。将 16.0 项目的映射直接复制到 17+,会在没有提示的情况下把实际时间当作计划时间读取。 - 工单日期对应工作中心的占用时段。在 19.0 中,
date_start和date_finished这两个字段位于mrp.workorder上,其值根据工作中心日历中的一条resource.calendar.leaves记录(leave_id)计算得出。写入工单日期会更新该占用时段。切勿直接写入 leave 表。 - 工单一旦开工,就无法取消排程。当“Some work orders have already started”(部分工单已经开工)时,Odoo 会拒绝取消该生产订单的排程。回写时应跳过状态为
progress或done的工单,只调整尚未开工的工单。 - 工序时长会变动。设为 Computed 的工序会根据最近的工单(默认为 10 张)计算时长,并按 Time Efficiency 调整。试用时将其设为 Fixed,否则就要接受输入数据持续变化。工序分别维护在各个 BoM 中,没有共用的工艺路线主数据,因此每个 BoM 都需要单独整理。
- 日历配置有误。每个工作中心都需要工作时间日历。Odoo 自带的排程功能最多向后查找 700 天,之后便会停止并提示“Impossible to plan the workorder”(无法为该工单排程)。首次加载数据前,应先修正日历。
- 计量单位。
mrp.bom.line有自己的product_uom_id,可能与产品的库存单位不同。检查物料可用量之前,先换算单位。
谁来配置 Odoo 集成
每家工厂的 Odoo 配置都不同:BoM 工序、工作中心日历、替代工作中心和自定义模块各有差异。针对这些配置建立准确的数据映射,正是 SkyPlanner 团队的专长。
- 由 SkyPlanner 团队配置。团队会在上线准备期间根据您的 Odoo 配置完成集成,并在上线后提供支持。集成基于 SkyPlanner REST API、webhook,以及 Odoo 的 JSON-2 或 RPC API 运行。这是默认路径。
- 您的 Odoo 合作伙伴也可参与。合作伙伴熟悉您的配置和自定义模块,可以使用同一套 REST API 进行开发,并参考其文档。该 API 可读写订单、产品、物料、工序和工时记录,采用 JWT 身份验证,并提供 Swagger/OpenAPI 文档。
- 您的内部开发人员也可以采用同样的方式,通常是为 Odoo 配套开发轻量中间件,或在 Odoo.sh 或本地部署环境中开发模块。只需一个 API 密钥即可开始(集成教程),SkyPlanner 团队会在需要时提供协助。
同样的模式已在其他 ERP 的生产环境中运行。在 Laboratory & Allied,内部 IT 团队在 SkyPlanner 的协助下,基本独立完成了 SAP Business One 集成。使用 NetSuite 的 UTU 则将 SkyPlanner 与 ERP 配合运行。
集成为何能带来回报
回写让集成在日常工作中真正发挥价值。启用后:
- Odoo 工单中有了切实可用的排程日期。Arcturus AI 引擎可在数秒内为所有未结生产订单排序,并将日期和所选工作中心写入
mrp.workorder,直接显示在 Odoo 的计划视图中。 - 无需人工重新排程。生产发生变化时,Autopilot 会自动重新排程,webhook 则将新日期推送到 Odoo。
- 车间反馈形成闭环。操作人员使用手机或平板电脑,通过 Mobile Confirmations、Production Timer 和 Quick Log Mode 记录作业,Time Logs 随后回传到 Odoo,用于库存和成本核算。排程与执行在同一工具中完成,Community 和 Enterprise 版均可使用。
- 排程考虑了 Odoo 未涵盖的约束。准备时间矩阵按产品组合定义与加工顺序相关的换型时间。工装是设备之间共用的有限资源,一项生产任务也可能同时需要多名操作员。主要设备或人员不可用时,引擎会选用备选设备或人员。回写到
mrp.workorder的日期符合所有这些约束。 - 按物料到货情况排程。现有库存和 Odoo 中未结采购订单为物料驱动排程提供数据。已订购的组件在采购订单交货日期视为可用,采购订单标记为 Delivered 后,库存随之更新。每项生产任务都会核对仓库现有物料和在途物料。
在开展任何集成工作之前,您就可以评估排程效果。使用导出的 CSV 文件开启30 天免费试用,在甘特图上查看自己的 Odoo 工单,最多支持 20 个工作中心,无需信用卡。价格每月 199 € 起,包含 5 个工作中心,按月计费,可随时取消。集成费用会根据您的流程和需求,与所选套餐一并提前报价,让您在开始前了解全部费用。查看功能和客户案例,或预约演示。
制造企业对 SkyPlanner 的评价
2 h每周节省的时间
“SkyPlanner 让我们的生产计划从 Excel 表格迈向了实时生产优化。”
Kalle Kalliomäki,供应链专员
UTU · 配电盘与开关设备
生产计划工作每周节省 2 小时,新的作业队列几秒内即可下达到产线。
+90%生产效率提升
“生产效率提高了 90%。”
Abdul Rucyinga,IT 主管
Laboratory & Allied · 制药
生产效率提高了 90%,为所有工作中心编制覆盖三个月的优化计划,用时不到 30 分钟。
1,000s工单自动排程
“我们对生产的管控有了新的方式,对产能的了解也达到了全新的水平。”
Hannu Ryynänen,首席执行官
Mamec · 工业搅拌机、泵及高科技产品合同制造
数千份工单自动完成排程,全公司都能实时掌握生产情况。
99.2%准时交付率
“SkyPlanner 让生产瓶颈清晰可见,也让生产管理更加清楚有序。”
Toni Tuori,生产经理
Piristeel · 屋面安全设施与雨水系统
今年准时交付率达到了 99.2%,排程每天最多可节省四小时的工作时间。
常见问题
Odoo Online 支持这项集成吗?
Custom 套餐支持,可通过外部 API 实现集成。One App Free 和 Standard 均不提供外部 API 访问权限,而且 Standard 不支持自定义模块,因此这两种套餐只能通过 CSV/XLSX 导入和导出数据。
应该使用 JSON-2 还是 XML-RPC?
Odoo 19.0 及更高版本应使用 JSON-2。16.0 至 18.0 仍需使用 XML-RPC 和 JSON-RPC,但这两种接口计划在 Odoo 22 中移除。
如何将排程结果写回 Odoo?
通过 ORM 的 write 方法更新每条 mrp.workorder 记录:在 19.0 中,向 POST /json/2/mrp.workorder/write 传入 ids 和 vals;在 16.0 至 18.0 中,通过 XML-RPC 或 JSON-RPC 使用 execute_kw 调用 write。写入的字段为 date_start、date_finished(16.0 中为 date_planned_start 和 date_planned_finished),以及发生变化时的 workcenter_id。Odoo 会随之调整工作中心的占用时段,因此其计划视图会显示 SkyPlanner 的排程日期。
操作人员的报工信息如何传入 Odoo?
以 Time Logs 的形式传入:集成程序为对应工单创建 mrp.workcenter.productivity 记录,填入开始时间、结束时间,并将损失原因设为 Productive,然后在工序完成时调用 button_finish。每次确认只提交一次,因此重试不会造成工时重复记录。
上线后由谁维护集成?
SkyPlanner 团队会在上线准备期间配置集成,并在上线后提供支持;当您的 Odoo 配置发生变化时,也会相应调整集成。如果由您的合作伙伴或开发人员构建集成,他们可依据 REST API 文档和 SkyPlanner 文档开展工作,SkyPlanner 团队会在需要时提供协助。
已经开工的工单会如何处理?
写回时不要改动这些工单。一旦有工单正在执行或已经完成,Odoo 就不允许取消该生产订单(MO)的排程。SkyPlanner 会读取这些工单的状态和进度,在安排剩余工作时将它们纳入考虑。
Odoo 集成需要多长时间?
实施通常在上线准备启动后的几周内完成。先用导出的 CSV 数据进行 30 天试用,就能在 API 开发开始前,用您自己的 Odoo 数据验证排程效果。