lark-workflow-crm

Installation
SKILL.md

微型团队 CRM 工作流

CRITICAL — 开始前 MUST 先用 Read 工具读取 ../lark-shared/SKILL.md,其中包含认证、权限处理

适用场景

  • "帮我创建一个CRM系统" / "搭建销售管理" / "新建CRM"
  • "新增客户:北京星辰科技,对接人王总" / "客户建档"
  • "给北京星辰创建商机:ERP采购,50万" / "商机跟进"
  • "跟进记录:今天电话联系了王总,约下周三面访"
  • "看看销售漏斗" / "本月赢单了多少" / "业绩排行"
  • "生成今天的销售日报" / "本周跟进汇总"
  • "创建客户登记表单" / "咨询表单"
  • "创建销售看板" / "销售仪表盘"
  • "跟进提醒" / "超时预警" / "赢单报喜" / "每周销售简报"

前置条件

仅支持 user 身份。执行前确保已授权:

lark-cli auth login --domain base,im,contact

系统架构

微型团队 CRM (lark-workflow-crm)
├── 数据层:飞书多维表格 (Bitable)
│   ├── 客户信息主表 (customers)        — 客户档案
│   ├── 商机管理表 (opportunities)      — 销售漏斗
│   └── 跟进记录表 (follow_ups)         — 沟通记录
├── 计算层
│   ├── 赢单概率建议 (formula)          — 根据商机阶段自动建议概率
│   ├── 商机天数 (formula)              — 距商机创建的天数
│   ├── 客户商机数量 (formula)          — 关联商机计数
│   ├── 客户累计赢单金额 (formula)       — 关联赢单金额汇总
│   └── 商机跟进次数 (formula)          — 关联跟进计数
├── 关联关系(双向)
│   ├── customers ↔ opportunities       — 一个客户多个商机
│   ├── customers ↔ follow_ups          — 跟进记录关联客户
│   └── opportunities ↔ follow_ups      — 跟进记录关联商机
├── 视图层
│   ├── 商机阶段看板 (Kanban)           — 按阶段分列拖拽
│   ├── 我的商机                        — 当前用户负责的商机
│   ├── 跟进时间线                      — 按时间倒序的跟进记录
│   └── 本月赢单                        — 当月赢单列表
├── 仪表盘
│   ├── 销售漏斗 (funnel)               — 各阶段商机数量
│   ├── 本月赢单金额 (statistics)        — SUM WHERE 阶段=赢单
│   ├── 商机总金额 (statistics)          — 在途商机金额
│   ├── 客户数量 (statistics)            — 总客户数
│   ├── 阶段分布 (pie)                  — 各阶段占比
│   ├── 负责人业绩排行 (column)          — 赢单金额排行
│   └── 本周跟进 (table)                — 本周跟进记录
├── 表单
│   └── 客户咨询登记表                  — 客户自助提交咨询
├── 交互层:用户自然语言指令
│   ├── 系统初始化 → 创建 Base + 表 + 字段 + 关联 + 视图 + 仪表盘 + 表单
│   ├── 日常操作 → 客户建档 / 商机管理 / 跟进记录
│   └── 数据分析 → 漏斗查询 / 业绩统计 / 销售日报
└── 通知层:飞书消息
    ├── 每日跟进提醒
    ├── 超时未跟进预警
    ├── 赢单报喜通知
    └── 每周销售简报

Agent 核心规则

  1. 只使用 lark-cli base +... 原子命令 — 不走 lark-cli api 直接调用
  2. 建表必须先建空表再逐个加字段+table-create 不带 --fields 参数,先建空表再用 +field-create 逐个加字段,每次间隔 1.5 秒
  3. 关联字段必须使用双向关联bidirectional: true,否则无法在公式中做跨表聚合
  4. 跨表计算优先使用 formula 字段 — 公式字段是 lookup 的超集,能用 formula 就不用 lookup
  5. 公式字段创建前先读 guide — 读取 ../lark-base/references/formula-field-guide.md
  6. +data-query 的 table-id 放在 DSL 中 — 不支持 --table-id 参数,需放在 --dsldatasource.table.tableId
  7. +data-query 只支持存储字段 — 不支持公式字段、lookup 字段、关联字段做聚合
  8. 写记录前先拿字段结构+field-list 确认字段名和类型
  9. 表名/字段名精确匹配 — 禁止凭自然语言猜测,必须来自 +table-list / +field-list 返回值
  10. +xxx-list 禁止并发 — 所有 list 命令串行执行
  11. 写入串行 + 间隔+record-upsert 串行,间隔 0.5-1 秒
  12. 分页拉取+record-list --limit 200,用 offset 分页
  13. 跟进记录中提及阶段变更时同步更新商机 — 用户说"推进到方案报价"时,更新对应商机的商机阶段字段
  14. 创建仪表盘前先读 guide — 读取 ../lark-base/references/dashboard-block-data-config.md
  15. 创建表单前先读 guide — 读取 ../lark-base/references/lark-base-form-create.md

