先说结论
很多人把 Odoo 的 Chatter 只理解成“页面下面那块可以留言的地方”。
这理解太浅了。
更准确地说,mail.thread 和 mail.activity.mixin 是 Odoo 里非常核心的一层协同基础设施。
它们负责把业务对象从“静态记录”变成:
- 可跟踪
- 可通知
- 可分派待办
- 可保留过程痕迹
也就是说,它们不是装饰品,而是很多业务协同体验的地基。
为什么业务系统需要 Chatter
因为真实世界里的业务不是静态表单。
一张销售单、一张采购单、一条工单、一条线索,背后往往都伴随着:
- 谁改了什么
- 谁通知了谁
- 谁需要下一步跟进
- 哪个时间点发生了什么
如果系统只有字段值,没有过程痕迹,那协同成本会非常高。
于是 Odoo 引入了一套统一机制,让业务对象可以天然携带:
- 消息线程
- 关注者
- 字段变更追踪
- 活动待办
这就是 Chatter 体系的价值。
mail.thread 本质上带来了什么
当一个模型继承 mail.thread,最核心的变化不是“界面多了一块评论区”。
而是这个模型开始具备:
- 发消息和留痕的能力
- 关注者订阅能力
- 某些字段变更自动追踪能力
- 与通知系统挂钩的能力
换句话说:
mail.thread让业务对象具备了“可对话、可通知、可留痕”的属性。
这比“可以评论”重要得多。
mail.activity.mixin 又补了什么
如果说 mail.thread 偏向“发生了什么”,
那 mail.activity.mixin 更偏向“接下来该谁做什么”。
它引入的是任务推进视角:
- 给某人安排一个待办
- 设定截止日期
- 标注活动类型
- 做完后关闭或安排下一步
所以 Activity 不是聊天,它更像轻量流程驱动器。
这也是为什么 CRM、销售、审批、项目、帮助台这类模块特别爱用它。
为什么字段追踪这么实用
很多人一开始觉得“字段变更追踪”只是锦上添花。
实际项目做久了就知道,它非常值钱。
因为一旦业务对象多人协作,大家最常问的就是:
- 谁改了报价金额?
- 承诺日期什么时候变的?
- 阶段是谁推进的?
- 为什么今天状态和昨天不一样?
如果没有统一追踪,团队只能靠人回忆。
有了 Chatter 留痕,系统就能把“变化历史”沉淀在对象自己身上。
这就是协同效率差异的来源。
为什么 Activity 比“发消息提醒一下”更稳
因为消息容易飘,待办更有归属感。
发条消息只是说:
- 我提醒过了
但 activity 更像在说:
- 这件事明确轮到你
- 截止时间在这里
- 做完要闭环
所以在需要明确责任人的场景里,activity 往往比普通 chatter 消息更有效。
这也是很多定制开发里值得思考的一点:
有些场景该发 message,有些场景更该建 activity。
为什么很多模块都继承它们
因为这套机制很通用。
只要一个业务对象需要:
- 被多人协作
- 记录关键变化
- 跟踪沟通过程
- 指派后续动作
它就很适合接入 mail.thread / mail.activity.mixin。
所以你会在很多核心模型里看到它们,不只是 CRM。
这不是“界面统一风格”,而是 Odoo 对协同能力的一种平台化设计。
实战里最容易踩的 5 个坑
1. 把 chatter 只当 UI 区块
结果你没真正利用通知和留痕能力。
2. 什么都发消息,不区分是否应该建 activity
最后团队收到很多提醒,但没人真正负责。
3. 追踪字段配太多
每改一点小东西都刷屏,反而降低可读性。
4. 定制逻辑只改字段,不考虑协同反馈
业务变了,但相关人没被通知。
5. 把 Activity 当审批引擎硬用
它适合轻流程,不适合替代完整工作流引擎。
一套很实用的设计原则
如果你在做协同类定制,我建议这样想:
1. 重要状态变化,优先考虑是否需要追踪
别让关键变化悄悄发生。
2. 需要责任人闭环的事,优先考虑 activity
不要只靠留言。
3. Chatter 信息密度要克制
过多噪音会让真正重要的留痕被淹没。
4. 把业务对象当协同载体,不只是数据容器
这是 Odoo 和很多纯表单系统的区别。
一句话记忆法
把这套机制记成一句话:
mail.thread负责让业务对象可留痕、可通知、可协同,mail.activity.mixin负责把“下一步谁来做”这件事落下来。
理解这一句,你会更知道什么时候该用 message,什么时候该用 activity。
DISCUSSION
评论区