企服客户管理

Other

客户管理中心技能。提供客户档案管理、客户画像分析、风险提醒、客户时间线查询。基于中集金地美兰中心真实业务数据(Excel台账)。触发场景:(1) 查询客户信息(@企服助手 查询客户 T1-601),(2) 查看客户画像(@企服助手 客户画像 上海铭尤力),(3) 查询风险客户(@企服助手 查询风险客户),(4) 定时任务生成风险提醒日报。

Install

openclaw skills install enterprise-customer-management

客户管理中心技能 (Customer Management Center Skill)

功能概述

本技能为企服助手的核心模块,统一管理中集金地美兰中心的客户信息,提供:

  • 📋 客户档案 - 企业基础信息、合同信息、租期信息、联系人管理
  • 📊 客户画像 - 服务记录汇总、报修记录、缴费记录、投诉记录、企业标签
  • ⚠️ 风险提醒 - 欠费风险、流失风险、高频投诉提醒、到期提醒
  • 📅 客户时间线 - 统一查看所有历史记录(服务、沟通、工单、缴费、续租)

数据源配置(基于真实Excel台账)

数据文件

文件路径: /Users/mac/美兰中心C+服务.xlsx

工作表映射

功能模块工作表名字段数记录数说明
客户档案👨客户管理👨27151企业基础信息、合同、租期
费用收缴👨💼费用收缴👨💼14396固定租金、物业管理费等
能耗收缴👨💼能耗收缴👨💼7149水电燃气费用
C+服务记录C+服务记录1022走访记录、服务成交
报修情况🛠️报修情况汇总🛠️134报修工单记录
退租汇总退租汇总136退租企业信息

核心功能详解

1. 客户档案 (Customer Profile)

1.1 数据结构(真实字段映射)

客户管理表字段(27个):

基础信息字段:
  - 项目名称: 美慧城四期T1
  - 单元类型: 办公
  - 名义楼层: 6
  - 实际楼层: 5
  - 单元号: T1-601 (主键,用于关联其他表)

合同信息字段:
  - 合同号: ZJML-2024-12260010 (关联费用收缴表)
  - 租户名: 上海铭尤力食品有限公司
  - 建筑面积: 143.95
  - 馶年合同单价: 1.75
  - 租期: 3年

租期信息字段:
  - 开始日期: 2025年3月1日
  - 截至日期: 2028年2月29日
  - 状态: 签约/退租/毛坯

联系人信息:
  - 租户联系人: 薛臻
  - 电话: (从Excel读取)
  - 注册地址: 上海市宝山区金石路1658弄11号4层410室

企业画像字段:
  - 等级: A/B/C
  - 企业类型: 餐饮配套/制造业/商务配套等
  - 经营范围: (具体业务)
  - 纳税人资质: 一般纳税人/小规模纳税人
  - 天眼评分: (天眼查评分)
  - 招商: (招商人员)

1.2 查询接口设计

def query_customer_profile(unit_no=None, tenant_name=None, contract_no=None):
    """
    查询客户档案
    
    Args:
        unit_no: 单元号(如 T1-601)
        tenant_name: 租户名(支持模糊匹配)
        contract_no: 合同号
    
    Returns:
        dict: 客户完整档案信息
    """
    # 使用 xlsx skill 读取 Excel
    wb = openpyxl.load_workbook('/Users/mac/美兰中心C+服务.xlsx')
    ws = wb['👨客户管理👨']
    
    headers = [cell.value for cell in ws[1]]
    
    for row in ws.iter_rows(min_row=2, values_only=True):
        # 匹配条件
        if unit_no and row[5] == unit_no:  # 单元号
            return build_customer_dict(headers, row)
        if tenant_name and tenant_name in str(row[6]):  # 租户名模糊匹配
            return build_customer_dict(headers, row)
        if contract_no and row[4] == contract_no:  # 合同号
            return build_customer_dict(headers, row)
    
    return None

1.3 使用示例

用户输入: @企服助手 查询客户 T1-601

输出:

━━━━━━━━━━━━━━━
【客户档案】T1-601

🏢 租户名:上海铭尤力食品有限公司
📍 项目:美慧城四期T1 | 单元类型:办公
📏 建筑面积:143.95㎡ | 楼层:名义6层/实际5层

━━━ 合同信息 ━━━
合同号:ZJML-2024-12260010
租期:3年(2025-03-01 ~ 2028-02-29)
状态:签约 ✅
首年单价:¥1.75/㎡/月

