Files
Neo-ZQYY/scripts/ops/refine_board_customer.py

586 lines
34 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""board-customer.html 各维度精细调整 v2"""
import pathlib, re
TARGET = pathlib.Path(__file__).resolve().parents[2] / "docs/h5_ui/pages/board-customer.html"
html = TARGET.read_text(encoding="utf-8")
# ── 通用:跟/弃 badge 向下偏移 ──
# 在 CSS 中把 assistant-badge 的 transform 改为向下多移一点
html = html.replace(
"transform: translateY(-0.5px);",
"transform: translateY(1.5px);"
)
def avatar(cf, ct, ch):
return f'''<div class="w-9 h-9 rounded-xl bg-gradient-to-br from-{cf} to-{ct} flex items-center justify-center shrink-0">
<span class="text-white font-semibold text-sm">{ch}</span>
</div>'''
# 助教行
def cr(c):
return f''' <div class="text-xs border-t border-gray-1 pt-2 ml-11">
<span class="text-gray-6">助教:</span>
{c}
</div>'''
CA = '''<span class="assistant-tag">❤️ <span class="assistant-assignee">小燕</span><span class="assistant-badge assistant-badge-follow">跟</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">泡芙</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-abandoned">Amy</span><span class="assistant-badge assistant-badge-drop">弃</span></span>'''
CB = '''<span class="assistant-tag">❤️ <span class="assistant-normal">Amy</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">小燕</span></span>'''
CC = '''<span class="assistant-tag">❤️ <span class="assistant-assignee">泡芙</span><span class="assistant-badge assistant-badge-follow">跟</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">小燕</span></span>'''
CD = '''<span class="assistant-tag">❤️ <span class="assistant-normal">泡芙</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-assignee">小燕</span><span class="assistant-badge assistant-badge-follow">跟</span></span>'''
CE = '''<span class="assistant-tag">❤️ <span class="assistant-normal">Amy</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-abandoned">泡芙</span><span class="assistant-badge assistant-badge-drop">弃</span></span>'''
CF = '''<span class="assistant-tag">❤️ <span class="assistant-normal">小燕</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">泡芙</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-abandoned">Amy</span><span class="assistant-badge assistant-badge-drop">弃</span></span>'''
CG = '''<span class="assistant-tag">❤️ <span class="assistant-assignee">小燕</span><span class="assistant-badge assistant-badge-follow">跟</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">泡芙</span></span>'''
CH = '''<span class="assistant-tag">❤️ <span class="assistant-normal">泡芙</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">Amy</span></span>'''
CI = '''<span class="assistant-tag">❤️ <span class="assistant-assignee">小燕</span><span class="assistant-badge assistant-badge-follow">跟</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-abandoned">泡芙</span><span class="assistant-badge assistant-badge-drop">弃</span></span>'''
CJ = '''<span class="assistant-tag">❤️ <span class="assistant-assignee">Amy</span><span class="assistant-badge assistant-badge-follow">跟</span></span>
<span class="assistant-sep">|</span>
<span class="assistant-tag">❤️ <span class="assistant-normal">小燕</span></span>'''
# ══ 维度1: 最应召回 — 去掉进度条,重新设计 ══
DIM_RECALL = '''
<!-- ==================== 最应召回(默认) ==================== -->
<div id="dim-recall" class="dim-container active p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("amber-400","orange-500","") + '''
<div>
<span class="font-semibold text-gray-13">王先生</span>
<div class="flex items-center gap-1.5 mt-0.5">
<span class="text-xs text-gray-6">理想 <span class="text-gray-11 font-medium">7天</span></span>
<span class="text-xs text-gray-6">已过 <span class="text-error font-bold">15天</span></span>
</div>
</div>
</div>
<span class="px-2.5 py-1 bg-error/10 text-error text-sm font-bold rounded-lg">超期 8天</span>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">30天到店 <span class="text-gray-11 font-medium">5次</span></div>
<div class="text-gray-6">余额 <span class="text-gray-11 font-medium">¥8,000</span></div>
<div class="text-gray-6">召回指数 <span class="text-primary font-bold">0.92</span></div>
</div>
''' + cr(CA) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("pink-400","rose-500","") + '''
<div>
<span class="font-semibold text-gray-13">李女士</span>
<div class="flex items-center gap-1.5 mt-0.5">
<span class="text-xs text-gray-6">理想 <span class="text-gray-11 font-medium">10天</span></span>
<span class="text-xs text-gray-6">已过 <span class="text-error font-bold">20天</span></span>
</div>
</div>
</div>
<span class="px-2.5 py-1 bg-warning/10 text-warning text-sm font-bold rounded-lg">超期 10天</span>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">30天到店 <span class="text-gray-11 font-medium">3次</span></div>
<div class="text-gray-6">余额 <span class="text-gray-11 font-medium">¥12,500</span></div>
<div class="text-gray-6">召回指数 <span class="text-primary font-bold">0.88</span></div>
</div>
''' + cr(CB) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("blue-400","indigo-500","") + '''
<div>
<span class="font-semibold text-gray-13">张先生</span>
<div class="flex items-center gap-1.5 mt-0.5">
<span class="text-xs text-gray-6">理想 <span class="text-gray-11 font-medium">7天</span></span>
<span class="text-xs text-gray-6">已过 <span class="text-error font-bold">18天</span></span>
</div>
</div>
</div>
<span class="px-2.5 py-1 bg-error/10 text-error text-sm font-bold rounded-lg">超期 11天</span>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">30天到店 <span class="text-gray-11 font-medium">2次</span></div>
<div class="text-gray-6">余额 <span class="text-gray-11 font-medium">¥3,200</span></div>
<div class="text-gray-6">召回指数 <span class="text-primary font-bold">0.85</span></div>
</div>
''' + cr(CC) + '''
</a>
</div>
'''
# ══ 维度2: 最大消费潜力 — 卡片内文字增大 ══
DIM_POTENTIAL = '''
<!-- ==================== 最大消费潜力 ==================== -->
<div id="dim-potential" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("rose-400","pink-500","") + '''
<span class="font-semibold text-gray-13">赵女士</span>
</div>
<div class="text-right shrink-0">
<div class="text-primary font-bold">0.95</div>
<div class="text-[10px] text-gray-6 -mt-0.5">消费潜力</div>
</div>
</div>
<div class="ml-11 mb-2 bg-gradient-to-r from-primary/5 to-blue-50 rounded-lg p-3">
<div class="flex items-center gap-2 mb-2">
<span class="text-sm font-bold text-primary">🔥 S级潜力</span>
<span class="text-xs text-gray-6">高频 · 高客单 · 高余额</span>
</div>
<div class="grid grid-cols-3 gap-2 text-center">
<div><p class="text-sm font-bold text-gray-13">¥4,800</p><p class="text-xs text-gray-6">近30天消费</p></div>
<div><p class="text-sm font-bold text-gray-13">8次</p><p class="text-xs text-gray-6">月均到店</p></div>
<div><p class="text-sm font-bold text-success">¥15,000</p><p class="text-xs text-gray-6">余额</p></div>
</div>
</div>
''' + cr(CD) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("green-400","emerald-500","") + '''
<span class="font-semibold text-gray-13">刘先生</span>
</div>
<div class="text-right shrink-0">
<div class="text-primary font-bold">0.87</div>
<div class="text-[10px] text-gray-6 -mt-0.5">消费潜力</div>
</div>
</div>
<div class="ml-11 mb-2 bg-gradient-to-r from-primary/5 to-blue-50 rounded-lg p-3">
<div class="flex items-center gap-2 mb-2">
<span class="text-sm font-bold text-primary">⭐ A级潜力</span>
<span class="text-xs text-gray-6">中频 · 高客单</span>
</div>
<div class="grid grid-cols-3 gap-2 text-center">
<div><p class="text-sm font-bold text-gray-13">¥3,500</p><p class="text-xs text-gray-6">近30天消费</p></div>
<div><p class="text-sm font-bold text-gray-13">5次</p><p class="text-xs text-gray-6">月均到店</p></div>
<div><p class="text-sm font-bold text-success">¥6,800</p><p class="text-xs text-gray-6">余额</p></div>
</div>
</div>
''' + cr(CE) + '''
</a>
</div>
'''
# ══ 维度3: 最高余额 — 余额小2号去进度条预计可用放余额右侧其他大2号 ══
DIM_BALANCE = '''
<!-- ==================== 最高余额 ==================== -->
<div id="dim-balance" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-1">
<div class="flex items-center gap-2">
''' + avatar("rose-400","pink-500","") + '''
<span class="font-semibold text-gray-13">赵女士</span>
</div>
</div>
<div class="ml-11 mb-2">
<div class="flex items-baseline gap-2">
<span class="text-lg font-bold text-warning">¥25,000</span>
<span class="text-xs text-gray-6">余额</span>
<span class="text-xs text-gray-5">·</span>
<span class="text-sm font-medium text-success">可用约8个月</span>
</div>
<div class="flex items-center gap-4 mt-2 text-sm">
<div class="text-gray-6">60天消费 <span class="text-gray-11 font-medium">¥6,200</span></div>
<div class="text-gray-6">月均消耗 <span class="text-gray-11 font-medium">¥3,100</span></div>
</div>
<div class="flex items-center gap-4 mt-1 text-sm">
<div class="text-gray-6">最近到店 <span class="text-gray-11 font-medium">12天前</span></div>
<div class="text-gray-6">理想间隔 <span class="text-gray-11 font-medium">10天</span></div>
</div>
</div>
''' + cr(CF) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-1">
<div class="flex items-center gap-2">
''' + avatar("purple-400","violet-500","") + '''
<span class="font-semibold text-gray-13">陈先生</span>
</div>
</div>
<div class="ml-11 mb-2">
<div class="flex items-baseline gap-2">
<span class="text-lg font-bold text-warning">¥18,500</span>
<span class="text-xs text-gray-6">余额</span>
<span class="text-xs text-gray-5">·</span>
<span class="text-sm font-medium text-success">可用约9.7个月</span>
</div>
<div class="flex items-center gap-4 mt-2 text-sm">
<div class="text-gray-6">60天消费 <span class="text-gray-11 font-medium">¥3,800</span></div>
<div class="text-gray-6">月均消耗 <span class="text-gray-11 font-medium">¥1,900</span></div>
</div>
<div class="flex items-center gap-4 mt-1 text-sm">
<div class="text-gray-6">最近到店 <span class="text-gray-11 font-medium">8天前</span></div>
<div class="text-gray-6">理想间隔 <span class="text-gray-11 font-medium">14天</span></div>
</div>
</div>
''' + cr(CG) + '''
</a>
</div>
'''
# ══ 维度4: 最近充值 — 数据字号大2号本年充值→最近3个月充值 ══
DIM_RECHARGE = '''
<!-- ==================== 最近充值 ==================== -->
<div id="dim-recharge" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center gap-2 mb-2">
''' + avatar("indigo-400","blue-500","") + '''
<div class="flex-1 min-w-0">
<span class="font-semibold text-gray-13">吴先生</span>
</div>
<span class="text-[10px] text-gray-6">2天前充值</span>
</div>
<div class="ml-11 mb-2 bg-gradient-to-r from-emerald-50 to-green-50 rounded-lg p-2.5 border border-emerald-100/50">
<div class="flex items-center justify-between">
<div>
<span class="text-lg font-bold text-success">+¥5,000</span>
<span class="text-[10px] text-gray-6 ml-1">充值</span>
</div>
<div class="text-right">
<div class="text-xs text-gray-6">充后余额</div>
<div class="text-sm font-bold text-gray-13">¥8,200</div>
</div>
</div>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">最近到店 <span class="text-gray-11 font-medium">2天前</span></div>
<div class="text-gray-6">理想间隔 <span class="text-gray-11 font-medium">7天</span></div>
<div class="text-gray-6">近3月充值 <span class="text-success font-medium">3次</span></div>
</div>
''' + cr(CB) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center gap-2 mb-2">
''' + avatar("orange-400","amber-500","") + '''
<div class="flex-1 min-w-0">
<span class="font-semibold text-gray-13">郑女士</span>
</div>
<span class="text-[10px] text-gray-6">5天前充值</span>
</div>
<div class="ml-11 mb-2 bg-gradient-to-r from-emerald-50 to-green-50 rounded-lg p-2.5 border border-emerald-100/50">
<div class="flex items-center justify-between">
<div>
<span class="text-lg font-bold text-success">+¥3,000</span>
<span class="text-[10px] text-gray-6 ml-1">充值</span>
</div>
<div class="text-right">
<div class="text-xs text-gray-6">充后余额</div>
<div class="text-sm font-bold text-gray-13">¥6,500</div>
</div>
</div>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">最近到店 <span class="text-gray-11 font-medium">5天前</span></div>
<div class="text-gray-6">理想间隔 <span class="text-gray-11 font-medium">10天</span></div>
<div class="text-gray-6">近3月充值 <span class="text-success font-medium">2次</span></div>
</div>
''' + cr(CC) + '''
</a>
</div>
'''
# ══ 维度5: 最高消费 近60天 — 消费金额小2号去余额到店+次均放一行去排名icon ══
DIM_SPEND60 = '''
<!-- ==================== 最高消费 近60天 ==================== -->
<div id="dim-spend60" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("pink-400","rose-500","") + '''
<span class="font-semibold text-gray-13">李女士</span>
</div>
</div>
<div class="ml-11 mb-2">
<div class="flex items-baseline gap-3">
<div>
<span class="text-lg font-bold text-warning">¥12,800</span>
<span class="text-xs text-gray-6 ml-1">近60天消费</span>
</div>
<span class="text-xs text-gray-5">·</span>
<span class="text-sm text-gray-9">18次到店</span>
<span class="text-xs text-gray-5">·</span>
<span class="text-sm text-gray-9">次均¥711</span>
</div>
</div>
''' + cr(CA) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("amber-400","orange-500","") + '''
<span class="font-semibold text-gray-13">王先生</span>
</div>
</div>
<div class="ml-11 mb-2">
<div class="flex items-baseline gap-3">
<div>
<span class="text-lg font-bold text-warning">¥9,500</span>
<span class="text-xs text-gray-6 ml-1">近60天消费</span>
</div>
<span class="text-xs text-gray-5">·</span>
<span class="text-sm text-gray-9">12次到店</span>
<span class="text-xs text-gray-5">·</span>
<span class="text-sm text-gray-9">次均¥792</span>
</div>
</div>
''' + cr(CH) + '''
</a>
</div>
'''
# ══ 维度6: 最频繁 近60天 — 左侧放平均间隔+60天消费去余额柱状图上标本周天数 ══
DIM_FREQ60 = '''
<!-- ==================== 最频繁 近60天 ==================== -->
<div id="dim-freq60" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("blue-400","indigo-500","") + '''
<div class="flex-1 min-w-0">
<span class="font-semibold text-gray-13">张先生</span>
<div class="flex items-center gap-3 mt-0.5 text-xs">
<span class="text-gray-6">平均间隔 <span class="text-primary font-medium">3.3天</span></span>
<span class="text-gray-6">60天消费 <span class="text-gray-11 font-medium">¥8,600</span></span>
</div>
</div>
</div>
<div class="text-right shrink-0">
<div class="text-primary font-bold text-lg">18<span class="text-xs font-normal text-gray-6">天</span></div>
<div class="text-[10px] text-gray-6 -mt-0.5">60天到店</div>
</div>
</div>
<div class="ml-11 mb-2">
<div class="flex items-center justify-between text-[10px] text-gray-5 mb-0.5">
<span>8周前</span>
<span>本周 <span class="text-primary font-bold text-xs">3</span></span>
</div>
<div class="flex items-end gap-0.5 h-6">
<div class="flex-1 bg-primary/20 rounded-t" style="height:60%"></div>
<div class="flex-1 bg-primary/30 rounded-t" style="height:80%"></div>
<div class="flex-1 bg-primary/40 rounded-t" style="height:50%"></div>
<div class="flex-1 bg-primary/50 rounded-t" style="height:100%"></div>
<div class="flex-1 bg-primary/40 rounded-t" style="height:70%"></div>
<div class="flex-1 bg-primary/60 rounded-t" style="height:90%"></div>
<div class="flex-1 bg-primary/30 rounded-t" style="height:40%"></div>
<div class="flex-1 bg-primary/50 rounded-t" style="height:75%"></div>
</div>
</div>
''' + cr(CF) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center gap-2">
''' + avatar("purple-400","violet-500","") + '''
<div class="flex-1 min-w-0">
<span class="font-semibold text-gray-13">陈先生</span>
<div class="flex items-center gap-3 mt-0.5 text-xs">
<span class="text-gray-6">平均间隔 <span class="text-primary font-medium">4天</span></span>
<span class="text-gray-6">60天消费 <span class="text-gray-11 font-medium">¥6,200</span></span>
</div>
</div>
</div>
<div class="text-right shrink-0">
<div class="text-primary font-bold text-lg">15<span class="text-xs font-normal text-gray-6">天</span></div>
<div class="text-[10px] text-gray-6 -mt-0.5">60天到店</div>
</div>
</div>
<div class="ml-11 mb-2">
<div class="flex items-center justify-between text-[10px] text-gray-5 mb-0.5">
<span>8周前</span>
<span>本周 <span class="text-primary font-bold text-xs">2</span></span>
</div>
<div class="flex items-end gap-0.5 h-6">
<div class="flex-1 bg-primary/20 rounded-t" style="height:40%"></div>
<div class="flex-1 bg-primary/30 rounded-t" style="height:60%"></div>
<div class="flex-1 bg-primary/40 rounded-t" style="height:70%"></div>
<div class="flex-1 bg-primary/30 rounded-t" style="height:50%"></div>
<div class="flex-1 bg-primary/50 rounded-t" style="height:80%"></div>
<div class="flex-1 bg-primary/40 rounded-t" style="height:65%"></div>
<div class="flex-1 bg-primary/60 rounded-t" style="height:90%"></div>
<div class="flex-1 bg-primary/50 rounded-t" style="height:70%"></div>
</div>
</div>
''' + cr(CJ) + '''
</a>
</div>
'''
# ══ 维度7: 最近到店 — 去进度条数据大2号余额→次均消费金额 ══
DIM_RECENT = '''
<!-- ==================== 最近到店 ==================== -->
<div id="dim-recent" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center gap-2 mb-2">
''' + avatar("green-400","emerald-500","") + '''
<div class="flex-1 min-w-0">
<span class="font-semibold text-gray-13">刘先生</span>
</div>
<div class="flex items-baseline gap-0.5 shrink-0">
<span class="text-2xl font-bold text-success">1</span>
<span class="text-xs text-gray-6">天前到店</span>
</div>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">理想间隔 <span class="text-gray-11 font-medium">7天</span></div>
<div class="text-gray-6">60天到店 <span class="text-gray-11 font-medium">12天</span></div>
<div class="text-gray-6">次均消费 <span class="text-gray-11 font-medium">¥450</span></div>
</div>
''' + cr(CH) + '''
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center gap-2 mb-2">
''' + avatar("cyan-400","teal-500","") + '''
<div class="flex-1 min-w-0">
<span class="font-semibold text-gray-13">周先生</span>
</div>
<div class="flex items-baseline gap-0.5 shrink-0">
<span class="text-2xl font-bold text-success">2</span>
<span class="text-xs text-gray-6">天前到店</span>
</div>
</div>
<div class="flex flex-wrap gap-x-4 gap-y-1 text-sm ml-11 mb-2">
<div class="text-gray-6">理想间隔 <span class="text-gray-11 font-medium">10天</span></div>
<div class="text-gray-6">60天到店 <span class="text-gray-11 font-medium">8天</span></div>
<div class="text-gray-6">次均消费 <span class="text-gray-11 font-medium">¥475</span></div>
</div>
''' + cr(CI) + '''
</a>
</div>
'''
# ══ 维度8: 最专一 — 去右上角专一指数,去进度条,爱心+昵称+数据表格式,去底部数据 ══
DIM_LOYAL = '''
<!-- ==================== 最专一 ==================== -->
<div id="dim-loyal" class="dim-container p-4 pt-1 space-y-3">
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center gap-2 mb-2.5">
''' + avatar("teal-400","cyan-500","") + '''
<span class="font-semibold text-gray-13">孙先生</span>
</div>
<div class="ml-11 mb-1 space-y-1.5">
<!-- 表头 -->
<div class="flex items-center text-[10px] text-gray-5 gap-1">
<span class="w-14"></span>
<span class="flex-1"></span>
<span class="w-12 text-right">次均时长</span>
<span class="w-12 text-right">60天时长</span>
<span class="w-10 text-right">服务次</span>
</div>
<!-- 小燕 -->
<div class="flex items-center gap-1">
<span class="w-14 flex items-center gap-0.5 shrink-0"><span class="text-xs">❤️</span><span class="text-xs font-medium text-error">小燕</span></span>
<span class="text-[10px] text-gray-5 shrink-0">0.95</span>
<span class="assistant-badge assistant-badge-follow text-[9px] shrink-0">跟</span>
<span class="flex-1"></span>
<span class="w-12 text-right text-xs font-medium text-gray-11">2.1h</span>
<span class="w-12 text-right text-xs font-medium text-gray-11">25.2h</span>
<span class="w-10 text-right text-xs font-medium text-gray-11">12</span>
</div>
<!-- 泡芙 -->
<div class="flex items-center gap-1">
<span class="w-14 flex items-center gap-0.5 shrink-0"><span class="text-xs">❤️</span><span class="text-xs font-medium text-gray-13">泡芙</span></span>
<span class="text-[10px] text-gray-5 shrink-0">0.68</span>
<span class="flex-1"></span>
<span class="w-12 text-right text-xs font-medium text-gray-11">1.8h</span>
<span class="w-12 text-right text-xs font-medium text-gray-11">9.0h</span>
<span class="w-10 text-right text-xs font-medium text-gray-11">5</span>
</div>
<!-- Amy -->
<div class="flex items-center gap-1">
<span class="w-14 flex items-center gap-0.5 shrink-0"><span class="text-xs">❤️</span><span class="text-xs font-medium text-gray-5">Amy</span></span>
<span class="text-[10px] text-gray-5 shrink-0">0.32</span>
<span class="assistant-badge assistant-badge-drop text-[9px] shrink-0">弃</span>
<span class="flex-1"></span>
<span class="w-12 text-right text-xs text-gray-7">1.2h</span>
<span class="w-12 text-right text-xs text-gray-7">3.6h</span>
<span class="w-10 text-right text-xs text-gray-7">3</span>
</div>
</div>
</a>
<a href="customer-detail.html" class="block bg-white rounded-2xl p-4 shadow-sm customer-card">
<div class="flex items-center gap-2 mb-2.5">
''' + avatar("rose-400","pink-500","") + '''
<span class="font-semibold text-gray-13">赵女士</span>
</div>
<div class="ml-11 mb-1 space-y-1.5">
<div class="flex items-center text-[10px] text-gray-5 gap-1">
<span class="w-14"></span>
<span class="flex-1"></span>
<span class="w-12 text-right">次均时长</span>
<span class="w-12 text-right">60天时长</span>
<span class="w-10 text-right">服务次</span>
</div>
<div class="flex items-center gap-1">
<span class="w-14 flex items-center gap-0.5 shrink-0"><span class="text-xs">❤️</span><span class="text-xs font-medium text-gray-13">Amy</span></span>
<span class="text-[10px] text-gray-5 shrink-0">0.88</span>
<span class="flex-1"></span>
<span class="w-12 text-right text-xs font-medium text-gray-11">2.3h</span>
<span class="w-12 text-right text-xs font-medium text-gray-11">32.2h</span>
<span class="w-10 text-right text-xs font-medium text-gray-11">14</span>
</div>
<div class="flex items-center gap-1">
<span class="w-14 flex items-center gap-0.5 shrink-0"><span class="text-xs">❤️</span><span class="text-xs font-medium text-gray-13">泡芙</span></span>
<span class="text-[10px] text-gray-5 shrink-0">0.72</span>
<span class="flex-1"></span>
<span class="w-12 text-right text-xs font-medium text-gray-11">1.5h</span>
<span class="w-12 text-right text-xs font-medium text-gray-11">12.0h</span>
<span class="w-10 text-right text-xs font-medium text-gray-11">8</span>
</div>
</div>
</a>
</div>
'''
# ══ 执行替换 ══
ALL_DIMS = DIM_RECALL + DIM_POTENTIAL + DIM_BALANCE + DIM_RECHARGE + DIM_SPEND60 + DIM_FREQ60 + DIM_RECENT + DIM_LOYAL
start_marker = '<div id="dim-recall"'
end_marker = '<!-- 悬浮助手按钮'
start_idx = html.find(start_marker)
end_idx = html.find(end_marker)
if start_idx == -1 or end_idx == -1:
print(f"ERROR: 找不到替换标记 start={start_idx} end={end_idx}")
import sys; sys.exit(1)
# 回退到行首
start_idx = html.rfind('\n', 0, start_idx) + 1
new_html = html[:start_idx] + ALL_DIMS + '\n ' + html[end_idx:]
TARGET.write_text(new_html, encoding="utf-8")
print(f"OK: board-customer.html v2 已重写,共 {len(new_html)} 字符")