|
|
1 viikko sitten | |
|---|---|---|
| .. | ||
| backend | 1 viikko sitten | |
| deploy | 1 viikko sitten | |
| frontend | 1 viikko sitten | |
| sync | 1 viikko sitten | |
| tools | 1 viikko sitten | |
| DEPLOY.md | 1 viikko sitten | |
| README.md | 1 viikko sitten | |
| start.sh | 1 viikko sitten | |
| 启动工作台.bat | 1 viikko sitten | |
| 启动工作台.command | 1 viikko sitten | |
| 开放局域网访问.bat | 1 viikko sitten | |
怡呵美门店数据检测工作台。每天把门店后台导出的数据丢进来,工作台自动算出 「哪些门店超违规线 / 低于考核基准 / 零核销」,并给出整改建议与反馈文案。
store-ops/
├── backend/ 后端(Python 标准库,零依赖)
│ ├── server.py HTTP 服务 + API 路由 + 收件箱自动导入
│ ├── db.py SQLite 存储与月度聚合
│ ├── ingest.py 数据导入 CSV / Excel(编码自适应 / 表头别名 / 日·月双粒度)
│ ├── xlsx.py .xlsx 解析(标准库 zipfile+XML,无需 openpyxl)
│ └── rules.py 考核指标默认值 + 检测规则(唯一规则源)
├── frontend/ 前端(原生 HTML/CSS/JS + 本地 ECharts)
│ ├── index.html
│ ├── style.css 工作台主样式
│ ├── report.css 单店分析报告样式(A4 打印 + 移动端)
│ ├── app.js
│ └── vendor/echarts.min.js
├── data/
│ ├── app.db SQLite 数据库(自动生成)
│ ├── inbox/ ★ 收件箱:CSV / Excel 丢进这里,20 秒内自动导入
│ └── processed/ 已处理的文件(按时间戳归档)
├── 启动工作台.bat 双击启动(Windows)
├── 启动工作台.command 双击启动(macOS / Linux)
└── 开放局域网访问.bat 放行防火墙(Windows 管理员)
Windows:双击 启动工作台.bat。
macOS / Linux:双击 启动工作台.command(首次若被系统拦下,右键 → 打开)。
或者终端里:
./启动工作台.command # 默认 8787 端口并自动开浏览器
./启动工作台.command 9000 # 换端口
./启动工作台.command --local # 只允许本机访问
./启动工作台.command --no-open # 不自动开浏览器
任何系统都可以直接调后端:
python3 backend/server.py # 默认监听 0.0.0.0:8787(本机 + 局域网都能访问)
python3 backend/server.py --local # 只允许本机访问(127.0.0.1)
python3 backend/server.py --port 9000 --open # 换端口并自动开浏览器
启动窗口会打印两行地址,把「局域网访问」那一行发给同事即可:
本机访问 : http://127.0.0.1:8787
局域网访问: http://192.168.10.232:8787
前提:两台设备连同一个 WiFi / 同一个路由器,并且本机防火墙放行 8787 端口。
开放局域网访问.bat(会弹管理员授权,点「是」),只需做一次,之后一直有效。⚠️ 该服务没有登录验证,同一内网内任何人打开链接都能看数据和改配置,只在公司办公网络内使用,不要在公共 WiFi(咖啡馆、酒店)上开放。想关闭局域网访问就用 --local 启动。
data/inbox/,后台自动导入打开工作台需要登录。首次启动会自动创建管理员账号:
| 账号 | 初始密码 |
|---|---|
admin |
admin123 |
登录后会强制要求修改密码,改完才能正常使用。
| 角色 | 查看 | 导出 | 导入 | 同步 | 改阈值/文案 | 账号管理 |
|---|---|---|---|---|---|---|
| 管理员 admin | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 运营 editor | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| 查看 viewer | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
用另一个管理员账号重置。如果所有管理员都进不去:
cd store-ops
python3 - <<'EOF'
import sys; sys.path.insert(0, 'backend')
import db, auth
db.set_password(1, 'newpass123', must_change=1)
print('admin 密码已重置为 newpass123')
EOF
导出入口统一在左侧栏【导入数据】面板里:
导出的都是生意经给的 xlsx 原件,40 列,不含任何计算。
data/processed/,批次表用 file_path 记住对应关系/api/export.csv分析口径是近30天滚动窗口(今天往前 29 天到今天),不是自然月。数据每天自动从生意经拉取。
curl -X POST http://127.0.0.1:8787/api/syncGET /api/sync/statusdata/inbox/门店数据_<起>_<止>.xlsx快照写入 metrics,granularity='snapshot',period 记「截至日」,
window_start / window_end 记统计区间。周期下拉显示「近30天 · 截至 11-01」。
月汇总数据与快照共存,互不覆盖。
~/Documents,系统级定时任务读不到这个目录里的文件
(实测 head 都被拒)。所以定时器放在服务进程里,服务从终端启动时是有的权限。
sync/com.yhm.lifesync.plist 保留作参考,若要启用需在「系统设置 → 隐私与安全性 → 完全磁盘访问」
里把 /bin/bash 加进去。规则唯一源是 backend/rules.py,设计依据见 项目记录/规则设计_v2_思维导图.html。
默认值来自飞书《门店考核指标》官方基准线。左侧【指标配置】面板可改, 改完点【应用到工作台】即可生效。
改完不只是存库,还会同步写回 backend/rules.py 的 DEFAULT_THRESHOLDS,
所以不会出现「界面上是 10、代码里还是 30」这种两套数字打架:
| 场景 | 结果 |
|---|---|
| 面板改完保存 | 立即生效 + 写回代码默认值 + 重新加载 |
| 复制整个文件夹到别的电脑 | 改过的值跟着走 |
| 【恢复默认】 | 回到出厂值(首次运行时快照在 data/factory_thresholds.json),并同样写回代码 |
| 面板右上角标签 | 显示「出厂值」或「已自定义」(对照出厂值判断) |
写回时只替换阈值数值,保留键名、缩进和行尾注释;写入前会生成 rules.py.bak 备份,
写入后清字节码缓存并重新加载模块。
注意:因为会改源码,如果这个目录放在 git 里,改阈值会产生一次文件变更。
除了官方基准线,面板里还能调这几条 v2 新增的判定门槛:
| 参数 | 默认 | 作用 |
|---|---|---|
| 访问过低线 | 100 次 | 低于此值判「访问过低」 |
| 成交转化率过低线 | 10% | 成交人数 ÷ 访问 低于此值 → 「转化率低」 |
| 视频数下限 | 10 条 | 新发布视频少于此数 → 「视频量少」 |
| 点亮数下限 | 10 次 | 门店点亮少于此数 → 「点亮偏低」 |
| 新增评价数下限 | 10 条 | 新增评价少于此数 → 「新增评价少」 |
| 未核销积压提醒线 | 30 张 | 估算未核销券达到此数 → 提示集中邀约 |
| 核销率最小成交券数 | 5 张 | 成交券太少时核销率不稳定,不判定 |
| 客单价最小核销券数 | 5 张 | 核销券太少时不算客单价 |
| 差评率最小样本(新增/累计) | 10 / 20 条 | 样本不足最高只判预警线 |
| 回复率最小新增评价数 | 1 条 | 没有新评价就不判回复率 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/meta | 周期列表、阈值、导入历史、统计 |
| GET | /api/dashboard?period=2026-10 | 工作台全量数据 |
| PUT | /api/thresholds | 保存自定义阈值 |
| POST | /api/thresholds/reset | 恢复官方默认 |
| POST | /api/import?filename=&period=&date= | 导入 CSV / Excel(body=文件字节) |
| GET | /api/export.file?period= | 导出原始文件(该周期最近一次导入的 xlsx/csv 原件) |
| GET | /api/batch/<id>/file | 导出指定批次的原始文件 |
| GET | /api/export.csv?period=&kpi=&city=&cat=&q= | 筛选结果导出为 CSV(含核销率/待核销等计算列) |
| GET | /api/history | 导入批次 |
/#TH 直达考核指标面板/#IM 直达导入面板/#<门店ID> 直达该店详情抽屉点开任一门店的详情抽屉,底部两个按钮:
报告包含五段:关键指标(带基准/目标刻度的指标条)→ 风险与限流因素(问题 + 建议动作)→ 经营数据(客资 / 核销 / 退单 / 待核销 / 访问 / 成交 / 流失)→ 分析洞察 → 门店调整动作。
报告顶部有两个操作:
| 按钮 | 得到什么 |
|---|---|
| 打印 / 另存为 PDF | 走系统打印对话框,目标选「另存为 PDF」即得 PDF 文件(macOS 选「存储为 PDF」) |
| 下载 HTML | 下载一个自包含的单文件 HTML(样式内联,不依赖服务),可直接发微信或存档 |
左侧菜单【文案配置】可自定义门店分析反馈文案:反馈文案结构、问题文案、整改建议、严重档位名称。大括号变量生成时自动替换({门店名} {周期} {访问} {金额} {评分} {v} {base} {口径} {档} 等),未知变量原样保留。修改存库、立即对全部门店生效,【恢复默认】可一键还原。
每个字段右侧有「+ 变量」按钮,点开可点选变量直接插入,避免手写变量名出错。写错的变量会标红并在预览区顶部提示,不会静默原样输出。
| 短名 | 含义 | 等价的数据表列名(别名,可直接写) |
|---|---|---|
| {客资} | 门店意向成交券数 | {门店意向成交券数} |
| {核销} | 核销券数 | |
| {核销券数} | 核销券数 | {门店核销券数} |
| {成交券数} | 意向成交券数 | |
| {退单} | 门店意向退款券数 | {门店意向退款券数} {退款券数} |
| {访问} | 门店页访问次数 | {门店页访问次数} {门店页有效人数} {访问次数} |
| {成交} | 实际成交人数 | {门店实际成交人数} {成交人数} |
| {流失} | 访问-成交 | {流失人数} |
| {成交占比} {流失占比} | 占访问比例 | {流失人数占比} |
| {待核销} | 成交券-核销券 | {待核销订单数} {后台待核销订单} |
| {金额} | 核销金额(元) | {核销金额} |
| {评分} | 团购评分 | {门店评分} {团购评分} |
| {评分基准} {核销率} {核销目标} {回复率} {回复基准} {核销金额基准} | 指标与基准值 | {评价回复率} {核销率基准} |
| {门店名} {门店ID} {城市} {周期} | 门店与周期 | {门店名称} {门店城市} {统计周期} |
问题文案另可用:{v} 实际值、{base} 基准值、{口径} 新增/累计、{档} 档位名;条目格式可用 {i} 序号、{问题}/{建议}/{洞察} 内容。