Phase 1:系统初始化

Step 1.1: 创建 Base

lark-cli base +base-create --name "微型团队CRM" --as user

记录返回的 base_token(后续所有命令需要)。

Step 1.2: 创建数据表(先建空表,间隔 2 秒)

IMPORTANT:不要使用 --fields 参数一次性创建多字段,容易触发限流。

# 表 1:客户信息主表
lark-cli base +table-create --base-token "<base_token>" --name "客户信息" --as user
sleep 2

# 表 2:商机管理表
lark-cli base +table-create --base-token "<base_token>" --name "商机管理" --as user
sleep 2

# 表 3:跟进记录表
lark-cli base +table-create --base-token "<base_token>" --name "跟进记录" --as user

Step 1.3: 获取各表 table_id

lark-cli base +table-list --base-token "<base_token>" --as user

记录各表的 table_id

Step 1.4: 逐个添加存储字段(每创建一个间隔 1.5 秒)

客户信息表字段

lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"text","name":"客户名称"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"select","name":"客户类型","multiple":false,"options":[{"name":"个人客户"},{"name":"企业客户"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"text","name":"联系人"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"text","name":"手机号","style":{"type":"phone"}}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"text","name":"邮箱","style":{"type":"email"}}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"select","name":"行业","multiple":false,"options":[{"name":"互联网"},{"name":"金融"},{"name":"教育"},{"name":"制造业"},{"name":"零售"},{"name":"其他"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"select","name":"公司规模","multiple":false,"options":[{"name":"1-10人"},{"name":"11-50人"},{"name":"51-200人"},{"name":"200人以上"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"select","name":"来源渠道","multiple":false,"options":[{"name":"主动咨询"},{"name":"转介绍"},{"name":"展会"},{"name":"线上广告"},{"name":"社群"},{"name":"其他"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"text","name":"地址"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"user","name":"负责人","multiple":false}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"select","name":"重要程度","multiple":false,"options":[{"name":"高"},{"name":"中"},{"name":"低"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"select","name":"客户状态","multiple":false,"options":[{"name":"活跃"},{"name":"沉睡"},{"name":"流失"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" --json '{"type":"text","name":"备注"}' --as user
sleep 2

商机管理表字段

lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"text","name":"商机名称"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"number","name":"商机金额","style":{"type":"currency","precision":2,"currency_code":"CNY"}}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"select","name":"商机阶段","multiple":false,"options":[{"name":"待接触"},{"name":"需求确认"},{"name":"方案报价"},{"name":"商务谈判"},{"name":"赢单"},{"name":"丢单"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"user","name":"负责人","multiple":false}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"datetime","name":"预计成交日期","style":{"format":"yyyy-MM-dd"}}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"text","name":"竞争对手"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"select","name":"丢单原因","multiple":false,"options":[{"name":"价格"},{"name":"功能"},{"name":"竞品"},{"name":"无预算"},{"name":"项目取消"},{"name":"其他"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"select","name":"商机来源","multiple":false,"options":[{"name":"新开发"},{"name":"老客户增购"},{"name":"转介绍"}]}' --as user
sleep 2

# 添加系统字段:创建时间(公式字段"商机天数"依赖此字段)
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" --json '{"type":"created_at","name":"创建时间","style":{"format":"yyyy-MM-dd HH:mm"}}' --as user

跟进记录表字段

lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"select","name":"跟进方式","multiple":false,"options":[{"name":"电话"},{"name":"微信"},{"name":"面访"},{"name":"邮件"},{"name":"视频会议"},{"name":"其他"}]}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"text","name":"跟进摘要"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"text","name":"客户反馈"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"text","name":"下一步计划"}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"datetime","name":"下次跟进时间","style":{"format":"yyyy-MM-dd HH:mm"}}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"user","name":"跟进人","multiple":false}' --as user
sleep 1.5
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"select","name":"商机阶段变更","multiple":false,"options":[{"name":"无变更"},{"name":"推进到下一阶段"},{"name":"退回上一阶段"},{"name":"赢单"},{"name":"丢单"}]}' --as user
sleep 1.5

# 添加系统字段:创建时间(公式字段"最后跟进时间"依赖此字段)
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" --json '{"type":"created_at","name":"创建时间","style":{"format":"yyyy-MM-dd HH:mm"}}' --as user

Step 1.5: 创建双向关联字段(每创建一个间隔 2 秒)

CRITICAL:关联字段必须使用 bidirectional: true,否则无法在公式/lookup 中做跨表聚合。

# 商机管理表 → 客户信息表
lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"type":"link","name":"关联客户","link_table":"客户信息","bidirectional":true,"bidirectional_link_field_name":"关联商机"}' \
  --as user
sleep 2

# 跟进记录表 → 客户信息表
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" \
  --json '{"type":"link","name":"关联客户","link_table":"客户信息","bidirectional":true,"bidirectional_link_field_name":"跟进记录"}' \
  --as user
sleep 2

# 跟进记录表 → 商机管理表
lark-cli base +field-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" \
  --json '{"type":"link","name":"关联商机","link_table":"商机管理","bidirectional":true,"bidirectional_link_field_name":"跟进记录"}' \
  --as user
sleep 2

Step 1.6: 创建公式字段

IMPORTANT:创建公式字段前 MUST 先读取 ../lark-base/references/formula-field-guide.md,创建后追加 --i-have-read-guide

商机管理表:赢单概率建议

根据商机阶段自动建议赢单概率。

lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"type":"formula","name":"赢单概率建议","expression":"SWITCH([商机阶段], \"待接触\", 10, \"需求确认\", 30, \"方案报价\", 50, \"商务谈判\", 75, \"赢单\", 100, 0)"}' \
  --i-have-read-guide \
  --as user
sleep 2

商机管理表:商机天数

距商机创建的天数。

lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"type":"formula","name":"商机天数","expression":"DAYS(NOW(), [创建时间])"}' \
  --i-have-read-guide \
  --as user
sleep 2

客户信息表:客户商机数量

通过关联字段跨表计数。

lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" \
  --json '{"type":"formula","name":"商机数量","expression":"COUNTA([关联商机])"}' \
  --i-have-read-guide \
  --as user
sleep 2

客户信息表:客户累计赢单金额

通过公式跨表条件聚合。

lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" \
  --json '{"type":"formula","name":"累计赢单金额","expression":"SUM([关联商机].[商机金额].FILTER([关联商机].[商机阶段] = \"赢单\"))"}' \
  --i-have-read-guide \
  --as user
sleep 2

客户信息表:最后跟进时间

取跟进记录中最近一次跟进时间。

lark-cli base +field-create --base-token "<base_token>" --table-id "<customers_table_id>" \
  --json '{"type":"formula","name":"最后跟进时间","expression":"MAX([跟进记录].[创建时间])"}' \
  --i-have-read-guide \
  --as user
sleep 2

注意:跟进记录表的 创建时间created_at 系统字段,公式中通过双向关联字段 [跟进记录] 引用。确保跟进记录表已创建 created_at 系统字段(Step 1.4 中已添加)。

商机管理表:跟进次数

通过关联字段跨表计数。

lark-cli base +field-create --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"type":"formula","name":"跟进次数","expression":"COUNTA([跟进记录])"}' \
  --i-have-read-guide \
  --as user

如果公式中使用 created_at 系统字段,需要用 +table-get 获取实际系统字段名(可能叫"创建时间"),确保公式中的字段名与 +field-list 返回值一致。

Step 1.7: 创建视图

视图 1:商机阶段看板(Kanban)

lark-cli base +view-create --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"name":"商机阶段看板","type":"kanban"}' \
  --as user