━━━ 联系人 ━━━
联系人:薛臻
电话:[查询Excel获取]
注册地址:上海市宝山区金石路1658弄11号4层410室

━━━ 企业画像 ━━━
等级:[查询Excel获取]
企业类型:[查询Excel获取]
经营范围:食品生产销售
纳税人资质:[查询Excel获取]
天眼评分:[查询Excel获取]

⚡ 操作链接:[腾讯文档-客户管理]
━━━━━━━━━━━━━━━

2. 客户画像 (Customer Portrait)

2.1 画像数据聚合逻辑

客户画像需要聚合多个工作表的数据

def build_customer_portrait(unit_no):
    """
    构建客户画像 - 聚合多个数据源
    
    Args:
        unit_no: 单元号(主键)
    
    Returns:
        dict: 客户画像(包含服务、费用、报修等汇总)
    """
    wb = openpyxl.load_workbook('/Users/mac/美兰中心C+服务.xlsx')
    
    portrait = {
        "基础信息": query_customer_profile(unit_no),
        "服务记录": [],
        "费用记录": [],
        "能耗记录": [],
        "报修记录": [],
        "风险标记": []
    }
    
    # 1. 查询C+服务记录(关联字段:租户名)
    ws_service = wb['C+服务记录']
    tenant_name = portrait["基础信息"]["租户名"]
    
    for row in ws_service.iter_rows(min_row=2, values_only=True):
        if row[0] == tenant_name:  # 关联客户字段
            portrait["服务记录"].append({
                "走访时间": row[1],
                "走访管家": row[2],
                "客户情绪": row[3],
                "成交情况": row[4],
                "服务类别": row[5],
                "成交金额": row[6],
                "详情记录": row[7]
            })
    
    # 2. 查询费用收缴记录(关联字段:单元号)
    ws_fee = wb['👨💼费用收缴👨💼']
    
    for row in ws_fee.iter_rows(min_row=2, values_only=True):
        if row[1] == unit_no:  # 单元号
            portrait["费用记录"].append({
                "合同编号": row[0],
                "费项项目": row[3],
                "应收金额": row[4],
                "已收金额": row[6],
                "欠收金额": row[8],
                "是否支付": row[9],
                "月份": row[13]
            })
    
    # 3. 查询能耗收缴记录(关联字段:单元号)
    ws_energy = wb['👨💼能耗收缴👨💼']
    
    for row in ws_energy.iter_rows(min_row=2, values_only=True):
        if row[0] == unit_no:  # 单元号
            portrait["能耗记录"].append({
                "租户名": row[1],
                "应收金额": row[2],
                "已收金额": row[3],
                "欠费金额": row[4],
                "是否支付": row[5],
                "月份": row[6]
            })
    
    # 4. 查询报修记录(关联字段:楼层/单元)
    ws_repair = wb['🛠️报修情况汇总🛠️']
    
    for row in ws_repair.iter_rows(min_row=2, values_only=True):
        if unit_no in str(row[0]):  # 楼层/单元匹配
            portrait["报修记录"].append({
                "楼层/单元": row[0],
                "紧急程度": row[1],
                "报修细节描述": row[2],
                "报修人员": row[4],
                "报修时间": row[5],
                "维修人员": row[6],
                "维修跟进状态": row[7]
            })
    
    # 5. 计算风险标记
    portrait["风险标记"] = calculate_risk_tags(portrait)
    
    return portrait

2.2 风险标记计算逻辑

def calculate_risk_tags(portrait):
    """
    计算客户风险标记
    
    Returns:
        list: 风险标记列表(如 ["欠费风险", "流失风险"])
    """
    risks = []
    
    # 1. 欠费风险判断
    欠费总额 = 0
    for fee in portrait["费用记录"]:
        if fee["是否支付"] == "否":
            欠费金额 = float(fee["欠收金额"]) if fee["欠收金额"] else 0
            欠费总额 += 欠费金额
    
    if 欠费总额 > 50000:
        risks.append("🚨 高欠费风险(欠费¥{欠费总额:.2f})")
    elif 欠费总额 > 10000:
        risks.append("⚠️ 中度欠费风险(欠费¥{欠费总额:.2f})")
    elif 欠费总额 > 0:
        risks.append("📢 轻度欠费提醒(欠费¥{欠费总额:.2f})")
    
    # 2. 流失风险判断(续租预警)
    基础信息 = portrait["基础信息"]
    if 基础信息:
        截至日期 = parse_date(基础信息["截至日期"])
        剩余天数 = (截至日期 - datetime.now()).days
        
        if 剩余天数 <= 30:
            risks.append(f"🚨 流失风险(合同剩余{剩余天数}天)")
        elif 剩余天数 <= 90:
            risks.append(f"⚠️ 续租预警(合同剩余{剩余天数}天)")
    
    # 3. 投诉/报修频率判断
    报修次数 = len(portrait["报修记录"])
    if 报修次数 >= 3:  # 最近报修次数>=3
        risks.append(f"⚠️ 高频报修({报修次数}次)")
    
    # 4. 服务满意度判断
    满意记录 = [s for s in portrait["服务记录"] if s["客户情绪"] == "满意"]
    总记录 = len(portrait["服务记录"])
    
    if 总记录 > 0 and len(满意记录) / 总记录 < 0.5:
        risks.append(f"⚠️ 低满意度(满意率{len(满意记录)/总记录*100:.1f}%)")
    
    return risks

