先说结论
Odoo 的采购提醒,不是“到点就给所有供应商发封邮件”。
在 /home/ubuntu/odoo-temp/addons/purchase/models/purchase_order.py 里,提醒链路至少同时看:
- 订单是否
purchase - 是否
acknowledged = False - 是否启用了
receipt_reminder_email - 计划收货日期是否到了“提前 X 天提醒”的窗口
- 订单是否不全是服务
所以:
采购提醒邮件的本质不是群发通知,而是围绕“供应商是否已确认收货承诺”做的节奏控制。
acknowledged 这个字段比很多人想的重要
源码里 purchase.order 有个字段:
acknowledged
帮助文本也写得很明确:它表示供应商已经确认收到了采购单。
这意味着 Odoo 在意的不是“邮件发没发”,而是:
- 供应商是否对这张采购单做过确认
一旦供应商已确认,这张单就不应该继续被当作“还需要催确认”的对象。
这就是提醒机制背后的业务语义。
_get_orders_to_remind() 怎样筛单
源码里的 _get_orders_to_remind() 很值得研究。它会筛出:
partner_id不为空state = 'purchase'acknowledged = Falsereceipt_reminder_email = True
然后还会过滤掉一种情况:
- 订单行全是
service
这说明 Odoo 认为:
- 对真正需要收货承诺的采购单,提醒才有意义
- 如果整张单都是服务,采购提醒不该简单套用实物到货逻辑
这跟前文讲的“服务采购收货语义不同”其实是一脉相承的。
提醒不是只看今天,而是看“提前几天”
_send_reminder_mail() 里还有一个很关键的判断:
date_planned - reminder_date_before_receipt == 今天
也就是说,提醒逻辑不是在到货当天才动,而是按供应商或订单设定的“提前几天”窗口发出。
这很像采购执行里的真实节奏:
- 不是等逾期了再追
- 而是在预期到货前先要一个确认
因此它更接近“催交确认”,不是“逾期报警”。
供应商和公司维度也参与了默认值传递
在 purchase.order 上,receipt_reminder_email 与 reminder_date_before_receipt 是根据供应商、公司维度算出来的。
在 res.partner 里,这两个字段又是 company_dependent。
这意味着:
- 同一个供应商
- 在不同公司下
- 可以有不同的提醒策略
这对于集团型、多公司采购特别重要,因为供应商协同习惯未必跨公司一致。
为什么很多团队会误配
最常见的误配有三类:
1)把提醒理解成“催到货”
其实源码更偏“催确认收货承诺”。
2)以为供应商确认和提醒无关
不对。acknowledged 正是提醒是否继续触发的重要开关。
3)把服务采购也纳入同样提醒节奏
源码已经明确表达:全服务单不应简单套这套逻辑。
实战排错建议
如果你发现提醒邮件没发,或者感觉发得不对,先查:
- 订单是否已在
purchase状态 acknowledged是否已经变成 Truereceipt_reminder_email是否启用reminder_date_before_receipt是几天date_planned是否刚好落在提醒窗口- 是否整张单都是服务
不要一上来就怀疑邮件模板。
一句话记忆
Odoo 采购提醒的重点不是“定时发邮件”,而是“在到货前,对尚未确认的采购承诺做节奏化跟进”。
DISCUSSION
评论区