手把手教你搭建一套“免费又好用”的招生CRM系统(三):公海线索与线索分配

引言:线索管理——招生流程的核心引擎

在前两篇教程中,我们完成了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
})
}
}

给确定按钮配置点击事件,调用我们的方法并且传入具体的参数


总结:打通线索管理的任督二脉

在本篇教程中,我们成功搭建了线索管理的两个核心功能:线索公海线索分配。我们不仅为不同角色提供了清晰的视图和操作权限,更重要的是,我们通过细致的状态流转设计,实现了线索从导入到跟进的全生命周期管理。

在下一篇教程中,我们将继续深入,重点讲解线索的日常跟进,包括如何添加跟进记录、安排试听以及最终的报名转化,并进一步完善状态流转的自动化逻辑。敬请期待!