sleep 2

# 设置看板分组:按商机阶段分组
lark-cli base +view-set-group --base-token "<base_token>" --table-id "<opportunities_table_id>" --view-id "<kanban_view_id>" \
  --json '[{"field":"商机阶段"}]' \
  --as user

视图 2:跟进时间线

lark-cli base +view-create --base-token "<base_token>" --table-id "<follow_ups_table_id>" \
  --json '{"name":"跟进时间线","type":"grid"}' \
  --as user
sleep 2

# 设置排序:按创建时间倒序
lark-cli base +view-set-sort --base-token "<base_token>" --table-id "<follow_ups_table_id>" --view-id "<timeline_view_id>" \
  --json '[{"field_name":"创建时间","desc":true}]' \
  --as user

视图 3:本月赢单

lark-cli base +view-create --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"name":"本月赢单","type":"grid"}' \
  --as user
sleep 2

# 设置筛选:商机阶段 = 赢单
lark-cli base +view-set-filter --base-token "<base_token>" --table-id "<opportunities_table_id>" --view-id "<won_view_id>" \
  --json '{"conjunction":"and","conditions":[{"field_name":"商机阶段","operator":"is","value":["赢单"]}]}' \
  --as user

Step 1.8: 创建仪表盘

IMPORTANT:创建仪表盘 Block 前先读取 ../lark-base/references/dashboard-block-data-config.md

