如果把 Google Reserve 理解成“把 Odoo 预约同步到 Google”,你会完全看错这套模块。enterprise/appointment_google_reserve/models/appointment_type.py 和 controllers/google_reserve.py 说明,它真正管理的是一个外部预订平台与本地预约引擎之间的持续对账关系:时段要同步、容量要匹配、预订更新要回写、失败原因要可解释。
一、接入前就先收紧了 appointment type 资格
appointment_type.py 里有 _check_appointment_category_for_google_reserve()、_check_google_reserve_fields()、_compute_is_auto_assign() 等检查。这不是形式主义,而是在告诉你:不是所有 appointment type 都有资格接到 Google Reserve。
企业对接时,最常见的错误是本地预约模型设计很随意,等接外部平台时才发现字段、容量、资源口径根本不兼容。Odoo 这里选择在启用前先做资格约束。
二、slot sync 不是“把日历发出去”,而是把可用性逻辑翻译给外部平台
_google_reserve_get_availabilities()、_google_reserve_format_slot_availabilities_users()、_google_reserve_format_slot_availabilities_resources() 负责把本地预约引擎算出的可用时段翻译成 Google Reserve 能理解的 availabilities feed。
这一步最难的地方在于容量口径:
- staff 型预约更多看某个员工有没有空;
- resource 型预约则要看资源容量、是否可共享、能否组合。
所以 slot sync 不是导出一个日历视图,而是导出一套经过业务规则处理的“可预约声明”。
三、真正的难点在 capacity rules
测试文件把这件事讲得很透。无论是 SLOT_UNAVAILABLE 还是 USER_OVER_BOOKING_LIMIT,本质都说明 Odoo 在保护本地容量模型不被外部平台随便冲破。
特别是 combinable resource 场景,系统不是只问“有没有空桌”,而是会根据多条 booking line、资源 capacity、shareable 与 reserved/used 容量去重算。这就是为什么一笔 booking 更新后,可能需要拆分或重组选用的资源。
四、booking reconciliation 是这套集成的真正核心
google_reserve_booking_create()、google_reserve_booking_update() 以及相关测试说明,Google Reserve 对接不是单向创建而已。预订创建、改期、改人数、取消,都要在 Odoo 本地重新验证,并把最终结果再回传给 Google。
这就是对账:
- 外部平台说“我要订这个时段、这个人数”;
- 本地系统重新按自己的规则验一遍;
- 成功则创建/更新 booking;
- 失败则返回明确 cause,而不是悄悄丢单。
如果没有这层 reconciliation,任何一边的数据变化都可能让另一边失真。
五、pending sync 机制说明同步是持续动作,不是一次性上线动作
在 API 测试里,容量改动、资源改动、启停开关都会让 google_reserve_pending_sync 变成 True。这一点很有企业味:外部平台接入不是“上线那天同步成功”就结束了,而是每次资源与容量结构变化后,都可能需要重新同步可用性。
六、实战建议
- 先把本地 appointment 的资源/容量模型理顺,再谈接 Google Reserve;
- 对所有失败原因建立监控,尤其是
SLOT_UNAVAILABLE与USER_OVER_BOOKING_LIMIT; - 上线后别忘了盯
google_reserve_pending_sync,它经常比客服投诉更早暴露问题。
七、结论
Odoo 企业版 Google Reserve 的难点,从来不是把预约“同步出去”,而是让外部可预约声明、本地容量规则和实际 booking 在持续变化中保持一致。只有把它当成一套对账系统来理解,你才不会在接入后被各种边界问题打懵。
主要源码锚点:
enterprise/appointment_google_reserve/models/appointment_type.pyenterprise/appointment_google_reserve/controllers/google_reserve.pyenterprise/appointment_google_reserve/tests/test_appointment_google_reserve_controller.pyenterprise/appointment_google_reserve/tests/test_appointment_google_reserve_api.py
DISCUSSION
评论区