dev「店铺运营」现在是明细表 + 卡片,适合逐店核对,但不适合一眼看经营大盘。需要一屏看清:今天做了多少、比昨天好还是差、哪家店在拖后腿、转化在哪一环掉。
数据源:上传的运营明细(平台导出全字段 + 人工统计表),已按「日期 + 门店」合并去重。
经营驾驶舱 日期 [10.18] ~ [10.19] 学校 ▾ 店铺 ▾
┌──────────┬──────────┬──────────┬──────────┬───────────┬─────────┐
│ 营业额 │ 有效订单 │ 客单价 │ 曝光人数 │ 进店转化率 │ 店铺评分 │
│ 2,363.73 │ 86 │ 27.49 │ 6,775 │ 8.6% │ 4.62 │
│ ↓ 7.2% │ ↓12.8% │ ↑ 6.5% │ ↓16.1% │ ↓0.4pp │ — │
└──────────┴──────────┴──────────┴──────────┴───────────┴─────────┘
┌────────────────────────────┬────────────────────────────┐
│ 营业额 / 订单趋势(双轴) │ 门店营业额 Top 10(横向条形) │
├────────────────────────────┼────────────────────────────┤
│ 转化漏斗 曝光→进店→下单 │ 收入结构:收入 / 支出 / 补贴 │
└────────────────────────────┴────────────────────────────┘
| 指标 | 口径 | 说明 |
|---|---|---|
| 营业额 | Σ 营业额 | 平台列「营业额」;人工表映射为 revenue |
| 有效订单 | Σ 有效订单 | 整数 |
| 客单价 | 营业额 ÷ 有效订单 | 订单为 0 时显示 – |
| 曝光人数 | Σ 曝光人数 | |
| 进店转化率 | Σ 进店人数 ÷ Σ 曝光人数 | 不是各店转化率的算术平均 |
| 店铺评分 | 评分 > 0 的门店取均值 | 未开业/无评分(0)不参与 |
环比:所选区间 vs 紧邻的前一个等长区间。
—,不显示 ∞| 图 | 形式 | 数据 |
|---|---|---|
| 趋势 | 柱(营业额,左轴)+ 线(订单,右轴) | 按日聚合 |
| 门店排行 | 横向条形 Top 10 | 所选区间营业额,带数值标签 |
| 转化漏斗 | 漏斗图 | 曝光人数 → 进店人数 → 下单人数,标注各层转化率 |
| 收入结构 | 堆叠柱 / 瀑布 | 收入、支出、活动补贴、商家活动成本(按日) |
配色沿用现有主题:主色 #ff6b35,辅助灰 #b8b2ad,ECharts 已在仓库内。
新增 GET /api/ops/dashboard(服务端聚合,保证口径一致):
?from=20261018&to=20261019&schools=浙江工商大学桐庐校区&shops=537278859
响应:
{
"from": "20261018", "to": "20261019",
"prev": { "from": "20261016", "to": "20261017" },
"kpis": {
"revenue": { "value": 2363.73, "prev": 2544.1, "delta": -7.1, "unit": "money" },
"orders": { "value": 86, "prev": 99, "delta": -13.1, "unit": "int" },
"avgTicket": { "value": 27.49, "prev": 25.7, "delta": 7.0, "unit": "money" },
"exposure": { "value": 6775, "prev": 8090, "delta": -16.3, "unit": "int" },
"conversion": { "value": 0.086, "prev": 0.09, "delta": -0.4, "unit": "pp" },
"rating": { "value": 4.62, "prev": null, "delta": null, "unit": "num" }
},
"trend": [{ "date": "20261018", "revenue": 2363.73, "orders": 86 }],
"ranking": [{ "shopId": "...", "shopName": "...", "revenue": 750.7 }],
"funnel": { "exposure": 6775, "visit": 585, "order": 88 },
"structure": [{ "date": "20261018", "income": 2363.73, "expense": 747.46, "subsidy": 51.7 }]
}
实现复用 loadMergedRows()(人工 + 平台合并),不动现有表结构。
cockpit,public/cockpit.js,复用 ops-multi 组件样式| 场景 | 表现 |
|---|---|
| 无数据 | 空态提示 + 清空筛选 |
| 只有 1 天数据 | 趋势图只有一根柱;环比显示 —(没有上期) |
| 上期为 0 | 环比 —,不显示 ∞ |
| 存储不可用 | 显示「数据暂不可用」+ 重试 |
| 店铺/学校筛选为空 | 与店铺运营一致:提示至少选一个 |
/api/ops/dashboard 空库 / 有数据 / 筛选组合GET /api/ops/dashboard 200GET /api/ops/dashboard 聚合实现(复用 loadMergedRows)public/cockpit.js:筛选、KPI 卡、趋势、排行、漏斗、结构图index.html 菜单与视图骨架、app.js 注册、style.css