# 创建仪表盘
lark-cli base +dashboard-create --base-token "<base_token>" --name "销售看板" --as user

记录返回的 dashboard_id

Block 1:销售漏斗

lark-cli base +dashboard-block-create --base-token "<base_token>" --dashboard-id "<dashboard_id>" \
  --name "销售漏斗" --type funnel \
  --data-config '{"table_name":"商机管理","count_all":true,"group_by":[{"field_name":"商机阶段","mode":"integrated"}]}' \
  --as user
sleep 1.5

Block 2:本月赢单金额

lark-cli base +dashboard-block-create --base-token "<base_token>" --dashboard-id "<dashboard_id>" \
  --name "本月赢单金额" --type statistics \
  --data-config '{"table_name":"商机管理","series":[{"field_name":"商机金额","rollup":"SUM"}],"filter":{"conjunction":"and","conditions":[{"field_name":"商机阶段","operator":"is","value":"赢单"}]}}' \
  --as user
sleep 1.5

Block 3:商机总金额(在途)

lark-cli base +dashboard-block-create --base-token "<base_token>" --dashboard-id "<dashboard_id>" \
  --name "商机总金额" --type statistics \
  --data-config '{"table_name":"商机管理","series":[{"field_name":"商机金额","rollup":"SUM"}],"filter":{"conjunction":"and","conditions":[{"field_name":"商机阶段","operator":"isNot","value":"赢单"},{"field_name":"商机阶段","operator":"isNot","value":"丢单"}]}}' \
  --as user
sleep 1.5

Block 4:客户数量

lark-cli base +dashboard-block-create --base-token "<base_token>" --dashboard-id "<dashboard_id>" \
  --name "客户总数" --type statistics \
  --data-config '{"table_name":"客户信息","count_all":true}' \
  --as user
sleep 1.5

Block 5:阶段分布

lark-cli base +dashboard-block-create --base-token "<base_token>" --dashboard-id "<dashboard_id>" \
  --name "阶段分布" --type pie \
  --data-config '{"table_name":"商机管理","count_all":true,"group_by":[{"field_name":"商机阶段","mode":"integrated"}]}' \
  --as user
sleep 1.5

Block 6:负责人业绩排行

lark-cli base +dashboard-block-create --base-token "<base_token>" --dashboard-id "<dashboard_id>" \
  --name "负责人业绩排行" --type column \
  --data-config '{"table_name":"商机管理","series":[{"field_name":"商机金额","rollup":"SUM"}],"group_by":[{"field_name":"负责人","mode":"integrated"}],"filter":{"conjunction":"and","conditions":[{"field_name":"商机阶段","operator":"is","value":"赢单"}]}}' \
  --as user
sleep 1.5

Step 1.9: 创建表单

在客户信息表上创建客户咨询登记表单,方便客户自助提交信息。

lark-cli base +form-create --base-token "<base_token>" --table-id "<customers_table_id>" \
  --name "客户咨询登记" \
  --description "欢迎填写咨询信息,我们会尽快与您联系" \
  --as user

表单创建后,可使用 +form-questions-list 查看已有问题,再用 +form-questions-create 添加或调整问题。


Phase 2:客户管理

2.1 新增客户

lark-cli base +record-upsert --base-token "<base_token>" --table-id "<customers_table_id>" \
  --json '{"客户名称":"北京星辰科技有限公司","客户类型":"企业客户","联系人":"王总","手机号":"138xxxx","邮箱":"wang@xx.com","行业":"互联网","公司规模":"51-200人","来源渠道":"展会","负责人":[{"id":"ou_xxx"}],"重要程度":"高","备注":""}' \
  --as user

