3d89baf65d
- 后端: 新增 cost-analysis.ts 路由,含31个分析端点和7个调整管理端点 - 前端: 新增 CostAnalysisPage 主页面 + 10个Tab组件 - Tab1-9: 成本总览/菜品盈利/原料差异/BOM配方/供应链/包装耗材/数据质量/门店成本/可视化探索 - Tab10: 调整管理(诊断快照+调整记录+效果验证) - 修复: 毛利率和损耗率从简单平均改为加权计算 - 新增: Tabs组件、侧边栏菜单项、路由注册 - 新增: 3张数据库表(诊断快照/调整记录/验证结果)
526 lines
36 KiB
Markdown
526 lines
36 KiB
Markdown
# 菜品成本分析前端展现方案
|
||
|
||
> 基于现有架构:侧边栏分组(Layout.tsx) + 路由(App.tsx) + 页面组件(pages/) + 折叠面板(CollapsibleSection) + 数据表格(DataTable) + 图表(recharts)
|
||
|
||
---
|
||
|
||
## 整体架构
|
||
|
||
### 新增页面路由
|
||
|
||
在 `App.tsx` 中新增1个页面路由,在 `Layout.tsx` 中新增1个菜单项:
|
||
|
||
```
|
||
/cost-analysis → CostAnalysisPage → "菜品成本分析" → 业务模块组
|
||
```
|
||
|
||
### 页面结构
|
||
|
||
采用**单页面 + Tab切换**的方式,避免新增过多路由。页面顶部为Tab栏,每个Tab对应一个分析维度:
|
||
|
||
```
|
||
菜品成本分析
|
||
├── Tab: 成本总览 → 模块1 + 模块10 + 模块25
|
||
├── Tab: 菜品盈利分析 → 模块3 + 模块12
|
||
├── Tab: 原料差异分析 → 模块2 + 模块11
|
||
├── Tab: BOM与配方 → 模块4 + 模块23 + 模块20 + 模块21 + 模块22
|
||
├── Tab: 供应链与精简 → 模块5 + 模块6 + 模块7 + 模块13
|
||
├── Tab: 包装耗材 → 模块8
|
||
├── Tab: 数据质量 → 模块9 + 模块14
|
||
├── Tab: 门店成本 → 模块15 + 模块16 + 模块17 + 模块26
|
||
└── Tab: 可视化探索 → 模块24 + 散点图 + 热力图
|
||
```
|
||
|
||
---
|
||
|
||
## 各Tab详细设计
|
||
|
||
### Tab 1: 成本总览
|
||
|
||
**包含模块**:模块1(SKU理论与实际成本)、模块10(品类成本对比)、模块25(毛利率偏差分布)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 成本总览 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [MetricCard] 理论成本 [MetricCard] 实际成本 │
|
||
│ [MetricCard] 成本差异 [MetricCard] 差异率 │
|
||
│ [MetricCard] 平均理论毛利率 [MetricCard] 平均实际毛利率 │
|
||
│ [MetricCard] 超理论菜品数 [MetricCard] 低毛利菜品数 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 品类成本对比(柱状图 + 表格) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ BarChart: X轴=品类, Y轴=毛利率 │ │
|
||
│ │ 双柱: 理论毛利率 vs 实际毛利率 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: 品类 | 菜品数 | 理论毛利率 | 实际毛利率 │
|
||
│ | 销售额 | 成本差异 | 成本率 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 毛利率偏差分布(饼图 + 表格) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ PieChart: 严重偏低/偏低/略低/略高/高于理论 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: 偏差区间 | 菜品数 | 占比 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 成本差异TOP榜(表格,默认展开) │
|
||
│ DataTable: 菜品 | 品类 | 理论毛利率 | 实际毛利率 │
|
||
│ | 成本差异 | 成本分层 | 销售额 │
|
||
│ 成本分层用 Badge 着色: 正常(绿) / 关注(黄) / 整改(橙) │
|
||
│ / 紧急(红) / 数据异常(灰) │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/overview` → 总览指标
|
||
- `GET /api/cost-analysis/category-comparison` → 品类对比
|
||
- `GET /api/cost-analysis/margin-deviation` → 偏差分布
|
||
- `GET /api/cost-analysis/variance-top?limit=50&order=desc` → 成本差异TOP
|
||
|
||
---
|
||
|
||
### Tab 2: 菜品盈利分析
|
||
|
||
**包含模块**:模块3(菜品盈利与菜单工程)、模块12(菜品定价合理性)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 菜品盈利分析 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 菜单工程矩阵(四象限图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ ScatterChart: │ │
|
||
│ │ X轴=销量, Y轴=实际毛利率 │ │
|
||
│ │ 气泡大小=销售额, 颜色=品类 │ │
|
||
│ │ 四象限: 明星/高销低利/低销高利/低销低利 │ │
|
||
│ │ 点击气泡 → 弹出菜品详情 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ 图例: 🟢明星盈利 🟡高销低利 🔵低销高利 🔴低销低利 │
|
||
│ ⚪数据异常 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 菜品盈利明细(表格) │
|
||
│ DataTable: 菜品 | 品类 | 销量 | 销售额 | 理论毛利 │
|
||
│ | 实际毛利 | 毛利贡献度 | 菜单类型(Badge) │
|
||
│ 支持排序: 按销售额/毛利/毛利率 │
|
||
│ 支持筛选: 品类下拉 / 菜单类型下拉 │
|
||
│ Pagination │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 定价合理性(毛利率分布图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ BarChart: X轴=毛利率区间, Y轴=菜品数 │ │
|
||
│ │ 区间: <0% / 0-30% / 30-50% / 50-70% │ │
|
||
│ │ / 70-90% / >90% │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: 低毛利菜品清单(理论<50%且销售额>1000) │
|
||
│ 菜品 | 售价 | 理论成本 | 理论毛利率 | 实际毛利率 │
|
||
│ | 定价偏离度 | 建议 │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/menu-engineering` → 菜单工程矩阵数据
|
||
- `GET /api/cost-analysis/profitability?page=1&category=&type=` → 盈利明细
|
||
- `GET /api/cost-analysis/pricing?threshold=50` → 定价合理性
|
||
|
||
---
|
||
|
||
### Tab 3: 原料差异分析
|
||
|
||
**包含模块**:模块2(SKU原料差异贡献)、模块11(物料损耗率分布)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 原料差异分析 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [搜索框] 输入菜品名称 → 查看该菜品的原料差异分解 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 菜品原料差异分解(选中菜品后展示) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ 水平BarChart: 原料名 vs 金额差异 │ │
|
||
│ │ 红色=超耗, 绿色=节约 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: 原料 | 理论用量 | 实际用量 | 数量差异 │
|
||
│ | 损耗率 | 金额差异 | 差异贡献度 | 原因分类 │
|
||
│ 原因分类(Badge): 份量超标/替代原料/分摊遗漏/门店错位 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 物料损耗率分布(饼图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ PieChart: 无损耗/轻微/轻度/中度/严重/极重/正向│ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: 损耗区间 | 明细数 | 占比 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 超耗物料TOP榜(表格) │
|
||
│ DataTable: 物料 | 类型(原料/半成品) | 涉及菜品数 │
|
||
│ | 总损耗量 | 平均损耗率 | 最大损耗率 │
|
||
│ 支持排序: 按损耗量/损耗率 │
|
||
│ Pagination │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 物料类型损耗对比(柱状图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ BarChart: 原材料 vs 半成品 │ │
|
||
│ │ 双柱: 平均损耗率 | 涉及菜品数 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/material-variance?dish_code=66920` → 菜品原料差异分解
|
||
- `GET /api/cost-analysis/loss-distribution` → 损耗率分布
|
||
- `GET /api/cost-analysis/material-loss-top?limit=50&order=desc` → 超耗物料TOP
|
||
- `GET /api/cost-analysis/material-type-loss` → 物料类型损耗对比
|
||
|
||
---
|
||
|
||
### Tab 4: BOM与配方
|
||
|
||
**包含模块**:模块4(BOM复杂度)、模块23(菜品物料构成)、模块20(BOM覆盖率)、模块21(适用门店覆盖)、模块22(高损耗BOM预警)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ BOM与配方 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [MetricCard] BOM覆盖率 [MetricCard] 有BOM的SKU数 │
|
||
│ [MetricCard] 缺BOM的SKU [MetricCard] 平均物料数/SKU │
|
||
│ [MetricCard] 高损耗BOM数 [MetricCard] 极端损耗BOM数 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] BOM复杂度分布(柱状图 + 表格) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ BarChart: X轴=物料数区间, Y轴=SKU数 │ │
|
||
│ │ ≤5 / 6-10 / 11-15 / 16-20 / >20 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: SKU编码 | 菜品名 | 品类 | 原料数 │
|
||
│ | 半成品数 | 独有原料数 | 单位数 │
|
||
│ | 高损耗原料数 | 复杂度评分 | 复杂度等级 │
|
||
│ 复杂度等级(Badge): 低(绿) / 正常(蓝) / 较复杂(橙) │
|
||
│ / 重点评审(红) │
|
||
│ Pagination │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 高损耗BOM预警(表格,默认展开) │
|
||
│ DataTable: 菜品 | 物料 | 损耗率 | 出成率 | 标准毛用量 │
|
||
│ | 标准净用量 | 单位 | 预警级别(Badge) │
|
||
│ 预警级别: >20%(黄) / >50%(橙) / >100%(红) │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 缺BOM的SKU清单(表格) │
|
||
│ DataTable: SKU编码 | 菜品名 | 品类 | 销售额 | 销量 │
|
||
│ 按销售额降序,优先补齐高销量SKU的BOM │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 菜品物料构成(点击菜品展开详情) │
|
||
│ 选中菜品后展示: │
|
||
│ DataTable: 物料 | 类型 | 标准用量 | 标准金额 | 成本占比 │
|
||
│ | 损耗率 | 出成率 │
|
||
│ 饼图: 物料成本占比 │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/bom-overview` → BOM总览指标
|
||
- `GET /api/cost-analysis/bom-complexity?page=1` → 复杂度分布
|
||
- `GET /api/cost-analysis/bom-high-loss?threshold=20` → 高损耗BOM预警
|
||
- `GET /api/cost-analysis/bom-missing?page=1` → 缺BOM的SKU清单
|
||
- `GET /api/cost-analysis/bom-composition?sku_code=66920` → 菜品物料构成
|
||
|
||
---
|
||
|
||
### Tab 5: 供应链与精简
|
||
|
||
**包含模块**:模块5(独有原料风险)、模块6(SKU精简供应链影响)、模块7(原料共用度)、模块13(BOM驱动物料需求预测)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 供应链与精简 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 原料共用度网络(表格 + 图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ 水平BarChart: TOP20物料被引用次数 │ │
|
||
│ │ 核心原料(>50个SKU)标红, 独有原料(=1)标灰 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ DataTable: 物料 | 类型 | 被引用SKU数 | 分类 │
|
||
│ 核心原料(Badge红) / 普通共用(蓝) / 独有(灰) │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 独有原料风险(表格) │
|
||
│ DataTable: SKU | 菜品名 | 销售额 | 独有原料数 │
|
||
│ | 独有原料成本 | 替代品 | 风险等级(Badge) │
|
||
│ 风险等级: 高(低收入+多独有原料,红) / 中(橙) / 低(绿) │
|
||
│ 按销售额升序(低收入优先),独有原料数降序 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] SKU精简模拟器(交互式) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ [下拉] 选择要下架的SKU │ │
|
||
│ │ 或 [输入] 批量输入SKU编码 │ │
|
||
│ │ [按钮] 模拟下架影响 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ 模拟结果: │
|
||
│ [MetricCard] 收入影响 [MetricCard] 毛利影响 │
|
||
│ [MetricCard] 可减少原料数 [MetricCard] 独有库存金额 │
|
||
│ [MetricCard] 仍需采购的共用原料 [MetricCard] 报损风险 │
|
||
│ DataTable: 可释放的独有原料清单 │
|
||
│ 物料 | 涉及菜品数(=1) | 库存金额 | 处置建议 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] BOM驱动物料需求预测(表格) │
|
||
│ DataTable: 物料 | 类型 | 单位 | 预计需求量 │
|
||
│ | 涉及菜品数 | 需求排名 │
|
||
│ 按需求量降序,TOP50 │
|
||
│ Pagination │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/material-sharing?limit=20` → 原料共用度
|
||
- `GET /api/cost-analysis/unique-material-risk?page=1` → 独有原料风险
|
||
- `POST /api/cost-analysis/sku-simplify-simulate` → SKU精简模拟(传入SKU编码列表)
|
||
- `GET /api/cost-analysis/material-demand?limit=50` → 物料需求预测
|
||
|
||
---
|
||
|
||
### Tab 6: 包装耗材
|
||
|
||
**包含模块**:模块8(包装及耗材成本分析)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 包装耗材成本 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [MetricCard] 包装物料种类 [MetricCard] 包装总成本 │
|
||
│ [MetricCard] 包装费用率 [MetricCard] 高损耗包装数 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 包装物料明细(表格) │
|
||
│ DataTable: 物料 | 涉及菜品数 | 每单用量 | 每单成本 │
|
||
│ | 费用率 | 损耗量 | 损耗率 | 状态(Badge) │
|
||
│ 状态: 正常(绿) / 关注(黄) / 核查(红) │
|
||
│ 支持筛选: 物料类型(餐盒/餐具/打包袋/调味包/其他) │
|
||
│ Pagination │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 包装损耗TOP榜(柱状图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ 水平BarChart: 物料名 vs 损耗量 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/packaging-overview` → 包装总览
|
||
- `GET /api/cost-analysis/packaging-detail?page=1&type=` → 包装明细
|
||
- `GET /api/cost-analysis/packaging-loss-top?limit=15` → 包装损耗TOP
|
||
|
||
---
|
||
|
||
### Tab 7: 数据质量
|
||
|
||
**包含模块**:模块9(BOM数据质量)、模块14(物料匹配率)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 数据质量 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [MetricCard] BOM覆盖率 [MetricCard] 菜品匹配率 │
|
||
│ [MetricCard] 物料匹配率 [MetricCard] 异常菜品数 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] BOM数据质量检查清单(表格) │
|
||
│ DataTable: 检查项 | 异常数 | 异常率 | 状态(Badge) │
|
||
│ 检查项: │
|
||
│ - BOM缺失(168个SKU无BOM) │
|
||
│ - 零实际用量(standard_net_quantity=0) │
|
||
│ - 成本率异常(实际毛利率<0) │
|
||
│ - 理论毛利率为负 │
|
||
│ - 负数量记录 │
|
||
│ - 明细与汇总不一致 │
|
||
│ - 重复BOM记录 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 未匹配菜品清单(表格) │
|
||
│ DataTable: 菜品名 | 品类 | 销售额 | 匹配状态 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 未匹配物料清单(表格) │
|
||
│ DataTable: 物料名 | 涉及菜品数 | 损耗金额 | 匹配状态 │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/data-quality` → 数据质量总览
|
||
- `GET /api/cost-analysis/unmatched-dishes?page=1` → 未匹配菜品
|
||
- `GET /api/cost-analysis/unmatched-materials?page=1` → 未匹配物料
|
||
|
||
---
|
||
|
||
### Tab 8: 门店成本
|
||
|
||
**包含模块**:模块15(门店成本差异分布)、模块16(门店超耗排名)、模块17(理论vs实际成本率)、模块26(门店成本分级地图)
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 门店成本 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [MetricCard] 门店总数 [MetricCard] 红色门店数 │
|
||
│ [MetricCard] 橙色门店数 [MetricCard] 绿色门店数 │
|
||
│ [MetricCard] 灰色门店数 [MetricCard] 总超耗金额 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 门店成本分级地图 │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ 地图组件(复用StoreMap或现有地图) │ │
|
||
│ │ 标注: 红/橙/绿/灰 圆点 │ │
|
||
│ │ 点击 → 弹出门店成本详情 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ 图例: 🔴严重超耗 🟠明显超耗 🟢基本正常 ⚪口径异常 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 门店成本差异分布(饼图) │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ PieChart: 红35 / 橙40 / 绿8 / 灰6 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 门店超耗排名(表格,默认展开) │
|
||
│ DataTable: 门店 | 理论成本率 | 实际成本率 | 偏差 │
|
||
│ | 超耗金额 | 负库存项数 | 分级(Badge) │
|
||
│ 分级(Badge): 红色-严重超耗(红) / 橙色-明显超耗(橙) │
|
||
│ / 绿色-基本正常(绿) / 灰色-口径异常(灰) │
|
||
│ 支持排序: 按超耗金额/偏差率 │
|
||
│ Pagination │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/store-overview` → 门店成本总览
|
||
- `GET /api/cost-analysis/store-map` → 门店地图数据(含经纬度+分级)
|
||
- `GET /api/cost-analysis/store-ranking?page=1&order=desc` → 门店超耗排名
|
||
|
||
---
|
||
|
||
### Tab 9: 可视化探索
|
||
|
||
**包含模块**:模块24(成本差异vs销量散点图)+ 自由探索
|
||
|
||
**布局**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 可视化探索 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 成本差异 vs 销量散点图 │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ ScatterChart: │ │
|
||
│ │ X轴=销量, Y轴=成本差异额 │ │
|
||
│ │ 气泡大小=销售额, 颜色=品类 │ │
|
||
│ │ 四象限标注: │ │
|
||
│ │ 右上=高销量高差异(优先整改) │ │
|
||
│ │ 右下=高销量低差异(保持) │ │
|
||
│ │ 左上=低销量高差异(考虑下架) │ │
|
||
│ │ 左下=低销量低差异(观察) │ │
|
||
│ │ 点击气泡 → 弹出菜品详情 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [CollapsibleSection] 品类成本热力图 │
|
||
│ ┌──────────────────────────────────────────┐ │
|
||
│ │ 热力图: 行=品类, 列=成本指标 │ │
|
||
│ │ 指标: 理论毛利率/实际毛利率/差异率/成本率 │ │
|
||
│ │ 颜色: 红=差, 绿=好 │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ [筛选器] │
|
||
│ 品类下拉 | 毛利率范围滑块 | 销量范围滑块 │
|
||
│ [按钮] 应用筛选 → 更新散点图 │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**API端点**:
|
||
- `GET /api/cost-analysis/scatter?x=sales_quantity&y=cost_variance&size=sales_amount&color=category_l1` → 散点图数据
|
||
- `GET /api/cost-analysis/category-heatmap` → 品类热力图
|
||
|
||
---
|
||
|
||
## 组件复用清单
|
||
|
||
| 组件 | 用途 | 已有 |
|
||
|------|------|------|
|
||
| `CollapsibleSection` | 折叠面板 | ✅ |
|
||
| `MetricCard` | 指标卡片 | ✅ |
|
||
| `DataTable` | 数据表格 | ✅ |
|
||
| `Pagination` | 分页 | ✅ |
|
||
| `Badge` | 状态标签 | ✅ |
|
||
| `LoadingSpinner` | 加载中 | ✅ |
|
||
| `BarChart` | 柱状图 | ✅ recharts |
|
||
| `PieChart` | 饼图 | ✅ recharts |
|
||
| `ScatterChart` | 散点图 | ✅ recharts |
|
||
| `StoreMap` | 地图 | ✅ 已有 |
|
||
| Tab切换组件 | Tab栏 | ❌ 需新建 |
|
||
| 搜索框组件 | 菜品搜索 | ❌ 用input实现 |
|
||
| 筛选器组件 | 下拉/滑块 | ❌ 用select/input实现 |
|
||
|
||
## 新增文件清单
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `client/src/pages/CostAnalysisPage.tsx` | 主页面(Tab容器) |
|
||
| `client/src/components/Tabs.tsx` | Tab切换组件 |
|
||
| `client/src/components/cost-analysis/OverviewTab.tsx` | Tab1: 成本总览 |
|
||
| `client/src/components/cost-analysis/ProfitabilityTab.tsx` | Tab2: 菜品盈利 |
|
||
| `client/src/components/cost-analysis/MaterialTab.tsx` | Tab3: 原料差异 |
|
||
| `client/src/components/cost-analysis/BomTab.tsx` | Tab4: BOM与配方 |
|
||
| `client/src/components/cost-analysis/SupplyTab.tsx` | Tab5: 供应链精简 |
|
||
| `client/src/components/cost-analysis/PackagingTab.tsx` | Tab6: 包装耗材 |
|
||
| `client/src/components/cost-analysis/QualityTab.tsx` | Tab7: 数据质量 |
|
||
| `client/src/components/cost-analysis/StoreTab.tsx` | Tab8: 门店成本 |
|
||
| `client/src/components/cost-analysis/ExploreTab.tsx` | Tab9: 可视化探索 |
|
||
| `server/src/routes/cost-analysis.ts` | API路由(所有端点) |
|
||
|
||
## API端点汇总
|
||
|
||
| 端点 | Tab | 说明 |
|
||
|------|-----|------|
|
||
| `GET /api/cost-analysis/overview` | 1 | 成本总览指标 |
|
||
| `GET /api/cost-analysis/category-comparison` | 1 | 品类成本对比 |
|
||
| `GET /api/cost-analysis/margin-deviation` | 1 | 毛利率偏差分布 |
|
||
| `GET /api/cost-analysis/variance-top` | 1 | 成本差异TOP榜 |
|
||
| `GET /api/cost-analysis/menu-engineering` | 2 | 菜单工程矩阵 |
|
||
| `GET /api/cost-analysis/profitability` | 2 | 菜品盈利明细 |
|
||
| `GET /api/cost-analysis/pricing` | 2 | 定价合理性 |
|
||
| `GET /api/cost-analysis/material-variance` | 3 | 菜品原料差异分解 |
|
||
| `GET /api/cost-analysis/loss-distribution` | 3 | 损耗率分布 |
|
||
| `GET /api/cost-analysis/material-loss-top` | 3 | 超耗物料TOP |
|
||
| `GET /api/cost-analysis/material-type-loss` | 3 | 物料类型损耗对比 |
|
||
| `GET /api/cost-analysis/bom-overview` | 4 | BOM总览 |
|
||
| `GET /api/cost-analysis/bom-complexity` | 4 | BOM复杂度 |
|
||
| `GET /api/cost-analysis/bom-high-loss` | 4 | 高损耗BOM预警 |
|
||
| `GET /api/cost-analysis/bom-missing` | 4 | 缺BOM的SKU |
|
||
| `GET /api/cost-analysis/bom-composition` | 4 | 菜品物料构成 |
|
||
| `GET /api/cost-analysis/material-sharing` | 5 | 原料共用度 |
|
||
| `GET /api/cost-analysis/unique-material-risk` | 5 | 独有原料风险 |
|
||
| `POST /api/cost-analysis/sku-simplify-simulate` | 5 | SKU精简模拟 |
|
||
| `GET /api/cost-analysis/material-demand` | 5 | 物料需求预测 |
|
||
| `GET /api/cost-analysis/packaging-overview` | 6 | 包装总览 |
|
||
| `GET /api/cost-analysis/packaging-detail` | 6 | 包装明细 |
|
||
| `GET /api/cost-analysis/packaging-loss-top` | 6 | 包装损耗TOP |
|
||
| `GET /api/cost-analysis/data-quality` | 7 | 数据质量总览 |
|
||
| `GET /api/cost-analysis/unmatched-dishes` | 7 | 未匹配菜品 |
|
||
| `GET /api/cost-analysis/unmatched-materials` | 7 | 未匹配物料 |
|
||
| `GET /api/cost-analysis/store-overview` | 8 | 门店成本总览 |
|
||
| `GET /api/cost-analysis/store-map` | 8 | 门店地图数据 |
|
||
| `GET /api/cost-analysis/store-ranking` | 8 | 门店超耗排名 |
|
||
| `GET /api/cost-analysis/scatter` | 9 | 散点图数据 |
|
||
| `GET /api/cost-analysis/category-heatmap` | 9 | 品类热力图 |
|
||
|
||
共 **31个API端点**,覆盖27个分析模块。
|
||
|
||
## 落地顺序
|
||
|
||
与指标体系的4批对应:
|
||
|
||
| 批次 | Tab | 优先级 | API数 |
|
||
|------|-----|--------|-------|
|
||
| 第一批 | Tab1 + Tab2 + Tab3 | 最高 | 11 |
|
||
| 第二批 | Tab4 + Tab6 + Tab7 | 高 | 10 |
|
||
| 第三批 | Tab8 | 中 | 3 |
|
||
| 第四批 | Tab5 + Tab9 | 低 | 7 |
|