# -*- 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__ 家门店
"""
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()