目录
- 前情回顾与本节目标
- [第 1 步:核心数据模型重构](#第 1 步:核心数据模型重构)
-
- [1.1 客户表 (MBA_Customers)](#1.1 客户表 (MBA_Customers))
- [第 2 步:搭建公海池管理页面](#第 2 步:搭建公海池管理页面)
-
- [2.1 创建公海池页面](#2.1 创建公海池页面)
- [2.2 配置页面布局](#2.2 配置页面布局)
- [2.3 添加数据表格](#2.3 添加数据表格)
- [2.4 配置筛选条件](#2.4 配置筛选条件)
- [2.5 配置菜单](#2.5 配置菜单)
- [第 3 步:捞取功能实现](#第 3 步:捞取功能实现)
- [第 4 步:极简自动回收引擎(云函数)](#第 4 步:极简自动回收引擎(云函数))
-
- [4.1 全局配置表(MBA_GlobalConfig)](#4.1 全局配置表(MBA_GlobalConfig))
- [4.2 云函数配置](#4.2 云函数配置)
- [4.3 云函数逻辑实现](#4.3 云函数逻辑实现)
- 总结
前情回顾与本节目标
在上一讲中,我们完成了跟进管理功能的开发,实现了销售人员对客户跟进记录的完整管理。销售人员可以录入跟进记录,系统会自动更新客户的跟进状态、最后跟进时间等信息。
然而,在实际业务中,我们面临一个关键问题:如何科学地管理客户资源的流转?销售领取线索后如果不及时跟进,资源就会被浪费;新入职的销售没有客户资源,而老销售却霸占着大量不跟进的客户。
传统的做法是通过组合判断 owner_id 是否为空、分配状态是否为特定值来"推导"客户是否在公海,这种设计让代码变得臃肿且难以维护。
在本节教程中,我们将采用极简设计思想:状态显性化 + 保护机制解耦 ,通过引入显式的 sea_status 字段,用最少的字段解决最复杂的问题。
本节核心目标:
- 极简数据模型重构 :引入显式的
sea_status字段和is_protected豁免保护开关。 - 一行代码前端查询:实现极简、高性能的公海池客户捞取功能。
- 极简自动回收引擎:利用微搭云函数 + 全局配置,实现无情、高效的资源流转。
第 1 步:核心数据模型重构
极简设计的第一步,是将复杂的推导逻辑直接变成数据表中的显性状态字段。
1.1 客户表 (MBA_Customers)
我们在微搭控制台找到 MBA_Customers 客户表,对其进行"瘦身"和"升级":
| 字段名称 | 字段标识 | 数据类型 | 说明 / 极简理念 |
|---|---|---|---|
| 资源归属状态 | sea_status |
枚举 | 核心 :仅限 待分配、私海、公海 三个明确状态。告别复杂条件组合! |
| 负责人 | owner_id |
关联关系 | 关联销售人员。(sea_status为'公海'或'待分配'时此字段为空) |
| 最后跟进时间 | last_contact |
日期时间 | 每次写跟进记录时自动更新,重新开始计算回收倒计时。 |
| 豁免回收保护 | is_protected |
布尔值 | 解耦利器:开启后,无论多久不跟进,都不会掉入公海。替代原有的各种业务状态判断(如'高价值'、'已成单')。 |
第 2 步:搭建公海池管理页面
2.1 创建公海池页面
点击创建页面,输入"公海池",选择销售布局。

2.2 配置页面布局
切换到页面设计,添加布局组件,修改标题为"公海池"。

2.3 添加数据表格
添加数据表格组件,绑定客户表数据模型:

将操作列的按钮改为认领

2.4 配置筛选条件
配置表格的筛选条件,只显示 sea_status 为"公海"的客户:

2.5 配置菜单
切换到布局设计,添加公海池菜单:

第 3 步:捞取功能实现
表格操作列添加"认领"按钮,绑定如下自定义方法,将当前销售的 ID 写入客户表,并更新状态。
javascript
export default async function claimCustomer({ event, data }) {
const customerId = data.target._id;
$w.utils.showModal({
title: '确认抢单',
content: `确定要将客户【${data.target.name}】捞入您的私海吗?`,
success: async (res) => {
if (res.confirm) {
try {
await $w.utils.showLoading({ title: '认领中...' });
const currentUser = $w.app.dataset.state.currentUser;
await $w.cloud.callDataSource({
dataSourceName: 'MBA_Customers',
methodName: 'wedaUpdateV2',
params: {
filter: { where: { _id: { $eq: customerId } } },
data: {
// 【极简逻辑】认领时,只需更新三个核心字段
sea_status: '2', // 1. 明确状态变更为私海
owner_id: {_id:currentUser._id}, // 2. 绑定归属人
last_contact: Date.now() // 3. 重置最后跟进时间,重新开始计算回收倒计时
}
}
});
$w.utils.showToast({ title: '认领成功,请及时跟进!', icon: 'success' });
$w.table1.refresh(); // 刷新表格
} finally {
$w.utils.hideLoading();
}
}
}
});
}
给认领按钮设置点击事件,调用我们的方法,传入所在行数据

第 4 步:极简自动回收引擎(云函数)
这是极简设计的精华所在。云函数不再需要判断什么是"学员"、什么是"高价值客户",它变成了一个纯粹、高效的"无情清道夫"。
4.1 全局配置表(MBA_GlobalConfig)
| 字段名称 | 字段标识 | 数据类型 | 说明 |
|---|---|---|---|
| 配置名称 | config_name |
单行文本 | 如:公海回收天数配置 |
| 回收天数 | public_sea_recycle_days |
数字 | 超过此天数未跟进自动回收 |
| 是否启用 | is_active |
布尔值 | 启用/禁用该配置 |

4.2 云函数配置
在微搭控制台找到"云函数/托管 ",新建云函数命名为 dynamicPublicSeaRecycle。
首先配置 package.json 文件:
json
{
"name": "dynamic-public-sea-recycle",
"version": "1.0.0",
"description": "公海池自动回收云函数",
"license": "ISC",
"type": "commonjs",
"main": "index.js",
"dependencies": {
"@cloudbase/node-sdk": "^3.0.0"
}
}

配置好了点击保存并安装依赖
依赖说明 :@cloudbase/node-sdk 是腾讯云开发的 Node.js SDK,用于云函数中访问云开发资源。
4.3 云函数逻辑实现
创建 index.js 文件,编写回收逻辑:
javascript
'use strict';
const cloudbase = require("@cloudbase/node-sdk");
const app = cloudbase.init({
env: "lowcode-***",
region: "ap-shanghai",
});
const models = app.models;
exports.main = async (event, context) => {
let totalRecycled = 0;
try {
// 1. 获取全局回收天数(实际业务应从 MBA_GlobalConfig 表读取,这里假设设为 7 天)
const recycle_days = 7;
const cutoffTime = Date.now() - (recycle_days * 24 * 60 * 60 * 1000);
// 2. 极简查询逻辑:找出命中回收规则、超时未跟进的客户
const { data: customersToRecycle } = await models.MBA_Customers.list({
filter: {
where: {
$and: [
// 条件1:当前归属于某个销售的私海
{ sea_status: { $eq: '2' } },
// 条件2:解耦利器,未开启豁免保护(不论是签约学员还是高价值,未开启保护即参与回收)
{ is_protected: { $neq: true } },
// 条件3:超时判定,最后跟进时间早于阈值
{ last_contact: { $lt: cutoffTime } }
]
}
},
select: { _id: true }
});
const customerIds = customersToRecycle.records.map(c => c._id);
// 3. 执行批量踢入公海
if (customerIds.length > 0) {
await models.MBA_Customers.updateMany({
filter: { where: { _id: { $in: customerIds } } },
data: {
sea_status: '3', // 状态改为公海
owner_id: null // 清空负责人
}
});
console.log(`极简自动回收引擎执行完毕:根据全局 ${recycle_days} 天未跟进规则,成功回收了 ${customerIds.length} 条线索入公海。`);
totalRecycled = customerIds.length;
}
return { success: true, totalRecycled };
} catch (e) {
console.error('公海动态回收引擎执行异常:', e);
return { success: false, error: e.message };
}
};
配置定时触发器 :
每天凌晨 2 点执行一次(Cron 表达式:0 0 2 * * * *)。
总结
本节教程我们彻底打通了基于极简架构的 MBA 培训系统公海池模块的业务闭环。
这套设计的核心优势在于:
- 绝对清晰的边界 :任何角色一看
sea_status: '公海'就秒懂其含义,不需要去推导和猜测。 - 极强的扩展性 :业务部门说要搞个"展会VIP客户不掉落"的活动。你不需要改云函数代码 ,只需要在录入展会客户时,默认把
is_protected设为true即可。系统高度解耦。 - 性能更优 :数据库索引只需要打在
sea_status、is_protected和last_follow_time上,查询速度比多重嵌套逻辑快得多。
公海池系统不仅是个技术模块,更是企业提升线索转化率、消除霸单/死单的"鲶鱼效应"引擎。希望你可以尝试并从中获益!
下一步,我们将继续完善 CRM 系统的销售管理功能,实现客户分配、销售报表等模块,构建完整的 CRM 销售管理体系。