Agent 处理逻辑

  1. 解析用户输入:提取客户名称、客户类型、联系人、手机、邮箱、行业、规模、来源、负责人、重要程度、备注
  2. 未提供的字段留空
  3. 行业/公司规模/来源渠道需匹配已有选项,不在选项中的需提醒用户
  4. 人员字段需要 user_id,可通过 contact +search-user 查找

新增客户回复格式

客户创建成功!

客户名称:北京星辰科技有限公司
客户类型:企业客户
联系人:王总
手机号:138xxxx
行业:互联网
负责人:当前用户

2.2 修改客户信息

# 先查询获取 record_id
lark-cli base +record-list --base-token "<base_token>" --table-id "<customers_table_id>" --as user

# 更新客户信息(Delta 更新,只更新用户指定的字段)
lark-cli base +record-upsert --base-token "<base_token>" --table-id "<customers_table_id>" \
  --record-id "<record_id>" \
  --json '{"重要程度":"高","备注":"重点客户"}' \
  --as user

2.3 查询客户列表

lark-cli base +record-list --base-token "<base_token>" --table-id "<customers_table_id>" \
  --limit 200 --as user

Agent 处理

  • 按用户指定的条件筛选(行业、负责人、重要程度等)
  • 整理成易读表格格式

2.4 删除客户

lark-cli base +record-delete --base-token "<base_token>" --table-id "<customers_table_id>" \
  --record-id "<record_id>" --yes --as user

Phase 3:商机管理

3.1 创建商机

lark-cli base +record-upsert --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --json '{"商机名称":"企业IM系统采购","关联客户":[{"id":"<customer_record_id>"}],"商机金额":500000,"商机阶段":"待接触","负责人":[{"id":"ou_xxx"}],"预计成交日期":"2026-06-30","竞争对手":"","商机来源":"新开发"}' \
  --as user

关联字段值格式:关联字段的值为 [{id: "recXXXX"}] 对象数组格式。 日期格式:使用 YYYY-MM-DD HH:mm:ss 字符串格式。

Agent 处理逻辑

  1. 解析用户输入:提取商机名称、关联客户、金额、阶段、负责人、预计成交日期等
  2. 如果用户提供了客户名称,先在客户表中查找对应的 record_id
  3. 客户不存在时,询问是否要同时创建客户记录
  4. 默认阶段为"待接触",默认商机来源为"新开发"

创建商机回复格式

商机创建成功!

商机名称:企业IM系统采购
关联客户:北京星辰科技
商机金额:¥500,000.00
商机阶段:待接触
负责人:当前用户
预计成交日期:2026-06-30

3.2 推进商机阶段

当用户在跟进记录中提及阶段变更,或直接要求推进商机时:

# 更新商机阶段
lark-cli base +record-upsert --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --record-id "<opportunity_record_id>" \
  --json '{"商机阶段":"方案报价"}' \
  --as user

Agent 处理逻辑

  1. 用户说"推进到方案报价"→ 更新商机阶段为"方案报价"
  2. 用户说"赢单了"→ 更新商机阶段为"赢单"
  3. 用户说"丢单了"→ 更新商机阶段为"丢单",并询问丢单原因
  4. 阶段变更后自动更新赢单概率建议(formula 字段自动计算)

阶段顺序:待接触 → 需求确认 → 方案报价 → 商务谈判 → 赢单/丢单

3.3 查询商机列表

lark-cli base +record-list --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --limit 200 --as user

Agent 处理

  • 按阶段、负责人、客户等条件筛选
  • 按商机金额排序

3.4 销售漏斗查询

lark-cli base +data-query --base-token "<base_token>" \
  --dsl '{
    "datasource": {"type": "table", "table": {"tableId": "<opportunities_table_id>"}},
    "dimensions": [{"field_name":"商机阶段","alias":"stage"}],
    "measures": [
      {"field_name":"商机金额","aggregation":"sum","alias":"total_amount"},
      {"field_name":"商机名称","aggregation":"count","alias":"count"}
    ]
  }' \
  --as user

回复格式

销售漏斗

