先说结论
在 Odoo CRM 里,commercial_partner_id 和 partner_id 不是同一个语义层。
commercial_partner_id更像用户界面上的公司候选/预选;partner_id才是正式挂上的联系人或客户记录。
源码在 create() 里处理得很谨慎:
- 如果你只给了
commercial_partner_id,系统会拿 lead 的邮箱、电话和该公司做比对; - 若联系方式不一致,系统不会强行把
partner_id指向这家公司; - 它宁可只保留
partner_name,让你后续再确认。
这是一种典型的“宁可晚挂,也别错挂”。
一、为什么要把两个字段分开
真实销售场景里,销售常常只知道:
- 这条线索大概属于某家公司;
- 但联系人是谁还不完全确定;
- 或邮箱/电话看起来像外包、分支机构、个人号。
如果系统把“选了公司”直接等价成“正式挂到 partner”,风险很大:
- 把错误联系人绑定到老客户主数据;
- 后续同步地址、邮箱、电话时误伤主数据;
- 重复检测和归因都可能跟着偏。
所以 Odoo 先给你一个商业公司视角,再决定是否真的落链。
二、创建时到底检查了什么
在 create() 里,源码会对只提供 commercial_partner_id 的情况做检查。
关键判断是:
- lead 上有电话或邮箱;
- 且这些联系方式与商业公司的已知联系方式不一致。
一旦不一致,系统不会直接把 partner_id 指向这个商业公司。
而是:
- 保留
partner_name作为公司信息; - 等待后续人工确认或转化流程再处理。
这说明 Odoo 不是在追求“自动挂得越多越好”,而是在追求“别把错关系写死”。
三、为什么这和“联系人同步边界”是两回事
很多人会把它和 lead-partner 同步混在一起。
但这里讲的是建链前的保守策略:
- 先决定要不要认这个 partner;
- 再谈认了以后哪些字段同步。
如果第一步都错了,后面的同步再精细也没有意义。
四、这套设计最能避免什么坑
它主要避免三类事故:
- 把陌生联系人硬挂到老客户公司;
- 因为公司名相似就误认主数据;
- 后续 conversion 时误以为客户关系已经确认。
也正因为如此,用户有时会觉得: “我明明选了公司,为什么表单里没直接变成那个联系人?”
答案通常是:
因为源码在替你防止误绑。
五、排错顺序
当你发现 commercial_partner_id 没有自动落成 partner_id 时,先查:
- lead 上是否带了邮箱或电话;
- 这些联系方式和目标商业公司是否一致;
- 系统是否因此只保留了
partner_name; - 业务上是否本来就应该等后续转换或人工确认再落正式联系人。
一句话记忆
Odoo CRM 里的
commercial_partner_id更像“我猜你属于这家公司”,partner_id才是“我确认把你正式挂到这条客户主数据上”。
DISCUSSION
评论区