# -*- coding: utf-8 -*- """ 门店数据工作台生成器 —— 把月度检测数据渲染成单文件交互式 HTML 工作台 输入: 门店数据_<月份>.csv (与 detect.py 同源) 输出: 04_输出/门店工作台_<月份>.html v3 变更: - 右侧菜单栏「考核指标」:展示全部阈值默认值,可自定义修改 - 阈值改动后前端按 detect.py 同一套规则重算全量门店(KPI/图表/表格/详情同步) - 自定义阈值存 localStorage,刷新不丢;可一键恢复官方默认 - 新增「导出清单」:导出当前筛选结果 CSV 用法: python build_dashboard.py [--month 2026-10] """ import csv import json import os import sys from detect import detect, THRESH BASE = os.path.dirname(os.path.abspath(__file__)) OUT = os.path.join(os.path.dirname(BASE), '04_输出') TEMPLATE = r""" 门店数据工作台 __MONTH__
怡呵美 · 水光会员店

门店数据工作台 · __MONTH__

规则来源:《门店考核指标》官方基准线· 共 __COUNT__ 家门店

问题命中分布(按类型)

核销金额分布

门店数 TOP15 城市

门店城市 评分核销率核销金额退单率 触发问题
""" def main(): args = sys.argv[1:] src = args[0] if args and args[0].endswith('.csv') else os.path.join(BASE, '门店数据_10月.csv') month = '2026-10' if '--month' in args: month = args[args.index('--month') + 1] rows = list(csv.DictReader(open(src, encoding='utf-8-sig'))) metrics, conflicts = detect(rows) # 只传原始字段,检测逻辑放到前端,阈值改动后可直接重算 data = [dict(id=m['门店ID'], name=m['门店名称'], city=m['城市'], score=m['评分'], hx_rate=m['核销率'], hx_amt=m['核销金额'], hx_cnt=m['核销券数'], td=m['商责退单率'], ts=m['投诉率'], cp=m['差评率'], cp_src=m['差评口径'], reply=m['回复率'], visit=int(m['月访问']), videos=int(m['新视频'])) for m in metrics] html = (TEMPLATE .replace('__DATA__', json.dumps(data, ensure_ascii=False, separators=(',', ':'))) .replace('__THRESH__', json.dumps(THRESH)) .replace('__MONTH__', month) .replace('__COUNT__', str(len(data)))) out = os.path.join(OUT, f'门店工作台_{month.replace("-", "")}.html') with open(out, 'w', encoding='utf-8') as fp: fp.write(html) print(f'工作台已生成: {out} ({os.path.getsize(out) // 1024} KB, {len(data)} 家门店)') if __name__ == '__main__': main()