| 阶段 | 数量 | 金额 |
|------|------|------|
| 待接触 | 12 | ¥1,200,000 |
| 需求确认 | 8 | ¥800,000 |
| 方案报价 | 5 | ¥500,000 |
| 商务谈判 | 3 | ¥450,000 |
| 赢单 | 2 | ¥200,000 |
| 丢单 | 1 | ¥100,000 |

Phase 4:跟进记录

4.1 添加跟进记录

lark-cli base +record-upsert --base-token "<base_token>" --table-id "<follow_ups_table_id>" \
  --json '{"关联客户":[{"id":"<customer_record_id>"}],"关联商机":[{"id":"<opportunity_record_id>"}],"跟进方式":"电话","跟进摘要":"电话联系了王总,对方对方案比较满意","客户反馈":"认可方案,但价格偏高","下一步计划":"下周三面访确认细节","下次跟进时间":"2026-04-16 14:00","跟进人":[{"id":"ou_xxx"}],"商机阶段变更":"无变更"}' \
  --as user

Agent 处理逻辑

  1. 解析用户输入:提取跟进方式、摘要、客户反馈、下一步计划、下次跟进时间、阶段变更
  2. 查找关联客户和商机的 record_id
  3. 关键:如果用户提到阶段变更(如"对方同意推进到方案报价"),同步更新对应商机的商机阶段
  4. 日期默认当天

跟进记录回复格式

跟进记录已保存!

客户:北京星辰科技
商机:企业IM系统采购
跟进方式:电话
跟进摘要:电话联系了王总,对方对方案比较满意
下一步计划:下周三面访确认细节
下次跟进时间:2026-04-16 14:00

4.2 查询跟进记录

lark-cli base +record-list --base-token "<base_token>" --table-id "<follow_ups_table_id>" \
  --limit 200 --as user

4.3 销售日报

Agent 处理逻辑:
1. 查询今天所有跟进记录(按创建时间筛选当天)
2. 查询今天新增的客户(按创建时间筛选当天)
3. 查询今天新增的商机
4. 查询今天发生阶段变更的商机
5. 生成结构化日报

日报格式

销售日报 — 2026-04-13

一、今日跟进(3 条)
| 客户 | 商机 | 方式 | 摘要 | 阶段变更 |
|------|------|------|------|---------|
| 北京星辰 | IM采购 | 电话 | 方案满意 | → 方案报价 |
| 上海悦达 | 数据服务 | 微信 | 初步接触 | 无 |

二、新增客户(1 家)
- 深圳华创科技,互联网行业,来自线上广告

三、新增商机(2 个)
- 深圳华创科技:云服务采购 ¥300,000(待接触)
- 北京星辰科技:IM系统采购 ¥500,000(待接触)

四、阶段变更(1 个)
- 北京星辰 IM采购:待接触 → 方案报价

五、今日提醒
- 1 个商机超 7 天未跟进
- 2 个客户待跟进

Phase 5:数据分析

5.1 业绩排行

lark-cli base +data-query --base-token "<base_token>" \
  --dsl '{
    "datasource": {"type": "table", "table": {"tableId": "<opportunities_table_id>"}},
    "dimensions": [{"field_name":"负责人","alias":"owner"}],
    "measures": [
      {"field_name":"商机金额","aggregation":"sum","alias":"total_amount"},
      {"field_name":"商机名称","aggregation":"count","alias":"count"}
    ],
    "filters": {"type": 1, "conjunction": "and", "conditions": [{"field_name":"商机阶段","operator":"is","value": ["赢单"]}]}
  }' \
  --as user

5.2 本月赢单统计

lark-cli base +data-query --base-token "<base_token>" \
  --dsl '{
    "datasource": {"type": "table", "table": {"tableId": "<opportunities_table_id>"}},
    "measures": [
      {"field_name":"商机金额","aggregation":"sum","alias":"total_amount"},
      {"field_name":"商机名称","aggregation":"count","alias":"count"}
    ],
    "filters": {"type": 1, "conjunction": "and", "conditions": [{"field_name":"商机阶段","operator":"is","value": ["赢单"]}]}
  }' \
  --as user

5.3 商机转化率

# 先获取各阶段数量
lark-cli base +data-query --base-token "<base_token>" \
  --dsl '{
    "datasource": {"type": "table", "table": {"tableId": "<opportunities_table_id>"}},
    "dimensions": [{"field_name":"商机阶段","alias":"stage"}],
    "measures": [{"field_name":"商机名称","aggregation":"count","alias":"count"}]
  }' \
  --as user

Agent 计算各阶段转化率:

