用PHP搭建CRM系统完全可行,需聚焦数据建模(客户/联系人分层、外键关联)与流程控制(漏斗状态机、阶段校验、活动留痕、待办提醒、基础报表、权限隔离)。

用PHP搭建CRM系统完全可行,关键是把客户关系管理逻辑和销售漏斗阶段拆解清楚,再用简洁、可扩展的代码结构落地。不需要复杂框架也能起步,但得从数据建模和流程控制两个核心入手。
客户与联系人分层设计
CRM不是简单存姓名电话,要区分“客户(Company)”和“联系人(Contact)”两个实体。一家公司可能有多个对接人,一个联系人也可能在不同阶段代表不同公司。
- 客户表(customers)存公司名、行业、规模、主联系人ID、创建时间等
- 联系人表(contacts)存姓名、职位、邮箱、手机、所属客户ID、是否为决策人等
- 用外键关联,避免冗余;加索引加速按公司查联系人或按人查公司
销售漏斗阶段状态驱动
漏斗不是静态列表,而是带行为约束的状态机。每个线索(lead)进入后,只能按业务规则向下一步流转,比如不能从“已报价”直接跳到“已签约”,中间必须经过“客户确认”。
- 定义阶段常量:'new', 'contacted', 'qualified', 'proposal_sent', 'negotiating', 'won', 'lost'
- 在leads表中用stage字段存储当前状态,配合updated_at自动记录阶段变更时间
- 更新阶段时校验合法性(例如:只有stage='qualified'才能转为'proposal_sent'),用简单switch或配置数组控制
关键动作留痕与自动提醒
销售过程的价值在于可追溯。每次沟通、跟进、文件发送都应生成一条活动记录(activities),并支持设置下次跟进时间触发提醒。
立即学习“PHP免费学习笔记(深入)”;
- activities表包含:lead_id/contact_id、type(call/email/meeting)、content、next_step_at、created_by
- 首页加“我的待办”模块,查next_step_at ≤ NOW() 且 status='pending' 的记录
- 用PHP脚本+系统定时任务(crontab)每天凌晨扫描,给销售发邮件或站内信提醒逾期跟进项
基础报表与漏斗可视化
不用立刻上ECharts,先用SQL聚合+HTML表格呈现核心指标。重点看各阶段数量、转化率、平均停留天数。
- 写一个getFunnelData()函数,按stage分组count(*),再关联leads.created_at和updated_at算平均时长
- 前端用简单table展示:阶段名称|数量|占比|平均耗时(天)|上月对比
- 点击某阶段可下钻查看具体线索列表,支持按负责人、时间范围筛选
不复杂但容易忽略的是权限隔离和数据归属。哪怕初期只有2个销售,也要在每张业务表加owner_id字段,并在所有查询中默认追加WHERE owner_id = $_SESSION['user_id'],避免客户信息错乱或越权查看。



















