电话侧栏最怕做成“看起来很聪明,实际上乱跳转”。销售接电话时,系统必须在几秒内决定:这通电话是新机会、老机会,还是一组历史机会?voip_crm 在这件事上做得很克制:它只暴露必要信息,并且把跳转逻辑做得很明确。
主要参考:
enterprise/voip_crm/models/res_partner.pyenterprise/voip_crm/models/voip_call.pyenterprise/voip_crm/tests/test_voip_crm_access_rights.py
一、机会计数不是默认公开数据
_voip_get_store_fields() 明确给 opportunity_count 加了 predicate,只有能读 crm.lead 的用户才会拿到这个字段。这个设计非常值得注意:电话 UI 虽然追求快,但企业版并没有因此牺牲权限边界。
换句话说,系统不会因为“这是个侧栏”就把销售机会数偷偷暴露给没权限的人。对企业来说,这种克制比炫技更重要。
二、0 / 1 / 多个机会,系统会走三种不同动作
get_view_opportunities_action() 的逻辑非常直白:
- 没有 partner:直接打开新建 opportunity,并带上默认电话;
- 有 partner 且
opportunity_count == 0:打开新建表单,并预填 partner; opportunity_count == 1:直接进入唯一那条 opportunity;- 多于 1 条:打开列表并带 domain。
这背后的业务含义是:电话场景最怕用户多想一步。系统宁可多写几段条件分支,也要把最可能的下一步直接准备好。
三、voip_call 只是桥,不是另一套 CRM 逻辑
voip_action_view_opportunity() 本质上还是调用 partner 侧的机会动作。它没有偷偷复制一套“电话版商机逻辑”,而是把电话上下文(例如来电号码)转交给已有 CRM 动作。
这类设计很稳健:真正的业务判断集中在 partner/action 层,电话模块只负责把用户带到正确入口。这样后续想改机会跳转规则,不必在多个模块里同时修补。
四、新手最容易忽略的边界
- 机会数不是纯展示字段,它本身就是权限敏感信息。
- 电话入口不是“总是打开列表”,而是根据机会数量做分流。
- 来电号码只有在没有 partner 时才更像“潜在线索起点”;一旦有 partner,系统会尽量复用既有客户上下文。
五、实战建议
- 如果销售反映电话侧栏跳错,不要先怪前端,先核对 partner 匹配和机会数量统计。
- 对混合权限团队,重点验证无 CRM 读权限用户是否仍能看到机会计数。
- 培训销售时说明:电话入口只是入口,最终仍要回到机会对象上维护上下文。
六、结论
voip_crm 的成熟之处,在于它没有把电话侧栏做成一个“绕过 CRM”的快捷通道,而是用机会数量、partner 上下文和读权限,把用户准确送到新建、单条或多条商机入口。快,但不越界,这才是企业版电话入口该有的样子。
DISCUSSION
评论区