商机转化分析

| 阶段 | 数量 | 转化率 |
|------|------|--------|
| 待接触 | 12 | 100%(入口) |
| 需求确认 | 8 | 67% |
| 方案报价 | 5 | 42% |
| 商务谈判 | 3 | 25% |
| 赢单 | 2 | 17% |

整体赢单率:17%(2/12)

Phase 6:自动化提醒

6.1 每日跟进提醒

查询今天需要跟进的内容:

# 查询下次跟进时间 = 今天的跟进记录
lark-cli base +record-list --base-token "<base_token>" --table-id "<follow_ups_table_id>" \
  --limit 200 --as user
# AI 筛选:下次跟进时间 = 今天

# 查询预计成交日期 = 今天且未关单的商机
lark-cli base +record-list --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --limit 200 --as user
# AI 筛选:预计成交日期 = 今天 AND 商机阶段 NOT IN (赢单, 丢单)

发送飞书消息:

lark-cli im +messages-send --chat-id "<chat_id>" \
  --msg-type "interactive" \
  --content '{
    "config": {"wide_screen_mode": true},
    "header": {"title": {"tag": "plain_text", "content": "今日跟进提醒"}, "template": "blue"},
    "elements": [
      {"tag": "div", "text": {"tag": "lark_md", "content": "**跟进提醒**\n- 客户A:下次跟进时间到,计划:XXX\n\n**商机提醒**\n- 商机B:预计今天成交,金额:XXX"}}
    ]
  }' \
  --as user

重要:发送消息前需先读取 ../lark-im/SKILL.md 了解消息发送规则。

6.2 超时未跟进预警

# 查询超过 7 天未跟进的商机
lark-cli base +record-list --base-token "<base_token>" --table-id "<opportunities_table_id>" \
  --limit 200 --as user
# AI 筛选:商机阶段 NOT IN (赢单, 丢单) AND 跟进次数 > 0 AND 最后跟进时间 > 7 天前

消息格式

超时未跟进预警

以下商机已超过 7 天未跟进:

| 商机 | 客户 | 阶段 | 未跟进天数 |
|------|------|------|-----------|
| 商机A | 客户A | 方案报价 | 8 天 |
| 商机B | 客户B | 需求确认 | 12 天 |

6.3 赢单报喜

当商机阶段变更为「赢单」时,发送飞书群消息通知:

lark-cli im +messages-send --chat-id "<chat_id>" \
  --msg-type "interactive" \
  --content '{
    "config": {"wide_screen_mode": true},
    "header": {"title": {"tag": "plain_text", "content": "赢单喜报!"}, "template": "green"},
    "elements": [
      {"tag": "div", "text": {"tag": "lark_md", "content": "商机:XX公司 ERP 采购\n金额:¥100,000\n负责人:@用户\n商机周期:XX天"}}
    ]
  }' \
  --as user

6.4 每周销售简报

Agent 处理逻辑:
1. 汇总上周新增客户数(按创建时间筛选)
2. 汇总上周新增商机数和金额
3. 汇总上周赢单数和金额
4. 汇总当前漏斗各阶段数量和金额
5. 生成结构化简报并发送

简报格式

周销售简报(上周 2026-04-07 ~ 2026-04-13)

一、关键指标
- 新增客户:5 家
- 新增商机:8 个,总金额 ¥500,000
- 赢单:3 个,金额 ¥200,000
- 丢单:1 个,金额 ¥50,000

二、当前漏斗
| 阶段 | 数量 | 金额 |
|------|------|------|
| 待接触 | 12 | ¥1,200,000 |
| 需求确认 | 8 | ¥800,000 |
| 方案报价 | 5 | ¥500,000 |
| 商务谈判 | 3 | ¥450,000 |

三、需关注
- 3 个商机超 7 天未跟进
- 2 个商机预计本周成交

Phase 7:表单管理

7.1 创建客户咨询登记表单

lark-cli base +form-create --base-token "<base_token>" --table-id "<customers_table_id>" \
  --name "客户咨询登记" \
  --description "欢迎填写咨询信息,我们会尽快与您联系" \
  --as user

7.2 查看和配置表单问题

# 查看已有问题
lark-cli base +form-questions-list --base-token "<base_token>" --table-id "<customers_table_id>" --form-id "<form_id>" --as user

