Install
openclaw skills install enterprise-customer-management客户管理中心技能。提供客户档案管理、客户画像分析、风险提醒、客户时间线查询。基于中集金地美兰中心真实业务数据(Excel台账)。触发场景:(1) 查询客户信息(@企服助手 查询客户 T1-601),(2) 查看客户画像(@企服助手 客户画像 上海铭尤力),(3) 查询风险客户(@企服助手 查询风险客户),(4) 定时任务生成风险提醒日报。
openclaw skills install enterprise-customer-management本技能为企服助手的核心模块,统一管理中集金地美兰中心的客户信息,提供:
文件路径: /Users/mac/美兰中心C+服务.xlsx
| 功能模块 | 工作表名 | 字段数 | 记录数 | 说明 |
|---|---|---|---|---|
| 客户档案 | 👨客户管理👨 | 27 | 151 | 企业基础信息、合同、租期 |
| 费用收缴 | 👨💼费用收缴👨💼 | 14 | 396 | 固定租金、物业管理费等 |
| 能耗收缴 | 👨💼能耗收缴👨💼 | 7 | 149 | 水电燃气费用 |
| C+服务记录 | C+服务记录 | 10 | 22 | 走访记录、服务成交 |
| 报修情况 | 🛠️报修情况汇总🛠️ | 13 | 4 | 报修工单记录 |
| 退租汇总 | 退租汇总 | 13 | 6 | 退租企业信息 |
客户管理表字段(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
- 企业类型: 餐饮配套/制造业/商务配套等
- 经营范围: (具体业务)
- 纳税人资质: 一般纳税人/小规模纳税人
- 天眼评分: (天眼查评分)
- 招商: (招商人员)
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
用户输入: @企服助手 查询客户 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获取]
⚡ 操作链接:[腾讯文档-客户管理]
━━━━━━━━━━━━━━━
客户画像需要聚合多个工作表的数据:
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
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
用户输入: @企服助手 客户画像 上海铭尤力
输出:
━━━━━━━━━━━━━━━
【客户画像】上海铭尤力食品有限公司
📍 单元:T1-601 | 状态:签约 ✅
━━━ 企业标签 ━━━
等级:[查询Excel]
企业类型:食品制造业
纳税人资质:[查询Excel]
天眼评分:[查询Excel]
━━━ 服务记录({服务次数}次)━━━
最近走访:2026-02-02
管家:戚亮先、刘瑞
客户情绪:满意 ✅
成交情况:否
服务类别:室内保洁
━━━ 费用记录 ━━━
应收总额:¥{应收总额:.2f}
已收总额:¥{已收总额:.2f}
欠费金额:¥{欠费总额:.2f}
支付状态:{欠费情况}
━━━ 能耗记录 ━━━
应收总额:¥{能耗应收:.2f}
已收总额:¥{能耗已收:.2f}
欠费金额:¥{能耗欠费:.2f}
━━━ 报修记录 ━━━
报修次数:{报修次数}次
最近报修:[如果有]
报修状态:[状态]
━━━ 风险标记 ━━━
{risks # 显示所有风险标记,如果没有则显示"无风险"}
━━━ 客户时间线 ━━━
⚡ 点击查看完整时间线:[腾讯文档-客户画像]
━━━━━━━━━━━━━━━
| 风险类型 | 判断条件 | 提醒级别 | 推送渠道 |
|---|---|---|---|
| 高欠费风险 | 欠费 > ¥50,000 | 🚨 紧急 | @all |
| 中度欠费风险 | 欠费 ¥10,000-50,000 | ⚠️ 高 | @财务 |
| 轻度欠费提醒 | 欠费 < ¥10,000 | 📢 普通 | 静默记录 |
| 流失风险 | 合同剩余 ≤ 30天 | 🚨 紧急 | @招商 @all |
| 续租预警 | 合同剩余 ≤ 90天 | ⚠️ 高 | @招商 |
| 高频报修 | 最近报修 ≥ 3次 | ⚠️ 高 | @工程 |
| 低满意度 | 满意率 < 50% | ⚠️ 高 | @管家 |
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
用户输入: @企服助手 查询风险客户
输出:
━━━━━━━━━━━━━━━
【风险客户清单】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个
⚡ 操作链接:[腾讯文档-风险清单]
━━━━━━━━━━━━━━━
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
用户输入: @企服助手 客户时间线 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"
}
查询客户档案: @企服助手 查询客户 {单元号}
@企服助手 查询客户 T1-601查看客户画像: @企服助手 客户画像 {租户名}
@企服助手 客户画像 上海铭尤力查询风险客户: @企服助手 查询风险客户
客户时间线: @企服助手 客户时间线 {单元号}
@企服助手 客户时间线 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 | 是否支付 | 风险判断 | 是/否 |
当前状态: 技能框架已完成,数据映射表已定义,可立即运行测试。
数据源: /Users/mac/美兰中心C+服务.xlsx(真实业务数据)
核心价值: 客户管理中心作为企服助手的"大脑",统一管理所有客户信息,为其他6个技能提供客户数据支持。