2.3 使用示例

用户输入: @企服助手 客户画像 上海铭尤力

输出:

━━━━━━━━━━━━━━━
【客户画像】上海铭尤力食品有限公司

📍 单元:T1-601 | 状态:签约 ✅

━━━ 企业标签 ━━━
等级:[查询Excel]
企业类型:食品制造业
纳税人资质:[查询Excel]
天眼评分:[查询Excel]

━━━ 服务记录({服务次数}次)━━━
最近走访:2026-02-02
管家:戚亮先、刘瑞
客户情绪:满意 ✅
成交情况:否
服务类别:室内保洁

━━━ 费用记录 ━━━
应收总额:¥{应收总额:.2f}
已收总额:¥{已收总额:.2f}
欠费金额:¥{欠费总额:.2f}
支付状态:{欠费情况}

━━━ 能耗记录 ━━━
应收总额:¥{能耗应收:.2f}
已收总额:¥{能耗已收:.2f}
欠费金额:¥{能耗欠费:.2f}

━━━ 报修记录 ━━━
报修次数:{报修次数}次
最近报修:[如果有]
报修状态:[状态]

━━━ 风险标记 ━━━
{risks  # 显示所有风险标记,如果没有则显示"无风险"}

━━━ 客户时间线 ━━━
⚡ 点击查看完整时间线:[腾讯文档-客户画像]

━━━━━━━━━━━━━━━

3. 风险提醒 (Risk Alert)

3.1 风险类型定义

风险类型判断条件提醒级别推送渠道
高欠费风险欠费 > ¥50,000🚨 紧急@all
中度欠费风险欠费 ¥10,000-50,000⚠️ 高@财务
轻度欠费提醒欠费 < ¥10,000📢 普通静默记录
流失风险合同剩余 ≤ 30天🚨 紧急@招商 @all
续租预警合同剩余 ≤ 90天⚠️ 高@招商
高频报修最近报修 ≥ 3次⚠️ 高@工程
低满意度满意率 < 50%⚠️ 高@管家

3.2 风险扫描逻辑

def scan_all_risks():
    """
    扫描所有客户风险
    
    Returns:
        dict: 分类风险清单
    """
    wb = openpyxl.load_workbook('/Users/mac/美兰中心C+服务.xlsx')
    ws_customer = wb['👨客户管理👨']
    
    risks_summary = {
        "高欠费风险": [],
        "中度欠费风险": [],
        "轻度欠费提醒": [],
        "流失风险": [],
        "续租预警": [],
        "高频报修": [],
        "低满意度": []
    }
    
    # 遍历所有签约客户
    for row in ws_customer.iter_rows(min_row=2, values_only=True):
        if row[12] == "签约":  # 状态 = 签约
            unit_no = row[5]  # 单元号
            tenant_name = row[6]  # 租户名
            
            # 构建客户画像
            portrait = build_customer_portrait(unit_no)
            risks = portrait["风险标记"]
            
            # 分类归档
            for risk in risks:
                if "高欠费风险" in risk:
                    risks_summary["高欠费风险"].append({
                        "单元号": unit_no,
                        "租户名": tenant_name,
                        "风险详情": risk
                    })
                elif "中度欠费风险" in risk:
                    risks_summary["中度欠费风险"].append({
                        "单元号": unit_no,
                        "租户名": tenant_name,
                        "风险详情": risk
                    })
                # ... 其他风险类型
    
    return risks_summary

3.3 使用示例

用户输入: @企服助手 查询风险客户

输出:

━━━━━━━━━━━━━━━
【风险客户清单】2026-05-28

━━━ 🚨 紧急风险 ━━━
【流失风险】(合同剩余 ≤ 30天)
  • T1-XXX,XXX公司,剩余XX天

【高欠费风险】(欠费 > ¥50,000)
  • T1-XXX,XXX公司,欠费¥XX,XXX

━━━ ⚠️ 高风险 ━━━
【中度欠费风险】(欠费 ¥10,000-50,000)
  • T1-XXX,XXX公司,欠费¥XX,XXX
  • T1-XXX,XXX公司,欠费¥XX,XXX

【续租预警】(合同剩余 ≤ 90天)
  • T1-601,上海铭尤力食品有限公司,剩余XX天

【高频报修】(报修 ≥ 3次)
  • T1-XXX,XXX公司,报修X次

━━━ 📢 普通提醒 ━━━
【轻度欠费提醒】(欠费 < ¥10,000)
  • T1-XXX,XXX公司,欠费¥X,XXX

━━━ 统计 ━━━
风险客户总数:XX个
紧急风险:XX个 | 高风险:XX个 | 普通提醒:XX个

⚡ 操作链接:[腾讯文档-风险清单]
━━━━━━━━━━━━━━━

4. 客户时间线 (Customer Timeline)

4.1 时间线数据整合

def build_customer_timeline(unit_no):
    """
    构建客户时间线 - 按时间排序所有记录
    
    Args:
        unit_no: 单元号
    
    Returns:
        list: 时间线事件列表(按时间倒序)
    """
    portrait = build_customer_portrait(unit_no)
    
    timeline = []
    
    # 1. 合同事件
    基础信息 = portrait["基础信息"]
    if 基础信息:
        timeline.append({
            "时间": 基础信息["开始日期"],
            "事件类型": "合同签约",
            "事件描述": f"签约{基础信息['租期']},单元{unit_no}",
            "详情": 基础信息
        })
    
    # 2. 服务记录事件
    for service in portrait["服务记录"]:
        timeline.append({
            "时间": service["走访时间"],
            "事件类型": "C+服务",
            "事件描述": f"管家{service['走访管家']}走访,情绪{service['客户情绪']}",
            "详情": service
        })
    
    # 3. 费用记录事件
    for fee in portrait["费用记录"]:
        timeline.append({
            "时间": fee["月份"],
            "事件类型": "费用收缴",
            "事件描述": f"{fee['费项项目']},应收¥{fee['应收金额']},已收¥{fee['已收金额']}",
            "详情": fee
        })
    
    # 4. 报修记录事件
    for repair in portrait["报修记录"]:
        timeline.append({
            "时间": repair["报修时间"],
            "事件类型": "报修工单",
            "事件描述": f"{repair['报修细节描述']}, 状态{repair['维修跟进状态']}",
            "详情": repair
        })
    
    # 5. 能耗记录事件
    for energy in portrait["能耗记录"]:
        timeline.append({
            "时间": energy["月份"],
            "事件类型": "能耗收缴",
            "事件描述": f"能耗应收¥{energy['应收金额']},已收¥{energy['已收金额']}",
            "详情": energy
        })
    
    # 按时间排序(倒序,最新在前)
    timeline.sort(key=lambda x: parse_date(x["时间"]), reverse=True)
    
    return timeline

4.2 使用示例

用户输入: @企服助手 客户时间线 T1-601

输出:

━━━━━━━━━━━━━━━
【客户时间线】上海铭尤力食品有限公司(T1-601)

━━━ 时间线(倒序,最新在前)━━━

📅 2026-02-02 【C+服务】
管家戚亮先、刘瑞走访
客户情绪:满意 ✅
服务类别:室内保洁
成交情况:否

📅 2026-01 【能耗收缴】
应收:¥259.31 | 已收:¥259.31
支付状态:是 ✅

📅 2025-03 【合同签约】
签约3年(2025-03-01 ~ 2028-02-29)
单元:T1-601 | 建筑面积:143.95㎡

━━━ 统计 ━━━
总事件数:XX个
服务记录:XX次 | 费用记录:XX条 | 报修记录:XX次

⚡ 完整时间线:[腾讯文档-客户时间线]
━━━━━━━━━━━━━━━

执行流程

Step 1 → 用户输入
          ├─ 查询客户信息(单元号/租户名/合同号)
          ├─ 查看客户画像(租户名)
          ├─ 查询风险客户
          └─ 查看客户时间线(单元号)

Step 2 → 数据读取
          ├─ 使用 xlsx skill 读取 Excel
          ├─ 主表:👨客户管理👨(客户档案)
          ├─ 关联表:费用收缴、能耗收缴、C+服务记录、报修汇总

Step 3 → 数据聚合
          ├─ 关联字段:单元号、租户名、合同号
          ├─ 构建客户画像(聚合所有记录)
          └─ 计算风险标记

Step 4 → 结果输出
          ├─ 格式化输出(Markdown)
          ├─ 推送企微群(可选)
          └─ 生成腾讯文档(可选)

Step 5 → 定时任务(可选)
          ├─ 每天09:00:生成风险提醒日报
          └─ 每天17:00:生成客户异常汇总

定时任务配置

{
  "name": "风险客户提醒日报",
  "schedule": {
    "kind": "cron",
    "expr": "0 9 * * *",
    "tz": "Asia/Shanghai"
  },
  "payload": {
    "kind": "agentTurn",
    "message": "扫描所有客户风险,生成风险提醒日报并推送企微群"
  },
  "sessionTarget": "isolated"
}

手动触发方式

  1. 查询客户档案: @企服助手 查询客户 {单元号}

    • 示例:@企服助手 查询客户 T1-601
  2. 查看客户画像: @企服助手 客户画像 {租户名}

    • 示例:@企服助手 客户画像 上海铭尤力
  3. 查询风险客户: @企服助手 查询风险客户

  4. 客户时间线: @企服助手 客户时间线 {单元号}

    • 示例:@企服助手 客户时间线 T1-601

配置参数

{
  "customer_management": {
    "excel_path": "/Users/mac/美兰中心C+服务.xlsx",
    "sheet_mapping": {
      "客户档案": "👨客户管理👨",
      "费用收缴": "👨💼费用收缴👨💼",
      "能耗收缴": "👨💼能耗收缴👨💼",
      "C+服务记录": "C+服务记录",
      "报修汇总": "🛠️报修情况汇总🛠️",
      "退租汇总": "退租汇总"
    },
    "risk_thresholds": {
      "高欠费风险": 50000,
      "中度欠费风险": 10000,
      "流失风险_days": 30,
      "续租预警_days": 90,
      "高频报修_count": 3,
      "低满意度_rate": 0.5
    },
    "wecom_webhook": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=14fb1170-2119-4f29-b400-67da770e3a3c"
  }
}

关键字段映射表

客户管理表(主表)

字段序号字段名用途示例值
5合同号关联费用收缴表ZJML-2024-12260010
6单元号主键,关联所有表T1-601
7租户名关联C+服务记录上海铭尤力食品有限公司
11开始日期合同起始2025年3月1日
12截至日期续租预警计算2028年2月29日
13状态筛选条件签约/退租/毛坯
15租户联系人联系信息薛臻
16电话联系信息[Excel]
18等级企业标签A/B/C
19企业类型企业标签餐饮配套
22经营范围企业标签食品生产销售

费用收缴表

字段序号字段名用途示例值
1合同编号关联客户表ZJML-2024-12260010
2单元号关联客户表T1-601
3租户名企业名称上海铭尤力食品有限公司
4费项项目费用类型固定租金/物业管理费
5应收金额计算欠费34270.94
7已收金额计算欠费34270.94
9欠收金额风险判断0 或 "34270.94"
10是否支付风险判断是/否

后续扩展接口

  1. 客户搜索优化 - 支持模糊搜索、拼音搜索、企业类型筛选
  2. 客户标签管理 - 自动打标签(如"优质客户"、"风险客户"、"意向客户")
  3. 客户分组统计 - 按等级、企业类型、租期分组统计
  4. 客户导出功能 - 导出客户画像到腾讯文档
  5. 客户对比分析 - 对比同一企业类型的不同客户表现

注意事项

  1. 数据隐私 - Excel包含客户敏感信息,禁止外泄
  2. 关联字段一致性 - 单元号、租户名在各个表中的格式必须一致
  3. 日期格式解析 - Excel日期格式多样(如"2025年3月1日"、"2025-03-01"),需要统一解析
  4. 数据更新 - Excel台账可能定期更新,需要重新读取最新数据

当前状态: 技能框架已完成,数据映射表已定义,可立即运行测试。

数据源: /Users/mac/美兰中心C+服务.xlsx(真实业务数据)

核心价值: 客户管理中心作为企服助手的"大脑",统一管理所有客户信息,为其他6个技能提供客户数据支持。