引言:线索管理——招生流程的核心引擎在前两篇教程中,我们完成了CRM系统的“蓝图设计”和“人员基建”。现在,我们进入招生流程的核心——线索管理。线索是潜在学员的宝贵信息,如何高效地管理、分配和跟进,直接决定了招生转化率。 本篇教程,我们将专注于搭建系统的“线索公海”,并围绕销售主管和课程顾问两种角色的不同需求,实现两个关键功能: - 销售主管端:负责全局线索的导入、批量分配以及对线索全生命周期的追踪。
- 课程顾问端
本篇的重点将在于线索状态的流转,我们将详细定义线索从导入到跟进、再到转化的每一个状态,并以此为基础,构建起清晰的角色视图和操作逻辑。
第一部分:创建数据模型在开始页面搭建之前,需要先创建数据模型。 点击+号创建数据模型
输入模型的名称和标识
添加字段,学员姓名(full_name),类型选择文本,设置为主列字段
添加字段,联系电话(phone_number),类型选择电话
添加字段,来源渠道(source_channel),类型选择枚举
枚举值设置为“线上广告”、“地推”、“转介绍”
添加字段,意向课程(intended_course),类型选择文本
添加字段,意向度(intention_level),类型选择枚举
枚举值设置为高、中、低
添加字段,跟进状态(status),类型选择枚举
枚举值设置为: - 待分配:线索刚导入系统,尚未分配给任何顾问。这是公海线索的默认状态。
- 已分配
- 已跟进
- 已试听
- 已报名
- 无效:线索因各种原因(电话无法接通、无意向等)被标记为无效。
添加字段,课程顾问(assigned_to),类型选择关联关系,关联到顾问表
添加字段,最新跟进时间(latest_follow_up_at),类型选择日期时间
第二部分:销售主管端应用搭建——线索导入与批量分配销售主管的核心职责是保证公海中有充足的线索,并能将它们合理地分配给课程顾问。 2.1 搭建“全部线索”管理页面场景:销售主管需要一个页面,能够总览所有线索,无论是公海中的还是已分配的,并能进行导入或批量分配。 操作步骤: 点击管理应用,从空白创建
输入应用的名称
点击创建页面的图标
选择表格与表单页,选择线索表,创建页面
切换到布局设计,点击一键生成菜单
修改菜单的名称
选中页面组件,配置布局
2.2 核心功能实现:线索导入与批量分配云函数1. 线索导入日常主管导入线索的时候直接使用表格组件的导入功能,将数据整理到excel里上传即可
2. 批量分配:云函数创建与代码示例我们需要创建一个API来管理主管批量分配销售的过程,点击资源连接的+号创建API
选择自定义代码
输入名称和标识
输入方法的名称和标识
添加入参,先添加线索ID,类型选择数组
然后添加销售ID
输入如下代码: module.exports=asyncfunction(params, context){ try{ const{ leadIds, saleId }= params;
// 1. 必要的参数校验 if(!leadIds ||!Array.isArray(leadIds)|| leadIds.length ===0){ thrownewError('Invalid parameter: leadIds must be a non-empty array.'); } if(!saleId){ thrownewError('Invalid parameter: saleId is required.'); }
// 2. 构造批量更新参数 const batchUpdateParams ={ data:{ assigned_to:{_id:saleId}, status:'2' }, filter:{ where:{ _id:{ $in: leadIds } } } };
// 3. 调用数据模型方法 const result =await context.callModel({ dataSourceName:'Leads_jw', methodName:'wedaBatchUpdateV2', params: batchUpdateParams, });
// 4. 返回成功结果 return{ success:true, data: result }; }catch(error){ // 5. 捕获并返回异常 return{ success:false, message: error.message }; } };
在表格组件的全局按钮下边添加一个批量分配的按钮
选中页面组件,添加弹窗组件
在弹窗内容里添加下拉单选组件
在代码区新建一个内置数据表查询
选择课程表,设置查询条件,角色等于课程顾问,状态是在职
给下拉单选绑定选项
绑定为如下表达式
配置选项名称和选项值
当我们点击弹窗的确定时候,需要调用一个自定义方法。代码区新建一个javascript方法
输入如下代码: exportdefaultasyncfunction({ event, data }){ const selectedRows = $w.table1.selectedRecords; const saleId = data.target const leadIds = selectedRows.map(row=> row._id);
if(leadIds.length ===0){ $w.utils.showToast({ title:"请至少选择一条线索进行分配", icon:"error", duration:1000 }) return; }
if(!saleId){ $w.utils.showToast({ title:"请选择一位销售顾问", icon:"error", duration:1000 })
return; }
const params ={ leadIds: leadIds, saleId: saleId, };
const result =await $w.cloud.callDataSource({ dataSourceName:'SaleManagement_rcn9py4', methodName:'assignToSale', params: params, });
if(result && result.success){
$w.utils.showToast({ title:"线索已成功批量分配!", icon:"success", duration:1000 }) // 分配成功后刷新页面,查看状态变化 $w.table1.refresh(); }else{ $w.utils.showToast({ title:"线索分配失败,请稍后重试", icon:"error", duration:1000 }) } }
给确定按钮配置点击事件,调用我们的方法并且传入具体的参数
总结:打通线索管理的任督二脉在本篇教程中,我们成功搭建了线索管理的两个核心功能:线索公海和线索分配。我们不仅为不同角色提供了清晰的视图和操作权限,更重要的是,我们通过细致的状态流转设计,实现了线索从导入到跟进的全生命周期管理。 在下一篇教程中,我们将继续深入,重点讲解线索的日常跟进,包括如何添加跟进记录、安排试听以及最终的报名转化,并进一步完善状态流转的自动化逻辑。敬请期待!
|