# 添加/修改问题
lark-cli base +form-questions-create --base-token "<base_token>" --table-id "<customers_table_id>" --form-id "<form_id>" \
  --json '[{"name":"客户名称","type":"input"},{"name":"联系电话","type":"input"},{"name":"咨询内容","type":"textarea"}]' \
  --as user

意图 → 命令索引

意图 推荐命令 备注
创建CRM系统 +base-create → 3 × +table-create → 逐个 +field-create → 双向关联 → formula → 视图 → 仪表盘 → 表单 按 Step 1 顺序执行
新增客户 +record-upsert → customers 表
修改客户 +record-list+record-upsert → customers 表 先查 record_id
删除客户 +record-delete → customers 表 --yes
查询客户 +record-list → customers 表 AI 过滤
创建商机 +record-list(查客户)→ +record-upsert → opportunities 表 关联客户
推进商机 +record-upsert → opportunities 表 更新商机阶段
查看商机 +record-list → opportunities 表
销售漏斗 +data-query → opportunities 表 按阶段聚合
添加跟进 +record-upsert → follow_ups 表 如有阶段变更同步更新商机
销售日报 +record-list → follow_ups + customers + opportunities 表 AI 汇总
业绩排行 +data-query → opportunities 表 赢单金额按负责人聚合
跟进提醒 +record-list → follow_ups + opportunities → im +messages-send
超时预警 +record-list → opportunities → im +messages-send
赢单报喜 im +messages-send
每周简报 +record-list + +data-queryim +messages-send
创建表单 +form-create+form-questions-create
创建看板 +dashboard-create+dashboard-block-create 先读 dashboard guide

常见错误速查

错误场景 原因 解决方案
+table-create --fields 限流 800004135 一次性创建多字段触发限流 先建空表,再用 +field-create 逐个加字段,间隔 1.5 秒
公式字段跨表查询返回全表结果 关联字段非双向 关联字段必须 bidirectional: true
单向关联不能改为双向 API 限制 unsafe_operation_blocked 删除旧关联字段,重新创建双向关联
+data-query unknown flag --table-id 该命令不支持 --table-id 把 table-id 放在 --dsldatasource.table.tableId
+data-query 不支持某字段聚合 公式/lookup/关联字段不在白名单 只对存储字段做聚合
+data-query 聚合 counta 不支持 +data-query 仅支持 count 不支持 counta 改用 "aggregation":"count"
关联字段值写入失败 格式错误 关联字段值必须是 [{id: "recXXX"}] 对象数组
日期字段写入失败 格式错误 使用 YYYY-MM-DD HH:mm:ss 字符串格式
人员字段写入失败 格式错误 使用 [{id: "ou_xxx"}] 对象数组
公式字段创建失败 未读 guide 或表达式有误 先读 formula-field-guide.md
表名/字段名不匹配 凭自然语言猜测 +table-list / +field-list 获取真实名称
并发报错 1254291 list 命令并发 所有 +xxx-list 串行执行
仪表盘 Block 创建失败 使用 --json 而非独立参数 改用 --name + --type + --data-config 独立参数
+view-create 不支持 --name 需用 --json 传参 改用 --json '{"name":"xxx","type":"grid"}'
+view-set-group 字段名 key 错误 JSON key 是 field 不是 field_name 改用 [{"field":"字段名"}]
公式引用「创建时间」返回 null 表没有 created_at 系统字段 初始化时用 +field-create 手动添加 type:"created_at" 字段
Base 自带默认"数据表" 创建 Base 时自动生成 忽略该表,只操作客户信息/商机管理/跟进记录三张表
消息发送失败 chat_id 无效 im +chat-list 确认 chat_id
权限不足 scope 未开通 参考 lark-shared 处理权限问题

权限表

命令 所需 scope
base +base-create bitable:app
base +table-create bitable:app
base +field-create bitable:app
base +field-list bitable:app:readonly
base +record-list bitable:app:readonly
base +record-upsert bitable:app
base +record-delete bitable:app
base +data-query bitable:app:readonly
base +view-create bitable:app
base +view-set-filter bitable:app
base +view-set-sort bitable:app
base +dashboard-create bitable:app
base +dashboard-block-create bitable:app
base +form-create bitable:app
base +form-questions-list bitable:app:readonly
base +form-questions-create bitable:app
im +messages-send im:message:send_as_bot
contact +search-user contact:employee.id:readonly

参考

Weekly Installs
1
GitHub Stars
20
First Seen
Apr 14, 2026