先说结论
Odoo 官网上的“Find a Reseller / Contact a Partner”这类能力,背后不是一个简单的联系人分派规则。
website_crm_partner_assign 真正在做的,是把网站线索转成一套渠道分发逻辑:
- 先给线索补地理坐标;
- 再按国家和范围逐级找合适伙伴;
- 不只是找最近的,还会考虑
partner_weight; - 已经拒绝过该线索的伙伴会被排除;
- 若成功分配,还能把负责销售人同步过去;
- 门户伙伴还能继续在外部门户里更新这条线索状态。
所以这个模块更准确的定位是:
官网获客进入渠道伙伴网络时的一套路由与反馈机制。
一、为什么线索分配前先做地理定位
assign_partner() 之前,系统会先走 assign_geo_localize()。
如果线索没有现成的经纬度,但有国家、街道、城市、州、省等信息,Odoo 会尝试调用 _geo_localize() 补齐:
partner_latitudepartner_longitude
这说明官网线索在 Odoo 里,不只是“来自某个表单的文本”,而是尽量被转成一个可用于空间匹配的对象。
这一步很关键,因为后面的伙伴搜索并不是只看国家,而是优先看距离。
如果没有地理坐标,所谓“就近分配”很容易变成口号。
二、为什么搜索伙伴要分多轮扩大范围
search_geo_partner() 的逻辑非常值得细看。
当线索有经纬度时,系统不是一次全库搜索,而是逐级扩大范围:
- 同国 + 小范围
- 同国 + 更大范围
- 同国 + 更大一圈
- 同国全部可用伙伴
- 仍找不到时,再找全局最近的伙伴
虽然代码里序号注释有跳号,但产品意图很清楚:
先尽量找到“本地且相关”的伙伴,再逐步放宽条件,不是一上来就全局乱派。
这对伙伴网络管理很重要。
因为线索分配不是单纯找到一个能接单的人,而是要尽量兼顾:
- 地理覆盖;
- 服务半径;
- 国家边界;
- 客户期待的本地响应体验。
三、为什么不是“最近就一定中”,而是要乘上 partner_weight
即便找到一批候选伙伴,Odoo 最后也不是简单取第一条。
源码里用了:
random.choices(partner_ids.ids, partner_ids.mapped('partner_weight'))
这说明最终分配是一个带权随机过程。
这背后的业务含义很强:
- 伙伴能力可能不一样;
- 覆盖同一区域的伙伴可能不止一家;
- 平台希望保留调配空间,而不是完全固化成最近距离唯一命中。
也就是说,partner_weight 不只是排序分数,而是会真实影响被分配概率。
这让 Odoo 的伙伴分发更像渠道策略,而不是纯地理算法。
四、为什么“拒绝过的伙伴”必须排除
partner_declined_ids 会在搜索条件里被显式排除。
同时,当门户侧伙伴调用 partner_desinterested() 时,系统会:
- 取消当前分配的伙伴;
- 把该伙伴加入 declined 列表;
- 必要时打上 spam 标签;
- 保留消息记录。
这一步非常重要,因为它避免了一个常见的分配灾难:
同一条线索被系统反复派回给已经明确说“不接”的伙伴。
一旦出现这种循环,渠道关系会迅速恶化。
Odoo 显然意识到了这一点,所以把“拒绝反馈”做成了下一轮路由的硬条件,而不只是备注文字。
五、为什么分配成功后还要同步 salesman
在 assign_partner() 里,如果分配到的 partner 绑定了 user_id,系统会调用 _handle_salesmen_assignment()。
这意味着官网线索分发,不只是把一个伙伴名字挂在线索上,而是会尝试把后续负责销售人也带起来。
从业务角度看,这能减少两层断点:
- 渠道伙伴知道这是分给自己的;
- 具体销售责任人也更快进入后续跟进链路。
也就是说,分配不是终点,而是销售执行的起点。
六、为什么门户伙伴不是只能“看”,而是能回写状态
partner_interested()、partner_desinterested() 和 update_lead_portal() 说明门户用户并不只是被动查看线索。
在访问控制满足条件时,他们还能:
- 表示自己有兴趣;
- 表示不感兴趣;
- 说明是否已联系客户;
- 更新预期收入、概率、优先级、截止日期;
- 管理与自己相关的活动。
这反映出 Odoo 的思路并不是“官网线索派出去就结束”,而是:
官网入口、渠道分配与后续推进,要尽量跑在同一条记录上。
这会显著减少内部销售团队和伙伴网络之间的数据断层。
七、为什么“没有国家”会被当场提示
action_assign_partner() 会先把没有国家的线索挑出来,并发出 warning。
这说明国家不是一个可有可无的展示字段,而是伙伴分发的关键前提。
因为后面的优先搜索明确依赖同国范围。
如果官网表单采集不到国家,或者国家字段质量很差,分配质量就会明显下降。
这也提醒实施团队:
官网线索表单的字段设计,会直接影响分发策略能否落地。
八、实施时最容易踩的坑
1. partner_weight 从来不维护
这样系统虽然有带权分配能力,实际上却退化成近似随机或无差别分配。
2. 官网表单地址质量太差
没有国家、城市、街道,或者全靠自由文本,会让地理定位效果大打折扣。
3. 不重视 declined 反馈
如果伙伴拒绝只是口头反馈,不让系统记录,后面就容易重复派发。
4. 把伙伴分配和门户协同拆开看
其实这两个动作在模块里是一条链:分配只是开始,后续反馈才决定网络是否高效。
最后总结
website_crm_partner_assign 在官网侧真正做的是:
- 把线索转成可定位对象;
- 在地理和国家边界内逐层找候选伙伴;
- 用权重而不是单点最近原则做分发;
- 把拒绝反馈沉淀成下一轮路由约束;
- 把伙伴分配继续延展到销售人和门户协同。
所以它不是“官网表单自动派单”这么简单,而是:
Odoo 把官网获客、伙伴网络覆盖和后续跟进反馈串成的一套渠道路由系统。
理解了这一点,你就会明白为什么源码既写地理定位,也写权重抽样,还写门户回写——因为真正难的不是把线索交出去,而是把它交给更可能接得住、也更愿意继续推进的人。
DISCUSSION
评论区