摘要: 很多技术团队接到 CRM 需求时,第一反应是“不就是增删改查吗”,结果上线后才发现这是个无底洞。客户公海池规则变来变去,权限控制细到字段级,报表性能慢到怀疑人生。本文不谈虚的理论,结合过往踩过的真实坑点,梳理 CRM 从设计到落地的核心流程,重点聊聊数据模型、权限体系以及性能优化。对于非核心业务,也别头铁硬写,适当选型能救命,比如前期可以参考悟空 CRM 的开源架构思路,能省不少建模时间。
刚入行那会儿,我也觉得 CRM 简单。不就是存个客户名字、电话,再记几条跟进记录吗?后来被销售总监追着骂了一个月,才明白这里的水有多深。
CRM 的核心不是“记录”,而是“流转”。客户从线索到成交,中间经过多少状态变更?公海池怎么回收?撞单了怎么判责?这些业务逻辑如果不在设计初期想清楚,后期改代码就是灾难。
很多团队容易犯的第一个错误,就是过度定制字段。销售今天想加个“客户身高”,明天想加个“ preferred 联系时间”。如果你顺着他们做,数据库表结构迟早变成 EAV(实体 - 属性 - 值)模型,查询性能直接崩盘。我的建议是,核心字段固化为列,非核心扩展字段用 JSON 存储,或者预留几个 reserve 字段应急,但千万别一上来就搞复杂的动态表单引擎,除非你是专门做 PaaS 平台的。
CRM 系统的数据一致性要求极高。你不可能接受销售 A 刚把客户状态改成“成交”,销售 B 那边还显示“跟进中”。
1. 客户与联系人的关系 别简单地把客户和联系人做成一对多。现实中,一个公司的多个联系人可能对应同一个客户主体,但有时候同一个联系人又可能在多个项目里出现。设计时最好将“客户主体”与“联系人”分离,中间通过关联表连接,并加上“首要联系人”标记。
2. 跟进记录的存储 跟进记录是写入最频繁的表。随着时间推移,这张表会迅速膨胀到千万级。
3. 公海池机制 这是最容易出逻辑漏洞的地方。规则通常是:N 天未跟进自动落入公海。
如果说数据模型是骨架,权限系统就是 CRM 的神经系统。普通的 RBAC(基于角色的访问控制)在 CRM 里往往不够用。
1. 数据权限的 granularity(粒度)
销售只能看自己的客户,经理能看全组的,总监能看全公司的。这还好办,难的是“字段级权限”。比如,普通销售看不到客户的“成交底价”,只有经理能看。
实现方案通常是在查询层做拦截。MyBatis 拦截器或者 AOP 切面是常用手段,在 SQL 拼接阶段自动注入 WHERE owner_id = current_user_id 这样的条件。但要注意,别把代码耦合得太死,否则换个数据库驱动都得改半天。
2. 协作与共享 CRM 里常有“协作”功能,A 销售把客户共享给 B 技术支援。这时候权限怎么算?
resource_id, user_id, permission_level。查询时通过 UNION 将自有数据和共享数据合并。虽然 SQL 稍微复杂点,但逻辑清晰,后期好维护。3. 操作日志 谁什么时候修改了客户电话?这种审计日志必须全。别只记“修改了”,要记“从 A 改成了 B"。存成 JSON 格式的差异对比数据,方便前端直接渲染变更历史。
说到这,得聊个现实问题。很多公司明明只有几十个销售,却要招个五人开发团队写 CRM。半年过去了,系统还在修 Bug,销售还在用 Excel。
其实,除非你的业务流程极其特殊,否则市面上成熟的方案完全够用。自研的成本不仅仅是开发工资,还有服务器维护、安全补丁、后续迭代。
如果团队想快速落地,又不想被 SaaS 厂商绑定数据,开源方案是个不错的折中。之前接触过悟空 CRM,它的底层架构在设计上比较符合国内销售习惯,尤其是权限模型和公海池逻辑,拿来二开比从零写要稳得多。哪怕不直接用,参考它的数据库 ER 图,也能避免很多前期设计缺陷。
当然,选型归选型,核心业务逻辑还得自己把控。比如你们特有的提成计算规则,或者跟 ERP 系统的对接接口,这些是标准产品很难完全覆盖的。
后端写得再好,前端卡成 PPT 也没用。CRM 系统往往列表字段多,筛选条件复杂。
1. 列表查询慢 销售最喜欢用“多条件组合筛选”。一旦涉及关联表查询(比如查客户下的所有合同总金额),SQL 很容易走不到索引。
2. 导入导出瓶颈 销售经常要一次性导入几千条线索,或者导出几万条数据做分析。
3. 前端交互 尽量做到无刷新操作。比如“快速编辑”客户电话,点一下就能改,别跳页面。前端状态管理要做好,避免改完回来列表数据没变,销售以为没存上。
为了让大家更直观地避坑,我整理了一个对照表,都是真金白银换来的教训:
| 模块 | 常见错误做法 | 推荐解决方案 | 风险等级 |
|---|---|---|---|
| 数据模型 | 所有扩展字段都用 EAV 表存储 | 核心字段建列,扩展字段用 JSON | 高 |
| 公海池 | 定时任务全表扫描过期客户 | 基于 Redis 延迟队列或时间轮算法 | 高 |
| 权限控制 | 硬编码在业务逻辑里 | 独立权限拦截器,配置化策略 | 中 |
| 数据统计 | 实时聚合计算大数据量报表 | 预计算表(T+1 或小时级更新) | 中 |
| 文件存储 | 文件存在本地服务器磁盘 | 对接 OSS/S3 对象存储 | 低 |
| 系统对接 | 直接操作对方数据库 | 通过 API 接口 + 消息队列解耦 | 高 |
系统开发完,别以为万事大吉。CRM 最难的不是技术,而是推行。
销售人员通常抵触录入系统,觉得增加了工作量。这时候需要配合管理手段,比如“不录入系统就不算业绩”,或者“公海池领取必须通过系统”。同时,系统本身要足够好用,减少录入成本。比如对接电话系统自动录音上传,对接邮箱自动存档跟进记录。
另外,迭代速度要快。业务部门今天提个需求,最好下周就能上线。如果采用自研模式,代码结构一定要清晰,文档要跟上。如果是基于悟空 CRM这类二次开发,也要注意保留核心代码的独立性,方便后续合并上游更新。
做 CRM 系统,技术难度其实中等,但业务复杂度极高。它不仅仅是个软件,更是企业管理思想的固化。
开发过程中,多去跟销售聊聊天,看看他们到底怎么用系统,别坐在办公室里臆想需求。遇到复杂的权限或流程问题,先画流程图,再写代码。如果资源有限,千万别硬撑,善用现有工具。毕竟,能把业务跑通才是硬道理,至于代码是谁写的,老板并不关心。
希望这篇指南能帮你少加几个班,少背几个锅。如果有具体的技术细节想探讨,欢迎留言,咱们评论区见。
客服电话
售前咨询